?? key.lst
字號:
1 .file "key.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:
124 .global key
125 .data
128 key:
129 0000 00 .byte 0
130 0001 00 .byte 0
131 0002 01 .byte 1
132 .text
134 .global KeyRead
136 KeyRead:
1:drive/key.c **** #include "inc/config.h"
2:drive/key.c ****
3:drive/key.c **** #define KEY_C 1
4:drive/key.c ****
5:drive/key.c ****
6:drive/key.c **** u08 KeyRead(void)
7:drive/key.c **** {
138 .LM1:
139 /* prologue: frame size=0 */
140 /* prologue end (size=0) */
8:drive/key.c **** u08 keyval=0;
142 .LM2:
143 0000 80E0 ldi r24,lo8(0)
9:drive/key.c ****
10:drive/key.c **** if(KEY_ADD==0) keyval=2;
145 .LM3:
146 0002 A498 cbi 52-0x20,4
147 0004 A499 sbic 52-0x20,4
148 0006 04C0 rjmp .L3
150 .LM4:
151 0008 AC9A sbi 53-0x20,4
152 000a AC9B sbis 53-0x20,4
153 000c 01C0 rjmp .L3
154 000e 9C9B sbis 51-0x20,4
155 .L3:
156 0010 82E0 ldi r24,lo8(2)
157 .L2:
11:drive/key.c **** if(KEY_DEC==0) keyval=3;
159 .LM5:
160 0012 A598 cbi 52-0x20,5
161 0014 A599 sbic 52-0x20,5
162 0016 04C0 rjmp .L5
163 0018 AD9A sbi 53-0x20,5
164 001a AD9B sbis 53-0x20,5
165 001c 01C0 rjmp .L5
166 001e 9D9B sbis 51-0x20,5
167 .L5:
168 0020 83E0 ldi r24,lo8(3)
169 .L4:
12:drive/key.c **** if(KEY_SET==0) keyval=4;//20070715此種算法僅支持單個按鍵,且set優先
171 .LM6:
172 0022 8998 cbi 49-0x20,1
173 0024 8999 sbic 49-0x20,1
174 0026 04C0 rjmp .L7
175 0028 919A sbi 50-0x20,1
176 002a 919B sbis 50-0x20,1
177 002c 01C0 rjmp .L7
178 002e 819B sbis 48-0x20,1
179 .L7:
180 0030 84E0 ldi r24,lo8(4)
181 .L6:
13:drive/key.c **** return ( keyval);
14:drive/key.c **** }
183 .LM7:
184 0032 9927 clr r25
185 /* epilogue: frame size=0 */
186 0034 0895 ret
187 /* epilogue end (size=1) */
188 /* function KeyRead size 30 (29) */
193 .Lscope0:
194 .lcomm key_val_pre.0,1
195 .lcomm key_val_now.1,1
196 .lcomm key_down_cnt.2,2
197 .lcomm key_status.3,1
199 .global KeyScan
201 KeyScan:
15:drive/key.c ****
16:drive/key.c ****
17:drive/key.c **** struct KEY key =
18:drive/key.c **** {
19:drive/key.c **** NOKEY, //無鍵按下
20:drive/key.c **** NON,
21:drive/key.c **** YES
22:drive/key.c **** };
23:drive/key.c ****
24:drive/key.c ****
25:drive/key.c **** void KeyScan(void)
26:drive/key.c **** {
203 .LM8:
204 /* prologue: frame size=0 */
205 0036 CF93 push r28
206 /* prologue end (size=1) */
27:drive/key.c **** static uint8 key_val_pre =0; //上次掃描鍵值
28:drive/key.c **** static uint8 key_val_now =0; //當前掃描鍵值
29:drive/key.c **** static uint16 key_down_cnt =0; //按鍵down計數
30:drive/key.c **** static uint8 key_status =0; //按鍵所處狀態
31:drive/key.c ****
32:drive/key.c **** if(f_15ms==TRUE)
208 .LM9:
209 0038 C091 0000 lds r28,f_15ms
210 003c C130 cpi r28,lo8(1)
211 003e 09F0 breq .+2
212 0040 A8C0 rjmp .L8
33:drive/key.c **** {
34:drive/key.c **** f_15ms=false; //掃描間隔為15ms
214 .LM10:
215 0042 1092 0000 sts f_15ms,__zero_reg__
35:drive/key.c **** }
36:drive/key.c **** else
37:drive/key.c **** {
38:drive/key.c **** return;
39:drive/key.c **** }
40:drive/key.c ****
41:drive/key.c **** key_val_now =KeyRead();
217 .LM11:
218 0046 DCDF rcall KeyRead
219 0048 282F mov r18,r24
220 004a 8093 0000 sts key_val_now.1,r24
42:drive/key.c ****
43:drive/key.c **** if(key.fkeydone ==NO) return; //按鍵未處理完畢 則不掃描
222 .LM12:
223 004e 8091 0000 lds r24,key+2
224 0052 8823 tst r24
225 0054 09F4 brne .+2
226 0056 9DC0 rjmp .L8
227 0058 3091 0000 lds r19,key_status.3
44:drive/key.c ****
45:drive/key.c **** if( key_val_now) //有鍵按下
229 .LM13:
230 005c 2223 tst r18
231 005e 09F4 brne .+2
232 0060 75C0 rjmp .L12
46:drive/key.c **** {
47:drive/key.c **** switch (key_status)
234 .LM14:
235 0062 832F mov r24,r19
236 0064 9927 clr r25
237 0066 8130 cpi r24,1
238 0068 9105 cpc r25,__zero_reg__
239 006a 81F0 breq .L15
240 006c 8230 cpi r24,2
241 006e 9105 cpc r25,__zero_reg__
242 0070 1CF4 brge .L28
243 0072 892B or r24,r25
244 0074 39F0 breq .L14
245 0076 8DC0 rjmp .L8
246 .L28:
247 0078 8230 cpi r24,2
248 007a 9105 cpc r25,__zero_reg__
249 007c 71F0 breq .L18
250 007e 0397 sbiw r24,3
251 0080 A1F1 breq .L23
252 0082 87C0 rjmp .L8
253 .L14:
48:drive/key.c **** {
49:drive/key.c **** case 0: //first down
50:drive/key.c **** key_status=key_status + 1;
255 .LM15:
256 0084 3F5F subi r19,lo8(-(1))
257 0086 3093 0000 sts key_status.3,r19
258 008a 1AC0 rjmp .L37
259 .L15:
51:drive/key.c **** key_val_pre =key_val_now;
52:drive/key.c **** break;
53:drive/key.c **** //down filter. make sure that key is down!
54:drive/key.c **** case 1: if( key_val_now == key_val_pre ) //delay for noise
261 .LM16:
262 008c 8091 0000 lds r24,key_val_pre.0
263 0090 2817 cp r18,r24
264 0092 99F0 breq .L36
55:drive/key.c **** {
56:drive/key.c **** key_status =2; //trans to state 2,
57:drive/key.c **** key_val_pre =key_val_now;
58:drive/key.c **** }
59:drive/key.c **** else //just the random noise
60:drive/key.c **** {
61:drive/key.c **** key_status =0; //reset the state record
266 .LM17:
267 0094 1092 0000 sts key_status.3,__zero_reg__
62:drive/key.c **** }
63:drive/key.c **** break;
269 .LM18:
270 0098 7CC0 rjmp .L8
271 .L18:
64:drive/key.c ****
65:drive/key.c **** //BUTTON was down .Judge it long or short!
66:drive/key.c **** case 2: if( key_val_now == key_val_pre ) //delay for noise,judge key really down
273 .LM19:
274 009a 8091 0000 lds r24,key_val_pre.0
275 009e 2817 cp r18,r24
276 00a0 F9F4 brne .L19
67:drive/key.c **** {
68:drive/key.c **** key_down_cnt++ ;
278 .LM20:
279 00a2 8091 0000 lds r24,key_down_cnt.2
280 00a6 9091 0000 lds r25,(key_down_cnt.2)+1
281 00aa 0196 adiw r24,1
282 00ac 9093 0000 sts (key_down_cnt.2)+1,r25
283 00b0 8093 0000 sts key_down_cnt.2,r24
69:drive/key.c **** if( key_down_cnt < KEYLONGTICKS) //juded as the short push butt
285 .LM21:
286 00b4 8639 cpi r24,150
287 00b6 9105 cpc r25,__zero_reg__
288 00b8 30F4 brsh .L20
289 .L36:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -