利用定时器中断轮询实现单个按键长按单击双击逻辑
今天偶然想到的,使用轮询实现长按单击双击逻辑。定时器初始化为10ms中断,每次外部中断触发之后,轮询50次,也就是500ms,然后将每次轮训的结果输出为一个50位的数组,通过遍历比较判断数组中1→0的变化次数,1次变化,输出为单击,两次及以上,输出为双击。如果0次1→0变化,则再次轮训50次,再次遍历比较,如果依然为0次1→0转换,则输出为长按,可以联动电源标识符,用^=运算翻转。
虽然比有限状态机对CPU时间使用更多,但代码结构更清晰,逻辑简单,易于理解。
本人是代码新手,这个逻辑还没有写出代码,希望和大家共同完成。
我使用的是触摸芯片,自带消抖,所以不需要软件消抖。
但话说回来,10ms的轮询间隔应该已经足够消抖了。
李硕 发表于 2025-6-22 22:04
我使用的是触摸芯片,自带消抖,所以不需要软件消抖。
但话说回来,10ms的轮询间隔应该已经足够消抖了。
...
但是又不得不考虑10ms检测时间会不会导致漏检?
我使用的是触摸按键,所以低电平持续时间比较久,
但是机械按键的话,确实需要考虑漏检的问题
https://www.stcaimcu.com/forum.p ... id=15176&pid=160764
程序可从下面下载:
李硕 发表于 2025-6-22 22:04
我使用的是触摸芯片,自带消抖,所以不需要软件消抖。
但话说回来,10ms的轮询间隔应该已经足够消抖了。
...
具体那款 触摸MCU, 原理图的PDF贴上来,大家帮分析 李硕 发表于 2025-6-22 22:20
但是又不得不考虑10ms检测时间会不会导致漏检?
我使用的是触摸按键,所以低电平持续时间比较久,
但是机 ...
使用10ms间隔扫描按键不会出现漏检,我一般使用20ms,可以避开抖动,也不会漏检。 判断按键按下、释放、长按、双击,其实不用不那么复杂。我常用如下逻辑:
按20ms扫描按键状态,统一按正逻辑:按下为1,不按下为0。
每次扫描都判断与上一次状态是否相等,相等则继续西面处理,不等(抖动)则退出。
判断上升沿(按下)或下降沿(释放),并根据与上一次按下或释放的计时判断双击,同时重置双击计时。
按下计时,到达一定时间(比如1秒)则长按有效。
可以做一个按键检测状态机,在检测按键释放的状态下如果保持超时则触发长按,如果检测到按键释放则开一个双击窗口时间检测,时间窗口内再次按相同的键则触发双击。
安富莱有个按键驱动,和你原理类似,利用定时器。实现了按键 按下,弹起,单击,双击,长按连续触发,还有组合键。很有意思。。可以去找找,,移植移植。{:jie:}
页:
[1]