按钮在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); 
    } 
} 
+0

如何用555定时器等硬件构建去抖动?这比用软件做更可靠。 – ckruczek

我想创建一个小的状态机这样的:

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应该让你忽略按钮的冗余弹跳,这个变量应该减少或者用一些定时器或者只是在函数本身,比如显示的代码。状态机将作出反应,然后用户释放按钮。

+0

你能更加特别的先生吗?我的意思是,read_button_state应该是这样或那样写的。我现在仍然空白。你能给我一个真正的'代码'的例子吗? –

+0

我不确定我明白你的意思。这是实际的'代码',我不认为我可以比这更清晰。程序启动时,您可以调用此函数的时间间隔与系统/ CPU的整体速度一致。只要记住要更改button_is_pressed变量以匹配您连接按钮的特定hw的寄存器。你在例子中写了PORTH_IN&PIN0_bm,所以我猜这是按钮的正确寄存器和掩码。 – staringlizard

+0

它不会工作,我不知道为什么..我是否做错了..我发布的代码波纹管 –