📄 1602lcd.lst
字号:
111 EC08 LDI R16,0xC8
112 E010 LDI R17,0
113 940E 00EC CALL _delay_nms
(0044) display_a_string(0,str1); //显示“frequncy meter”
115 E822 LDI R18,0x82
116 E030 LDI R19,0
117 2700 CLR R16
118 940E 00CB CALL _display_a_string
(0045) delay_nms(200);
11A EC08 LDI R16,0xC8
11B E010 LDI R17,0
11C 940E 00EC CALL _delay_nms
11E C00A RJMP 0x0129
(0046) while(1)
(0047) {
(0048) hextoasc(); //十六进制转ASCII码
11F D00B RCALL _hextoasc
(0049) display_a_string(1,str2);
120 E923 LDI R18,0x93
121 E030 LDI R19,0
122 E001 LDI R16,1
123 940E 00CB CALL _display_a_string
(0050) delay_nms(200);
125 EC08 LDI R16,0xC8
126 E010 LDI R17,0
127 940E 00EC CALL _delay_nms
129 CFF5 RJMP 0x011F
12A 9508 RET
(0051) }
(0052) }
(0053) //十六进制转ASCII码,为LCD显示作准备
(0054) void hextoasc(void)
(0055) {
(0056) if(count>=1000) //检测数值大于1000HZ,溢出
_hextoasc:
12B 9180 00A5 LDS R24,count
12D 9190 00A6 LDS R25,count+1
12F 3E88 CPI R24,0xE8
130 E0E3 LDI R30,3
131 079E CPC R25,R30
132 F058 BCS 0x013E
(0057) {
(0058) str2[6] ='O'; //显示"OVF"
133 E48F LDI R24,0x4F
134 9380 0099 STS 0x0099,R24
(0059) str2[7] ='V';
136 E586 LDI R24,0x56
137 9380 009A STS 0x009A,R24
(0060) str2[8] ='F';
139 E486 LDI R24,0x46
13A 9380 009B STS 0x009B,R24
(0061)
(0062) PORTC|=(1<<PC0);//PC0置1,发光管亮
13C 9AA8 SBI 0x15,0
(0063)
(0064) }
13D C029 RJMP 0x0167
(0065) else
(0066) {
(0067) str2[6]=count/100+0x30;
13E E624 LDI R18,0x64
13F E030 LDI R19,0
140 9100 00A5 LDS R16,count
142 9110 00A6 LDS R17,count+1
144 940E 01E1 CALL div16u
146 01C8 MOVW R24,R16
147 96C0 ADIW R24,0x30
148 9380 0099 STS 0x0099,R24
(0068) str2[7]=count%100/10+0x30;
14A E624 LDI R18,0x64
14B E030 LDI R19,0
14C 9100 00A5 LDS R16,count
14E 9110 00A6 LDS R17,count+1
150 940E 01DF CALL mod16u
152 E02A LDI R18,0xA
153 E030 LDI R19,0
154 940E 01E1 CALL div16u
156 01C8 MOVW R24,R16
157 96C0 ADIW R24,0x30
158 9380 009A STS 0x009A,R24
(0069) str2[8]=count%10+0x30;
15A E02A LDI R18,0xA
15B E030 LDI R19,0
15C 9100 00A5 LDS R16,count
15E 9110 00A6 LDS R17,count+1
160 940E 01DF CALL mod16u
162 01C8 MOVW R24,R16
163 96C0 ADIW R24,0x30
164 9380 009B STS 0x009B,R24
(0070) PORTC&=~(1<<PC0); //PC0清0,发光管灭
166 98A8 CBI 0x15,0
(0071) }
167 9508 RET
(0072) }
(0073)
(0074) void port_init(void)
(0075) {
(0076) PORTA = 0x00;
_port_init:
168 2422 CLR R2
169 BA2B OUT 0x1B,R2
(0077) DDRA = 0xFF;
16A EF8F LDI R24,0xFF
16B BB8A OUT 0x1A,R24
(0078) PORTB = 0x01;
16C E081 LDI R24,1
16D BB88 OUT 0x18,R24
(0079) DDRB = 0xFE;
16E EF8E LDI R24,0xFE
16F BB87 OUT 0x17,R24
(0080) PORTC = 0x00; //m103 output only
170 BA25 OUT 0x15,R2
(0081) DDRC = 0x01;
171 E081 LDI R24,1
172 BB84 OUT 0x14,R24
(0082) PORTD = 0xff;
173 EF8F LDI R24,0xFF
174 BB82 OUT 0x12,R24
(0083) DDRD = 0x00;
175 BA21 OUT 0x11,R2
(0084)
(0085) lcd_data_port=0xff;
176 BB82 OUT 0x12,R24
(0086) lcd_data_ddr=0xff;
177 BB81 OUT 0x11,R24
(0087) lcd_control_port=0x07;
178 E087 LDI R24,7
179 BB8B OUT 0x1B,R24
(0088) lcd_control_ddr=0x07;
17A BB8A OUT 0x1A,R24
17B 9508 RET
(0089) }
(0090)
(0091) //TIMER1 initialize - prescale:64
(0092) // WGM: 0) Normal, TOP=0xFFFF
(0093) // desired value: 1Hz
(0094) // actual value: 1.000Hz (0.0%)
(0095) void timer1_init(void)
(0096) {
(0097) TCCR1B = 0x00; //stop
_timer1_init:
17C 2422 CLR R2
17D BC2E OUT 0x2E,R2
(0098) TCNT1H = 0x0B; //setup
17E E08B LDI R24,0xB
17F BD8D OUT 0x2D,R24
(0099) TCNT1L = 0xDC;
180 ED8C LDI R24,0xDC
181 BD8C OUT 0x2C,R24
(0100)
(0101) TCCR1A = 0x00;
182 BC2F OUT 0x2F,R2
(0102) TCCR1B = 0x03; //start Timer
183 E083 LDI R24,3
184 BD8E OUT 0x2E,R24
185 9508 RET
(0103) }
(0104)
(0105) void init_devices(void)
(0106) {
(0107) //stop errant interrupts until set up
(0108) CLI(); //disable all interrupts
_init_devices:
186 94F8 BCLR 7
(0109) port_init();
187 DFE0 RCALL _port_init
(0110) timer1_init();
188 DFF3 RCALL _timer1_init
(0111) TCCR0=0x06;
189 E086 LDI R24,6
18A BF83 OUT 0x33,R24
(0112) TCNT0=0x00;
18B 2422 CLR R2
18C BE22 OUT 0x32,R2
(0113)
(0114) count=0x00;
18D 2433 CLR R3
18E 9230 00A6 STS count+1,R3
190 9220 00A5 STS count,R2
(0115) tim0_ovf_count=0x00;
192 9220 00A4 STS tim0_ovf_count,R2
(0116) timer1_init();
194 DFE7 RCALL _timer1_init
(0117)
(0118) lcd_init();
195 940E 006F CALL _lcd_init
(0119)
(0120) MCUCR = 0x00;
197 2422 CLR R2
198 BE25 OUT 0x35,R2
(0121) GICR = 0x00;
199 BE2B OUT 0x3B,R2
(0122) TIMSK = 0x05; //timer interrupt sources
19A E085 LDI R24,5
19B BF89 OUT 0x39,R24
(0123) SEI(); //re-enable interrupts
19C 9478 BSET 7
19D 9508 RET
_timer0_ovf_isr:
19E 922A ST R2,-Y
19F 938A ST R24,-Y
1A0 939A ST R25,-Y
1A1 B62F IN R2,0x3F
1A2 922A ST R2,-Y
(0124) }
(0125)
(0126) #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
(0127) void timer0_ovf_isr(void)
(0128) {
(0129) TCNT0 = 0x00 /*INVALID SETTING*/; //reload counter value
1A3 2422 CLR R2
1A4 BE22 OUT 0x32,R2
(0130) tim0_ovf_count++;
1A5 9180 00A4 LDS R24,tim0_ovf_count
1A7 5F8F SUBI R24,0xFF
1A8 9380 00A4 STS tim0_ovf_count,R24
1AA 9029 LD R2,Y+
1AB BE2F OUT 0x3F,R2
1AC 9199 LD R25,Y+
1AD 9189 LD R24,Y+
1AE 9029 LD R2,Y+
1AF 9518 RETI
_timer1_ovf_isr:
1B0 922A ST R2,-Y
1B1 923A ST R3,-Y
1B2 924A ST R4,-Y
1B3 925A ST R5,-Y
1B4 930A ST R16,-Y
1B5 931A ST R17,-Y
1B6 932A ST R18,-Y
1B7 933A ST R19,-Y
1B8 938A ST R24,-Y
1B9 B62F IN R2,0x3F
1BA 922A ST R2,-Y
(0131) }
(0132)
(0133)
(0134)
(0135) #pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
(0136) void timer1_ovf_isr(void)
(0137) {
(0138) //TIMER1 has overflowed
(0139) TCNT1H = 0x0B; //reload counter high value
1BB E08B LDI R24,0xB
1BC BD8D OUT 0x2D,R24
(0140) TCNT1L = 0xDC; //reload counter low value
1BD ED8C LDI R24,0xDC
1BE BD8C OUT 0x2C,R24
(0141) count=tim0_ovf_count*256+TCNT0;
1BF 9120 00A4 LDS R18,tim0_ovf_count
1C1 2733 CLR R19
1C2 E000 LDI R16,0
1C3 E011 LDI R17,1
1C4 940E 01FB CALL empy16s
1C6 0118 MOVW R2,R16
1C7 B642 IN R4,0x32
1C8 2455 CLR R5
1C9 0C24 ADD R2,R4
1CA 1C35 ADC R3,R5
1CB 9230 00A6 STS count+1,R3
1CD 9220 00A5 STS count,R2
(0142) tim0_ovf_count=0x00;
1CF 2422 CLR R2
1D0 9220 00A4 STS tim0_ovf_count,R2
(0143) TCNT0=0x00;
FILE: <library>
1D2 BE22 OUT 0x32,R2
1D3 9029 LD R2,Y+
1D4 BE2F OUT 0x3F,R2
1D5 9189 LD R24,Y+
1D6 9139 LD R19,Y+
1D7 9129 LD R18,Y+
1D8 9119 LD R17,Y+
1D9 9109 LD R16,Y+
1DA 9059 LD R5,Y+
1DB 9049 LD R4,Y+
1DC 9039 LD R3,Y+
1DD 9029 LD R2,Y+
1DE 9518 RETI
mod16u:
1DF 9468 BSET 6
1E0 C001 RJMP xdiv16u
div16u:
1E1 94E8 BCLR 6
xdiv16u:
1E2 92EA ST R14,-Y
1E3 92FA ST R15,-Y
1E4 938A ST R24,-Y
1E5 24EE CLR R14
1E6 24FF CLR R15
1E7 E180 LDI R24,0x10
1E8 0F00 LSL R16
1E9 1F11 ROL R17
1EA 1CEE ROL R14
1EB 1CFF ROL R15
1EC 16E2 CP R14,R18
1ED 06F3 CPC R15,R19
1EE F018 BCS 0x01F2
1EF 1AE2 SUB R14,R18
1F0 0AF3 SBC R15,R19
1F1 9503 INC R16
1F2 958A DEC R24
1F3 F7A1 BNE 0x01E8
1F4 F416 BRTC 0x01F7
1F5 2D0E MOV R16,R14
1F6 2D1F MOV R17,R15
1F7 9189 LD R24,Y+
1F8 90F9 LD R15,Y+
1F9 90E9 LD R14,Y+
1FA 9508 RET
empy16s:
1FB 920A ST R0,-Y
1FC 921A ST R1,-Y
1FD 938A ST R24,-Y
1FE 939A ST R25,-Y
1FF 9F02 MUL R16,R18
200 01C0 MOVW R24,R0
201 9F12 MUL R17,R18
202 0D90 ADD R25,R0
203 9F03 MUL R16,R19
204 0D90 ADD R25,R0
205 018C MOVW R16,R24
206 9199 LD R25,Y+
207 9189 LD R24,Y+
208 9019 LD R1,Y+
209 9009 LD R0,Y+
20A 9508 RET
push_xgset300C:
20B 935A ST R21,-Y
20C 934A ST R20,-Y
20D 92BA ST R11,-Y
20E 92AA ST R10,-Y
20F 9508 RET
pop_xgset300C:
210 90A9 LD R10,Y+
211 90B9 LD R11,Y+
212 9149 LD R20,Y+
213 9159 LD R21,Y+
214 9508 RET
push_xgsetF00C:
215 937A ST R23,-Y
216 936A ST R22,-Y
217 935A ST R21,-Y
218 934A ST R20,-Y
219 92BA ST R11,-Y
21A 92AA ST R10,-Y
21B 9508 RET
pop_xgsetF00C:
21C 90A9 LD R10,Y+
21D 90B9 LD R11,Y+
21E 9149 LD R20,Y+
21F 9159 LD R21,Y+
220 9169 LD R22,Y+
221 9179 LD R23,Y+
222 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -