📄 timer1leddisplay.lst
字号:
__text_start:
__start:
34 E5CF LDI R28,0x5F
35 E0D4 LDI R29,4
36 BFCD OUT 0x3D,R28
37 BFDE OUT 0x3E,R29
38 51C0 SUBI R28,0x10
39 40D0 SBCI R29,0
3A EA0A LDI R16,0xAA
3B 8308 STD Y+0,R16
3C 2400 CLR R0
3D E6E0 LDI R30,0x60
3E E0F0 LDI R31,0
3F E010 LDI R17,0
40 36E9 CPI R30,0x69
41 07F1 CPC R31,R17
42 F011 BEQ 0x0045
43 9201 ST R0,Z+
44 CFFB RJMP 0x0040
45 8300 STD Z+0,R16
46 E6E8 LDI R30,0x68
47 E0F0 LDI R31,0
48 E6A0 LDI R26,0x60
49 E0B0 LDI R27,0
4A E010 LDI R17,0
4B E000 LDI R16,0
4C BF0B OUT 0x3B,R16
4D 36E8 CPI R30,0x68
4E 07F1 CPC R31,R17
4F F021 BEQ 0x0054
50 95C8 LPM
51 9631 ADIW R30,1
52 920D ST R0,X+
53 CFF9 RJMP 0x004D
54 940E 0150 CALL _main
_exit:
56 CFFF RJMP _exit
FILE: F:\avr单片机学习\我自编程序\定时器数码管显示\timer1leddisplay.c
(0001) //ICC-AVR application builder : 2007-8-1 21:29:13
(0002) // Target : M16
(0003) // Crystal: 4.0000Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007)
(0008) #define key_hour PD0
(0009) #define key_min PD1
(0010) #define key_sec PD2
(0011) #define key_clr PD3
(0012) /*共阴数码管七段码*/
(0013) const led_tab[10]={
(0014) 0x3F,/*0*/
(0015) 0x06,/*1*/
(0016) 0x5B,/*2*/
(0017) 0x4F,/*3*/
(0018) 0x66,/*4*/
(0019) 0x6D,/*5*/
(0020) 0x7D,/*6*/
(0021) 0x07,/*7*/
(0022) 0x7F,/*8*/
(0023) 0x6F,/*9*/
(0024) };
(0025) unsigned char second,minute,hour;
(0026) unsigned char time_group[6];
(0027)
(0028) void delay_ms(unsigned char);
(0029) void display(void);
(0030) void set_detect(void);
(0031)
(0032) void port_init(void)
(0033) {
(0034) PORTA = 0x00;
_port_init:
57 2422 CLR R2
58 BA2B OUT 0x1B,R2
(0035) DDRA = 0xFF;
59 EF8F LDI R24,0xFF
5A BB8A OUT 0x1A,R24
(0036) PORTB = 0x00;
5B BA28 OUT 0x18,R2
(0037) DDRB = 0xFF;
5C BB87 OUT 0x17,R24
(0038) PORTC = 0x00; //m103 output only
5D BA25 OUT 0x15,R2
(0039) DDRC = 0x00;
5E BA24 OUT 0x14,R2
(0040) PORTD = 0xff;
5F BB82 OUT 0x12,R24
(0041) DDRD = 0x00;
60 BA21 OUT 0x11,R2
61 9508 RET
(0042) }
(0043)
(0044) //TIMER1 initialize - prescale:64
(0045) // WGM: 0) Normal, TOP=0xFFFF
(0046) // desired value: 1Hz
(0047) // actual value: 1.000Hz (0.0%)
(0048) void timer1_init(void)
(0049) {
(0050) TCCR1B = 0x00; //stop
_timer1_init:
62 2422 CLR R2
63 BC2E OUT 0x2E,R2
(0051) TCNT1H = 0x0B; //setup
64 E08B LDI R24,0xB
65 BD8D OUT 0x2D,R24
(0052) TCNT1L = 0xDC;
66 ED8C LDI R24,0xDC
67 BD8C OUT 0x2C,R24
(0053)
(0054) TCCR1A = 0x00;
68 BC2F OUT 0x2F,R2
(0055) TCCR1B = 0x03; //start Timer
69 E083 LDI R24,3
6A BD8E OUT 0x2E,R24
6B 9508 RET
_timer1_ovf_isr:
6C 922A ST R2,-Y
6D 938A ST R24,-Y
6E 939A ST R25,-Y
6F B62F IN R2,0x3F
70 922A ST R2,-Y
(0056) }
(0057)
(0058) #pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
(0059) void timer1_ovf_isr(void)
(0060) {
(0061) //TIMER1 has overflowed
(0062) TCNT1H = 0x0B; //reload counter high value
71 E08B LDI R24,0xB
72 BD8D OUT 0x2D,R24
(0063) TCNT1L = 0xDC; //reload counter low value
73 ED8C LDI R24,0xDC
74 BD8C OUT 0x2C,R24
(0064) second++;
75 9180 0068 LDS R24,second
77 5F8F SUBI R24,0xFF
78 9380 0068 STS second,R24
(0065) if(second==60)
7A 338C CPI R24,0x3C
7B F4C1 BNE 0x0094
(0066) {
(0067) second=0x00;
7C 2422 CLR R2
7D 9220 0068 STS second,R2
(0068) minute++;
7F 9180 0067 LDS R24,minute
81 5F8F SUBI R24,0xFF
82 9380 0067 STS minute,R24
(0069) if(minute==60)
84 338C CPI R24,0x3C
85 F471 BNE 0x0094
(0070) {
(0071) minute=0x00;
86 9220 0067 STS minute,R2
(0072) hour++;
88 9180 0066 LDS R24,hour
8A 5F8F SUBI R24,0xFF
8B 9380 0066 STS hour,R24
(0073) if(hour=24)
8D E188 LDI R24,0x18
8E 9380 0066 STS hour,R24
90 2388 TST R24
91 F011 BEQ 0x0094
(0074) {
(0075) hour=0x00;
92 9220 0066 STS hour,R2
(0076) }
(0077) }
(0078) }
94 9029 LD R2,Y+
95 BE2F OUT 0x3F,R2
96 9199 LD R25,Y+
97 9189 LD R24,Y+
98 9029 LD R2,Y+
99 9518 RETI
(0079) }
(0080)
(0081) /*数据拆分程序*/
(0082) void data_split(void)
(0083) {
(0084) time_group[0]=second%10;
_data_split:
9A E01A LDI R17,0xA
9B 9100 0068 LDS R16,second
9D 940E 0157 CALL mod8u
9F 9300 0060 STS time_group,R16
(0085) time_group[1]=second/10;
A1 E01A LDI R17,0xA
A2 9100 0068 LDS R16,second
A4 940E 0159 CALL div8u
A6 9300 0061 STS time_group+1,R16
(0086) time_group[2]=minute%10;
A8 E01A LDI R17,0xA
A9 9100 0067 LDS R16,minute
AB 940E 0157 CALL mod8u
AD 9300 0062 STS time_group+2,R16
(0087) time_group[3]=minute/10;
AF E01A LDI R17,0xA
B0 9100 0067 LDS R16,minute
B2 940E 0159 CALL div8u
B4 9300 0063 STS time_group+3,R16
(0088) time_group[4]=hour%10;
B6 E01A LDI R17,0xA
B7 9100 0066 LDS R16,hour
B9 940E 0157 CALL mod8u
BB 9300 0064 STS 0x0064,R16
(0089) time_group[5]=hour/10;
BD E01A LDI R17,0xA
BE 9100 0066 LDS R16,hour
C0 940E 0159 CALL div8u
C2 9300 0065 STS 0x0065,R16
C4 9508 RET
(0090) }
(0091)
(0092) /*时间设置检测*/
(0093) void set_detect(void)
(0094) {
(0095) if(!(PIND&(1<<key_clr))) //清零键检测
_set_detect:
C5 9983 SBIC 0x10,3
C6 C00B RJMP 0x00D2
(0096) {
(0097) delay_ms(10);
C7 E00A LDI R16,0xA
C8 D078 RCALL _delay_ms
(0098) if(!(PIND&(1<<key_clr)))
C9 9983 SBIC 0x10,3
CA C007 RJMP 0x00D2
(0099) {
(0100) hour=0x00;
CB 2422 CLR R2
CC 9220 0066 STS hour,R2
(0101) minute=0x00;
CE 9220 0067 STS minute,R2
(0102) second=0x00;
D0 9220 0068 STS second,R2
(0103) }
(0104) }
(0105)
(0106)
(0107) if(!(PIND&(1<<key_hour))) //小时调整键检测
D2 9980 SBIC 0x10,0
D3 C012 RJMP 0x00E6
(0108) {
(0109) delay_ms(10);
D4 E00A LDI R16,0xA
D5 D06B RCALL _delay_ms
(0110) if(!(PIND&(1<<key_hour)))
D6 9980 SBIC 0x10,0
D7 C00E RJMP 0x00E6
(0111) {
D8 C001 RJMP 0x00DA
(0112) while(!(PIND&(1<<key_hour)))
(0113) {
(0114) display();
D9 D045 RCALL _display
DA 9B80 SBIS 0x10,0
DB CFFD RJMP 0x00D9
(0115) }
(0116) hour++;
DC 9180 0066 LDS R24,hour
DE 5F8F SUBI R24,0xFF
DF 9380 0066 STS hour,R24
(0117) if(hour==24)
E1 3188 CPI R24,0x18
E2 F419 BNE 0x00E6
(0118) {
(0119) hour=0;
E3 2422 CLR R2
E4 9220 0066 STS hour,R2
(0120) }
(0121) }
(0122) }
(0123)
(0124) if(!(PIND&(1<<key_min)))//分钟调整键检测
E6 9981 SBIC 0x10,1
E7 C012 RJMP 0x00FA
(0125) {
(0126) delay_ms(10);
E8 E00A LDI R16,0xA
E9 D057 RCALL _delay_ms
(0127) if(!(PIND&(1<<key_min)))
EA 9981 SBIC 0x10,1
EB C00E RJMP 0x00FA
(0128) {
EC C001 RJMP 0x00EE
(0129) while(!(PIND&(1<<key_min)))
(0130) {
(0131) display();
ED D031 RCALL _display
EE 9B81 SBIS 0x10,1
EF CFFD RJMP 0x00ED
(0132) }
(0133) minute++;
F0 9180 0067 LDS R24,minute
F2 5F8F SUBI R24,0xFF
F3 9380 0067 STS minute,R24
(0134) if(minute==60)
F5 338C CPI R24,0x3C
F6 F419 BNE 0x00FA
(0135) {
(0136) minute=0;
F7 2422 CLR R2
F8 9220 0067 STS minute,R2
(0137) }
(0138) }
(0139) }
(0140) if(!(PIND&(1<<key_sec)))//秒调整键检测
FA 9982 SBIC 0x10,2
FB C012 RJMP 0x010E
(0141) {
(0142) delay_ms(10);
FC E00A LDI R16,0xA
FD D043 RCALL _delay_ms
(0143) if(!(PIND&(1<<key_sec)))
FE 9982 SBIC 0x10,2
FF C00E RJMP 0x010E
(0144) {
100 C001 RJMP 0x0102
(0145) while(!(PIND&(1<<key_sec)))
(0146) {
(0147) display();
101 D01D RCALL _display
102 9B82 SBIS 0x10,2
103 CFFD RJMP 0x0101
(0148) }
(0149) second++;
104 9180 0068 LDS R24,second
106 5F8F SUBI R24,0xFF
107 9380 0068 STS second,R24
(0150) if(second==60)
109 338C CPI R24,0x3C
10A F419 BNE 0x010E
(0151) {
(0152) second=0;
10B 2422 CLR R2
10C 9220 0068 STS second,R2
(0153) }
(0154) }
(0155) }
10E 9508 RET
(0156) }
(0157)
(0158) //call this routine to initialize all peripherals
(0159) void init_devices(void)
(0160) {
(0161) //stop errant interrupts until set up
(0162) CLI(); //disable all interrupts
_init_devices:
10F 94F8 BCLR 7
(0163) port_init();
110 DF46 RCALL _port_init
(0164) timer1_init();
111 DF50 RCALL _timer1_init
(0165) hour=0x00;
112 2422 CLR R2
113 9220 0066 STS hour,R2
(0166) minute=0x00;
115 9220 0067 STS minute,R2
(0167) second=0x00;
117 9220 0068 STS second,R2
(0168) MCUCR = 0x00;
119 BE25 OUT 0x35,R2
(0169) GICR = 0x00;
11A BE2B OUT 0x3B,R2
(0170) TIMSK = 0x04; //timer interrupt sources
11B E084 LDI R24,4
11C BF89 OUT 0x39,R24
(0171) SEI(); //re-enable interrupts
11D 9478 BSET 7
11E 9508 RET
_display:
led_sel --> R20
i --> R22
11F 940E 016F CALL push_xgsetF000
(0172) //all peripherals are now initialized
(0173) }
(0174)
(0175) /*动态扫描显示程序*/
(0176) void display()
(0177) {
(0178) unsigned char i,led_sel;
(0179) led_sel=0xdf;
121 ED4F LDI R20,0xDF
(0180) for(i=0;i<6;i++)
122 2766 CLR R22
123 C019 RJMP 0x013D
(0181) {
(0182) PORTA=led_tab[time_group[i]];
124 E680 LDI R24,0x60
125 E090 LDI R25,0
126 2FE6 MOV R30,R22
127 27FF CLR R31
128 0FE8 ADD R30,R24
129 1FF9 ADC R31,R25
12A 81E0 LDD R30,Z+0
12B 27FF CLR R31
12C 0FEE LSL R30
12D 1FFF ROL R31
12E E584 LDI R24,0x54
12F E090 LDI R25,0
130 0FE8 ADD R30,R24
131 1FF9 ADC R31,R25
132 9025 LPM R2,Z+
133 9034 LPM R3,0(Z)
134 BA2B OUT 0x1B,R2
(0183) PORTB=led_sel;
135 BB48 OUT 0x18,R20
(0184) led_sel=(led_sel>>1)+0x80;
136 9546 LSR R20
137 5840 SUBI R20,0x80
(0185) delay_ms(10);
138 E00A LDI R16,0xA
139 D007 RCALL _delay_ms
(0186) PORTB=0xff;
13A EF8F LDI R24,0xFF
13B BB88 OUT 0x18,R24
13C 9563 INC R22
13D 3066 CPI R22,6
13E F328 BCS 0x0124
13F 940C 0174 JMP pop_xgsetF000
_delay_ms:
a --> R20
b --> R22
i --> R16
141 934A ST R20,-Y
142 936A ST R22,-Y
(0187) }
(0188) }
(0189)
(0190) /*毫秒延时程序*/
(0191) void delay_ms(unsigned char i)
(0192) {
(0193) unsigned char a, b;
(0194) for (a = 1; a < i; a++)
143 E041 LDI R20,1
144 C006 RJMP 0x014B
(0195) {
(0196) for (b = 1; b; b++)
145 E061 LDI R22,1
146 C001 RJMP 0x0148
147 9563 INC R22
148 2366 TST R22
149 F7E9 BNE 0x0147
14A 9543 INC R20
14B 1740 CP R20,R16
14C F3C0 BCS 0x0145
14D 9169 LD R22,Y+
14E 9149 LD R20,Y+
14F 9508 RET
(0197) {
(0198) ;
(0199) }
(0200) }
(0201) }
(0202)
(0203) /*主程序*/
(0204) void main(void)
(0205) {
(0206)
(0207) init_devices();
_main:
150 DFBE RCALL _init_devices
151 C003 RJMP 0x0155
(0208) while(1)
(0209) {
(0210) set_detect();
152 DF72 RCALL _set_detect
(0211) data_split();
153 DF46 RCALL _data_split
(0212) display();
FILE: <library>
154 DFCA RCALL _display
155 CFFC RJMP 0x0152
156 9508 RET
mod8u:
157 9468 BSET 6
158 C001 RJMP xdiv8u
div8u:
159 94E8 BCLR 6
xdiv8u:
15A 932A ST R18,-Y
15B 92FA ST R15,-Y
15C 92EA ST R14,-Y
15D 24FF CLR R15
15E 24EE CLR R14
15F E120 LDI R18,0x10
160 0F00 LSL R16
161 1CFF ROL R15
162 1CEE ROL R14
163 16E1 CP R14,R17
164 F010 BCS 0x0167
165 1AE1 SUB R14,R17
166 9503 INC R16
167 952A DEC R18
168 F7B9 BNE 0x0160
169 F40E BRTC 0x016B
16A 2D0E MOV R16,R14
16B 90E9 LD R14,Y+
16C 90F9 LD R15,Y+
16D 9129 LD R18,Y+
16E 9508 RET
push_xgsetF000:
16F 937A ST R23,-Y
170 936A ST R22,-Y
171 935A ST R21,-Y
172 934A ST R20,-Y
173 9508 RET
pop_xgsetF000:
174 9149 LD R20,Y+
175 9159 LD R21,Y+
176 9169 LD R22,Y+
177 9179 LD R23,Y+
178 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -