[技术问答] 按键为什么要消抖?

[复制链接]
 楼主| 余三水 发表于 2020-4-27 14:49 | 显示全部楼层 |阅读模式
原理图分析
1989894-20200412205748434-812398330.jpg
根据原理图,当按键没有按下的时候,单片机引脚BTN1通过10K的电阻接VCC,为高电平;当按键按下的时候,BTN1通过10K的电阻接地,为低电平,此时这个10K的电阻起限流作用,一般程序限流电阻。那么理想情况下,按键没有按下的时候为高电平1,按下为低电平0,但是实际情况下,由于机械的抖动,实际情况产生的波形如下图所示:
1989894-20200412205808045-457371886.jpg
信号由于机械的抖动,导致在1和0之间多次跳变,一般抖动时间为5-10ms。单片机的处理速度很快,如果不做处理,那么会导致程序多次执行按键后的操作,从而导致逻辑错误。例如,要实现按下灯亮,再次按下灯灭,如果不消抖,就可能导致一次按下,多次处理,灯的开关状态就有可能没有变化。

 楼主| 余三水 发表于 2020-4-27 14:49 | 显示全部楼层
实现按键消抖
一个简单的消抖办法是检测到按键按下,则等待10ms之后,再次检测是否在按下状态,如果是按下的状态,那么才确定是在按下状态。伪代码如下:
  1. if (key == 0) {                        //检测到按键按下
  2.         DelayMs(10);                //等待10个毫秒
  3.         if (key == 0) {                //按键仍然保持在按下的状态
  4.                 led = !led;                //切换LED的开关状态
  5.                 while (key == 0);        //等待松手
  6.         }
  7. }


 楼主| 余三水 发表于 2020-4-27 14:50 | 显示全部楼层
编写程序并测试
  1. #include <ioCC2530.h>

  2. #define LED1   P1_0     //定义LED1所在引脚
  3. #define KEY1   P0_1     //定义BTN1所在引脚

  4. void DelayMs(int ms)
  5. {
  6.     while (ms--) {
  7.         volatile int x = 500;//注意:这个数字是估计的,不准确
  8.         while (x--);
  9.     }
  10. }

  11. void main(void)
  12. {
  13.     //配置P0_1引脚的按键1
  14.     P0SEL &= ~0x02; //普通GPIO模式<0为IO模式,1为外设模式>
  15.     P0DIR &= ~0x02; //输入功能<0为输入,1为输出>
  16.     P0INP &= ~0x02; //上拉或下拉模式<0为上拉或下拉模式,1为三态模式>

  17.     //配置P1_0引脚的LED1
  18.     P1SEL &= ~0x01; //普通GPIO模式<0为IO模式,1为外设模式>
  19.     P1DIR |= 0x01;  //输出功能<0为输入,1为输出>
  20.     P1INP &= ~0x01; //上拉或下拉模式<0为上拉或下拉模式,1为三态模式>
  21.    
  22.     P2INP |= 0xe0;  //P0,P1,P2都设置为上拉模式
  23.    
  24.     while (1)
  25.     {
  26.         if (0 == KEY1) {
  27.             DelayMs(10);
  28.             if (0 == KEY1) {
  29.                 LED1 = !LED1;
  30.                 while (0 == KEY1);
  31.             }
  32.         }
  33.     }
  34. }



 楼主| 余三水 发表于 2020-4-27 14:51 | 显示全部楼层
注意事项
上面这个方法比较常用,但是存在如下问题:

如果用户一直按着,会导致程序停在等待松手的位置。
在等待10ms期间,程序什么也不能做,浪费了处理器的性能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

356

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部