📄 usart_m8.s
字号:
.module usart_m8.c
.area data(ram, con, rel)
_Write_Error::
.blkb 2
.area idata
.byte 'x,'w
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 52,48
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'x,0
.area data(ram, con, rel)
.dbfile H:\程序库\usart_m8.c
.dbsym e Write_Error _Write_Error A[6:6]c
_Read_Error::
.blkb 2
.area idata
.byte 'x,'w
.area data(ram, con, rel)
.dbfile H:\程序库\usart_m8.c
.blkb 2
.area idata
.byte 56,48
.area data(ram, con, rel)
.dbfile H:\程序库\usart_m8.c
.blkb 2
.area idata
.byte 'x,0
.area data(ram, con, rel)
.dbfile H:\程序库\usart_m8.c
.dbsym e Read_Error _Read_Error A[6:6]c
_aa::
.blkb 2
.area idata
.byte 'o,'p
.area data(ram, con, rel)
.dbfile H:\程序库\usart_m8.c
.blkb 3
.area idata
.byte 0,0,0
.area data(ram, con, rel)
.dbfile H:\程序库\usart_m8.c
.dbsym e aa _aa A[5:5]c
.area vector(rom, abs)
.org 22
rjmp _uart0_rx_isr
.area data(ram, con, rel)
.dbfile H:\程序库\usart_m8.c
.area text(rom, con, rel)
.dbfile H:\程序库\usart_m8.c
.dbfunc e uart0_rx_isr _uart0_rx_isr fV
.even
_uart0_rx_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 28
.dbline 31
ldi R24,<_UART_RX_buff
ldi R25,>_UART_RX_buff
lds R30,_Rx_Count
clr R31
add R30,R24
adc R31,R25
in R2,0xc
std z+0,R2
.dbline 32
lds R24,_Rx_Count
subi R24,255 ; addi 1
sts _Rx_Count,R24
.dbline 33
cpi R24,9
brne L2
.dbline 34
.dbline 35
ldi R24,1
sts _Rx_Flag,R24
.dbline 37
clr R2
sts _Rx_Count,R2
.dbline 39
L2:
.dbline -2
L1:
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e uart0_init _uart0_init fV
.even
_uart0_init::
.dbline -1
.dbline 49
; /*****************************************************************
; //ICC-AVR application builder : 2005-8-19 14:40:53
; // Target : M8
; // Crystal: 7.3728Mhz
; // Crystal: 4.6080Mhz
;
; 实验:做usart串行通讯实验
; 目的:了解及会使用usart串口
; CPU:atmega8L
; 相关的5个寄存器:UCSRA,UCSRB,UCSRC,UDR,UBRR(UBRRH,UBRRL)
; 其中:UBRRH和UCSRC共用一个地址
; ******************************************************************/
; /*配置:CKOPT=0,CKSEL3..0=1111,SUT1..0=11(65ms慢速上升电源)*/
; #include "usart_m8.h"
;
; unsigned char UART_RX_buff[UART_RX_BUFFER_SIZE];
; unsigned char UART_TX_buff[UART_TX_BUFFER_SIZE];
; unsigned char Rx_Flag;
; unsigned char Rx_Temp,Rx_Count;
; unsigned char Rx_Start_Pack_Flag,Rx_Over_Pack_Flag;
;
; unsigned char Write_Error[6] = {'x','w','4','0','x',0};//后面这个零是一定要加的,表示字符串结束
; unsigned char Read_Error[6] = {'x','w','8','0','x',0};//或者"\0"
; unsigned char aa[5] = {'o','p'};
;
; #pragma interrupt_handler uart0_rx_isr:12
; void uart0_rx_isr(void)
; {
; //uart has received a character in UDR
;
; UART_RX_buff[Rx_Count] = UDR;
; Rx_Count = Rx_Count+1;
; if(Rx_Count == 9)
; {
; Rx_Flag = true;
; //USART_TransmitByte((Rx_Count+0x30));
; Rx_Count = 0;
; //上位机在这时候要停一会儿,才能发第二串数据
; }
; //USART_TransmitByte((Rx_Count+0x30));
; }
;
; //UART0 initialize
; // desired baud rate: 9600
; // actual: baud rate:9600 (0.0%)
; // char size: 8 bit
; // parity: Disabled
; void uart0_init(void)
; {
.dbline 50
; Rx_Count = 0;
clr R2
sts _Rx_Count,R2
.dbline 51
; Rx_Flag = false;
sts _Rx_Flag,R2
.dbline 52
; Rx_Start_Pack_Flag = false;
sts _Rx_Start_Pack_Flag,R2
.dbline 53
; Rx_Over_Pack_Flag = false;
sts _Rx_Over_Pack_Flag,R2
.dbline 55
; //本身的uart的初始化
; UCSRB = 0x00; //disable while setting baud rate
out 0xa,R2
.dbline 59
; //UCSRB[RXCIE,TXCIE,UDRIE,RXEN,TXEN,UCSZ2,RXB8,TXB8]
; //Bit 7 – RXCIE: RX Complete Interrupt Enable
;
; UCSRA = 0x00;
out 0xb,R2
.dbline 62
; //UCSRA[RXC,TXC,UDRE,FE,DOR,PE,U2X,MPCM]
;
; UCSRC = (BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0));//设置成8位
ldi R24,134
out 0x20,R24
.dbline 71
; //UCSRC[URSEL,UMSEL,UPM1,UPM0,USBS,UCSZ1,UCSZ0,UCPOL]
; //位URSEL:寄存器选择("1"为UCSRC或"0"为UBRRH)
; //位UMSEL:工作模式选择(0为异步,1为同步)
; //位UPM1..0:为校验方式,硬件支持校验
; //位USBS:停止位选择(0为一位,1为两位)
; //位UCSZ0..2:发送位数选择(如果是8位:011)
; //位UCPOL:时钟极性(只在同步模式使用,异步应置为"0")
;
; UBRRL = 0x77;//baudrate; //set baud rate lo
ldi R24,119
out 0x9,R24
.dbline 72
; UBRRH = 0x00; //set baud rate hi(设置波特率只用低四位,加起来一共12位)
out 0x20,R2
.dbline 75
; //UBRR = baudrate; /* set the baud rate */
;
; UCSRB = ((1<<RXCIE)|(1<<RXEN)|(1<<TXEN));
ldi R24,152
out 0xa,R24
.dbline -2
L4:
.dbline 0 ; func end
ret
.dbend
.dbfunc e UART_Receive _UART_Receive fV
.even
_UART_Receive::
.dbline -1
.dbline 81
; }
; /************************************************************************
; 接收时采用中断方式,,,以"包"为单位接收(9个字符)
; *************************************************************************/
; void UART_Receive(void)
; {
.dbline 82
; if(Rx_Flag == true)
lds R24,_Rx_Flag
cpi R24,1
brne L6
.dbline 83
; {
.dbline 84
; Rx_Flag = false;
clr R2
sts _Rx_Flag,R2
.dbline 86
;
; if((UART_RX_buff[0] == 0x58)&&(UART_RX_buff[8] == 0x58))//0x58 = 'w'
lds R24,_UART_RX_buff
cpi R24,88
brne L8
lds R24,_UART_RX_buff+8
cpi R24,88
brne L8
.dbline 87
; {
.dbline 88
; Rx_Over_Pack_Flag = true; //这个标志,可以让主函数去查
ldi R24,1
sts _Rx_Over_Pack_Flag,R24
.dbline 90
; //Rx_Count = 0;//接收计数器清零
; }
L8:
.dbline 93
L6:
.dbline -2
L5:
.dbline 0 ; func end
ret
.dbend
.dbfunc e USART_Transmit _USART_Transmit fV
; s -> R20,R21
.even
_USART_Transmit::
rcall push_gset1
movw R20,R16
.dbline -1
.dbline 132
; //USART_TransmitByte('p');//接收一包完,就发一个信号叫上机暂停发
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -