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

📄 m16uart.s

📁 AVR程序
💻 S
字号:
	.module M16Uart.c
	.area text(rom, con, rel)
	.dbfile F:\job\M16学习板\串口通信实验(实验六)\M16Uart.c
	.dbfile F:\job\M16学习板\串口通信实验(实验六)\..\ICC_H\SOFTWARE.h
	.dbfunc e ChangeIntToHex _ChangeIntToHex fV
;            dec -> R20,R21
	.even
_ChangeIntToHex::
	xcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 136
; /*******************************************************************
;                       实验六
; 实验名称: 串口通信实验
; 实验目的: 学习AVR单片机的串行通信功能
; 实验现象: 通过超级终端或者是串口调试助手向单片机发送数据,以*开始#结束
; 		  单片机储存的是*#之间的数据, 发送R可将单片机最近一次记录的数
; 		  据传送给PC机,接收到新的数据,以前的数据将被清除,  数据长度在
; 		  255个字节以内
; 环	  境: ICCAVR6.31A 
; 时钟频率: 单片机内部1M频率的时钟
; 设 计 者: shinea8868
; 说    明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
; 	  	  作商业用途请保留本段文字
; 完成日期: 2007年4月10日
; *******************************************************************/
; 
; #include <iom16v.h>
; #include <macros.h>
; #include "..\ICC_H\SOFTWARE.h"
; 
; uchar RecvData[255];			  	//记录接收到的数据
; uchar i = 0;
; uchar NewBeginFlag = 0;				//接收到新的数据,清除原有数据
; uchar RecvDataFlag = 0;				//当有新的数据串接收是置一,结束为0
; uchar ReadFlag 	   = 0;	 			//读数据标志
; /*-----------------------------------------------------------------
; 函数名称: void Uart0Init(void) 
; 函数功能: 串口初始化
; 		  波特率 9600 0.2% 字符长度 8bit 无奇偶校验
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void Uart0Init(void)
; {
;  	UCSRB = 0x00; 					//关串口
;  	UCSRA = 0x02;					//倍速模式   M16中文P151
;  	UCSRC = BIT(URSEL) | 0x06;		//写UCSRC寄存器,设定8个bit
;  	UBRR  = 0x000c;	 	  	   		//设定串口波特率为9600
;  	UCSRB = 0x98;					//开串口
; }
; /*-----------------------------------------------------------------
; 函数名称: void Uart0Init(void) 
; 函数功能: 串口初始化
; 		  波特率 9600 0.2% 字符长度 8bit 无奇偶校验
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; #pragma interrupt_handler UartRecvData:12
; void UartRecvData(void)
; {
;  	uchar temp;
; 	temp = UDR;
; 	if( temp == '*')   	  				 //判断是否是数据开始标志
; 	{
; 	 	NewBeginFlag = 1;
; 		RecvDataFlag = 1;
; 	}
; 	else if( RecvDataFlag)
; 		 {
; 		  	 if( temp == '#')			 //判断是否是数据结束标志
; 			 {
; 			  	 RecvDataFlag = 0;		 //置接收结束标志
; 			 }
; 			 else
; 			 {
; 			  	 RecvData[i++] = temp;	 //暂存数据
; 			 }
; 		 }
; 	else if((temp == 'R')||(temp == 'r'))
; 		 {
; 		  	 ReadFlag = 1;
; 		 }
; }
; /*-----------------------------------------------------------------
; 函数名称: void UartTransmitData(void)
; 函数功能: 发送字符串
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void UartTransmitData(void)
; {
;  	uchar j,Er[6] = "ERROR";
; 	if( i == 0)			   				//判断接收到的数据是否为空
; 	{
; 	 	for( j = 0;j < 5; j++)
; 		{
; 	 	 	while(!(UCSRA&0x20));		//等待数据寄存器为空
; 				UDR = Er[j];		//发送字符
; 		}		
; 	}
; 	else
; 	{
; 	 	for( j = 0;j < i; j++)
; 		{
; 	 	 	while(!(UCSRA&0x20));			//等待数据寄存器为空
; 				UDR = RecvData[j];			//发送字符
; 		}
; 	}
; }
; /*-----------------------------------------------------------------
; 函数名称: void InitDevices(void) 
; 函数功能: 初始化各种信息
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void InitDevices(void)
; {
;  	CLI(); //关全部中断
;  	Uart0Init();
; 
;  	MCUCR = 0x00;
;  	SEI(); 
; }
; 
; void main( void)
; {
;  	uchar j;
;  	InitDevices();
; 	while(1)
; 	{
; 	 	if( NewBeginFlag)					//有新的数据接收,清除原有数据
; 		{
; 			NewBeginFlag = 0;
; 			for( j = 1; j ; j++ )
; 			{
; 			 	RecvData[j] = 0;
; 			}
; 		}
; 		if( ReadFlag)
; 		{
; 		 	UartTransmitData();
; 			ReadFlag = 0;
; 		}
; 	}
; }
; }
	.dbline 137
; }
	movw R30,R20
	ldd R2,z+0
	clr R3
	ldi R17,10
	mov R16,R2
	xcall mod8u
	mov R4,R16
	ldi R17,10
	mov R16,R2
	xcall div8u
	mov R24,R16
	andi R24,#0x0F
	swap R24
	or R24,R4
	movw R30,R20
	std z+0,R24
	.dbline -2
L1:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r dec 20 pc
	.dbend
	.dbfunc e ChangeHexToInt _ChangeHexToInt fV
;            hex -> R16,R17
	.even
_ChangeHexToInt::
	.dbline -1
	.dbline 166
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
	.dbline 167
; }
	movw R30,R16
	ldd R2,z+0
	clr R3
	mov R24,R2
	swap R24
	andi R24,#0x0F
	ldi R25,10
	mul R25,R24
	mov R24,R2
	andi R24,15
	mov R2,R0
	add R2,R24
	std z+0,R2
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbsym r hex 16 pc
	.dbend
	.dbfunc e Delay _Delay fV
;              i -> R16
	.even
_Delay::
	.dbline -1
	.dbline 180
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
	.dbline 182
; }
; }
	ldi R16,200
L4:
	.dbline 183
L5:
	.dbline 183
; }
	mov R2,R16
	clr R3
	subi R16,1
	tst R2
	brne L4
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\串口通信实验(实验六)\..\ICC_H\SOFTWARE.h
_i::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\串口通信实验(实验六)\..\ICC_H\SOFTWARE.h
	.dbfile F:\job\M16学习板\串口通信实验(实验六)\M16Uart.c
	.dbsym e i _i c
_NewBeginFlag::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\串口通信实验(实验六)\M16Uart.c
	.dbsym e NewBeginFlag _NewBeginFlag c
_RecvDataFlag::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\串口通信实验(实验六)\M16Uart.c
	.dbsym e RecvDataFlag _RecvDataFlag c
_ReadFlag::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\串口通信实验(实验六)\M16Uart.c
	.dbsym e ReadFlag _ReadFlag c
	.area text(rom, con, rel)
	.dbfile F:\job\M16学习板\串口通信实验(实验六)\M16Uart.c
	.dbfunc e Uart0Init _Uart0Init fV
	.even
_Uart0Init::
	.dbline -1
	.dbline 34
	.dbline 35
	clr R2
	out 0xa,R2
	.dbline 36
	ldi R24,2
	out 0xb,R24
	.dbline 37
	ldi R24,134
	out 0x20,R24
	.dbline 38
	ldi R24,12
	out 0x9,R24
	.dbline 39
	ldi R24,152
	out 0xa,R24
	.dbline -2
L7:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 44
	jmp _UartRecvData
	.area text(rom, con, rel)
	.dbfile F:\job\M16学习板\串口通信实验(实验六)\M16Uart.c
	.dbfunc e UartRecvData _UartRecvData fV
;           temp -> R16
	.even
_UartRecvData::
	st -y,R2
	st -y,R3
	st -y,R16
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 50
	.dbline 52
	in R16,0xc
	.dbline 53
	cpi R16,42
	brne L9
	.dbline 54
	.dbline 55
	ldi R24,1
	sts _NewBeginFlag,R24
	.dbline 56
	sts _RecvDataFlag,R24
	.dbline 57
	xjmp L10
L9:
	.dbline 58
	lds R2,_RecvDataFlag
	tst R2
	breq L11
	.dbline 59
	.dbline 60
	cpi R16,35
	brne L13
	.dbline 61
	.dbline 62
	clr R2
	sts _RecvDataFlag,R2
	.dbline 63
	xjmp L12
L13:
	.dbline 65
	.dbline 66
	lds R2,_i
	clr R3
	mov R24,R2
	subi R24,255    ; addi 1
	sts _i,R24
	ldi R24,<_RecvData
	ldi R25,>_RecvData
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R16
	.dbline 67
	.dbline 68
	xjmp L12
L11:
	.dbline 69
	cpi R16,82
	breq L17
	cpi R16,114
	brne L15
L17:
	.dbline 70
	.dbline 71
	ldi R24,1
	sts _ReadFlag,R24
	.dbline 72
L15:
L12:
L10:
	.dbline -2
L8:
	ld R2,y+
	out 0x3f,R2
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R16,y+
	ld R3,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbsym r temp 16 c
	.dbend
	.area lit(rom, con, rel)
L19:
	.byte 'E,'R,'R,'O,'R,0
	.area text(rom, con, rel)
	.dbfile F:\job\M16学习板\串口通信实验(实验六)\M16Uart.c
	.dbfunc e UartTransmitData _UartTransmitData fV
;             Er -> y+0
;              j -> R20
	.even
_UartTransmitData::
	xcall push_gset1
	sbiw R28,6
	.dbline -1
	.dbline 81
	.dbline 82
	ldi R24,<L19
	ldi R25,>L19
	movw R30,R28
	ldi R16,6
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 83
	lds R2,_i
	tst R2
	brne L20
	.dbline 84
	.dbline 85
	clr R20
	xjmp L25
X0:
	.dbline 86
L26:
	.dbline 87
L27:
	.dbline 87
	sbis 0xb,5
	rjmp L26
	.dbline 88
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	out 0xc,R2
	.dbline 89
L23:
	.dbline 85
	inc R20
L25:
	.dbline 85
	cpi R20,5
	brlo L27
	.dbline 90
	xjmp L21
L20:
	.dbline 92
	.dbline 93
	clr R20
	xjmp L32
X1:
	.dbline 94
L33:
	.dbline 95
L34:
	.dbline 95
	sbis 0xb,5
	rjmp L33
	.dbline 96
	ldi R24,<_RecvData
	ldi R25,>_RecvData
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	out 0xc,R2
	.dbline 97
L30:
	.dbline 93
	inc R20
L32:
	.dbline 93
	lds R2,_i
	cp R20,R2
	brlo L34
	.dbline 98
L21:
	.dbline -2
L18:
	adiw R28,6
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym l Er 0 A[6:6]c
	.dbsym r j 20 c
	.dbend
	.dbfunc e InitDevices _InitDevices fV
	.even
_InitDevices::
	.dbline -1
	.dbline 107
	.dbline 108
	cli
	.dbline 109
	xcall _Uart0Init
	.dbline 111
	clr R2
	out 0x35,R2
	.dbline 112
	sei
	.dbline -2
L36:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;              j -> R20
	.even
_main::
	.dbline -1
	.dbline 116
	.dbline 118
	xcall _InitDevices
	xjmp L39
L38:
	.dbline 120
	.dbline 121
	lds R2,_NewBeginFlag
	tst R2
	breq L41
	.dbline 122
	.dbline 123
	clr R2
	sts _NewBeginFlag,R2
	.dbline 124
	ldi R20,1
	xjmp L46
L43:
	.dbline 125
	.dbline 126
	ldi R24,<_RecvData
	ldi R25,>_RecvData
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
	.dbline 127
L44:
	.dbline 124
	inc R20
L46:
	.dbline 124
	tst R20
	brne L43
	.dbline 128
L41:
	.dbline 129
	lds R2,_ReadFlag
	tst R2
	breq L47
	.dbline 130
	.dbline 131
	xcall _UartTransmitData
	.dbline 132
	clr R2
	sts _ReadFlag,R2
	.dbline 133
L47:
	.dbline 134
L39:
	.dbline 119
	xjmp L38
X2:
	.dbline -2
L37:
	.dbline 0 ; func end
	ret
	.dbsym r j 20 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile F:\job\M16学习板\串口通信实验(实验六)\M16Uart.c
_RecvData::
	.blkb 255
	.dbsym e RecvData _RecvData A[255:255]c

⌨️ 快捷键说明

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