数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2697|回复: 7

[C51] 求助朋友帮我看看这段单片机按键长按短按的代码

[复制链接]
发表于 2020-6-29 16:54:53 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
谢谢朋友帮我看看这段代码,我看了一下理解这是按键长按短按的代码?但不知道怎么调用合适,我想实现长按和短按的功能。
  1. static unsigned char p16key(void)
  2. {
  3.          static bit p16isLockKey=1;
  4.          unsigned char p16key_cnt=120;
  5.    if(!P16 && p16isLockKey)
  6.         {
  7.                 p16isLockKey = 0;
  8.                 do
  9.                 {
  10.                         p16key_cnt--;
  11.                         delay_ms(10);
  12.                 }while(!P16 && p16key_cnt>0);
  13.                 return p16key_cnt;
  14.         }
  15.         else if(P16)
  16.         {
  17.                 p16isLockKey = 1;
  18.         }
  19.         
  20.         return 0xFF;
  21. }
复制代码



下面这段是自己写的一段长按短按的代码,开始显示的时候要么停止了,只能按一下走一下。要么就是长按走动的数字位置不对,请也帮我看看。

  1. static unsigned char KeyScan(void)
  2. {
  3.         static bit isLockKey=1;
  4.         unsigned char key_cnt=120;
  5. /* unsigned int p=0;
  6.         
  7.         while(1)
  8.         {
  9.                 if(Vtemp<=99000)
  10.                 {        
  11.                  if(P16!=1)
  12.                 {
  13.                         p++;
  14.                         delay_ms(10);
  15.                         if(p>=50)
  16.                         {
  17.                                 Vtemp +=1000;
  18.                                 return 1;
  19.                   }
  20.           }
  21.                 else
  22.                 {
  23.                         if(P16!=1 && p<45)
  24.                   {
  25.                   Vtemp +=10;
  26.                         return 0;
  27.                   }
  28.           }
  29.           }
  30.   }
复制代码

  
发表于 2020-6-29 18:02:16 | 显示全部楼层
自己写的那段好像没有消抖,这样就容易误判

打赏

参与人数 1家元 +6 收起 理由
家睦 + 6 歡迎探討

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2020-6-29 18:52:16 | 显示全部楼层
子程序里面等待的时间最大到了1.2s......当单片机是自个用吗?:sweat:
用定时器,设标志位来判断长短按较好。上面的代码,作示范尚可,实际应用中不会这样干,否则别的程序就别想干活了
回复 支持 1 反对 0

使用道具 举报

发表于 2020-6-29 19:11:11 | 显示全部楼层
同意楼上,写代码千万别死等,会遇到各种问题,早晚都得改,可以用一个定时器专门做计时用,加个标志位,每次进定时器按下就加一,可以用来消抖也可以用来判断长短按
回复 支持 反对

使用道具 举报

发表于 2020-6-30 11:09:06 | 显示全部楼层
有带显示功能的程序不要用软件延时,长按短按的检测应该增加一个释放检测,就比较容易做了
回复 支持 反对

使用道具 举报

发表于 2020-6-30 11:47:00 来自手机浏览器 | 显示全部楼层
多次检测吧,程序循环一次,检测一次,检测到按下就累加个数,释放后判断累加的数,小于多少是短按,大于多少是长按,如果还有配合显示,那就从累加数上取巧。
回复 支持 反对

使用道具 举报

发表于 2020-6-30 13:23:14 | 显示全部楼层
可以同时实现一个按钮单击,双击,长按的代码
给楼主参考
https://github.com/jjbboox/GpioKeyEvent

只要把include中的.h文件放到工程里面就可以了。
不过是用Arduino写的,你自己看着改造就行了。

如何使用可以看一下main.cpp就行了。
回复 支持 反对

使用道具 举报

发表于 2020-6-30 13:45:19 来自手机浏览器 | 显示全部楼层
用计时器和中断,看我的帖子 https://www.mydigit.cn/forum.php?mod=viewthread&tid=147084&mobile=2
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-6-27 13:54 , Processed in 0.234001 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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