基于stm32的4X4矩阵键盘定时器扫描消抖法,彻底告别delay函...

2019-12-10 18:27发布

以前的消抖总是采用delay延时约10到20ms的时间,但这样会导致MCU在延时里空跑而造成主程序被搁置,显然,程序的实时性大打折扣。矩阵键盘定时器扫描消抖法。感谢CSDN的可爱虎朋友。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
84条回答
彪悍的飞翔
1楼-- · 2019-12-11 10:19
矩阵键盘上加个电容就好了,不用delay
0123456789
2楼-- · 2019-12-11 14:22
 精彩回答 2  元偷偷看……
afeionline
3楼-- · 2019-12-11 18:16
本帖最后由 afeionline 于 2014-7-24 20:56 编辑

从来都不用delay的飘过。定时扫描+状态机最有效,也很方便
dongjiren2012
4楼-- · 2019-12-11 21:55
afeionline 发表于 2014-7-24 20:46
从来都不用delay的飘过。定时扫描+状态机最有效,也很方便

来一个定时扫描+状态机的例程呗,我不太懂状态机
afeionline
5楼-- · 2019-12-11 23:29
本帖最后由 afeionline 于 2014-7-25 22:53 编辑

好久不写代码了,之前最完整的程序找不到了,只找到了简单的,供参考。
说一下思路吧,这个倒是记得。
先说矩阵扫描的思路,也就是状态机转换。
按键分为未按下,按下一次(不确认按下是否有效,需消抖),按下(有效按下),持续按下,抬起一次(需消抖),抬起(也就是未按下),总共5种有效状态,分别标记为状态0~4,状态转移图如下图。

对绝大多数矩阵键盘来说,只允许同时按下一个按键,如果同时按下多个键,则以扫描到的第一个键为准,这个是前提。
由于人按键的速度是有限的,即使狂按同一个按键,每秒按键次数通常也不超过10次,因此只要在100ms内完成5次完整的矩阵扫描就保证不会有漏检的情况。比如4*4矩阵键盘,5ms扫描一列,20ms刚好扫描完一个状态,100ms可以扫描5次。
定时扫描有两种方式,一种是每隔固定时间在timer中断里直接扫描矩阵键盘的其中一行;另一种是在timer中断里定时打开一个信号量,在主函数while(1)循环中检查信号量,有效则扫描一行。
需要调用键盘的函数只需要检查按键值即可,在有效值范围内则认为按键有效,执行相应操作。
dongjiren2012
6楼-- · 2019-12-12 01:46
好的,谢谢了,一会儿研究研究

一周热门 更多>