252 lines
10 KiB
Plaintext
252 lines
10 KiB
Plaintext
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)
|