找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2643|回复: 7
收起左侧

请问单片机怎么用延时做按键长按延时?

[复制链接]
ID:644190 发表于 2019-11-21 22:35 | 显示全部楼层 |阅读模式
大神们你们好,本人单片机新手,在做万年历的时候为了节省一个按键,想把加的那个按键,做成功能是:单次按下只加一次,长按开始快速递增,但是只能做出来前半部分功能,关于这个功能的代码如下:
        if(i==333)
                  {        if(KEY2==1)
                          {
                                  i=0;
                          }
                  
                          goto j;
                  }
                else
                  {
                    while(!KEY2)
                    {
                     delay(5);
                     i++;                    }
                  }

j :{;}

求解答,问题比较白痴,希望不要笑话哈哈,感谢大家
回复

使用道具 举报

ID:25310 发表于 2019-11-22 08:06 | 显示全部楼层
检测时给个时间比如超过300mS算长按,小于300算短按。操作时再调整.
回复

使用道具 举报

ID:158375 发表于 2019-11-22 08:33 | 显示全部楼层
按键是怎么扫描,怎么消小抖的呢?

如果是用定时器方式,很好办的;确认按键位置后,时间长短根据进中断次数即可区分长按键和短按键。
回复

使用道具 举报

ID:644141 发表于 2019-11-22 09:05 | 显示全部楼层
用状态机进行扫描
回复

使用道具 举报

ID:470332 发表于 2019-11-22 09:11 | 显示全部楼层
你这按键问题比较大呀
回复

使用道具 举报

ID:592807 发表于 2019-11-22 09:12 | 显示全部楼层
if(i== 300)然 厚if(KEY2 ==1)i=0  
else whlle(!KEY2){ i++}

你的定义的变量  i  是什么?是按键时间还是计数器
回复

使用道具 举报

ID:213173 发表于 2019-11-22 10:31 | 显示全部楼层
给你一个长、短按键示例参考。
  1. #include <REG51.H>
  2. #define uint unsigned int                         //宏定义数据类型uint
  3. #define uchar unsigned char                 //宏定义数据类型uchar
  4. #define key_S 500                                        //宏定义短按(约20ms)
  5. #define key_L 16000                                        //宏定义长按(约2/3s)
  6. #define key_M 11000                                        //宏定义长按间隔(约1/3s)
  7. sbit key1=P3^6;                                                //加键
  8. sbit key2=P3^7;                                                //减键
  9. uchar num=1;

  10. void keyscan()                                                //按键扫描
  11. {
  12.         static uint count1=0,count2=0;        //计数变量
  13.         if(!key1)   
  14.         {  
  15.                 count1++;  
  16.                 if(count1>=key_L)                        //长按
  17.                 {
  18.                         if(num<255)
  19.                                 num++;        
  20.                         count1=key_M;
  21.                 }
  22.         }  
  23.         else                                                        //按键抬起
  24.         {  
  25.                 if(count1>key_S && count1<key_L)//短按
  26.                 {
  27.                         if(num<255)
  28.                                 num++;
  29.                 }
  30.                 count1=0;                                        //count清0
  31.         }   
  32.         if(!key2)   
  33.         {  
  34.                 count2++;  
  35.                 if(count2>=key_L)                        //长按
  36.                 {
  37.                         if(num>0)
  38.                                 num--;        
  39.                         count2=key_M;
  40.                 }
  41.         }  
  42.         else                                                        //按键抬起
  43.         {  
  44.                 if(count2>key_S && count2<key_L)//短按
  45.                 {
  46.                         if(num>0)
  47.                                 num--;
  48.                 }
  49.                 count2=0;                                        //count清0
  50.         }
  51. }

  52. void main()
  53. {
  54.         while(1)                                                //12MHz晶振主循环周期33~41us
  55.         {
  56.                
  57.                 keyscan();                                        //按键扫描
  58.                 P1=~num;                                        //LED低电平显示
  59.         }
  60. }
复制代码
回复

使用道具 举报

ID:123289 发表于 2019-11-23 10:59 | 显示全部楼层
1、别人的按键动作,你是无法延时的,因为你不能控制别人的手。
2、按键后是否响应却是你可以控制的。
3、检测到按键后,你就起动一个定时器,定时器动作后,你再响应按键的“动作需求”,这就OK了。当然你还要考虑中途取消等等问题,这是你需要做的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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