找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7384|回复: 12
收起左侧

请问:怎么才能实现只用一个按键,实现单击,双击,三击,长按功能

  [复制链接]
ID:91521 发表于 2018-10-27 11:30 | 显示全部楼层 |阅读模式
项目中要用到只用一个按钮,实现单击、双击、三击及长按功能,没有思路,百思不得其解。各位高手可不可以提供方法,能有代码参考更好不过了。
回复

使用道具 举报

ID:416822 发表于 2018-10-28 19:26 | 显示全部楼层
需要  2字节数据空间 【  1、相同结果扫描次数(字节1)    2、有效按入次数 (字节2) 】1个位空间   【 1、上次扫描结果(位1) 】 1个定时器及中断;也可根据自己的程序另行安排,就是定期检查按钮按入情况。
使用计数器配合使用   定时扫描按钮改变情况   设 按入为0    弹开为1   接下来需要完成如下工作:
1、去抖动, 通过(位1)记录上次扫描结果,本次扫描结束存本次结果 。 当本次结果与上次结果相同 (字节1)记录结果持续次数加1。次扫描与上次不相同则清零。
2,当(字节1)记录结果持续次数到“定值一”(定值一为立即数,自己定数值越大去抖动效果越好,但按键响应时间越长,与双击冲突,建议调试看效果定)表示去抖动有效。(字节1)记录结果持续次数到定值二(相比定值一,数字更大)表示到长有效时间。在这里就会有两个出口,一个是到定值一,一个是到定值二。每个在加上检查扫描结果(按键是按入,还是弹出)一共出来4个出口。
按重要程度一一列出:  A、 按键扫描为弹开,(字节1)记录结果持续次数到定值二读取结果输出(结束,正常情况永远会出现) 读取有效按入次数 (字节2),并判断其值。(1、单击;2、双击;3、三击;4、。。。。。。。当大于16表示长安键)注意:在这里需要给下次工作初始化(清零有效按入次数 (字节2)) B、按键弹开,到定值一,等待和观望。(没有再按入就会到前一种情况) C、按键按入,到定值一,有效按入次数 (字节2)加1  D、按键按入,到定值二。直接设置有效按入次数 (字节2)为17以上;(并可以长按预先出口;提示在长安了,或者发音告诉操作者,现在是长按了。)。

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:123289 发表于 2018-10-29 09:34 | 显示全部楼层
先定义一下什么是“单击、双击、三击及长按”,而后依定义写程序就OK了,无非是加几个计时、计次寄存器而矣,最后用4个标志分别表示:单击、双击、三击、长按,则大功告成。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:310519 发表于 2018-10-28 12:33 | 显示全部楼层
检测到按键时,延时一段时间,期间如果没有再检测到按键,就是按了一下;

如果延时期间内再检测到按键,重新延时,期间如果没有再检测到按键,就是按了两下;

以此类推,长按就不用说了吧?

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:393131 发表于 2018-10-28 13:38 | 显示全部楼层
最好用脉宽捕捉的方式

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:416683 发表于 2018-10-28 15:09 | 显示全部楼层
设置2个时间检测,按下时启动T0,松开后启动T1并复位T0。T1启动后预设时间内再次检测到按下的信号判定为双击,松开后复位重新计时,再次检测到按下信号判断为三击,以此类推,松开后超出T1预设则输出对应的按下次数,同时复位。TO到达预设值后,则输出长按,并复位。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:111634 发表于 2018-10-28 16:02 | 显示全部楼层
本帖最后由 zl2168 于 2018-10-28 20:16 编辑

给你介绍2个案例,能实现单击、双击、三击及长按功能。
Proteus仿真一下,确认有效。
实例93  99.9秒秒表
实例95 99.9秒秒表.rar (38.86 KB, 下载次数: 50)
回复

使用道具 举报

ID:480256 发表于 2019-5-8 10:56 | 显示全部楼层
现在实现了吗?
回复

使用道具 举报

ID:512205 发表于 2019-5-8 12:53 | 显示全部楼层
三楼说的有道理,首先你是怎么定义“单击、双击、三击及长按”的.
1.如果是定义在一定时间内来判断,那么就用延时的方法来判断. 比如按键按下超过2秒后松开后只记到一次的话,那么就是长按. 记到3次的话就为3击,记到2次为松紧.  如果按键按下时间小于2秒只记到一次的话,那么就叫短按.
2.如果是不考虑时间周期,只是记第几次的话,那么用7楼的第一种方案即可.
回复

使用道具 举报

ID:91521 发表于 2020-5-30 16:48 | 显示全部楼层

没呢,还没有实现!
回复

使用道具 举报

ID:401564 发表于 2020-5-30 17:02 | 显示全部楼层
这玩意都快两年了,还没有实现
两年时间足够学一门编程语言了,更不用说某个功能而已,难不成你一直在等别人的代码?
回复

使用道具 举报

ID:732506 发表于 2020-5-30 22:16 | 显示全部楼层
控制逻辑不合理,即便能实现,也会有较多误动作,可靠性无法保证。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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