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