Files
r3_delay_3/lst/key.lst
T
2025-07-07 10:41:49 +08:00

252 lines
10 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)为例, 当K1K2同时按下时,产生按键为(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)