基于延时采样的按键消抖方法

基于延时采样的按键消抖方法

知识共享许可协议
本作品采用知识共享署名-相同方式共享 3.0 未本地化版本许可协议进行许可。

按键抖动

常见的按键有轻触按键和触摸按键。前者通过内部金属片受力弹动实现按键的接通和断开,后者通过电阻或电容实现触摸感应。此处讨论轻触按键的抖动和软件消抖方法。

产生抖动的原因

通常的按键所用的开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。

在闭合及断开的瞬间均伴随有一连串的抖动。程序很有可能因为抖动,将一次按键读取成多次输入。按键为了使这种抖动不影响正常的操作,需要在软件中进行优化处理,就是按键消抖。

按键消抖的机理

通常,按键持续时间为数百毫秒以上;按下和放开按键时,产生的抖动一般持续10ms。常用消抖方式有两种:

  • 延时采样:检测按键电平变化后延时(10ms以上),采样作为有效信号
  • 周期采样:每隔固定时间采样(10ms以上) ,采样作为有效信号

此处使用延时电平采样实现按键消抖。

按键消抖程序

本程序使用C语言编写,在基于ARM Cortex M4的TI TM4C1294开发板上测试通过。

以下代码由定时器中断控制,每毫秒运行一次。

程序中使用到的变量为 uint32_t USR_SW1_counter 。当USR_SW1_counter == 0时,说明按键没有被按下;否则说明按键被按下。

GPIOPinRead(GPIO_PORTJ_BASE,GPIO_PIN_0) == 0 用于读取并判断按键的值。若上述结果为true ,说明按键被按下。

在初次读到按键键值后,延时20ms,再次读取按键:如果仍然检测到按键信号,则认为按键被按下。

代码见下

//This whole script runs at a frequency of 1000 Hz

//counter == 0 indicates that the key has not been pressed
if (USR_SW1_counter == 0)
{
     //Read from switch pin
    if (GPIOPinRead(GPIO_PORTJ_BASE,GPIO_PIN_0) == 0)
        USR_SW1_counter++;
}
//20 ms after detecting key press for the first time, check if the key is still pressed.
else if (++USR_SW1_counter == 20)
{
    if (GPIOPinRead(GPIO_PORTJ_BASE,GPIO_PIN_0) == 0)
        //Do what you want
    else
         //reset counter to eliminate jitter
        USR_SW1_counter = 0;
}

版本信息

1.0 20170603 initial commit

你可能感兴趣的:(基于延时采样的按键消抖方法)