打印
[PIC®/AVR®/dsPIC®产品]

如何实现单击,双击,三连击,以及长按检测呢?

[复制链接]
351|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiekou001|  楼主 | 2024-3-24 13:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机的IO按键如何实现单击,双击,三连击,以及长按检测呢?
有没有简单成熟的方法,求分享。

使用特权

评论回复
沙发
问天少年| | 2024-3-25 10:49 | 只看该作者
在单片机应用开发中,实现单个IO按键上的单击、双击、三连击及长按检测通常需要一套综合的软件算法,结合硬件中断或周期性查询的方式监测按键状态变化。以下是一个通用的设计思路:

思路概览:
硬件准备:

使用外部中断(下降沿或上升沿)感知按键按下事件,以减少软件查询次数,提高响应速度。
对于精确的时间间隔测量,可以启用内部定时器。
软件设计:

按键消抖:消除机械按键触点抖动的影响,通常设置一个短暂延时(如5ms)来确认按键状态稳定。

状态变量:

定义变量记录按键状态(如lastPressTime记录上次按键按下时间,pressCount记录连续按下的次数,longPressTimer用于长按计时等)。
事件检测流程:

单击:按键按下后迅速弹起,在两次按键间隔大于预设单击阈值(例如500ms)时,计数为1次单击。
双击:在单击阈值内再次检测到按键按下并释放,计为双击。
三连击:在单击阈值内第三次检测到按键按下并释放,计为三连击。
长按:若按键一直保持按下状态,且持续时间超过预设的长按阈值(例如2秒),则判定为长按。
实现逻辑:

当检测到按键按下事件时,启动定时器,并重置按键计数器。
按键未释放前,定时器不断更新,比较当前时间与初始按下时间,判断是否达到长按条件。
若按键在较短时间内释放并再次按下,累加按键计数器,根据计数器的值来判断是单击、双击还是三连击。
若按键释放后等待时间超出单击阈值,则清零计数器,准备下一轮按键检测。

使用特权

评论回复
板凳
lcczg| | 2024-3-25 15:02 | 只看该作者
这个要定时器功能了。

使用特权

评论回复
地板
chenqianqian| | 2024-3-25 21:54 | 只看该作者
检测按键按下的持续时间长短来决定。

使用特权

评论回复
5
田舍郎| | 2024-3-25 22:50 | 只看该作者
还有长按开机,长按关机

使用特权

评论回复
6
CoolSilicon| | 2024-3-26 10:38 | 只看该作者
纯软件, 或者算法来解决了..
短按,长按, 双击的时间都是自定义的.

使用特权

评论回复
7
t1ngus4| | 2024-3-26 15:19 | 只看该作者
这网上不是有很多这方面的资料么

使用特权

评论回复
8
zhizia4f| | 2024-3-26 16:25 | 只看该作者
你可以去GitHub上看看,然后自己移植一下就行了

使用特权

评论回复
9
suw12q| | 2024-3-26 17:39 | 只看该作者
你自己做都可以,就是用定时器检测长按,双击等等

使用特权

评论回复
10
p0gon9y| | 2024-3-26 19:00 | 只看该作者
这个不费劲的,逻辑就是用定时器来判断IO是否被触发按下等等

使用特权

评论回复
11
q1d0mnx| | 2024-3-26 20:04 | 只看该作者
长按的话可以这么理解,就是定时器3秒,三秒之后还有IO按下就算是长按,其他亦然

使用特权

评论回复
12
q1ngt12| | 2024-3-26 21:10 | 只看该作者
单击就是普通的IO按键呗,双击就是加个标记呗

使用特权

评论回复
13
l1uyn9b| | 2024-3-27 09:08 | 只看该作者
长按比较简单吧,就是短按就麻烦了

使用特权

评论回复
14
w2nme1ai7| | 2024-3-27 10:17 | 只看该作者
你梳理一下这几个按键的按下的特色呗,就用这个区分就好了

使用特权

评论回复
15
cen9ce| | 2024-3-27 12:01 | 只看该作者
三连击的话就是双击的嵌套版本呗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

120

主题

1253

帖子

2

粉丝