传统的处理方法:在第一次检测到有键按下时,执行一段延时 10ms 的子程序以后再确认该按键电平是否能保持闭合状态的电平,如果保持闭合状态电平,则确认为真正有键按下,从而消除抖动的影响。
个人感觉有两点弊端:
1. 传统的处理方法执行10ms 的延时子程序,会降低程序的实时性。
2. 传统的处理方法一次按键动作的确认,只检测两次,在高抗干扰环境下的会有按键的误动作。
提出一些建议,大家看看是否可行呢:
1. 建议弹跳时间为 100ms 才可有效通过 EFT 杂讯认证。
2. 建议主程序中连续检查 100ms 的稳定低电平才可认定按键按下成立。
3. 相同道理连续检查 100ms 高电平才可认定按键弹起。
4. 为了保证 MCU 的执行效率,按键的检测尽量不要使用 Delay 的方式,可以考虑采用轮询检测和计时器配合的方式进行。
方法如下:
在发现低电平后,我们每一个循环(时基)去读取一次电平,并与上次进行比较,若是相同则计数器加 1,直至达到足够的次数就进行处理,否则计数器清零,重新开始。

同时这也包含了分时处理的思想。

呵呵,我也从来没检测超过100ms 、30-50ms我觉得可以,100ms的确有点迟钝。这个可以调节。
说用其他程序段代替延时程序也可取,这个代替延时的程序段每次执行所花费的时间是固定的。
我的意思是用时基来计时 ,设定一个变量 cnt 假如程序的主时基是4ms的话当检测到按键按下的时候 inc cnt 下一个回圈再检测按键,如果还按下的话,cnt 再加一 ,当加到某个值的时候可以认为按键确实按下了这期间如果检测到又一次没按下,则clr cnt 重新开始。如果取cnt=10则消抖时间是10*4=40ms。
总结如下:
在定时中断里做一个1mS的公共时标,当有键按下时对这个公共时标计数,比如计数30,则再检查键状态,就比原先的操作方便多了,性能也稳定了不少!