?? countermeter.lst
字號:
1 .file "countermeter.c"
2 .arch atmega16
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:
70 .global digits
71 .data
74 digits:
75 0000 3F .byte 63
76 0001 06 .byte 6
77 0002 5B .byte 91
78 0003 4F .byte 79
79 0004 66 .byte 102
80 0005 6D .byte 109
81 0006 7D .byte 125
82 0007 07 .byte 7
83 0008 7F .byte 127
84 0009 6F .byte 111
85 000a 01 .byte 1
86 000b 40 .byte 64
87 000c 08 .byte 8
88 .global active_led
89 .global active_led
90 .section .bss
93 active_led:
94 0000 00 .skip 1,0
95 .global led_value
96 .global led_value
99 led_value:
100 0001 0000 0000 .skip 4,0
101 .global decimal_point
102 .global decimal_point
105 decimal_point:
106 0005 00 .skip 1,0
107 .global mode_setting
108 .global mode_setting
111 mode_setting:
112 0006 00 .skip 1,0
113 .text
115 .global __vector_9
117 __vector_9:
1:countermeter.c **** /*************************************************
2:countermeter.c **** **
3:countermeter.c **** ** 本程序根據Jesper的應用例子改編
4:countermeter.c **** ** 源例子網頁:http://www.myplace.nu/avr/countermeasures/index.htm
5:countermeter.c **** ** CPU ATmega16
6:countermeter.c **** ** 晶振頻率 4MHz
7:countermeter.c **** ** 編譯環境 AVR Studio 4.12.460 + GCC 3.4.3
8:countermeter.c **** ** 程序修改 machao
9:countermeter.c **** ** 時間 2005-12-07
10:countermeter.c **** **
11:countermeter.c **** *************************************************/
12:countermeter.c **** #define COUNTERMETER_C
13:countermeter.c ****
14:countermeter.c **** #include <avr/io.h>
15:countermeter.c **** #include <avr/signal.h>
16:countermeter.c **** #include <avr/interrupt.h>
17:countermeter.c **** #include <stdio.h>
18:countermeter.c **** #include <stdlib.h>
19:countermeter.c ****
20:countermeter.c **** //定義計數器控制引腳
21:countermeter.c **** #define CLEAR PA6
22:countermeter.c **** #define OE_H PA5
23:countermeter.c **** #define OE_L PA4
24:countermeter.c ****
25:countermeter.c ****
26:countermeter.c **** //#define F_CPU 4000000 // 晶振頻率 4MHz
27:countermeter.c **** #define CYCLES_PER_US ((F_CPU+500000)/1000000) // cpu cycles per microsecond
28:countermeter.c ****
29:countermeter.c ****
30:countermeter.c **** // 數碼管顯示數據
31:countermeter.c ****
32:countermeter.c **** #define SEG_a 0x01
33:countermeter.c **** #define SEG_b 0x02
34:countermeter.c **** #define SEG_c 0x04
35:countermeter.c **** #define SEG_d 0x08
36:countermeter.c **** #define SEG_e 0x10
37:countermeter.c **** #define SEG_f 0x20
38:countermeter.c **** #define SEG_g 0x40
39:countermeter.c **** #define SEG_dot 0x80
40:countermeter.c ****
41:countermeter.c ****
42:countermeter.c **** unsigned char digits[] = {
43:countermeter.c **** (SEG_a|SEG_b|SEG_c|SEG_d|SEG_e|SEG_f), // 0
44:countermeter.c **** (SEG_b|SEG_c), // 1
45:countermeter.c **** (SEG_a|SEG_b|SEG_d|SEG_e|SEG_g), // 2
46:countermeter.c **** (SEG_a|SEG_b|SEG_c|SEG_d|SEG_g), // 3
47:countermeter.c **** (SEG_b|SEG_c|SEG_c|SEG_f|SEG_g), // 4
48:countermeter.c **** (SEG_a|SEG_c|SEG_d|SEG_f|SEG_g), // 5
49:countermeter.c **** (SEG_a|SEG_c|SEG_d|SEG_e|SEG_f|SEG_g), // 6
50:countermeter.c **** (SEG_a|SEG_b|SEG_c), // 7
51:countermeter.c **** (SEG_a|SEG_b|SEG_c|SEG_d|SEG_e|SEG_f|SEG_g), // 8
52:countermeter.c **** (SEG_a|SEG_b|SEG_c|SEG_d|SEG_f|SEG_g), // 9
53:countermeter.c **** (SEG_a), // mode 0 indicator (Hz)
54:countermeter.c **** (SEG_g), // mode 1 indicator (kHz)
55:countermeter.c **** (SEG_d), // mode 2 indicator (MHz)
56:countermeter.c **** };
57:countermeter.c ****
58:countermeter.c ****
59:countermeter.c **** /****************************************************************************/
60:countermeter.c ****
61:countermeter.c ****
62:countermeter.c **** // timer 0 interrupt handles multiplex and refresh of the displays
63:countermeter.c **** //定時器T0的溢出中斷用于刷新數碼管
64:countermeter.c **** // timer is clocked at 62500 Hz
65:countermeter.c ****
66:countermeter.c **** #define TI0_L (256-125) // 500 Hz -> 2 mS
67:countermeter.c ****
68:countermeter.c **** volatile unsigned char active_led = 0; //當前點亮的數碼管
69:countermeter.c ****
70:countermeter.c **** volatile unsigned long led_value = 0; // four BCD nibbles
71:countermeter.c **** volatile unsigned char decimal_point = 0;
72:countermeter.c **** volatile unsigned char mode_setting = 0;
73:countermeter.c ****
74:countermeter.c ****
75:countermeter.c ****
76:countermeter.c **** SIGNAL(SIG_OVERFLOW0) //定時器T0溢出中斷程序(16 uS中斷一次)
77:countermeter.c **** {
119 .LM1:
120 /* prologue: frame size=2 */
121 0000 1F92 push __zero_reg__
122 0002 0F92 push __tmp_reg__
123 0004 0FB6 in __tmp_reg__,__SREG__
124 0006 0F92 push __tmp_reg__
125 0008 1124 clr __zero_reg__
126 000a 2F93 push r18
127 000c 3F93 push r19
128 000e 4F93 push r20
129 0010 5F93 push r21
130 0012 6F93 push r22
131 0014 7F93 push r23
132 0016 8F93 push r24
133 0018 9F93 push r25
134 001a AF93 push r26
135 001c BF93 push r27
136 001e EF93 push r30
137 0020 FF93 push r31
138 0022 CF93 push r28
139 0024 DF93 push r29
140 0026 CDB7 in r28,__SP_L__
141 0028 DEB7 in r29,__SP_H__
142 002a 2297 sbiw r28,2
143 002c DEBF out __SP_H__,r29
144 002e CDBF out __SP_L__,r28
145 /* prologue end (size=24) */
78:countermeter.c **** unsigned char a,b;
79:countermeter.c **** //重新裝載初值
80:countermeter.c **** TCNT0 = TI0_L;
147 .LM2:
148 0030 83E8 ldi r24,lo8(-125)
149 0032 8093 5200 sts 82,r24
81:countermeter.c **** //關閉所有數碼管
82:countermeter.c **** PORTA |= 0X07;
151 .LM3:
152 0036 8091 3B00 lds r24,59
153 003a 8760 ori r24,lo8(7)
154 003c 8093 3B00 sts 59,r24
83:countermeter.c ****
84:countermeter.c **** if (active_led == 5)
156 .LM4:
157 0040 8091 0000 lds r24,active_led
158 0044 8530 cpi r24,lo8(5)
159 0046 49F4 brne .L2
85:countermeter.c **** {
86:countermeter.c **** b = digits[10 + mode_setting]; //第6為數碼管用于模式指示
161 .LM5:
162 0048 8091 0000 lds r24,mode_setting
163 004c 9927 clr r25
164 004e FC01 movw r30,r24
165 0050 E050 subi r30,lo8(-(digits+10))
166 0052 F040 sbci r31,hi8(-(digits+10))
167 0054 8081 ld r24,Z
168 0056 8A83 std Y+2,r24
169 0058 38C0 rjmp .L3
170 .L2:
87:countermeter.c **** }
88:countermeter.c **** else
89:countermeter.c **** {
90:countermeter.c **** a = led_value >> (( 4 - active_led ) * 4);
172 .LM6:
173 005a 8091 0000 lds r24,active_led
174 005e 282F mov r18,r24
175 0060 3327 clr r19
176 0062 84E0 ldi r24,lo8(4)
177 0064 90E0 ldi r25,hi8(4)
178 0066 821B sub r24,r18
179 0068 930B sbc r25,r19
180 006a 9C01 movw r18,r24
181 006c 220F lsl r18
182 006e 331F rol r19
183 0070 220F lsl r18
184 0072 331F rol r19
185 0074 8091 0000 lds r24,led_value
186 0078 9091 0000 lds r25,(led_value)+1
187 007c A091 0000 lds r26,(led_value)+2
188 0080 B091 0000 lds r27,(led_value)+3
189 0084 04C0 rjmp 2f
190 0086 B695 1: lsr r27
191 0088 A795 ror r26
192 008a 9795 ror r25
193 008c 8795 ror r24
194 008e 2A95 2: dec r18
195 0090 D2F7 brpl 1b
196 0092 8983 std Y+1,r24
91:countermeter.c ****
92:countermeter.c **** b = digits[a & 0x0f];
198 .LM7:
199 0094 8981 ldd r24,Y+1
200 0096 9927 clr r25
201 0098 8F70 andi r24,lo8(15)
202 009a 9070 andi r25,hi8(15)
203 009c FC01 movw r30,r24
204 009e E050 subi r30,lo8(-(digits))
205 00a0 F040 sbci r31,hi8(-(digits))
206 00a2 8081 ld r24,Z
207 00a4 8A83 std Y+2,r24
93:countermeter.c ****
94:countermeter.c **** if (decimal_point == (4 - active_led) )
209 .LM8:
210 00a6 8091 0000 lds r24,decimal_point
211 00aa 482F mov r20,r24
212 00ac 5527 clr r21
213 00ae 8091 0000 lds r24,active_led
214 00b2 282F mov r18,r24
215 00b4 3327 clr r19
216 00b6 84E0 ldi r24,lo8(4)
217 00b8 90E0 ldi r25,hi8(4)
218 00ba 821B sub r24,r18
219 00bc 930B sbc r25,r19
220 00be 4817 cp r20,r24
221 00c0 5907 cpc r21,r25
222 00c2 19F4 brne .L3
95:countermeter.c **** b |= SEG_dot;
224 .LM9:
225 00c4 8A81 ldd r24,Y+2
226 00c6 8068 ori r24,lo8(-128)
227 00c8 8A83 std Y+2,r24
228 .L3:
96:countermeter.c **** }
97:countermeter.c **** PORTB = b;
230 .LM10:
231 00ca 8A81 ldd r24,Y+2
232 00cc 8093 3800 sts 56,r24
98:countermeter.c **** //設置顯示位置
99:countermeter.c **** PORTA = ((PORTA & 0Xf8)|active_led);
234 .LM11:
235 00d0 98EF ldi r25,lo8(-8)
236 00d2 8091 3B00 lds r24,59
237 00d6 9823 and r25,r24
238 00d8 8091 0000 lds r24,active_led
239 00dc 892B or r24,r25
240 00de 8093 3B00 sts 59,r24
100:countermeter.c **** active_led = (active_led+1) % 6;
242 .LM12:
243 00e2 8091 0000 lds r24,active_led
244 00e6 9927 clr r25
245 00e8 0196 adiw r24,1
246 00ea 26E0 ldi r18,lo8(6)
247 00ec 30E0 ldi r19,hi8(6)
248 00ee B901 movw r22,r18
249 00f0 0E94 0000 call __divmodhi4
250 00f4 8093 0000 sts active_led,r24
251 /* epilogue: frame size=2 */
252 00f8 2296 adiw r28,2
253 00fa F894 cli
254 00fc DEBF out __SP_H__,r29
255 00fe CDBF out __SP_L__,r28
256 0100 DF91 pop r29
257 0102 CF91 pop r28
258 0104 FF91 pop r31
259 0106 EF91 pop r30
260 0108 BF91 pop r27
261 010a AF91 pop r26
262 010c 9F91 pop r25
263 010e 8F91 pop r24
264 0110 7F91 pop r23
265 0112 6F91 pop r22
266 0114 5F91 pop r21
267 0116 4F91 pop r20
268 0118 3F91 pop r19
269 011a 2F91 pop r18
270 011c 0F90 pop __tmp_reg__
271 011e 0FBE out __SREG__,__tmp_reg__
272 0120 0F90 pop __tmp_reg__
273 0122 1F90 pop __zero_reg__
274 0124 1895 reti
275 /* epilogue end (size=23) */
276 /* function __vector_9 size 148 (101) */
282 .Lscope0:
285 .global delay
287 delay:
101:countermeter.c **** }
102:countermeter.c ****
103:countermeter.c ****
104:countermeter.c ****
105:countermeter.c ****
106:countermeter.c ****
107:countermeter.c **** /****************************************************************************/
108:countermeter.c **** /* helpers ****************************************************************/
109:countermeter.c **** /****************************************************************************/
110:countermeter.c ****
111:countermeter.c ****
112:countermeter.c **** void delay(unsigned short us)
113:countermeter.c **** {
289 .LM13:
290 /* prologue: frame size=6 */
291 0126 CF93 push r28
292 0128 DF93 push r29
293 012a CDB7 in r28,__SP_L__
294 012c DEB7 in r29,__SP_H__
295 012e 2697 sbiw r28,6
296 0130 0FB6 in __tmp_reg__,__SREG__
297 0132 F894 cli
298 0134 DEBF out __SP_H__,r29
299 0136 0FBE out __SREG__,__tmp_reg__
300 0138 CDBF out __SP_L__,r28
301 /* prologue end (size=10) */
302 013a 8983 std Y+1,r24
303 013c 9A83 std Y+2,r25
114:countermeter.c **** unsigned short delay_loops;
115:countermeter.c **** register unsigned short i;
116:countermeter.c ****
117:countermeter.c **** delay_loops = (us+3)/5*CYCLES_PER_US; // +3 for rounding up (dirty)
305 .LM14:
306 013e 8981 ldd r24,Y+1
307 0140 9A81 ldd r25,Y+2
308 0142 0396 adiw r24,3
309 0144 25E0 ldi r18,lo8(5)
310 0146 30E0 ldi r19,hi8(5)
311 0148 B901 movw r22,r18
312 014a 0E94 0000 call __udivmodhi4
313 014e CB01 movw r24,r22
314 0150 AA27 clr r26
315 0152 BB27 clr r27
316 0154 6894 set
317 0156 12F8 bld __zero_reg__,3-1
318 0158 880F 1: lsl r24
319 015a 991F rol r25
320 015c AA1F rol r26
321 015e BB1F rol r27
322 0160 1694 lsr __zero_reg__
323 0162 D1F7 brne 1b
324 0164 8B83 std Y+3,r24
325 0166 9C83 std Y+4,r25
118:countermeter.c ****
119:countermeter.c **** // one loop takes 5 cpu cycles
120:countermeter.c **** for (i=0; i < delay_loops; i++);
327 .LM15:
328 0168 1D82 std Y+5,__zero_reg__
329 016a 1E82 std Y+6,__zero_reg__
330 .L6:
332 .LM16:
333 016c 8B81 ldd r24,Y+3
334 016e 9C81 ldd r25,Y+4
335 0170 2D81 ldd r18,Y+5
336 0172 3E81 ldd r19,Y+6
337 0174 2817 cp r18,r24
338 0176 3907 cpc r19,r25
339 0178 30F4 brsh .L5
340 017a 8D81 ldd r24,Y+5
341 017c 9E81 ldd r25,Y+6
342 017e 0196 adiw r24,1
343 0180 8D83 std Y+5,r24
344 0182 9E83 std Y+6,r25
345 0184 F3CF rjmp .L6
346 .L5:
347 /* epilogue: frame size=6 */
348 0186 2696 adiw r28,6
349 0188 0FB6 in __tmp_reg__,__SREG__
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -