找回密码
 立即注册
查看: 179|回复: 17

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

[复制链接]
  • TA的每日心情
    开心
    半小时前
  • 签到天数: 150 天

    [LV.7]常住居民III

    39

    主题

    420

    回帖

    2260

    积分

    荣誉版主

    积分
    2260
    发表于 2024-5-16 15:36:26 | 显示全部楼层 |阅读模式
    本帖最后由 王昱顺 于 2024-5-17 11:13 编辑

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

    这就完成了上升沿和下降沿的识别,那么长按和双击此时也变得很简单了。
    先贴一下代码:
    1. <font size="5">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. }</font>
    复制代码

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

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

    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:58
  • 签到天数: 96 天

    [LV.6]常住居民II

    13

    主题

    53

    回帖

    182

    积分

    注册会员

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

    点评

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

    使用道具 举报

  • TA的每日心情
    开心
    半小时前
  • 签到天数: 150 天

    [LV.7]常住居民III

    39

    主题

    420

    回帖

    2260

    积分

    荣誉版主

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:58
  • 签到天数: 96 天

    [LV.6]常住居民II

    13

    主题

    53

    回帖

    182

    积分

    注册会员

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

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

    点评

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

    使用道具 举报

  • TA的每日心情
    无聊
    9 小时前
  • 签到天数: 184 天

    [LV.7]常住居民III

    10

    主题

    316

    回帖

    1208

    积分

    金牌会员

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

    使用道具 举报

  • TA的每日心情
    慵懒
    2 小时前
  • 签到天数: 201 天

    [LV.7]常住居民III

    26

    主题

    976

    回帖

    2510

    积分

    金牌会员

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

    点评

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

    使用道具 举报

  • TA的每日心情

    昨天 07:16
  • 签到天数: 104 天

    [LV.6]常住居民II

    4

    主题

    551

    回帖

    1545

    积分

    金牌会员

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

    使用道具 举报

  • TA的每日心情
    无聊
    3 小时前
  • 签到天数: 180 天

    [LV.7]常住居民III

    18

    主题

    536

    回帖

    1418

    积分

    金牌会员

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

    使用道具 举报

  • TA的每日心情
    开心
    2 小时前
  • 签到天数: 138 天

    [LV.7]常住居民III

    11

    主题

    666

    回帖

    1209

    积分

    金牌会员

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

    使用道具 举报

  • TA的每日心情
    开心
    2 小时前
  • 签到天数: 169 天

    [LV.7]常住居民III

    21

    主题

    1249

    回帖

    3043

    积分

    论坛元老

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-6-16 10:29 , Processed in 0.079653 second(s), 73 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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