📄 pro.lst
字号:
(0094) }
0249 9029 LD R2,Y+
024A BE2F OUT 0x3F,R2
024B 9199 LD R25,Y+
024C 9189 LD R24,Y+
024D 9029 LD R2,Y+
024E 9518 RETI
(0095) }
(0096)
(0097) //定时T1初始化
(0098) void timer1_init(void)
(0099) {
(0100) TCCR1B = 0x00;//停止定时器
_timer1_init:
024F 2422 CLR R2
0250 BC2E OUT 0x2E,R2
(0101) TIMSK |= 0x04;//中断允许
0251 B789 IN R24,0x39
0252 6084 ORI R24,4
0253 BF89 OUT 0x39,R24
(0102) TCNT1H = 0x00;
0254 BC2D OUT 0x2D,R2
(0103) TCNT1L = 0x00;//初始值
0255 BC2C OUT 0x2C,R2
(0104) OCR1AH = 0xFF;
0256 EF8F LDI R24,0xFF
0257 BD8B OUT 0x2B,R24
(0105) OCR1AL = 0xFF;//匹配A值
0258 BD8A OUT 0x2A,R24
(0106) OCR1BH = 0xFF;
0259 BD89 OUT 0x29,R24
(0107) OCR1BL = 0xFF;//匹配B值
025A BD88 OUT 0x28,R24
(0108) ICR1H = 0xFF;
025B BD87 OUT 0x27,R24
(0109) ICR1L = 0xFF;//输入捕捉匹配值
025C BD86 OUT 0x26,R24
(0110) TCCR1A = 0x0C;
025D E08C LDI R24,0xC
025E BD8F OUT 0x2F,R24
(0111) TCCR1B = 0x06;//启动定时器
025F E086 LDI R24,6
0260 BD8E OUT 0x2E,R24
0261 9508 RET
_timer1_ovf_isr:
0262 938A ST R24,-Y
0263 B78F IN R24,0x3F
0264 938A ST R24,-Y
(0112) }
(0113)
(0114)
(0115) //定时器T1溢出中断服务程序
(0116) #pragma interrupt_handler timer1_ovf_isr:9
(0117) void timer1_ovf_isr(void)
(0118) {
(0119) // TCNT1H = 0x00; //重装值高位
(0120) // TCNT1L = 0x00; //重装值低位
(0121) T1_OV_Times=1;
0265 E081 LDI R24,1
0266 93800081 STS T1_OV_Times,R24
0268 9189 LD R24,Y+
0269 BF8F OUT 0x3F,R24
026A 9189 LD R24,Y+
026B 9518 RETI
(0122) }
(0123)
(0124) //定时器T2初始化
(0125) void timer2_init(void)
(0126) {
(0127) TCCR2 = 0x00;//停止定时器
_timer2_init:
026C 2422 CLR R2
026D BC25 OUT 0x25,R2
(0128) ASSR = 0x08;//异步时钟模式
026E E088 LDI R24,0x8
026F BD82 OUT 0x22,R24
(0129) TCNT2 = 0x80;//初始值
0270 E880 LDI R24,0x80
0271 BD84 OUT 0x24,R24
(0130) OCR2 = 0x7F;//匹配值
0272 E78F LDI R24,0x7F
0273 BD83 OUT 0x23,R24
(0131) TIMSK |= 0x40;//中断允许
0274 B789 IN R24,0x39
0275 6480 ORI R24,0x40
0276 BF89 OUT 0x39,R24
(0132) TCCR2 = 0x06;//启动定时器
0277 E086 LDI R24,6
0278 BD85 OUT 0x25,R24
0279 9508 RET
_timer2_ovf_isr:
027A 922A ST R2,-Y
027B 923A ST R3,-Y
027C 924A ST R4,-Y
027D 925A ST R5,-Y
027E 926A ST R6,-Y
027F 927A ST R7,-Y
0280 928A ST R8,-Y
0281 929A ST R9,-Y
0282 930A ST R16,-Y
0283 931A ST R17,-Y
0284 932A ST R18,-Y
0285 933A ST R19,-Y
0286 938A ST R24,-Y
0287 939A ST R25,-Y
0288 93AA ST R26,-Y
0289 93BA ST R27,-Y
028A 93EA ST R30,-Y
028B B62F IN R2,0x3F
028C 922A ST R2,-Y
028D 940E064C CALL push_gset2
(0133) }
(0134)
(0135) uchar second_is_ok=0;
(0136) //T2溢出中断服务程序
(0137)
(0138) #pragma interrupt_handler timer2_ovf_isr:5
(0139) void timer2_ovf_isr(void)
(0140) {
(0141)
(0142) TCCR1B = 0x00;//停止定时器
028F 2422 CLR R2
0290 BC2E OUT 0x2E,R2
(0143) PORTB &=~(1<<PB0); //关闭闸门
0291 98C0 CBI 0x18,0
(0144) second_is_ok=1;
0292 E081 LDI R24,1
0293 93800084 STS second_is_ok,R24
(0145) value=TCNT1L;
0295 B42C IN R2,0x2C
0296 2433 CLR R3
0297 2444 CLR R4
0298 2455 CLR R5
0299 9230006E STS value+1,R3
029B 9220006D STS value,R2
029D 92500070 STS value+3,R5
029F 9240006F STS value+2,R4
(0146) value|=(TCNT1H << 8); //然后读高位
02A1 B42D IN R2,0x2D
02A2 2433 CLR R3
02A3 2C32 MOV R3,R2
02A4 2422 CLR R2
02A5 2444 CLR R4
02A6 FC37 SBRC R3,7
02A7 9440 COM R4
02A8 2455 CLR R5
02A9 FC47 SBRC R4,7
02AA 9450 COM R5
02AB 9080006F LDS R8,value+2
02AD 90900070 LDS R9,value+3
02AF 9060006D LDS R6,value
02B1 9070006E LDS R7,value+1
02B3 2862 OR R6,R2
02B4 2873 OR R7,R3
02B5 2884 OR R8,R4
02B6 2895 OR R9,R5
02B7 9270006E STS value+1,R7
02B9 9260006D STS value,R6
02BB 92900070 STS value+3,R9
02BD 9280006F STS value+2,R8
(0147) //读取计数值
(0148) Freq_H16=value;
02BF 0113 MOVW R2,R6
02C0 0124 MOVW R4,R8
02C1 92300076 STS Freq_H16+1,R3
02C3 92200075 STS Freq_H16,R2
02C5 92500078 STS Freq_H16+3,R5
02C7 92400077 STS Freq_H16+2,R4
(0149) counter=Freq_H16;
02C9 90400077 LDS R4,Freq_H16+2
02CB 90500078 LDS R5,Freq_H16+3
02CD 90200075 LDS R2,Freq_H16
02CF 90300076 LDS R3,Freq_H16+1
02D1 9230007E STS counter+1,R3
02D3 9220007D STS counter,R2
02D5 92500080 STS counter+3,R5
02D7 9240007F STS counter+2,R4
(0150) Freq_H16 =Freq_H16*256;
02D9 E040 LDI R20,0
02DA E051 LDI R21,1
02DB E060 LDI R22,0
02DC E070 LDI R23,0
02DD 925A ST R5,-Y
02DE 924A ST R4,-Y
02DF 923A ST R3,-Y
02E0 922A ST R2,-Y
02E1 018A MOVW R16,R20
02E2 019B MOVW R18,R22
02E3 940E0610 CALL empy32s
02E5 93100076 STS Freq_H16+1,R17
02E7 93000075 STS Freq_H16,R16
02E9 93300078 STS Freq_H16+3,R19
02EB 93200077 STS Freq_H16+2,R18
(0151)
(0152) Freq_L8 =(PIND & 0b11111111); //读取计数值的低8位
02ED B380 IN R24,0x10
02EE 2799 CLR R25
02EF 7090 ANDI R25,0
02F0 011C MOVW R2,R24
02F1 2444 CLR R4
02F2 FC37 SBRC R3,7
02F3 9440 COM R4
02F4 2455 CLR R5
02F5 FC47 SBRC R4,7
02F6 9450 COM R5
02F7 9230007A STS Freq_L8+1,R3
02F9 92200079 STS Freq_L8,R2
02FB 9250007C STS Freq_L8+3,R5
02FD 9240007B STS Freq_L8+2,R4
(0153) Freq=Freq_H16+Freq_L8;
02FF 0138 MOVW R6,R16
0300 0149 MOVW R8,R18
0301 0C62 ADD R6,R2
0302 1C73 ADC R7,R3
0303 1C84 ADC R8,R4
0304 1C95 ADC R9,R5
0305 92700072 STS Freq+1,R7
0307 92600071 STS Freq,R6
0309 92900074 STS Freq+3,R9
030B 92800073 STS Freq+2,R8
(0154) if(T1_OV_Times !=0)
030D 90200081 LDS R2,T1_OV_Times
030F 2022 TST R2
0310 F131 BEQ 0x0337
(0155) {
(0156) Freq+=(unsigned long)0xffff*0xff*T1_OV_Times;
0311 2433 CLR R3
0312 2444 CLR R4
0313 2455 CLR R5
0314 E041 LDI R20,1
0315 EF5F LDI R21,0xFF
0316 EF6E LDI R22,0xFE
0317 E070 LDI R23,0
0318 925A ST R5,-Y
0319 924A ST R4,-Y
031A 923A ST R3,-Y
031B 922A ST R2,-Y
031C 018A MOVW R16,R20
031D 019B MOVW R18,R22
031E 940E0610 CALL empy32s
0320 90400073 LDS R4,Freq+2
0322 90500074 LDS R5,Freq+3
0324 90200071 LDS R2,Freq
0326 90300072 LDS R3,Freq+1
0328 0E20 ADD R2,R16
0329 1E31 ADC R3,R17
032A 1E42 ADC R4,R18
032B 1E53 ADC R5,R19
032C 92300072 STS Freq+1,R3
032E 92200071 STS Freq,R2
0330 92500074 STS Freq+3,R5
0332 92400073 STS Freq+2,R4
(0157) T1_OV_Times=0;
0334 2422 CLR R2
0335 92200081 STS T1_OV_Times,R2
(0158) }
(0159) PORTB |=(1<<PB7); //74LS393清零
0337 9AC7 SBI 0x18,7
(0160) TCNT1H=0;
0338 2422 CLR R2
0339 BC2D OUT 0x2D,R2
(0161) TCNT1L=0; //清空T1计数器
033A BC2C OUT 0x2C,R2
(0162) PORTB &=~(1<<PB7); //使能计数功能
033B 98C7 CBI 0x18,7
(0163) PORTB |=(1<<PB0); //打开闸门
033C 9AC0 SBI 0x18,0
(0164) TCNT2 = 0x80; //定时时间1秒
033D E880 LDI R24,0x80
033E BD84 OUT 0x24,R24
(0165) TCCR1B = 0x06;
033F E086 LDI R24,6
0340 BD8E OUT 0x2E,R24
0341 940E0640 CALL pop_gset2
0343 9029 LD R2,Y+
0344 BE2F OUT 0x3F,R2
0345 91E9 LD R30,Y+
0346 91B9 LD R27,Y+
0347 91A9 LD R26,Y+
0348 9199 LD R25,Y+
0349 9189 LD R24,Y+
034A 9139 LD R19,Y+
034B 9129 LD R18,Y+
034C 9119 LD R17,Y+
034D 9109 LD R16,Y+
034E 9099 LD R9,Y+
034F 9089 LD R8,Y+
0350 9079 LD R7,Y+
0351 9069 LD R6,Y+
0352 9059 LD R5,Y+
0353 9049 LD R4,Y+
0354 9039 LD R3,Y+
0355 9029 LD R2,Y+
0356 9518 RETI
_PutChar:
freq --> Y+0
0357 940E064C CALL push_gset2
0359 9724 SBIW R28,4
(0166) }
(0167)
(0168) void PutChar()
(0169) {
(0170) unsigned long freq=0;
035A E040 LDI R20,0
035B E050 LDI R21,0
035C E060 LDI R22,0
035D E070 LDI R23,0
035E 01FE MOVW R30,R28
035F 8340 STD Z+0,R20
0360 8351 STD Z+1,R21
0361 8362 STD Z+2,R22
0362 8373 STD Z+3,R23
(0171) freq=Freq;
0363 90400073 LDS R4,Freq+2
0365 90500074 LDS R5,Freq+3
0367 90200071 LDS R2,Freq
0369 90300072 LDS R3,Freq+1
036B 01FE MOVW R30,R28
036C 8220 STD Z+0,R2
036D 8231 STD Z+1,R3
036E 8242 STD Z+2,R4
036F 8253 STD Z+3,R5
(0172) temp[0]= freq /10000000+0x30;
0370 E840 LDI R20,0x80
0371 E956 LDI R21,0x96
0372 E968 LDI R22,0x98
0373 E070 LDI R23,0
0374 01FE MOVW R30,R28
0375 8020 LDD R2,Z+0
0376 8031 LDD R3,Z+1
0377 8042 LDD R4,Z+2
0378 8053 LDD R5,Z+3
0379 937A ST R23,-Y
037A 936A ST R22,-Y
037B 935A ST R21,-Y
037C 934A ST R20,-Y
037D 0181 MOVW R16,R2
037E 0192 MOVW R18,R4
037F 940E0577 CALL div32u
0381 0118 MOVW R2,R16
0382 0129 MOVW R4,R18
0383 E340 LDI R20,0x30
0384 E050 LDI R21,0
0385 E060 LDI R22,0
0386 E070 LDI R23,0
0387 0E24 ADD R2,R20
0388 1E35 ADC R3,R21
0389 1E46 ADC R4,R22
038A 1E57 ADC R5,R23
038B 922000C0 STS temp,R2
(0173) freq = freq %10000000;
038D E840 LDI R20,0x80
038E E956 LDI R21,0x96
038F E968 LDI R22,0x98
0390 E070 LDI R23,0
0391 01FE MOVW R30,R28
0392 8020 LDD R2,Z+0
0393 8031 LDD R3,Z+1
0394 8042 LDD R4,Z+2
0395 8053 LDD R5,Z+3
0396 937A ST R23,-Y
0397 936A ST R22,-Y
0398 935A ST R21,-Y
0399 934A ST R20,-Y
039A 0181 MOVW R16,R2
039B 0192 MOVW R18,R4
039C 940E0579 CALL mod32u
039E 01FE MOVW R30,R28
039F 8300 STD Z+0,R16
03A0 8311 STD Z+1,R17
03A1 8322 STD Z+2,R18
03A2 8333 STD Z+3,R19
(0174) temp[1]=freq /1000000+0x30;
03A3 E440 LDI R20,0x40
03A4 E452 LDI R21,0x42
03A5 E06F LDI R22,0xF
03A6 E070 LDI R23,0
03A7 01FE MOVW R30,R28
03A8 8020 LDD R2,Z+0
03A9 8031 LDD R3,Z+1
03AA 8042 LDD R4,Z+2
03AB 8053 LDD R5,Z+3
03AC 937A ST R23,-Y
03AD 936A ST R22,-Y
03AE 935A ST R21,-Y
03AF 934A ST R20,-Y
03B0 0181 MOVW R16,R2
03B1 0192 MOVW R18,R4
03B2 940E0577 CALL div32u
03B4 0118 MOVW R2,R16
03B5 0129 MOVW R4,R18
03B6 E340 LDI R20,0x30
03B7 E050 LDI R21,0
03B8 E060 LDI R22,0
03B9 E070 LDI R23,0
03BA 0E24 ADD R2,R20
03BB 1E35 ADC R3,R21
03BC 1E46 ADC R4,R22
03BD 1E57 ADC R5,R23
03BE 922000C1 STS temp+1,R2
(0175) freq =freq %1000000;
03C0 E440 LDI R20,0x40
03C1 E452 LDI R21,0x42
03C2 E06F LDI R22,0xF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -