找回密码
 立即注册
查看: 106|回复: 8

利用定时器中断轮询实现单个按键长按单击双击逻辑

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-06-27 22:35:18
已绑定手机

3

主题

8

回帖

57

积分

注册会员

积分
57
发表于 6 天前 | 显示全部楼层 |阅读模式
今天偶然想到的,使用轮询实现长按单击双击逻辑。
定时器初始化为10ms中断,每次外部中断触发之后,轮询50次,也就是500ms,然后将每次轮训的结果输出为一个50位的数组,通过遍历比较判断数组中1→0的变化次数,1次变化,输出为单击,两次及以上,输出为双击。如果0次1→0变化,则再次轮训50次,再次遍历比较,如果依然为0次1→0转换,则输出为长按,可以联动电源标识符,用^=运算翻转。
虽然比有限状态机对CPU时间使用更多,但代码结构更清晰,逻辑简单,易于理解。
本人是代码新手,这个逻辑还没有写出代码,希望和大家共同完成。

原理框图

原理框图
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-06-27 22:35:18
已绑定手机

3

主题

8

回帖

57

积分

注册会员

积分
57
发表于 6 天前 | 显示全部楼层
我使用的是触摸芯片,自带消抖,所以不需要软件消抖。
但话说回来,10ms的轮询间隔应该已经足够消抖了。

点评

具体那款 触摸MCU, 原理图的PDF贴上来,大家帮分析  详情 回复 发表于 6 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-06-27 22:35:18
已绑定手机

3

主题

8

回帖

57

积分

注册会员

积分
57
发表于 6 天前 | 显示全部楼层
李*** 发表于 2025-6-22 22:04
我使用的是触摸芯片,自带消抖,所以不需要软件消抖。
但话说回来,10ms的轮询间隔应该已经足够消抖了。
...

但是又不得不考虑10ms检测时间会不会导致漏检?
我使用的是触摸按键,所以低电平持续时间比较久,
但是机械按键的话,确实需要考虑漏检的问题

点评

使用10ms间隔扫描按键不会出现漏检,我一般使用20ms,可以避开抖动,也不会漏检。  详情 回复 发表于 5 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-06-28 08:54:08

740

主题

1万

回帖

1万

积分

管理员

积分
17147
发表于 6 天前 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:111
  • 最近打卡:2025-06-28 08:54:08

740

主题

1万

回帖

1万

积分

管理员

积分
17147
发表于 6 天前 | 显示全部楼层
李*** 发表于 2025-6-22 22:04
我使用的是触摸芯片,自带消抖,所以不需要软件消抖。
但话说回来,10ms的轮询间隔应该已经足够消抖了。
...

具体那款 触摸MCU, 原理图的PDF贴上来,大家帮分析
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-06-28 00:08:16

75

主题

6163

回帖

1万

积分

超级版主

积分
12930
发表于 5 天前 | 显示全部楼层
李*** 发表于 2025-6-22 22:20
但是又不得不考虑10ms检测时间会不会导致漏检?
我使用的是触摸按键,所以低电平持续时间比较久,
但是机 ...

使用10ms间隔扫描按键不会出现漏检,我一般使用20ms,可以避开抖动,也不会漏检。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-06-28 00:08:16

75

主题

6163

回帖

1万

积分

超级版主

积分
12930
发表于 5 天前 | 显示全部楼层
判断按键按下、释放、长按、双击,其实不用不那么复杂。我常用如下逻辑:
按20ms扫描按键状态,统一按正逻辑:按下为1,不按下为0。
每次扫描都判断与上一次状态是否相等,相等则继续西面处理,不等(抖动)则退出。
判断上升沿(按下)或下降沿(释放),并根据与上一次按下或释放的计时判断双击,同时重置双击计时。
按下计时,到达一定时间(比如1秒)则长按有效。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:471
  • 最近打卡:2025-06-28 02:07:15
已绑定手机

38

主题

2243

回帖

2773

积分

荣誉版主

积分
2773
发表于 5 天前 | 显示全部楼层
可以做一个按键检测状态机,在检测按键释放的状态下如果保持超时则触发长按,如果检测到按键释放则开一个双击窗口时间检测,时间窗口内再次按相同的键则触发双击。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:471
  • 最近打卡:2025-06-27 10:50:20

33

主题

2437

回帖

5186

积分

论坛元老

积分
5186
发表于 4 天前 | 显示全部楼层
安富莱有个按键驱动,和你原理类似,利用定时器。实现了按键 按下,弹起,单击,双击,长按连续触发,还有组合键。很有意思。。可以去找找,,移植移植。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-28 22:35 , Processed in 0.543621 second(s), 100 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表