Atmel Button Debounce无效

时间:2014-04-17 14:13:28

标签: c atmel

我试图通过一个led切换功能来制作一个按钮去抖动软件,每次我通过提出问题但从未有效的方式返回一个不同的布尔值:

#include <avr/io.h>

bool ledToggle();

int main(void)
{   
    DDRB |= (1 << 0); 
    DDRB &= ~(1 << 0); 

    while(1)
    {   
        //TODO:: Please write your application code                 

        if (ledToggle() == true)
        {       
            //led on
            PORTB |= (1 << 0);          
        }else{          
            //led off
            PORTB &= ~(1 << 0);         
        }       
    }
}

bool ledToggle()
{
    static bool state = false;  
    if(bit_is_clear(PINB, 1)){
        state = !state;
    }

    return state;   
}

修改

当我尝试编译它时,我没有任何错误或任何错误,但是没有工作......

2 个答案:

答案 0 :(得分:0)

在main()的第二行,您错误地将LED端口而不是BUTTON端口设置为输入。它应该是:

DDRB &= ~(1 << 1);

我建议使用定义作为一种不太可能犯这种错误的方法:

#define LED    0
#define BUTTON 1

DDRB |= (1 << LED);
DDRB &= ~(1 << BUTTON);

答案 1 :(得分:0)

我不知道这个代码会以哪种方式去除连接到端口B / 1的开关。去抖意味着

  • 检查并存储关键逻辑状态
  • 等待一段时间(取决于硬件,5 - 50毫秒)
  • 将(现在)逻辑状态与之前读取的内容进行比较
  • 如果等于(现在)逻辑状态是去抖键状态

如果程序运行良好,LED将以与开关相同的速度反弹。

在你的bool ledToggle()我建议您声明static volatile bool state;以确保在RAM中创建变量(而不是CPU寄存器)