⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usart_m8.s

📁 AVR单片机的T_TO_TWI通讯方式
💻 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 + -