
嵌入式中经常使用按键作为人机交互的接口典型的按键电路如下所示在实际使用过程中由于误触及按键的机械特性按键按下或松开时的输出的波形上会存在抖动一般可以通过增加滤波电容C1进行处理。但是在实际产品应用中尤其是在在一些低功耗、低成本要求的应用场景中会取消滤波电容C1并增大电阻R1的阻值按键按下或送开时的抖动会增大。一、硬件消抖1、IC硬件消抖IC硬件滤波一般依赖与使用硬件平台的GPIO实现。部分MCU的GPIO实现支持硬件滤波功能一般采用高于待采样信号频率的时钟对待采样信号进行多次采样实现。采样周期越长对应的产生误判的概率越下。存在硬件滤波时软件可以直接获取相对可靠的结果。2、板级硬件消抖板级硬件滤波通常是在电路中与按键并联接入一个滤波电容利用电容的充放电延时进行消抖。需要设计好充放电常数时间常数太大按键不灵敏连续按键可能无法正确识别按键信号时间常数太小达不到消抖的效果。这种方法对于软件实现来说最简单可以认为结果是可靠的但增加了硬件成本在一些低成本产品无法采用。二、软件消抖1、单次延时消抖根据按键的机械特性按键在按下或松开时的抖动时长一般为10ms所以可以以10ms为间隔对按键进行两次判断获取按键实际状态按下或松开。若检测到按键按下则延时一定时间如10ms再次获取按键状态若按键仍为按下则按键按下否则可认为是扰动。boolkeyRead(void){if(KEY1){DelayMs(10);if(KEY1){returntrue;}}returnfalse;}该方法在保护电阻R1阻值较小时效果较好不依赖滤波电容也可以获取准确的按键状态。2、多次延时消抖软件滤波的另一种方法以较小的间隔对按键多次采样若采样结果一致则为正确的按键状态。比如以1ms的间隔对按键连续采样8次。boolkeyRead(void){uint8_t i;uint8_t key0;for(i0;i8;i){key|(KEY0x1)i;}if(key0xff){returntrue;}returnfalse;}在保护电阻R1较大时低功耗产品该方法感觉效果较好些。