📄 uart.lst
字号:
(0216)
(0217) //串行接收中断服务程序
(0218) #pragma interrupt_handler uart0_rx_isr:12
(0219) void uart0_rx_isr(void)
0101 E585 LDI R24,0x55
0102 2628 EOR R2,R24
(0220) {
0103 9220008C STS xx0,R2
(0221) if(!(UCSRA& (1<<RXC)))
0105 EA8A LDI R24,0xAA
0106 E090 LDI R25,0
0107 2433 CLR R3
(0222) return;
0108 2628 EOR R2,R24
0109 2639 EOR R3,R25
010A 9220008C STS xx0,R2
(0223) if(rsok00==0){
010C 90200090 LDS R2,rscnt11
010E 9030008C LDS R3,xx0
0110 2432 EOR R3,R2
0111 9230008C STS xx0,R3
0113 2422 CLR R2
(0224) rcvd1=UDR;
0114 9220007E STS Tx_Rx,R2
0116 C080 RJMP 0x0197
0117 2422 CLR R2
0118 9220008A STS rsok00,R2
011A C07C RJMP 0x0197
011B 90200088 LDS R2,rsok20
(0225) if(rcvd1==0x55)rscnt01++;
(0226) else if(rcvd1==0xaa)rscnt01++;
011D 2022 TST R2
011E F461 BNE 0x012B
011F B02C IN R2,0x0C
0120 9220008F STS rscnt12,R2
0122 E081 LDI R24,1
0123 93800088 STS rsok20,R24
0125 9030008C LDS R3,xx0
0127 2432 EOR R3,R2
0128 9230008C STS xx0,R3
(0227) else{}
012A C06C RJMP 0x0197
012B 90200087 LDS R2,rsok30
(0228) if((rcvd1==0xaa)&&(rscnt01>=1)){rsok00=1;
(0229) rscnt01=0;
012D 2022 TST R2
(0230) }
(0231) }
012E F461 BNE 0x013B
012F B02C IN R2,0x0C
0130 9220008E STS rscnt13,R2
(0232) else{
0132 E081 LDI R24,1
0133 93800087 STS rsok30,R24
(0233) if(rsok10==0){
(0234)
0135 9030008C LDS R3,xx0
0137 2432 EOR R3,R2
(0235) rscnt11=UDR;
0138 9230008C STS xx0,R3
013A C05C RJMP 0x0197
013B E982 LDI R24,0x92
(0236) // if((rscnt11==addressper)||(rscnt11==0x00))
013C E090 LDI R25,0
013D 91E0008D LDS R30,rscnt01
(0237) if(rscnt11==addressper)
013F 27FF CLR R31
(0238) { rsok10=1;
(0239) xx0=0;xx1=0;
0140 0FE8 ADD R30,R24
0141 1FF9 ADC R31,R25
0142 B02C IN R2,0x0C
0143 8220 STD Z+0,R2
(0240) xx0=xx0^0x55;
0144 9180008E LDS R24,rscnt13
0146 5F8F SUBI R24,0xFF
(0241) xx0=xx0^0xaa;
0147 9020008D LDS R2,rscnt01
0149 1628 CP R2,R24
(0242) xx0=xx0^rscnt11;
014A F4B8 BCC 0x0162
(0243) Tx_Rx=0;
(0244) }
014B E982 LDI R24,0x92
014C E090 LDI R25,0
014D 2DE2 MOV R30,R2
014E 27FF CLR R31
(0245) else { rsok00=0;}
014F 0FE8 ADD R30,R24
0150 1FF9 ADC R31,R25
0151 8020 LDD R2,Z+0
(0246) }
0152 9030008C LDS R3,xx0
0154 2432 EOR R3,R2
(0247) else{
0155 9230008C STS xx0,R3
0157 91E0008D LDS R30,rscnt01
0159 27FF CLR R31
(0248) if(rsok20==0){
015A 0FE8 ADD R30,R24
(0249) rscnt12=UDR;
(0250) rsok20=1;
015B 1FF9 ADC R31,R25
015C 8020 LDD R2,Z+0
015D 9030008B LDS R3,xx1
015F 0C32 ADD R3,R2
0160 9230008B STS xx1,R3
0162 9180008E LDS R24,rscnt13
(0251) xx0=xx0^rscnt12;
0164 5F8F SUBI R24,0xFF
0165 9020008D LDS R2,rscnt01
0167 1628 CP R2,R24
0168 F549 BNE 0x0192
0169 E982 LDI R24,0x92
016A E090 LDI R25,0
016B 2DE2 MOV R30,R2
016C 27FF CLR R31
016D 0FE8 ADD R30,R24
016E 1FF9 ADC R31,R25
016F 8020 LDD R2,Z+0
0170 9030008C LDS R3,xx0
0172 1432 CP R3,R2
0173 F451 BNE 0x017E
0174 E081 LDI R24,1
0175 93800086 STS rsok40,R24
(0252) }
0177 2422 CLR R2
0178 9220007D STS Rx_Time,R2
017A E082 LDI R24,2
017B 9380007E STS Tx_Rx,R24
017D C014 RJMP 0x0192
017E 2422 CLR R2
017F 9220008A STS rsok00,R2
0181 92200089 STS rsok10,R2
(0253) else {
(0254) if(rsok30==0){
0183 92200088 STS rsok20,R2
0185 92200087 STS rsok30,R2
0187 92200086 STS rsok40,R2
(0255) rscnt13=UDR;
0189 9220008D STS rscnt01,R2
018B 92200090 STS rscnt11,R2
018D E082 LDI R24,2
018E 9380007E STS Tx_Rx,R24
0190 9220007D STS Rx_Time,R2
0192 9180008D LDS R24,rscnt01
(0256) rsok30=1;
0194 5F8F SUBI R24,0xFF
0195 9380008D STS rscnt01,R24
0197 9029 LD R2,Y+
(0257) xx0=xx0^rscnt13;
(0258) }
(0259) else{
0198 BE2F OUT 0x3F,R2
0199 91F9 LD R31,Y+
019A 91E9 LD R30,Y+
(0260) rcv1[rscnt01]=UDR;
019B 9199 LD R25,Y+
019C 9189 LD R24,Y+
(0261) if(rscnt01<(rscnt13+1)){ xx0=xx0^rcv1[rscnt01];
019D 9039 LD R3,Y+
019E 9029 LD R2,Y+
(0262) xx1+=rcv1[rscnt01];
019F 9518 RETI
_delay:
01A0 D535 RCALL push_arg4
(0263) }
01A1 D545 RCALL push_gset3
01A2 9724 SBIW R28,4
01A3 C006 RJMP 0x01AA
(0264) if(rscnt01==(rscnt13+1)){
01A4 24AA CLR R10
01A5 C001 RJMP 0x01A7
(0265) if(xx0==rcv1[rscnt01])
01A6 94A3 INC R10
01A7 2D8A MOV R24,R10
(0266) { rsok40=1;
(0267) Rx_Time = 0;
(0268) Tx_Rx = 2;
01A8 3082 CPI R24,2
01A9 F3E0 BCS 0x01A6
01AA 01FE MOVW R30,R28
01AB 8422 LDD R2,Z+10
01AC 8433 LDD R3,Z+11
(0269) }
(0270) else {
(0271) // UCSRB=UCSRB|0x08;
(0272) rsok00=0;
01AD 8444 LDD R4,Z+12
01AE 8455 LDD R5,Z+13
01AF 01FE MOVW R30,R28
01B0 8220 STD Z+0,R2
01B1 8231 STD Z+1,R3
01B2 8242 STD Z+2,R4
01B3 8253 STD Z+3,R5
01B4 E041 LDI R20,1
01B5 E050 LDI R21,0
(0273) rsok10=0;
(0274) rsok20=0;
(0275) rsok30=0;
(0276) rsok40=0;
(0277) rscnt01=0;
(0278) rscnt11=0;
(0279) Tx_Rx=2;
_UnLoad:
01B6 E060 LDI R22,0
01B7 E070 LDI R23,0
01B8 01FE MOVW R30,R28
(0280) Rx_Time=0;
01B9 8020 LDD R2,Z+0
01BA 8031 LDD R3,Z+1
01BB 8042 LDD R4,Z+2
(0281) }
01BC 8053 LDD R5,Z+3
01BD 1A24 SUB R2,R20
01BE 0A35 SBC R3,R21
01BF 0A46 SBC R4,R22
01C0 0A57 SBC R5,R23
01C1 01FE MOVW R30,R28
01C2 8622 STD Z+10,R2
(0282) }
(0283) rscnt01++;
(0284) }
(0285) }
(0286) }
(0287) }
_Switch_Range:
01C3 8633 STD Z+11,R3
01C4 8644 STD Z+12,R4
01C5 8655 STD Z+13,R5
(0288) }
(0289)
(0290) void delay(unsigned long delay_count)
01C6 E040 LDI R20,0
01C7 E050 LDI R21,0
01C8 E060 LDI R22,0
01C9 E070 LDI R23,0
01CA 01FE MOVW R30,R28
01CB 8020 LDD R2,Z+0
01CC 8031 LDD R3,Z+1
01CD 8042 LDD R4,Z+2
01CE 8053 LDD R5,Z+3
01CF 1624 CP R2,R20
01D0 0635 CPC R3,R21
01D1 0646 CPC R4,R22
01D2 0657 CPC R5,R23
01D3 F009 BEQ 0x01D5
01D4 CFCF RJMP 0x01A4
01D5 9624 ADIW R28,4
01D6 D506 RCALL pop_gset3
01D7 9624 ADIW R28,4
01D8 9508 RET
_puts:
s --> R20
01D9 D511 RCALL push_gset1
(0291) {
(0292) unsigned char loopi;
(0293) while(delay_count-- != 0)
01DA 01A8 MOVW R20,R16
(0294) {
01DB C005 RJMP 0x01E1
(0295) for(loopi=0;loopi<2;loopi++);
(0296) }
01DC 01FA MOVW R30,R20
(0297) }
(0298)
(0299)
01DD 8100 LDD R16,Z+0
(0300)
(0301) /* 字符串输出函数 */
01DE DE6E RCALL _putchar
(0302) void puts(char *s)
(0303) {
01DF 5F4F SUBI R20,0xFF
(0304) while (*s)
(0305) {
01E0 4F5F SBCI R21,0xFF
(0306) putchar(*s);
(0307) s++;
01E1 01FA MOVW R30,R20
_Auto_Range:
advalue --> Y+0
01E2 8020 LDD R2,Z+0
01E3 2022 TST R2
01E4 F7B9 BNE 0x01DC
(0308) }
(0309) putchar(0x0a);//回车换行
(0310) putchar(0x0d);
(0311) }
(0312)
(0313)
(0314) /* UART初始化 */
(0315) void uart_init(void)
01E5 E00A LDI R16,0xA
01E6 DE66 RCALL _putchar
01E7 E00D LDI R16,0xD
(0316) {
01E8 DE64 RCALL _putchar
01E9 D504 RCALL pop_gset1
01EA 9508 RET
(0317) // OSCCAL=read_flash(0x1f20);
(0318) rsok00=0;
(0319) rsok10=0;
(0320) rsok20=0;
_uart_init:
01EB 2422 CLR R2
(0321) rsok30=0;
(0322) rsok40=0;
01EC 9220008A STS rsok00,R2
01EE 92200089 STS rsok10,R2
(0323) rcvd1=0x00;
(0324) rscnt11=0x00;
01F0 92200088 STS rsok20,R2
(0325) rscnt12=0x00;
01F2 92200087 STS rsok30,R2
(0326) rscnt13=0x00;
(0327) rscnt01=0x00;
(0328) xx0=0;xx1=0;
01F4 92200086 STS rsok40,R2
01F6 92200091 STS rcvd1,R2
01F8 92200090 STS rscnt11,R2
01FA 9220008F STS rscnt12,R2
01FC 9220008E STS rscnt13,R2
01FE 9220008D STS rscnt01,R2
0200 9220008C STS xx0,R2
(0329) //UCSRB=0x90;//允许发送并开接收中断,发送不使能
(0330) UCSRB = 0x00;
(0331) UCSRA = 0x00;
0202 9220008B STS xx1,R2
0204 B82A OUT 0x0A,R2
(0332) UBRRL=(fosc/16/(baud+1))%256;
(0333) UBRRH=(fosc/16/(baud+1))/256;
0205 B82B OUT 0x0B,R2
0206 E688 LDI R24,0x68
0207 B989 OUT 0x09,R24
(0334) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
0208 BC20 OUT 0x20,R2
0209 E886 LDI R24,0x86
020A BD80 OUT 0x20,R24
020B E988 LDI R24,0x98
020C B98A OUT 0x0A,R24
(0335) UCSRB=0x98;
(0336) }
020D 9508 RET
_port_init:
020E 2422 CLR R2
020F BA28 OUT 0x18,R2
(0337)
0210 E083 LDI R24,3
0211 BB87 OUT 0x17,R24
0212 E280 LDI R24,0x20
(0338) void port_init(void)
(0339) {
(0340) //PB1-PCLK
(0341) //PB0-PDIO
(0342) PORTB = 0x00;
(0343) DDRB = 0x03;
0213 BB82 OUT 0x12,R24
(0344) //PD5-PSEL
(0345) //PD3-DCLK
(0346) //PD4-DIO
(0347) PORTD = 0x20;
0214 E380 LDI R24,0x30
0215 BB81 OUT 0x11,R24
0216 9508 RET
_entcomm:
0217 2422 CLR R2
0218 9220008C STS xx0,R2
021A 9220008B STS xx1,R2
021C E585 LDI R24,0x55
021D B98C OUT 0x0C,R24
021E 2628 EOR R2,R24
021F 9220008C STS xx0,R2
0221 9180008B LDS R24,xx1
0223 5A8B SUBI R24,0xAB
0224 9380008B STS xx1,R24
0226 9B5D SBIS 0x0B,5
0227 CFFE RJMP 0x0226
0228 EA8A LDI R24,0xAA
(0348) DDRD = 0x30;
(0349) }
(0350)
0229 B98C OUT 0x0C,R24
022A 2799 CLR R25
022B 9020008C LDS R2,xx0
(0351) /* 确认帧 */
(0352) void entcomm(void)
022D 2433 CLR R3
022E 2628 EOR R2,R24
022F 2639 EOR R3,R25
(0353) {
0230 9220008C STS xx0,R2
0232 9180008B LDS R24,xx1
(0354) xx0=0;xx1=0;
0234 5586 SUBI R24,0x56
0235 9380008B STS xx1,R24
0237 9B5D SBIS 0x0B,5
(0355) UDR=0x55;
0238 CFFE RJMP 0x0237
(0356) xx0=xx0^0x55;
(0357) xx1+=0x55;
(0358) while (!(UCSRA&(1<<UDRE)));
0239 E180 LDI R24,0x10
023A B98C OUT 0x0C,R24
023B 9020008C LDS R2,xx0
(0359) UDR=0xaa;
(0360) xx0=xx0^0xaa;
023D 2628 EOR R2,R24
023E 9220008C STS xx0,R2
0240 9180008B LDS R24,xx1
(0361) xx1+=0xaa;
(0362) while (!(UCSRA&(1<<UDRE)));
(0363) UDR=addressper;
(0364) xx0=xx0^addressper;
0242 5F80 SUBI R24,0xF0
0243 9380008B STS xx1,R24
(0365) xx1+=addressper;
0245 9B5D SBIS 0x0B,5
0246 CFFE RJMP 0x0245
(0366) while (!(UCSRA&(1<<UDRE)));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -