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

📄 uart.s

📁 AVR16源代码 ICC编译器
💻 S
字号:
	.module Uart.c
	.area text(rom, con, rel)
	.dbfile D:\MY_COMPUTER\d\avr16\atmegal16\Uart.c
	.dbfunc e Uart_PutChar _Uart_PutChar fV
;           Data -> R16
	.even
_Uart_PutChar::
	.dbline -1
	.dbline 18
; #include	<iom16v.h>
; #include	"Uart.h"
; #include	"Crc.h"
; 
; 
;    		 
; //============================================================
; //函	数:void Uart_PutChar(unsigned char Data)
; //功	能:发送一个字符
; //入口参数:发送的字符数据  
; //返 回 值:无 
; //设 计 者:覃道堂 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void Uart_PutChar(unsigned char Data)
; {
L2:
	.dbline 20
L3:
	.dbline 20
;   	//while(!(UCSRA & 0x20));
; 	while ( !( UCSRA & (1<<UDRE)) );
	sbis 0xb,5
	rjmp L2
	.dbline 21
;   	UDR = Data; 
	out 0xc,R16
	.dbline -2
	.dbline 22
; }
L1:
	.dbline 0 ; func end
	ret
	.dbsym r Data 16 c
	.dbend
	.dbfunc e Uart_GetChar _Uart_GetChar fI
;            res -> R16
;         status -> R18
	.even
_Uart_GetChar::
	.dbline -1
	.dbline 35
; 
; //============================================================
; //函	数:int Uart_GetChar(void)
; //功	能:接收一个字符
; //入口参数:无  
; //返 回 值:返回-1接受数据错误,否则为接收到的一个字符数据 
; //设 计 者:覃道堂 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; int Uart_GetChar(void)
; {
	.dbline 38
; 	unsigned char 	status,res;
; 	
;   	if(!(UCSRA&(1<<RXC)))
	sbic 0xb,7
	rjmp L6
	.dbline 39
;   		return -1;
	ldi R16,-1
	ldi R17,-1
	xjmp L5
L6:
	.dbline 40
;   	status = UCSRA;
	in R18,0xb
	.dbline 41
;   	res = UDR;
	in R16,0xc
	.dbline 42
;   	if ( status & (1<<FE)|(1<<DOR)|(1<<PE) )//if(status & 0x1c)//数据益处,数据贞错误,校验错误 
	mov R24,R18
	andi R24,16
	ori R24,12
	breq L8
	.dbline 43
;   		return -1;
	ldi R16,-1
	ldi R17,-1
	xjmp L5
L8:
	.dbline 45
;   	else
;   		return res;
	clr R17
	.dbline -2
L5:
	.dbline 0 ; func end
	ret
	.dbsym r res 16 c
	.dbsym r status 18 c
	.dbend
	.dbfunc e Uart_Send_Frame _Uart_Send_Frame fV
;            Len -> R20,R21
;          Frame -> R22,R23
	.even
_Uart_Send_Frame::
	xcall push_gset2
	movw R20,R18
	movw R22,R16
	.dbline -1
	.dbline 59
; } 
; 
; //============================================================
; //函	数:void Uart_Send_Frame(unsigned char *Frame, int Len)
; //功	能:发送一个字符串
; //入口参数:*Frame发送一个字符串数据,Len发送的长度  
; //返 回 值:无
; //设 计 者:覃道堂 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void Uart_Send_Frame(unsigned char *Frame, int Len)
; {
	xjmp L12
L11:
	.dbline 61
	.dbline 62
	movw R30,R22
	ldd R16,z+0
	xcall _Uart_PutChar
	.dbline 63
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 64
	subi R20,1
	sbci R21,0
	.dbline 65
L12:
	.dbline 60
; 	while(Len > 0)
	clr R2
	clr R3
	cp R2,R20
	cpc R3,R21
	brlt L11
	.dbline -2
	.dbline 66
; 	{
; 	 	Uart_PutChar(*Frame);
; 	 	Frame ++;
; 	 	Len --;
; 	}
; }
L10:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r Len 20 I
	.dbsym r Frame 22 pc
	.dbend
	.dbfunc e Uart_Receive_Frame _Uart_Receive_Frame fc
;            Len -> R20,R21
;     ReceiveLen -> R22,R23
;     TimerCount -> R10,R11
;       ByteData -> R14,R15
;       OverTime -> R12,R13
;          Frame -> y+10
	.even
_Uart_Receive_Frame::
	xcall push_arg4
	xcall push_gset5
	movw R12,R18
	.dbline -1
	.dbline 80
; 
; //============================================================
; //函	数:unsigned char Uart_Receive_Frame(unsigned char *Frame,
; //					     int OverTime)
; //功	能:接收一个字符串
; //入口参数:*Frame接收一个字符串数据存放地址,OverTime超时时间  
; //返 回 值:无
; //设 计 者:覃道堂 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; unsigned char Uart_Receive_Frame(unsigned char *Frame,int OverTime)
; {
	.dbline 82
; 	int 	ByteData;
; 	int	TimerCount = 0;
	clr R10
	clr R11
	.dbline 83
; 	int	ReceiveLen = 0;
	clr R22
	clr R23
	.dbline 84
; 	int	Len = 255;
	ldi R20,255
	ldi R21,0
	xjmp L16
X0:
	.dbline 87
;   
; 	while(ReceiveLen < Len)
; 	{	
L18:
	.dbline 89
;   		while((ByteData = Uart_GetChar()) == -1)
;        		{
	.dbline 90
;        			if(TIFR& 0x02)
	in R2,0x38
	sbrs R2,1
	rjmp L21
	.dbline 91
;           		{
	.dbline 92
;           			if(++TimerCount > OverTime) 
	movw R24,R10
	adiw R24,1
	movw R10,R24
	cp R12,R10
	cpc R13,R11
	brge L23
	.dbline 93
; 	       				return 0;//等待超时如果还没接收到数据,则返回数据长度0
	clr R16
	xjmp L14
L23:
	.dbline 94
; 	       			TIFR=TIFR|0x02;
	in R24,0x38
	ori R24,2
	out 0x38,R24
	.dbline 95
; 	      		}	 
L21:
	.dbline 96
L19:
	.dbline 88
	xcall _Uart_GetChar
	movw R14,R16
	cpi R16,255
	ldi R30,255
	cpc R17,R30
	breq L18
	.dbline 97
; 		    }  
;   		Frame[ReceiveLen] = (unsigned char)ByteData;
	movw R30,R22
	ldd R0,y+10
	ldd R1,y+11
	add R30,R0
	adc R31,R1
	std z+0,R14
	.dbline 98
;   		if(ReceiveLen == 0x04)
	cpi R22,4
	ldi R30,0
	cpc R23,R30
	brne L25
	.dbline 99
;   			Len = Frame[ReceiveLen] + 0x02;
	movw R30,R22
	add R30,R0
	adc R31,R1
	ldd R20,z+0
	clr R21
	subi R20,254  ; offset = 2
	sbci R21,255
L25:
	.dbline 100
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 101
	clr R10
	clr R11
	.dbline 102
L16:
	.dbline 86
	cp R22,R20
	cpc R23,R21
	brlt L19
	.dbline 103
;   		ReceiveLen ++; 
;   		TimerCount = 0;
;    }
; 	return ReceiveLen;
	mov R16,R22
	.dbline -2
L14:
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r Len 20 I
	.dbsym r ReceiveLen 22 I
	.dbsym r TimerCount 10 I
	.dbsym r ByteData 14 I
	.dbsym r OverTime 12 I
	.dbsym l Frame 10 pc
	.dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -