找回密码
 立即注册
查看: 1372|回复: 34

三行又四行,简单实现长按双击识别

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2024-5-16 15:36:26 | 显示全部楼层 |阅读模式
前段时间里,论坛曾经研究过一个三行代码实现按键识别的帖子,近来研究双击和长按的时候,心血来潮研究了一下。成功实现了一种非常简单的双击和长按识别,其中,按键识别占用四行,双击和长按的逻辑占用四行。
首先,我们分析一下双击和长按的逻辑,长按即是按下按键后超过了某一个时间,双击则是在单击后的某一段时间内,再次按下按键。所以,如果追求响应速度的话,单击和双击必然是识别冲突的,这里建议只保留双击功能,否则第一下肯定会识别为单击,处理不好甚至会造成逻辑混乱。
在上面的逻辑里面,我们不仅仅需要获取到按键按下的边沿,还需要获取到按键抬起的边沿。
所以,我们需要对代码做一些小小的改动。
代码部分:
先贴一下代码:
  1. val = Get_Key();
  2.             down = val & (val ^ old);
  3.             up = old & (val ^ old);
  4.             old = val;
复制代码
这里,我们通过get_key()函数获取了本次按下的键值(这里是矩阵键盘和独立按键都可以,只需要返回对应的数字就可以了)
然后,我们使用(val^old)进行边沿检测,如果两次一次为0一次为有效数字,则会返回一个有效数字。然后通过val&(val^old)对当前值进行比较,如果当前值为val(从0到val),则判断为上升沿,如果上次为有效数字,即从val到0,则为下降沿,实现代码为:old&(val^old)

这就完成了上升沿和下降沿的识别,那么长按和双击此时也变得很简单了。
先贴一下代码:
  1. u32 l_key = 0, d_key = 0;
  2. if (down == 9)
  3. {
  4.     l_key = time;
  5.     if (time - d_key < 200)
  6.         Mode = Tmp_Mode;
  7. }
  8. if (up == 9)
  9. {
  10.     if (time - l_key > 500)
  11.         Mode = UART_Mode;
  12.     else
  13.         d_key = time;
  14. }
复制代码

这里,down是按下边沿的键值,up是抬起边沿的键值,time为u32大小的1ms自加值。
当按键按下的时候,保存一次当前的时间戳。抬起的时候,判断第一次按下的时间戳和当前是的差值,如果大于500ms,则判定为长按。
此时保存一次抬起时间戳,如果有第二次按下时,发现距离上次抬起时间小于200ms(时间较短),则可以判断为双击。
如果想要拓展为多个按键的双击和长按,可以对l_key和d_key拓展为数组形式,对每个按键进行分别存储。
双击和长按实现,核心代码只需要四行即可,并且继承了三行代码按键识别的优点,判断边沿,自带消抖。

这里放一下完整的代码程序,适合大部分的官方开发板,使用P32作为按键,每次长按取反P20口,每次双击取反P21口
双击和长按实现代码.zip (5.6 KB, 下载次数: 150)
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:385
  • 最近打卡:2025-05-01 08:05:45

25

主题

113

回帖

725

积分

高级会员

积分
725
发表于 2024-5-16 16:55:05 | 显示全部楼层
没有完整代码看不懂

点评

稍等我整理一下发个完整的代码  详情 回复 发表于 2024-5-16 18:02
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2024-5-16 18:02:40 | 显示全部楼层
zhang*** 发表于 2024-5-16 16:55
没有完整代码看不懂

稍等我整理一下发个完整的代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:385
  • 最近打卡:2025-05-01 08:05:45

25

主题

113

回帖

725

积分

高级会员

积分
725
发表于 2024-5-16 23:14:07 | 显示全部楼层
王*** 发表于 2024-5-16 18:02
稍等我整理一下发个完整的代码

谢谢 共同学习。三行经典代码的帖子是我发的。双击和长按没有研究透

点评

欢迎交流,完整程序已发  发表于 2024-5-17 11:14
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:449
  • 最近打卡:2025-04-30 10:57:37

17

主题

533

回帖

1326

积分

金牌会员

积分
1326
发表于 2024-5-17 03:13:30 | 显示全部楼层
贴下完整的代码 烧录研究下
自信就会温和,温和就会坚定!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:518
  • 最近打卡:2025-05-01 05:52:49
已绑定手机

46

主题

1694

回帖

2540

积分

金牌会员

积分
2540
发表于 2024-5-17 06:52:23 | 显示全部楼层
这种如果要检测多个输入信号的状态该怎么处理,比如上升沿,下降沿啥的

点评

正常的按键识别程序,是检测到按键以后直接return返回了,如果想要检测多个,可以在每次检测的时候都进行一次记录,不进行return返回就可以了  详情 回复 发表于 2024-5-17 11:16
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:395
  • 最近打卡:2025-05-02 05:31:55

16

主题

702

回帖

2474

积分

金牌会员

积分
2474
发表于 2024-5-17 07:20:41 | 显示全部楼层
希望楼主加上双击和长按
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:484
  • 最近打卡:2025-05-01 08:52:01
已绑定手机

23

主题

589

回帖

2813

积分

金牌会员

积分
2813
发表于 2024-5-17 08:08:06 | 显示全部楼层
牛啊,{:5_332:}学习了
不停地学习
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:452
  • 最近打卡:2025-05-01 06:20:50
已绑定手机

13

主题

1257

回帖

2971

积分

金牌会员

积分
2971
发表于 2024-5-17 08:22:12 | 显示全部楼层
期待完整、完美代码分享
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-5-17 09:43:11 | 显示全部楼层
组合键 研究研究
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 06:38 , Processed in 0.157047 second(s), 114 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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