C51 COMPILER V9.51 KEY 03/07/2018 10:41:04 PAGE 1 C51 COMPILER V9.51, COMPILATION OF MODULE KEY OBJECT MODULE PLACED IN .\hex\key.obj COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE key.c OMF2 ROM(COMPACT) OPTIMIZE(9,SIZE) BROWSE DEBUG PRINT(.\lst\key.lst) -TABS(2) OBJECT(.\hex\key.obj) line level source 1 #ifndef _KEY_C_ 2 #define _KEY_C_ 3 4 /********************************************************************************************************* -************/ 5 #include "ca51f5_config.h" 6 #include "includes\ca51f5sfr.h" 7 #include "includes\ca51f5xsfr.h" 8 #include "includes\gpiodef_f5.h" 9 10 #include "Library\Includes\system_clock.h" 11 #include "Library\includes\uart.h" 12 #include "key.h" 13 #include "io.h" 14 /********************************************************************************************************* -************/ 15 #include "TS_Lib\Includes\ts_configuration.h" 16 #include "TS_Lib\Includes\ts_def.h" 17 #include "TS_Lib\Includes\ts_api.h" 18 #include "TS_Lib\Includes\ts_service.h" 19 /********************************************************************************************************* -************/ 20 21 /************************************************************************************************* 22 单键:以K1为例,K1按键产生的流程如下所示: 23 24 --> K1|KEY_BREAK(短按松开) 25 - 26 K1(按下)-- 27 - 28 --> K1|KEY_LONG_START(长按大约1秒)---> K1|KEY_LONG(一直长按,约每300ms产生长按键)---->K1|KEY_LONG_BR -EAK(长按松开) 29 ^ | 30 | | 31 |-----------------------------------------------| 32 33 复合键: 34 以K1(K1=0x0001),K2(K2=0x0002)为例, 当K1,K2同时按下时,产生按键为(K1<<5)|K2,即0x22, 产生按键的流程如下所 -示: 35 36 37 --> ((K1<<5)|K2)|KEY_BREAK(短按松开) 38 - 39 (K1<<5)|K2(按下)-- 40 - 41 --> ((K1<<5)|K2)|KEY_LONG_START(长按大约1秒)---> ((K1<<5)|K2)|KEY_LONG(一直长按,约每300ms产生长 -按键)---->((K1<<5)|K2)|KEY_LONG_BREAK(长按松开) 42 ^ | 43 | | 44 |---------------------------------------------------------| 45 注意:由于复合键按下时,软件不一定同时检测到双键,而是先检测到单键按下,例如先检测到K1,此时会先产生K1键, -等到检测到K2也按 46 下时,才会产生按键(K1<<5)|K2,检测到双键后,如果双键一直按下,会产生((K1<<5)|K2)|KEY_LONG_START和((K1<<5)| -K2)|KEY_LONG,如果 C51 COMPILER V9.51 KEY 03/07/2018 10:41:04 PAGE 2 47 有一个键先松手,会停止产生按键, 等到双键都松开时,才会产生((K1<<5)|K2)|KEY_BREAK(短按松开)或((K1<<5)|K2)| -KEY_LONG_BREAK(长按松开) 48 *************************************************************************************************/ 49 typedef struct 50 { 51 unsigned char TogKeyNum; 52 unsigned char TogKeyList[2]; 53 } 54 T_TogKeyInfo; 55 code unsigned char TS_KEY_TAB[]= 56 { 57 K1,K2,K3,K4,K5,K6,K7,K8,K9,K10,K11,K12,K13 58 }; 59 void TSKey_init(void) 60 { 61 1 TK_State = TK_STATE_RELEASE; 62 1 TS_Key = 0; 63 1 } 64 void TS_GetTogKeyInfor(T_TogKeyInfo *pKeyInfo) 65 { 66 1 unsigned char i,index; 67 1 pKeyInfo->TogKeyNum = 0; 68 1 index = 0; 69 1 for(i = 0; i < KEY_CH_COUNT; i++) 70 1 { 71 2 if(KeysFlagSN & MASK_TAB[i]) 72 2 { 73 3 pKeyInfo->TogKeyNum++; 74 3 75 3 if(pKeyInfo->TogKeyNum <= 2) 76 3 { 77 4 pKeyInfo->TogKeyList[index++] = TS_KEY_TAB[i]; 78 4 } 79 3 } 80 2 } 81 1 } 82 83 void TS_GetKey(void) 84 { 85 1 static unsigned int KeyBak; 86 1 static bit LongFlag; 87 1 T_TogKeyInfo KeyInfo; 88 1 unsigned char i; 89 1 TS_Key = 0; 90 1 TS_GetTogKeyInfor(&KeyInfo); 91 1 92 1 if(TK_State == TK_STATE_RELEASE) 93 1 { 94 2 if(KeyInfo.TogKeyNum != 0) 95 2 { 96 3 if(KeyInfo.TogKeyNum == 1) 97 3 { 98 4 KeyBak = (unsigned int)KeyInfo.TogKeyList[0]; 99 4 TK_State = TK_STATE_SINGLE_KEY_PRESS; 100 4 } 101 3 else if(KeyInfo.TogKeyNum == 2) 102 3 { 103 4 KeyBak = ((unsigned int)KeyInfo.TogKeyList[0]<<5)|(unsigned int)KeyInfo.TogKeyList[1]; 104 4 TK_State = TK_STATE_DOUBLE_KEY_PRESS; 105 4 } 106 3 107 3 TS_Key = KeyBak; C51 COMPILER V9.51 KEY 03/07/2018 10:41:04 PAGE 3 108 3 LongFlag = 0; 109 3 TS_LongKeyTimer = TS_LONG_START_TIME; 110 3 BUZZ_ON; 111 3 } 112 2 } 113 1 else if(TK_State == TK_STATE_SINGLE_KEY_PRESS) 114 1 { 115 2 if(KeyInfo.TogKeyNum == 1) 116 2 { 117 3 if(KeyBak == (unsigned int)KeyInfo.TogKeyList[0]) 118 3 { 119 4 if(!TS_LongKeyTimer) 120 4 { 121 5 if(!LongFlag) 122 5 { 123 6 LongFlag = 1; 124 6 TS_Key = KeyBak | KEY_LONG_START; 125 6 } 126 5 else 127 5 { 128 6 TS_Key = KeyBak | KEY_LONG; 129 6 } 130 5 TS_LongKeyTimer = TS_LONG_TIME; 131 5 } 132 4 } 133 3 else 134 3 { 135 4 if(!LongFlag) 136 4 { 137 5 TS_Key = KeyBak | KEY_BREAK; 138 5 } 139 4 else 140 4 { 141 5 TS_Key = KeyBak | KEY_LONG_BREAK; 142 5 } 143 4 TK_State = TK_STATE_RELEASE; 144 4 BUZZ_OFF; 145 4 } 146 3 } 147 2 else if(KeyInfo.TogKeyNum == 2) 148 2 { 149 3 KeyBak = ((unsigned int)KeyInfo.TogKeyList[0]<<5) | (unsigned int)KeyInfo.TogKeyList[1]; 150 3 TK_State = TK_STATE_DOUBLE_KEY_PRESS; 151 3 TS_Key = KeyBak; 152 3 LongFlag = 0; 153 3 TS_LongKeyTimer = TS_LONG_START_TIME; 154 3 } 155 2 else if(KeyInfo.TogKeyNum == 0) 156 2 { 157 3 if(!LongFlag) 158 3 { 159 4 TS_Key = KeyBak | KEY_BREAK; 160 4 } 161 3 else 162 3 { 163 4 TS_Key = KeyBak | KEY_LONG_BREAK; 164 4 } 165 3 TK_State = TK_STATE_RELEASE; 166 3 BUZZ_OFF; 167 3 } 168 2 } 169 1 else if(TK_State == TK_STATE_DOUBLE_KEY_PRESS) C51 COMPILER V9.51 KEY 03/07/2018 10:41:04 PAGE 4 170 1 { 171 2 if(KeyInfo.TogKeyNum == 2) 172 2 { 173 3 if(KeyBak == ((unsigned int)KeyInfo.TogKeyList[0]<<5)|(unsigned int)KeyInfo.TogKeyList[1]) 174 3 { 175 4 if(!TS_LongKeyTimer) 176 4 { 177 5 if(!LongFlag) 178 5 { 179 6 LongFlag = 1; 180 6 TS_Key = KeyBak | KEY_LONG_START; 181 6 } 182 5 else 183 5 { 184 6 TS_Key = KeyBak | KEY_LONG; 185 6 } 186 5 TS_LongKeyTimer = TS_LONG_TIME; 187 5 } 188 4 } 189 3 } 190 2 else if(KeyInfo.TogKeyNum == 0) 191 2 { 192 3 if(!LongFlag) 193 3 { 194 4 TS_Key = KeyBak | KEY_BREAK; 195 4 } 196 3 else 197 3 { 198 4 TS_Key = KeyBak | KEY_LONG_BREAK; 199 4 } 200 3 TK_State = TK_STATE_RELEASE; 201 3 BUZZ_OFF; 202 3 } 203 2 } 204 1 } *** WARNING C280 IN LINE 88 OF key.c: 'i': unreferenced local variable 205 /********************************************************************************************************* -************/ 206 #endif MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 407 ---- CONSTANT SIZE = 13 ---- XDATA SIZE = ---- ---- PDATA SIZE = ---- ---- DATA SIZE = 7 9 IDATA SIZE = ---- ---- BIT SIZE = 1 ---- EDATA SIZE = ---- ---- HDATA SIZE = ---- ---- XDATA CONST SIZE = ---- ---- FAR CONST SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)