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

📄 uart.s

📁 AVR16源代码 ICC编译器
💻 S
字号:
	.module Uart.c
	.area text(rom, con, rel)
	.dbfile E:\程序\AVR程序\BOOTLoadICC\Uart.c
	.dbfunc e Init_Com _Init_Com fV
	.even
_Init_Com::
	.dbline -1
	.dbline 24
; #include	<iom128v.h>
; #include	"Uart.h"
; #include	"Crc.h"
; 
; //============================================================
; //计算和设置128的波特率参数	chenzuan 2006-03-16
; #define   BAUD 		19200
; #define   CRYSTAL 	7372800
; #define   BAUD_SETTING 	(unsigned char)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
; #define   BAUD_H 	(unsigned char)(BAUD_SETTING>>8)
; #define   BAUD_L 	(unsigned char)BAUD_SETTING
; 
; //============================================================
; //函	数:void Init_Com(void)
; //功	能:初始化串口设置
; //入口参数:无 
; //返 回 值:无  
; //设 计 者:覃道堂 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void Init_Com(void)
; {
	.dbline 25
; 	UBRR0H = BAUD_H;
	clr R2
	sts 144,R2
	.dbline 26
; 	UBRR0L = BAUD_L;
	ldi R24,23
	out 0x9,R24
	.dbline 27
; 	UCSR0B = 0x18;
	ldi R24,24
	out 0xa,R24
	.dbline 28
; 	UCSR0C = 0x0E;
	ldi R24,14
	sts 149,R24
	.dbline 29
; 	OCR0  = 0xEA;
	ldi R24,234
	out 0x31,R24
	.dbline 30
; 	TCCR0 = 0x0F;
	ldi R24,15
	out 0x33,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Uart_PutChar _Uart_PutChar fV
;           Data -> R16
	.even
_Uart_PutChar::
	.dbline -1
	.dbline 44
; }
; 		   		 
; //============================================================
; //函	数:void Uart_PutChar(unsigned char Data)
; //功	能:发送一个字符
; //入口参数:发送的字符数据  
; //返 回 值:无 
; //设 计 者:覃道堂 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void Uart_PutChar(unsigned char Data)
; {
L3:
	.dbline 45
L4:
	.dbline 45
;   	while(!(UCSR0A & 0x20));
	sbis 0xb,5
	rjmp L3
	.dbline 46
;   	UDR0 = Data; 
	out 0xc,R16
	.dbline -2
L2:
	.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 60
; }
; 
; //============================================================
; //函	数:int Uart_GetChar(void)
; //功	能:接收一个字符
; //入口参数:无  
; //返 回 值:返回-1接受数据错误,否则为接收到的一个字符数据 
; //设 计 者:覃道堂 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; int Uart_GetChar(void)
; {
	.dbline 63
; 	unsigned char 	status,res;
; 	
;   	if(!(UCSR0A&0x80))
	sbic 0xb,7
	rjmp L7
	.dbline 64
;   		return -1;
	ldi R16,-1
	ldi R17,-1
	xjmp L6
L7:
	.dbline 65
;   	status = UCSR0A;
	in R18,0xb
	.dbline 66
;   	res = UDR0;
	in R16,0xc
	.dbline 67
;   	if(status & 0x1c) 
	mov R24,R18
	andi R24,28
	breq L9
	.dbline 68
;   		return -1;
	ldi R16,-1
	ldi R17,-1
	xjmp L6
L9:
	.dbline 70
;   	else
;   		return res;
	clr R17
	.dbline -2
L6:
	.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 84
; } 
; 
; //============================================================
; //函	数:void Uart_Send_Frame(unsigned char *Frame, int Len)
; //功	能:发送一个字符串
; //入口参数:*Frame发送一个字符串数据,Len发送的长度  
; //返 回 值:无
; //设 计 者:覃道堂 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void Uart_Send_Frame(unsigned char *Frame, int Len)
; {
	xjmp L13
L12:
	.dbline 86
	.dbline 87
	movw R30,R22
	ldd R16,z+0
	xcall _Uart_PutChar
	.dbline 88
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 89
	subi R20,1
	sbci R21,0
	.dbline 90
L13:
	.dbline 85
; 	while(Len > 0)
	clr R2
	clr R3
	cp R2,R20
	cpc R3,R21
	brlt L12
	.dbline -2
L11:
	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 105
; 	{
; 	 	Uart_PutChar(*Frame);
; 	 	Frame ++;
; 	 	Len --;
; 	}
; }
; 
; //============================================================
; //函	数: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 107
; 	int 	ByteData;
; 	int	TimerCount = 0;
	clr R10
	clr R11
	.dbline 108
; 	int	ReceiveLen = 0;
	clr R22
	clr R23
	.dbline 109
; 	int	Len = 255;
	ldi R20,255
	ldi R21,0
	xjmp L17
X0:
	.dbline 112
;   
; 	while(ReceiveLen < Len)
; 	{	
L19:
	.dbline 114
;   		while((ByteData = Uart_GetChar()) == -1)
;        		{
	.dbline 115
;        			if(TIFR& 0x02)
	in R2,0x36
	sbrs R2,1
	rjmp L22
	.dbline 116
;           		{
	.dbline 117
;           			if(++TimerCount > OverTime) 
	movw R24,R10
	adiw R24,1
	movw R10,R24
	cp R12,R10
	cpc R13,R11
	brge L24
	.dbline 118
; 	       				return 0;//等待超时如果还没接收到数据,则返回数据长度0
	clr R16
	xjmp L15
L24:
	.dbline 119
; 	       			TIFR=TIFR|0x02;
	in R24,0x36
	ori R24,2
	out 0x36,R24
	.dbline 120
; 	      		}	 
L22:
	.dbline 121
L20:
	.dbline 113
	xcall _Uart_GetChar
	movw R14,R16
	cpi R16,255
	ldi R30,255
	cpc R17,R30
	breq L19
	.dbline 122
; 		}  
;   		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 123
;   		if(ReceiveLen == 0x04)
	cpi R22,4
	ldi R30,0
	cpc R23,R30
	brne L26
	.dbline 124
;   			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
L26:
	.dbline 125
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 126
	clr R10
	clr R11
	.dbline 127
L17:
	.dbline 111
	cp R22,R20
	cpc R23,R21
	brlt L20
	.dbline 128
;   		ReceiveLen ++; 
;   		TimerCount = 0;
;  	}
; 	return ReceiveLen;
	mov R16,R22
	.dbline -2
L15:
	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
	.dbfunc e PC_Send_Err _PC_Send_Err fV
;       Crc_Data -> R22,R23
;        SendBuf -> R20,R21
;        Err_Ret -> R22
	.even
_PC_Send_Err::
	xcall push_gset2
	movw R20,R18
	mov R22,R16
	.dbline -1
	.dbline 142
; }
; 
; //============================================================
; //函	数:void PC_Send_Err(unsigned char Ret,unsigned char *SendBuf)
; //功	能:向PC返回执行结果
; //入口参数:结果代码,发送缓冲区
; //返 回 值:无
; //设 计 者:覃道堂 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void PC_Send_Err(unsigned char Err_Ret,unsigned char *SendBuf)
; {
	.dbline 145
; 	unsigned short 	Crc_Data;
; 	
; 	SendBuf[0] = 0x45;
	ldi R24,69
	movw R30,R20
	std z+0,R24
	.dbline 146
;  	SendBuf[1] = 0x52;
	ldi R24,82
	std z+1,R24
	.dbline 147
;  	SendBuf[2] = 0x00;
	clr R2
	movw R30,R20
	std z+2,R2
	.dbline 148
;  	SendBuf[3] = 0x05;
	ldi R24,5
	movw R30,R20
	std z+3,R24
	.dbline 149
;  	SendBuf[4] = Err_Ret;	       
	movw R30,R20
	std z+4,R22
	.dbline 150
;  	Crc_Data = CRC16(SendBuf,5);
	ldi R18,5
	ldi R19,0
	movw R16,R20
	xcall _CRC16
	movw R22,R16
	.dbline 151
;  	SendBuf[5] = Crc_Data / 0x100;
	movw R2,R22
	mov R2,R3
	clr R3
	movw R30,R20
	std z+5,R2
	.dbline 152
;  	SendBuf[6] = (unsigned char)Crc_Data;	
	movw R30,R20
	std z+6,R22
	.dbline 153
;  	Uart_Send_Frame(SendBuf, 7);
	ldi R18,7
	ldi R19,0
	movw R16,R20
	xcall _Uart_Send_Frame
	.dbline -2
L28:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r Crc_Data 22 s
	.dbsym r SendBuf 20 pc
	.dbsym r Err_Ret 22 c
	.dbend
	.dbfunc e PC_Send_Ok _PC_Send_Ok fV
;       Crc_Data -> R10,R11
;              i -> R10,R11
;            Len -> R22,R23
;        SendBuf -> R20,R21
;        Ok_Coad -> R10
;       Ok_Frame -> R12,R13
	.even
_PC_Send_Ok::
	xcall push_gset4
	mov R10,R18
	movw R12,R16
	ldd R20,y+8
	ldd R21,y+9
	ldd R22,y+10
	ldd R23,y+11
	.dbline -1
	.dbline 168
; }
; 
; //============================================================
; //函	数:void PC_Send_Ok(unsigned char *Ok_Frame,unsigned char Ok_Coad,
; //				unsigned char *SendBuf,int Len)
; //功	能:向PC返回执行结果
; //入口参数:发送数据,结果代码,发送缓冲区,发送数据长度
; //返 回 值:无
; //设 计 者:覃道堂 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void PC_Send_Ok(unsigned char *Ok_Frame,unsigned char Ok_Coad,unsigned char *SendBuf,int Len)
; {
	.dbline 172
; 	int		i;
; 	unsigned short 	Crc_Data;
; 	
; 	SendBuf[0] = 0x4F;
	ldi R24,79
	movw R30,R20
	std z+0,R24
	.dbline 173
;  	SendBuf[1] = 0x4B;
	ldi R24,75
	std z+1,R24
	.dbline 174
;  	SendBuf[2] = 0x00;			//包序号
	clr R2
	movw R30,R20
	std z+2,R2
	.dbline 175
;  	SendBuf[3] = 0x04 + Len;       		//数据长度
	movw R24,R22
	adiw R24,4
	movw R30,R20
	std z+3,R24
	.dbline 176
;  	if(Len == 1)
	cpi R22,1
	ldi R30,0
	cpc R23,R30
	brne L30
	.dbline 177
;  		SendBuf[4] = Ok_Coad;
	movw R30,R20
	std z+4,R10
	xjmp L31
L30:
	.dbline 178
;  	else if(Len > 1)
	ldi R24,1
	ldi R25,0
	cp R24,R22
	cpc R25,R23
	brge L32
	.dbline 179
;  	{
	.dbline 180
;  		for(i = 0;i < Len;i ++)
	clr R10
	clr R11
	xjmp L37
L34:
	.dbline 181
	movw R30,R10
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	movw R30,R10
	add R30,R20
	adc R31,R21
	std z+4,R2
L35:
	.dbline 180
	movw R24,R10
	adiw R24,1
	movw R10,R24
L37:
	.dbline 180
	cp R10,R22
	cpc R11,R23
	brlt L34
	.dbline 182
;  			SendBuf[4+i] = Ok_Frame[i];
;  	}
	xjmp L33
L32:
	.dbline 184
;  	else
;  		SendBuf[4] = 0;
	clr R2
	movw R30,R20
	std z+4,R2
L33:
L31:
	.dbline 185
;   	Crc_Data = CRC16(SendBuf,4+Len);
	movw R18,R22
	subi R18,252  ; offset = 4
	sbci R19,255
	movw R16,R20
	xcall _CRC16
	movw R10,R16
	.dbline 186
;  	SendBuf[Len+4] = Crc_Data / 0x100;
	movw R30,R22
	add R30,R20
	adc R31,R21
	movw R2,R10
	mov R2,R3
	clr R3
	std z+4,R2
	.dbline 187
;  	SendBuf[Len+5] = (unsigned char)Crc_Data;	
	movw R30,R22
	add R30,R20
	adc R31,R21
	std z+5,R10
	.dbline 188
;  	Uart_Send_Frame(SendBuf, Len+6);
	movw R18,R22
	subi R18,250  ; offset = 6
	sbci R19,255
	movw R16,R20
	xcall _Uart_Send_Frame
	.dbline -2
L29:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r Crc_Data 10 s
	.dbsym r i 10 I
	.dbsym r Len 22 I
	.dbsym r SendBuf 20 pc
	.dbsym r Ok_Coad 10 c
	.dbsym r Ok_Frame 12 pc
	.dbend

⌨️ 快捷键说明

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