在按下按键的时候,在闭合和断开的瞬间有一连串的抖动。
这样一次按下的动作可能会触发很多次。
所以,当检测到按键状态变化时,不是立即去响应动作,而是先等待闭合或断开稳定后再进行处理。 按键消抖可分为硬件消抖和软件消抖。
消除抖动有软件和硬件两种方法。
通常我们用软件消抖。
最简单的消抖原理,就是当检 测到按键状态变化后,先等待一个 10ms 左右的延时时间,让抖动消失后再进行一次按键状 态检测,如果与刚才检测到的状态相同,就可以确认按键已经稳定的动作了。
但是。
当我们的工程庞大的时候,这种的方法就会出现某些问题。
while(1) 这个主循环要不停的扫描各种状态值是否有发生变化,及时的进行任务调度,如果程序中间 加了这种 delay 延时操作后,很可能某一事件发生了,但是我们程序还在进行 delay 延时操作 中,当这个事件发生完了,程序还在 delay 操作中,当我们 delay 完事再去检查的时候,已经 晚了,已经检测不到那个事件了。
就出现了按键消抖的优化:
启用定时器中断,每 2ms 进一次中断,扫描 一次按键状态并且存储起来,连续扫描 8 次后,看看这连续 8 次的按键状态是否是一致的。 8 次按键的时间大概是 16ms,这 16ms 内如果按键状态一直保持一致,那就可以确定现在按 键处于稳定的阶段,而非处于抖动的阶段。
这样就会避免delay占用单片机程序执行时间。
而是变成了按键状态判定,而不是按键过程判定。
这只是按键消抖算法之一。
下面是矩阵按键的扫描:
通常我们会先把列线拉高把行线拉低,然后等待按键按下判断那一列被拉低,用switch语句记录key值。
再把行线拉高把列线拉低,等待行线的值变换,然后记录key值,两个key值相加,得到最后的key值。
原文:https://www.cnblogs.com/Brimon-zZY/p/14051883.html