📄 m16uart.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 + -