按钮在XMEGA AVR中的去抖动
我想在xmega中做一个简单的开关。例如,如果我按一次,应该说按钮在XMEGA AVR中的去抖动
好
,如果我再次按下它,它应该说
坏
等..
我知道如何做在Arduino按钮debouncing,但我真的不知道AVR。有人可以帮助我,还是给我一些示例代码来学习?
这里是我到目前为止的代码:
if (!(PORTH_IN&PIN0_bm))
{
if (Mode1 != 1)
{
Mode1 = 1;
printf("%d\n", Mode1);
}
}
if (!(PORTH_IN&PIN0_bm))
{
if (Mode1 != 0)
{
Mode1 = 0;
printf("%d\n", Mode1);
}
}
我想创建一个小的状态机这样的:
static int debounce_guard;
static int button_has_been_pressed;
void read_button_state()
{
switch(button_is_pressed)
{
case YES:
if(debounce_guard == 0)
{
button_has_been_pressed = 1;
}
break;
case NO:
if(button_has_been_pressed)
{
/* Do stuff here */
debounce_guard = 10000;
button_has_been_pressed = 0;
}
break;
}
if(debounce_guard > 0)
debounce_guard--;
}
(button_is_pressed变量应该反映GPIO引脚的状态)
这个想法是,debounce_guard应该让你忽略按钮的冗余弹跳,这个变量应该减少或者用一些定时器或者只是在函数本身,比如显示的代码。状态机将作出反应,然后用户释放按钮。
你能更加特别的先生吗?我的意思是,read_button_state应该是这样或那样写的。我现在仍然空白。你能给我一个真正的'代码'的例子吗? –
我不确定我明白你的意思。这是实际的'代码',我不认为我可以比这更清晰。程序启动时,您可以调用此函数的时间间隔与系统/ CPU的整体速度一致。只要记住要更改button_is_pressed变量以匹配您连接按钮的特定hw的寄存器。你在例子中写了PORTH_IN&PIN0_bm,所以我猜这是按钮的正确寄存器和掩码。 – staringlizard
它不会工作,我不知道为什么..我是否做错了..我发布的代码波纹管 –
如何用555定时器等硬件构建去抖动?这比用软件做更可靠。 – ckruczek