📄 uart.lis
字号:
.module Uart.c
.area data(ram, con, rel)
0000 _put_done::
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 _recv_done::
0001 .blkb 1
.area idata
0001 00 .byte 0
.area data(ram, con, rel)
0002 _newMSG::
0002 .blkb 1
.area idata
0002 00 .byte 0
.area data(ram, con, rel)
0003 _change_flag::
0003 .blkb 1
.area idata
0003 00 .byte 0
.area data(ram, con, rel)
0004 _serial_recv_flag::
0004 .blkb 1
.area idata
0004 00 .byte 0
.area data(ram, con, rel)
.area vector(rom, abs)
.org 72
0048 0C940000 jmp _uart0_rx_isr
.area data(ram, con, rel)
.area text(rom, con, rel)
.even
0000 _uart0_rx_isr::
0000 0E940000 xcall push_lset
0004 ; #include<iom128v.h>
0004 ; //UART0接口
0004 ;
0004 ;
0004 ; unsigned char put_done=0;
0004 ; unsigned char recv_done=0;
0004 ; unsigned char recvBuff[128];
0004 ; unsigned char newMSG=0;
0004 ; unsigned char i;
0004 ; unsigned char *serial_recv_MSG;
0004 ; unsigned char change_flag=0;
0004 ; unsigned char serial_recv_flag=0;
0004 ;
0004 ; #pragma interrupt_handler uart0_rx_isr:19
0004 ; void uart0_rx_isr(void)
0004 ; {
0004 ; recv_done=1;
0004 81E0 ldi R24,1
0006 80930100 sts _recv_done,R24
000A ; serial_get();
000A 47D0 xcall _serial_get
000C L1:
000C 0E940000 xcall pop_lset
0010 .dbline 0 ; func end
0010 1895 reti
.area vector(rom, abs)
.org 80
0050 0C940900 jmp _uart0_tx_isr
.area text(rom, con, rel)
.even
0012 _uart0_tx_isr::
0012 8A93 st -y,R24
0014 8FB7 in R24,0x3f
0016 8A93 st -y,R24
0018 ; }
0018 ;
0018 ;
0018 ; #pragma interrupt_handler uart0_tx_isr:21
0018 ; void uart0_tx_isr(void)
0018 ; {
0018 ; put_done=1;
0018 81E0 ldi R24,1
001A 80930000 sts _put_done,R24
001E L2:
001E 8991 ld R24,y+
0020 8FBF out 0x3f,R24
0022 8991 ld R24,y+
0024 .dbline 0 ; func end
0024 1895 reti
0026 ; data -> R16
.even
0026 _put::
0026 ; }
0026 ;
0026 ;
0026 ; //**********Put a single byte to the serial port.
0026 ; void put(unsigned char data)
0026 ; {
0026 L4:
0026 L5:
0026 ; while(!put_done)
0026 20900000 lds R2,_put_done
002A 2220 tst R2
002C E1F3 breq L4
002E ; ;
002E ; UDR0=data;
002E 0CB9 out 0xc,R16
0030 ; put_done=0;
0030 2224 clr R2
0032 20920000 sts _put_done,R2
0036 L3:
0036 .dbline 0 ; func end
0036 0895 ret
0038 ; data -> R16
.even
0038 _get::
0038 ; }
0038 ;
0038 ;
0038 ; //***********Receive a single byte from the serial port.
0038 ; unsigned char get()
0038 ; {
0038 L8:
0038 L9:
0038 ; unsigned char data;
0038 ; while(!recv_done)
0038 20900100 lds R2,_recv_done
003C 2220 tst R2
003E E1F3 breq L8
0040 ; ;
0040 ; data=UDR0;
0040 0CB1 in R16,0xc
0042 ; recv_done=0;
0042 2224 clr R2
0044 20920100 sts _recv_done,R2
0048 ; return data;
0048 L7:
0048 .dbline 0 ; func end
0048 0895 ret
004A ; length -> R20
004A ; m -> R22
004A ; data -> R12
004A ; serial_MSG -> R10,R11
.even
004A _serial_put::
004A 0E940000 xcall push_gset4
004E 5801 movw R10,R16
0050 ; }
0050 ;
0050 ;
0050 ; //**********Put a serial Frame to the serial port.
0050 ; void serial_put(unsigned char *serial_MSG)
0050 ; {
0050 ; unsigned char m;
0050 ; unsigned char length;
0050 ; unsigned char data;
0050 ; put(0x7E);
0050 0EE7 ldi R16,126
0052 E9DF xcall _put
0054 ; serial_MSG++;
0054 C501 movw R24,R10
0056 0196 adiw R24,1
0058 5C01 movw R10,R24
005A ; length=*serial_MSG;
005A FC01 movw R30,R24
005C 4081 ldd R20,z+0
005E ;
005E ; for(m=0;m<length;m++)
005E 6627 clr R22
0060 15C0 xjmp L15
0062 L12:
0062 ; {
0062 ; data=*serial_MSG;
0062 F501 movw R30,R10
0064 C080 ldd R12,z+0
0066 ; if(data==0x7E)
0066 8C2D mov R24,R12
0068 8E37 cpi R24,126
006A 29F4 brne L16
006C ; {
006C ; put(0x7D);
006C 0DE7 ldi R16,125
006E DBDF xcall _put
0070 ; put(0x5E);
0070 0EE5 ldi R16,94
0072 D9DF xcall _put
0074 ; }
0074 0AC0 xjmp L17
0076 L16:
0076 ; else if(data==0x7D)
0076 8C2D mov R24,R12
0078 8D37 cpi R24,125
007A 29F4 brne L18
007C ; {
007C ; put(0x7D);
007C 0DE7 ldi R16,125
007E D3DF xcall _put
0080 ; put(0x5D);
0080 0DE5 ldi R16,93
0082 D1DF xcall _put
0084 ; }
0084 02C0 xjmp L19
0086 L18:
0086 ; else
0086 ; {
0086 ; put(data);
0086 0C2D mov R16,R12
0088 CEDF xcall _put
008A ; }
008A L19:
008A L17:
008A L13:
008A 6395 inc R22
008C L15:
008C 6417 cp R22,R20
008E 48F3 brlo L12
0090 ; }
0090 ; put(0x7E);
0090 0EE7 ldi R16,126
0092 C9DF xcall _put
0094 L11:
0094 0E940000 xcall pop_gset4
0098 .dbline 0 ; func end
0098 0895 ret
009A ; data -> R20
.even
009A _serial_get::
009A 0E940000 xcall push_gset2
009E ; }
009E ;
009E ; //**********Receive a serial Frame from the serial port.
009E ; unsigned char *serial_get()
009E ; {
009E ; unsigned char data;
009E ; data=get();
009E CCDF xcall _get
00A0 402F mov R20,R16
00A2 ;
00A2 ; if(data==0x7E&&newMSG==0) //symbol for new msg
00A2 0E37 cpi R16,126
00A4 01F5 brne L21
00A6 20900200 lds R2,_newMSG
00AA 2220 tst R2
00AC E1F4 brne L21
00AE ; {
00AE ; i=0;
00AE 2224 clr R2
00B0 20920200 sts _i,R2
00B4 ; newMSG=1;
00B4 81E0 ldi R24,1
00B6 80930200 sts _newMSG,R24
00BA ; recvBuff[i]=data;
00BA 80E0 ldi R24,<_recvBuff
00BC 90E0 ldi R25,>_recvBuff
00BE E22D mov R30,R2
00C0 FF27 clr R31
00C2 E80F add R30,R24
00C4 F91F adc R31,R25
00C6 4083 std z+0,R20
00C8 ; serial_recv_MSG=&recvBuff[i];
00C8 20900200 lds R2,_i
00CC 3324 clr R3
00CE 280E add R2,R24
00D0 391E adc R3,R25
00D2 30920100 sts _serial_recv_MSG+1,R3
00D6 20920000 sts _serial_recv_MSG,R2
00DA ; i++;
00DA 80910200 lds R24,_i
00DE 8F5F subi R24,255 ; addi 1
00E0 80930200 sts _i,R24
00E4 ; }
00E4 5DC0 xjmp L22
00E6 L21:
00E6 ; else if(data==0x7E&&newMSG==1)
00E6 4E37 cpi R20,126
00E8 A9F4 brne L23
00EA 80910200 lds R24,_newMSG
00EE 8130 cpi R24,1
00F0 89F4 brne L23
00F2 ; {
00F2 ; newMSG=0;
00F2 2224 clr R2
00F4 20920200 sts _newMSG,R2
00F8 ; recvBuff[i]=data;
00F8 80E0 ldi R24,<_recvBuff
00FA 90E0 ldi R25,>_recvBuff
00FC E0910200 lds R30,_i
0100 FF27 clr R31
0102 E80F add R30,R24
0104 F91F adc R31,R25
0106 4083 std z+0,R20
0108 ; i=0;
0108 20920200 sts _i,R2
010C ; serial_recv_flag=1; //一条消息发送完毕,在处理完本条消息后需要被置零
010C 81E0 ldi R24,1
010E 80930400 sts _serial_recv_flag,R24
0112 ; }
0112 46C0 xjmp L24
0114 L23:
0114 ; else
0114 ; {
0114 ; if(data==0x7D)
0114 4D37 cpi R20,125
0116 21F4 brne L25
0118 ; {
0118 ; change_flag=1;
0118 81E0 ldi R24,1
011A 80930300 sts _change_flag,R24
011E ; }
011E 40C0 xjmp L26
0120 L25:
0120 ; else if(change_flag==1)
0120 80910300 lds R24,_change_flag
0124 8130 cpi R24,1
0126 79F5 brne L27
0128 ; {
0128 ; switch(data)
0128 642F mov R22,R20
012A 7727 clr R23
012C 6D35 cpi R22,93
012E E0E0 ldi R30,0
0130 7E07 cpc R23,R30
0132 B9F0 breq L33
0134 6E35 cpi R22,94
0136 E0E0 ldi R30,0
0138 7E07 cpc R23,R30
013A 09F0 breq L32
013C 31C0 xjmp L28
013E X0:
013E ; {
013E L32:
013E ; case 0x5E: recvBuff[i]=0x7E;
013E 80E0 ldi R24,<_recvBuff
0140 90E0 ldi R25,>_recvBuff
0142 E0910200 lds R30,_i
0146 FF27 clr R31
0148 E80F add R30,R24
014A F91F adc R31,R25
014C 8EE7 ldi R24,126
014E 8083 std z+0,R24
0150 ; change_flag=0;
0150 2224 clr R2
0152 20920300 sts _change_flag,R2
0156 ; i++;
0156 80910200 lds R24,_i
015A 8F5F subi R24,255 ; addi 1
015C 80930200 sts _i,R24
0160 ; break;
0160 1FC0 xjmp L28
0162 L33:
0162 ; case 0x5D: recvBuff[i]=0x7D;
0162 80E0 ldi R24,<_recvBuff
0164 90E0 ldi R25,>_recvBuff
0166 E0910200 lds R30,_i
016A FF27 clr R31
016C E80F add R30,R24
016E F91F adc R31,R25
0170 8DE7 ldi R24,125
0172 8083 std z+0,R24
0174 ; change_flag=0;
0174 2224 clr R2
0176 20920300 sts _change_flag,R2
017A ; i++;
017A 80910200 lds R24,_i
017E 8F5F subi R24,255 ; addi 1
0180 80930200 sts _i,R24
0184 ; break;
0184 ; default: break;
0184 ; }
0184 ; }
0184 0DC0 xjmp L28
0186 L27:
0186 ; else
0186 ; {
0186 ; recvBuff[i]=data;
0186 80E0 ldi R24,<_recvBuff
0188 90E0 ldi R25,>_recvBuff
018A E0910200 lds R30,_i
018E FF27 clr R31
0190 E80F add R30,R24
0192 F91F adc R31,R25
0194 4083 std z+0,R20
0196 ; i++;
0196 80910200 lds R24,_i
019A 8F5F subi R24,255 ; addi 1
019C 80930200 sts _i,R24
01A0 ; }
01A0 L28:
01A0 L26:
01A0 ; }
01A0 L24:
01A0 L22:
01A0 ; return serial_recv_MSG;
01A0 00910000 lds R16,_serial_recv_MSG
01A4 10910100 lds R17,_serial_recv_MSG+1
01A8 L20:
01A8 0E940000 xcall pop_gset2
01AC .dbline 0 ; func end
01AC 0895 ret
.area bss(ram, con, rel)
0000 _serial_recv_MSG::
0000 .blkb 2
0002 _i::
0002 .blkb 1
0003 _recvBuff::
0003 .blkb 128
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -