📄 uart.s
字号:
.module uart.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\uart.c
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\uart.c
_SprayNum::
.blkb 2
.area idata
.word 120
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\uart.c
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
.dbsym e SprayNum _SprayNum I
_CSprayCyc::
.blkb 4
.area idata
.word 53392,3
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
.dbsym e CSprayCyc _CSprayCyc l
_CSprayOn::
.blkb 2
.area idata
.word 2000
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
.dbsym e CSprayOn _CSprayOn i
_CPivDelay::
.blkb 2
.area idata
.word 1000
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
.dbsym e CPivDelay _CPivDelay i
_T1OveForPump::
.blkb 2
.area idata
.word 458
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
.dbsym e T1OveForPump _T1OveForPump i
_T1OveCnt::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
.dbsym e T1OveCnt _T1OveCnt c
_ActFlag::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
.dbsym e ActFlag _ActFlag c
_IsLongCyc::
.blkb 1
.area idata
.byte 1
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
.dbsym e IsLongCyc _IsLongCyc c
_HighByte::
.blkb 1
.area idata
.byte 3
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
.dbsym e HighByte _HighByte c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\uart.c
.dbfunc e FlashRxBuf _FlashRxBuf fV
.even
_FlashRxBuf::
.dbline -1
.dbline 7
; #include <iom88v.h>
; #include <macros.h>
; #include <uart.h>
; #include <timer1.h>
;
; void FlashRxBuf(void)
; {
.dbline 8
; rx_error0 = 0;
clr R2
sts _rx_error0,R2
.dbline 9
; rx_counter0 = 0;
sts _rx_counter0,R2
.dbline 10
; rx_rd_index0 = 0;
sts _rx_rd_index0,R2
.dbline 11
; FrameHead0 = 0;
sts _FrameHead0,R2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e uart0_init _uart0_init fV
.even
_uart0_init::
.dbline -1
.dbline 20
; }
;
; //UART0 initialize
; // desired baud rate: 9600
; // actual: baud rate:9615 (0.2%)
; // char size: 8 bit
; // parity: Even
; void uart0_init(void)
; {
.dbline 21
; UCSR0B = 0x00; //disable while setting baud rate
clr R2
sts 193,R2
.dbline 22
; UCSR0A = 0x00;
sts 192,R2
.dbline 23
; UCSR0C = 0x26;
ldi R24,38
sts 194,R24
.dbline 24
; UBRR0L = 0x33; //set baud rate lo
ldi R24,51
sts 196,R24
.dbline 25
; UBRR0H = 0x00; //set baud rate hi
sts 197,R2
.dbline 26
; UCSR0B = 0xD8;
ldi R24,216
sts 193,R24
.dbline 27
; FlashRxBuf();
rcall _FlashRxBuf
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e TestFrameHead _TestFrameHead fc
; data -> R16
.even
_TestFrameHead::
.dbline -1
.dbline 33
; }
;
;
;
; char TestFrameHead(char data)
; {
.dbline 34
; if(data == FRAMEFLAG1) //是否和设定的帧标志相等?有多种帧类型时,以或运算添加其他标志
cpi R16,255
brne L4
X0:
.dbline 35
; return 1;
ldi R16,1
rjmp L3
L4:
.dbline 37
; else
; return 0;
clr R16
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbsym r data 16 c
.dbend
.area vector(rom, abs)
.org 36
rjmp _uart0_rx_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\uart.c
.dbfunc e uart0_rx_isr _uart0_rx_isr fV
; data -> R10
; status -> R20
.even
_uart0_rx_isr::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R6
st -y,R7
st -y,R8
st -y,R9
st -y,R10
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R20
st -y,R24
st -y,R25
st -y,R26
st -y,R27
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
st -y,R10
st -y,R20
.dbline -1
.dbline 42
; }
; // USART0 Receiver interrupt service routine
; #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
; void uart0_rx_isr(void)
; {
.dbline 44
; char status,data;
; status=UCSR0A;
lds R20,192
.dbline 45
; data=UDR0;
lds R10,198
.dbline 50
; // putchar(251); //回传接收成功标志 debug
; // putchar(251); //回传接收成功标志debug
; // if(data == 0xFF) //DEBUG
; // UDR0 = data; //DEBUG
; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
mov R24,R20
andi R24,28
brne L7
X1:
.dbline 51
; {
.dbline 52
; if(FrameHead0 == 0 && rx_counter0 == 0) //判断是否帧头
lds R2,_FrameHead0
tst R2
brne L9
X2:
lds R2,_rx_counter0
tst R2
brne L9
X3:
.dbline 53
; {
.dbline 54
; if(TestFrameHead(data)) //数据有效才设置FrameHead
mov R16,R10
rcall _TestFrameHead
tst R16
breq L8
X4:
.dbline 55
; {
.dbline 56
; FrameHead0 = data;
sts _FrameHead0,R10
.dbline 57
; }
.dbline 58
; }
rjmp L8
L9:
.dbline 61
;
; else
; {
.dbline 62
; rx_buffer0[rx_counter0]=data;
ldi R24,<_rx_buffer0
ldi R25,>_rx_buffer0
lds R30,_rx_counter0
clr R31
add R30,R24
adc R31,R25
std z+0,R10
.dbline 65
; // putchar(251); //回传接收成功标志 debug
; // putchar(251); //回传接收成功标志debug
; if (++rx_counter0 == RX_BUFFER_SIZE0)
lds R24,_rx_counter0
subi R24,255 ; addi 1
mov R2,R24
sts _rx_counter0,R2
cpi R24,8
brne L8
X5:
.dbline 66
; {
.dbline 67
; rx_counter0 = 0;
clr R2
sts _rx_counter0,R2
.dbline 68
; rx_error0 = 1;
ldi R24,1
sts _rx_error0,R24
.dbline 69
; }
.dbline 70
; }
.dbline 71
; }
rjmp L8
L7:
.dbline 72
; else rx_error0 = 1 ;
ldi R24,1
sts _rx_error0,R24
L8:
.dbline -2
L6:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ld R0,y+
out 0x3f,R0
ld R31,y+
ld R30,y+
ld R27,y+
ld R26,y+
ld R25,y+
ld R24,y+
ld R20,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R10,y+
ld R9,y+
ld R8,y+
ld R7,y+
ld R6,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
reti
.dbsym r data 10 c
.dbsym r status 20 c
.dbend
.dbfunc e getchar _getchar fc
; data -> R16
; IisOn -> R18
.even
_getchar::
.dbline -1
.dbline 79
; }
;
;
;
; // Get a character from the USART0 Receiver buffer
; char getchar(void)
; {
.dbline 81
; char data;
; char IisOn = 1;
ldi R18,1
.dbline 82
; if((SREG & 0x80) == 0x00) //I之前是否置位
in R2,0x3f
sbrc R2,7
rjmp L19
X6:
.dbline 83
; IisOn = 0;
clr R18
L18:
.dbline 85
;
; while (rx_counter0==0);
L19:
.dbline 85
lds R2,_rx_counter0
tst R2
breq L18
X7:
.dbline 86
; data=rx_buffer0[rx_rd_index0];
ldi R24,<_rx_buffer0
ldi R25,>_rx_buffer0
lds R30,_rx_rd_index0
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
.dbline 87
; if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
lds R24,_rx_rd_index0
subi R24,255 ; addi 1
mov R2,R24
sts _rx_rd_index0,R2
cpi R24,8
brne L21
X8:
.dbline 87
clr R2
sts _rx_rd_index0,R2
L21:
.dbline 88
; CLI();
cli
.dbline 89
; --rx_counter0;
lds R24,_rx_counter0
subi R24,1
sts _rx_counter0,R24
.dbline 90
; if(IisOn)
tst R18
breq L23
X9:
.dbline 91
; SEI();
sei
L23:
.dbline 92
; return data;
.dbline -2
L15:
.dbline 0 ; func end
ret
.dbsym r data 16 c
.dbsym r IisOn 18 c
.dbend
.area vector(rom, abs)
.org 40
rjmp _uart0_tx_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\avr1\uart.c
.dbfunc e uart0_tx_isr _uart0_tx_isr fV
.even
_uart0_tx_isr::
st -y,R2
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
.dbline -1
.dbline 101
; }
;
;
;
;
; // USART0 Transmitter interrupt service routine
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -