📄 uart.s
字号:
.module Uart.c
.area data(ram, con, rel)
_put_done::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
_recv_done::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
_newMSG::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
_change_flag::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
_serial_recv_flag::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.area vector(rom, abs)
.org 72
jmp _uart0_rx_isr
.area data(ram, con, rel)
.area text(rom, con, rel)
.even
_uart0_rx_isr::
xcall push_lset
; #include<iom128v.h>
; //UART0接口
;
;
; unsigned char put_done=0;
; unsigned char recv_done=0;
; unsigned char recvBuff[128];
; unsigned char newMSG=0;
; unsigned char i;
; unsigned char *serial_recv_MSG;
; unsigned char change_flag=0;
; unsigned char serial_recv_flag=0;
;
; #pragma interrupt_handler uart0_rx_isr:19
; void uart0_rx_isr(void)
; {
; recv_done=1;
ldi R24,1
sts _recv_done,R24
; serial_get();
xcall _serial_get
L1:
xcall pop_lset
.dbline 0 ; func end
reti
.area vector(rom, abs)
.org 80
jmp _uart0_tx_isr
.area text(rom, con, rel)
.even
_uart0_tx_isr::
st -y,R24
in R24,0x3f
st -y,R24
; }
;
;
; #pragma interrupt_handler uart0_tx_isr:21
; void uart0_tx_isr(void)
; {
; put_done=1;
ldi R24,1
sts _put_done,R24
L2:
ld R24,y+
out 0x3f,R24
ld R24,y+
.dbline 0 ; func end
reti
; data -> R16
.even
_put::
; }
;
;
; //**********Put a single byte to the serial port.
; void put(unsigned char data)
; {
L4:
L5:
; while(!put_done)
lds R2,_put_done
tst R2
breq L4
; ;
; UDR0=data;
out 0xc,R16
; put_done=0;
clr R2
sts _put_done,R2
L3:
.dbline 0 ; func end
ret
; data -> R16
.even
_get::
; }
;
;
; //***********Receive a single byte from the serial port.
; unsigned char get()
; {
L8:
L9:
; unsigned char data;
; while(!recv_done)
lds R2,_recv_done
tst R2
breq L8
; ;
; data=UDR0;
in R16,0xc
; recv_done=0;
clr R2
sts _recv_done,R2
; return data;
L7:
.dbline 0 ; func end
ret
; length -> R20
; m -> R22
; data -> R12
; serial_MSG -> R10,R11
.even
_serial_put::
xcall push_gset4
movw R10,R16
; }
;
;
; //**********Put a serial Frame to the serial port.
; void serial_put(unsigned char *serial_MSG)
; {
; unsigned char m;
; unsigned char length;
; unsigned char data;
; put(0x7E);
ldi R16,126
xcall _put
; serial_MSG++;
movw R24,R10
adiw R24,1
movw R10,R24
; length=*serial_MSG;
movw R30,R24
ldd R20,z+0
;
; for(m=0;m<length;m++)
clr R22
xjmp L15
L12:
; {
; data=*serial_MSG;
movw R30,R10
ldd R12,z+0
; if(data==0x7E)
mov R24,R12
cpi R24,126
brne L16
; {
; put(0x7D);
ldi R16,125
xcall _put
; put(0x5E);
ldi R16,94
xcall _put
; }
xjmp L17
L16:
; else if(data==0x7D)
mov R24,R12
cpi R24,125
brne L18
; {
; put(0x7D);
ldi R16,125
xcall _put
; put(0x5D);
ldi R16,93
xcall _put
; }
xjmp L19
L18:
; else
; {
; put(data);
mov R16,R12
xcall _put
; }
L19:
L17:
L13:
inc R22
L15:
cp R22,R20
brlo L12
; }
; put(0x7E);
ldi R16,126
xcall _put
L11:
xcall pop_gset4
.dbline 0 ; func end
ret
; data -> R20
.even
_serial_get::
xcall push_gset2
; }
;
; //**********Receive a serial Frame from the serial port.
; unsigned char *serial_get()
; {
; unsigned char data;
; data=get();
xcall _get
mov R20,R16
;
; if(data==0x7E&&newMSG==0) //symbol for new msg
cpi R16,126
brne L21
lds R2,_newMSG
tst R2
brne L21
; {
; i=0;
clr R2
sts _i,R2
; newMSG=1;
ldi R24,1
sts _newMSG,R24
; recvBuff[i]=data;
ldi R24,<_recvBuff
ldi R25,>_recvBuff
mov R30,R2
clr R31
add R30,R24
adc R31,R25
std z+0,R20
; serial_recv_MSG=&recvBuff[i];
lds R2,_i
clr R3
add R2,R24
adc R3,R25
sts _serial_recv_MSG+1,R3
sts _serial_recv_MSG,R2
; i++;
lds R24,_i
subi R24,255 ; addi 1
sts _i,R24
; }
xjmp L22
L21:
; else if(data==0x7E&&newMSG==1)
cpi R20,126
brne L23
lds R24,_newMSG
cpi R24,1
brne L23
; {
; newMSG=0;
clr R2
sts _newMSG,R2
; recvBuff[i]=data;
ldi R24,<_recvBuff
ldi R25,>_recvBuff
lds R30,_i
clr R31
add R30,R24
adc R31,R25
std z+0,R20
; i=0;
sts _i,R2
; serial_recv_flag=1; //一条消息发送完毕,在处理完本条消息后需要被置零
ldi R24,1
sts _serial_recv_flag,R24
; }
xjmp L24
L23:
; else
; {
; if(data==0x7D)
cpi R20,125
brne L25
; {
; change_flag=1;
ldi R24,1
sts _change_flag,R24
; }
xjmp L26
L25:
; else if(change_flag==1)
lds R24,_change_flag
cpi R24,1
brne L27
; {
; switch(data)
mov R22,R20
clr R23
cpi R22,93
ldi R30,0
cpc R23,R30
breq L33
cpi R22,94
ldi R30,0
cpc R23,R30
breq L32
xjmp L28
X0:
; {
L32:
; case 0x5E: recvBuff[i]=0x7E;
ldi R24,<_recvBuff
ldi R25,>_recvBuff
lds R30,_i
clr R31
add R30,R24
adc R31,R25
ldi R24,126
std z+0,R24
; change_flag=0;
clr R2
sts _change_flag,R2
; i++;
lds R24,_i
subi R24,255 ; addi 1
sts _i,R24
; break;
xjmp L28
L33:
; case 0x5D: recvBuff[i]=0x7D;
ldi R24,<_recvBuff
ldi R25,>_recvBuff
lds R30,_i
clr R31
add R30,R24
adc R31,R25
ldi R24,125
std z+0,R24
; change_flag=0;
clr R2
sts _change_flag,R2
; i++;
lds R24,_i
subi R24,255 ; addi 1
sts _i,R24
; break;
; default: break;
; }
; }
xjmp L28
L27:
; else
; {
; recvBuff[i]=data;
ldi R24,<_recvBuff
ldi R25,>_recvBuff
lds R30,_i
clr R31
add R30,R24
adc R31,R25
std z+0,R20
; i++;
lds R24,_i
subi R24,255 ; addi 1
sts _i,R24
; }
L28:
L26:
; }
L24:
L22:
; return serial_recv_MSG;
lds R16,_serial_recv_MSG
lds R17,_serial_recv_MSG+1
L20:
xcall pop_gset2
.dbline 0 ; func end
ret
.area bss(ram, con, rel)
_serial_recv_MSG::
.blkb 2
_i::
.blkb 1
_recvBuff::
.blkb 128
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -