• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

关于按键长按短按检测

瞩目人kri 2019-02-28 浏览量:973

每次只能检测到短按,长按检测不了,请问是什么原因呢?

微信图片_20190228234056.png

微信图片_20190228234117.png

微信图片_20190228234123.png

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 你看看你的longkeytemp的定时类型,我怀疑你定义的是char类型,因为值大于了128,所以又会从0开始计数,永远达不到150,应该将数据定义成int型或者是unsigned char类型,不知道我说的对不对,你可以先看一下。如果数据类型定义没有问题的话,最好的是仿真调试一下,看看这个变量为什么不会再增大,建议你再在longkeytemp后面再加一句if(longkeytemp >=200)   longkeytemp = 200;

    给他增加一个上限,不然可能会导致变量增加的太大溢出了。

    • 发布于 2019-03-01
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:14
  • 你keybuf和keyflag定义在什么地方?

    而且感觉你的逻辑都有问题,检测按键需要用到中断吗?

    还不如直接在你的while循环中完成。

    • 发布于2019-03-01
    • 举报
    • 评论 1
    • 0
    • 0
瞩目人kri 回复了 xdsnet :定义在定时器头文件了,因为要检测长按与短按所以用了定时器中断去计数判断按下的时间 回复

  • 你可以参考原子的例程里面keyscan函数,直接移植过来用
    • 发布于2019-03-01
    • 举报
    • 评论 1
    • 0
    • 0
瞩目人kri 回复了 yhj416606438 :我就是移植了原子的keyscan只是稍作修改 回复

  • 主循环中通过KEY_SCAN判断是KEY0还是KEY1按下;同时定时器每5ms中断一次,如果按键还处于按下状态就长按键暂存值+1;在3到100之间,是短按;150以上是长按。

    看下来,觉得逻辑没问题,我都怀疑是不是你LED0的硬件管脚配置错了。另外,不知道是有意为之,还是逻辑问题,100-150之间的longkeytemp值是无效状态,这个不好。


    • 发布于2019-03-01
    • 举报
    • 评论 1
    • 0
    • 0
瞩目人kri 回复了 请输入用户名 :谢谢你,我试过设置为大于20就判断为长按,把短按判断去掉,但是LED还是不亮。LED设置没问题,可以连灭的 回复

  • 程序懒得看。大概这么个意思,是不是只检测了电平,它一检测到电平就立即操作,你没有时间判断是吧
    • 发布于2019-03-01
    • 举报
    • 评论 0
    • 0
    • 0

  • 程序结构有些混乱,定时器只管定时做个计数就好了,不要在这里去检测IO状态。在主循环里检测按键时长。
    • 发布于2019-03-01
    • 举报
    • 评论 0
    • 0
    • 0

  • 具体问题是长按会误检测短按吗?

    你试过跟踪你的longkeytemp没有,长按的结果是什么呢?

    • 发布于2019-03-01
    • 举报
    • 评论 0
    • 0
    • 0

  • 仿真看下呢,看看longkeytemp会不会增长不对。大致看了下,感觉逻辑没啥问题。
    • 发布于2019-03-01
    • 举报
    • 评论 0
    • 0
    • 0

  • 程序逻辑感觉没错。可以都贴上来看看,或者你仿真追踪下。
    • 发布于2019-03-01
    • 举报
    • 评论 0
    • 0
    • 0

  • 是不是你的长按定时太短被当作短按了!
    • 发布于2019-03-01
    • 举报
    • 评论 0
    • 0
    • 0

  • 建议你参考这个程序-安富莱的按键检测代码。这个是我见到过最经典的按键检测方式。

    我也将这种方式用到了我的项目中。

    【安富莱STM32-V6开发板试用体验】+1.STM32F429之经典按键检测
    http://bbs.icxbk.com/thread-102588-1-1.html
    (出处: ICKEY BBS)



    • 发布于2019-03-01
    • 举报
    • 评论 0
    • 0
    • 0

  • 在硬件仿真状态下面看一下,长按的时候那个标志是否有异常
    • 发布于2019-03-03
    • 举报
    • 评论 0
    • 0
    • 0

  • 思路   按键按下  计时   定时器计数次数大于X  长按  
    • 发布于2019-03-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 长按时,时间长了之后,要把短按的标志位清掉才可以的
    • 发布于2019-03-17
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

关于按键长按短按检测