keyscan.lst
来自「cs5460a做功率表用 cs5460a做功率表用 cs5460a做功率表」· LST 代码 · 共 372 行 · 第 1/2 页
LST
372 行
1 .file "KeyScan.c"
2 .arch atmega8
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
101 .global WatchKeyTime
102 .global WatchKeyTime
103 .section .bss
106 WatchKeyTime:
107 0000 0000 00 .skip 3,0
108 .global KeyScan
109 .data
112 KeyScan:
113 0000 00 .byte 0
114 0001 0100 .word 1
115 .lcomm KeyState.0,1
116 .lcomm OldKeyCode.1,1
117 .lcomm KeyCount.2,1
118 .text
120 .global ScanKey_MainLoop
122 ScanKey_MainLoop:
1:driver/KeyScan.c **** /********************************************
2:driver/KeyScan.c **** 公司名称:
3:driver/KeyScan.c **** 文 件 名:
4:driver/KeyScan.c **** 版 本 号:
5:driver/KeyScan.c **** 程序设计:
6:driver/KeyScan.c **** 说 明:
7:driver/KeyScan.c **** 完成日期:
8:driver/KeyScan.c **** 修改日期:
9:driver/KeyScan.c **** 功能摘要:
10:driver/KeyScan.c **** **********************************************/
11:driver/KeyScan.c **** #define _KeyScanV20
12:driver/KeyScan.c **** #include "includes.h"
13:driver/KeyScan.c **** //---------------------------------------------
14:driver/KeyScan.c **** uint8 KeyVal;
15:driver/KeyScan.c **** WAIT_TIME_STRUCT KeyScan = {0,_10MS};
16:driver/KeyScan.c **** WAIT_TIME_STRUCT WatchKeyTime = {0,0};
17:driver/KeyScan.c ****
18:driver/KeyScan.c **** void WatchKey(void);
19:driver/KeyScan.c **** void ScanKey_MainLoop(void)
20:driver/KeyScan.c **** {
124 .LM1:
125 /* prologue: frame size=0 */
126 /* prologue end (size=0) */
21:driver/KeyScan.c **** static uint8 KeyState = 0; //按键状态
22:driver/KeyScan.c **** static uint8 OldKeyCode = 0; //老键值缓存
23:driver/KeyScan.c **** static uint8 KeyCount = 0; //按键按下的时间,用于连击处理
24:driver/KeyScan.c **** uint8 GETKEY = 0;
128 .LM2:
129 0000 20E0 ldi r18,lo8(0)
25:driver/KeyScan.c ****
26:driver/KeyScan.c **** if (!KeyScan.fGetTime)
131 .LM3:
132 0002 8091 0000 lds r24,KeyScan
133 0006 8823 tst r24
134 0008 19F4 brne .L2
27:driver/KeyScan.c **** { KeyVal = 0; }
136 .LM4:
137 000a 2093 0000 sts KeyVal,r18
138 000e 0895 ret
139 .L2:
28:driver/KeyScan.c **** else
29:driver/KeyScan.c **** { //系统时间到进行按键扫描
30:driver/KeyScan.c **** KeyScan.fGetTime = 0;
141 .LM5:
142 0010 2093 0000 sts KeyScan,r18
31:driver/KeyScan.c **** KeyScan.WaitTime = _10MS;
144 .LM6:
145 0014 81E0 ldi r24,lo8(1)
146 0016 90E0 ldi r25,hi8(1)
147 0018 9093 0000 sts (KeyScan+1)+1,r25
148 001c 8093 0000 sts KeyScan+1,r24
32:driver/KeyScan.c ****
33:driver/KeyScan.c **** if (!SET_KEY) GETKEY |= 0x04;
150 .LM7:
151 0020 B59B sbis 54-0x20,5
152 0022 24E0 ldi r18,lo8(4)
153 .L4:
34:driver/KeyScan.c **** if (!UP_KEY) GETKEY |= 0x02;
155 .LM8:
156 0024 B49B sbis 54-0x20,4
157 0026 2260 ori r18,lo8(2)
158 .L5:
35:driver/KeyScan.c **** if (!DN_KEY) GETKEY |= 0x01;
160 .LM9:
161 0028 B39B sbis 54-0x20,3
162 002a 2160 ori r18,lo8(1)
163 .L6:
36:driver/KeyScan.c ****
37:driver/KeyScan.c **** switch (KeyState) //根据按键不同的状态进行处理
165 .LM10:
166 002c 8091 0000 lds r24,KeyState.0
167 0030 9927 clr r25
168 0032 8130 cpi r24,1
169 0034 9105 cpc r25,__zero_reg__
170 0036 A9F0 breq .L10
171 0038 8230 cpi r24,2
172 003a 9105 cpc r25,__zero_reg__
173 003c 1CF4 brge .L28
174 003e 892B or r24,r25
175 0040 39F0 breq .L8
176 0042 0895 ret
177 .L28:
178 0044 8230 cpi r24,2
179 0046 9105 cpc r25,__zero_reg__
180 0048 81F0 breq .L11
181 004a 0397 sbiw r24,3
182 004c 09F1 breq .L14
183 004e 0895 ret
184 .L8:
38:driver/KeyScan.c **** {
39:driver/KeyScan.c **** case 0:
40:driver/KeyScan.c **** if (GETKEY)
186 .LM11:
187 0050 2223 tst r18
188 0052 09F4 brne .+2
189 0054 50C0 rjmp .L29
41:driver/KeyScan.c **** {
42:driver/KeyScan.c **** OldKeyCode = GETKEY;
191 .LM12:
192 0056 2093 0000 sts OldKeyCode.1,r18
43:driver/KeyScan.c **** KeyState = 1;
194 .LM13:
195 005a 81E0 ldi r24,lo8(1)
196 005c 8093 0000 sts KeyState.0,r24
197 0060 4AC0 rjmp .L29
198 .L10:
44:driver/KeyScan.c **** }
45:driver/KeyScan.c **** KeyVal = 0;
46:driver/KeyScan.c **** break;
47:driver/KeyScan.c ****
48:driver/KeyScan.c **** case 1:
49:driver/KeyScan.c **** KeyState = 2; //按键消抖20ms
200 .LM14:
201 0062 82E0 ldi r24,lo8(2)
202 0064 8093 0000 sts KeyState.0,r24
50:driver/KeyScan.c **** break;
204 .LM15:
205 0068 0895 ret
206 .L11:
51:driver/KeyScan.c ****
52:driver/KeyScan.c **** case 2:
53:driver/KeyScan.c **** if (OldKeyCode == GETKEY)
208 .LM16:
209 006a 8091 0000 lds r24,OldKeyCode.1
210 006e 8217 cp r24,r18
211 0070 61F4 brne .L12
54:driver/KeyScan.c **** {
55:driver/KeyScan.c **** KeyState = 3; //按键按下
213 .LM17:
214 0072 83E0 ldi r24,lo8(3)
215 0074 8093 0000 sts KeyState.0,r24
56:driver/KeyScan.c **** KeyVal = OldKeyCode; //传递键值
217 .LM18:
218 0078 2093 0000 sts KeyVal,r18
57:driver/KeyScan.c **** WatchKeyTime.WaitTime = _60S;
220 .LM19:
221 007c 80E7 ldi r24,lo8(6000)
222 007e 97E1 ldi r25,hi8(6000)
223 0080 9093 0000 sts (WatchKeyTime+1)+1,r25
224 0084 8093 0000 sts WatchKeyTime+1,r24
225 0088 0895 ret
226 .L12:
58:driver/KeyScan.c **** }
59:driver/KeyScan.c **** else
60:driver/KeyScan.c **** { KeyState = 0; } //抖动
228 .LM20:
229 008a 1092 0000 sts KeyState.0,__zero_reg__
61:driver/KeyScan.c **** break;
231 .LM21:
232 008e 0895 ret
233 .L14:
62:driver/KeyScan.c ****
63:driver/KeyScan.c **** case 3:
64:driver/KeyScan.c **** if (OldKeyCode == GETKEY)
235 .LM22:
236 0090 3091 0000 lds r19,OldKeyCode.1
237 0094 3217 cp r19,r18
238 0096 C1F5 brne .L15
65:driver/KeyScan.c **** {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?