单片机按键扫描

  1 /***********************
  2 *检测是否有键按下
  3 *有返回1  键值 *da
  4 *没有返回0
  5 *可以是矩阵键盘,直接接IO的键盘,亦可为ADC键盘,就算是USB键盘也行
  6 *
  7 ************************/
  8 uint8_t KeyScan(uint8_t *da)
  9 {
 10     if(KEY1==0||KEY2==0||KEY3==0||KEY4==0)
 11     {
 12         if(KEY1==0)   *da=11;
 13         if(KEY2==0)   *da=12;
 14         if(KEY3==0)   *da=13;
 15         if(KEY4==0)   *da=14;
 16         
 17         return 1;
 18     }
 19     return 0;
 20     
 21 }
 22 /*****************************
 23 *扫描按键并返回按下时间
 24 *time = key_insure(&keyValue);
 25 *返回值  键按下的时间  
 26 **key_data 键值
 27 ***************************/
 28 uint16_t key_insure(uint8_t *key_data)
 29 {
 30     uint8_t error;
 31     static uint8_t tp=0,tp1=0,key,key_value=0;
 32     static uint16_t    cnt=0,cnt1=0;
 33     error = KeyScan(&key_value);
 34 
 35     if(tp==0)
 36     {
 37         if(error==1)//检测到第一次按下
 38         {
 39             tp =1;
 40             cnt = 0;/*若要判断长短按,cnt就是这参数,返回cnt就行*/
 41             cnt1 = 0;//
 42         }
 43     }
 44     else
 45     {
 46         if(error==0)
 47         {
 48             if(tp1==0)
 49             {
 50                 tp = 0;//开始新的扫描    
 51             }
 52             else
 53             {
 54 
 55                 if(cnt1<10000)
 56                 {
 57                     cnt1++;
 58                 }
 59             
 60                 if(cnt1>1)//持续松开,
 61                 {
 62                 
 63                     tp = 0;//重新开始扫描按下事件
 64 
 65                     if(key==key_value)
 66                     {
 67                         *key_data = key_value;
 68                         return cnt;
 69                     }
 70                     else 
 71                     {
 72                         return 0;                    
 73                     }
 74                 }
 75 
 76             }
 77         }    
 78         else
 79         {
 80             if(cnt<10000)
 81             {
 82                 cnt++;//
 83             }        
 84             if(cnt==1)//第一次采样   检测到第一次按下后 20ms
 85             {
 86                 key = key_value;
 87             }
 88             else if(cnt==2)//第二次采样  检测到第一次按下后 40ms
 89             {
 90                 if(key == key_value)
 91                 {
 92                     tp1 = 1;    
 93                 }
 94                 else
 95                 {
 96                     tp = 0;//重新开始扫描按下事件
 97                     return 0;
 98                 }
 99             }
100 //            else if(cnt>3)//这里是支持长按连续输出键值的代码
101 //            {
102 //                tp = 0;//重新开始扫描按下事件
103 //                cnt = 0;/*若要判断长短按,cnt就是这参数,返回cnt就行*/
104 //                cnt1 = 0;//
105 //                if(key==key_value)
106 //                {
107 //                    return 1;
108 //                }
109 //                else 
110 //                {
111 //                    return 0;                    
112 //                }    
113 //            }            
114         }
115     }
116     return 0;
117 }    

转载于:https://www.cnblogs.com/0713tanic/p/6651141.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值