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