📄 uart.lis
字号:
.module Uart.c
.area text(rom, con, rel)
0000 .dbfile D:\MY_COMPUTER\d\avr16\atmegal16\Uart.c
0000 .dbfunc e Uart_PutChar _Uart_PutChar fV
0000 ; Data -> R16
.even
0000 _Uart_PutChar::
0000 .dbline -1
0000 .dbline 18
0000 ; #include <iom16v.h>
0000 ; #include "Uart.h"
0000 ; #include "Crc.h"
0000 ;
0000 ;
0000 ;
0000 ; //============================================================
0000 ; //函 数:void Uart_PutChar(unsigned char Data)
0000 ; //功 能:发送一个字符
0000 ; //入口参数:发送的字符数据
0000 ; //返 回 值:无
0000 ; //设 计 者:覃道堂
0000 ; //创作时间:2006-03-16
0000 ; //修改时间:
0000 ; //修改目的:
0000 ; //============================================================
0000 ; void Uart_PutChar(unsigned char Data)
0000 ; {
0000 L2:
0000 .dbline 20
0000 L3:
0000 .dbline 20
0000 ; //while(!(UCSRA & 0x20));
0000 ; while ( !( UCSRA & (1<<UDRE)) );
0000 5D9B sbis 0xb,5
0002 FECF rjmp L2
0004 .dbline 21
0004 ; UDR = Data;
0004 0CB9 out 0xc,R16
0006 .dbline -2
0006 .dbline 22
0006 ; }
0006 L1:
0006 .dbline 0 ; func end
0006 0895 ret
0008 .dbsym r Data 16 c
0008 .dbend
0008 .dbfunc e Uart_GetChar _Uart_GetChar fI
0008 ; res -> R16
0008 ; status -> R18
.even
0008 _Uart_GetChar::
0008 .dbline -1
0008 .dbline 35
0008 ;
0008 ; //============================================================
0008 ; //函 数:int Uart_GetChar(void)
0008 ; //功 能:接收一个字符
0008 ; //入口参数:无
0008 ; //返 回 值:返回-1接受数据错误,否则为接收到的一个字符数据
0008 ; //设 计 者:覃道堂
0008 ; //创作时间:2006-03-16
0008 ; //修改时间:
0008 ; //修改目的:
0008 ; //============================================================
0008 ; int Uart_GetChar(void)
0008 ; {
0008 .dbline 38
0008 ; unsigned char status,res;
0008 ;
0008 ; if(!(UCSRA&(1<<RXC)))
0008 5F99 sbic 0xb,7
000A 03C0 rjmp L6
000C .dbline 39
000C ; return -1;
000C 0FEF ldi R16,-1
000E 1FEF ldi R17,-1
0010 0AC0 xjmp L5
0012 L6:
0012 .dbline 40
0012 ; status = UCSRA;
0012 2BB1 in R18,0xb
0014 .dbline 41
0014 ; res = UDR;
0014 0CB1 in R16,0xc
0016 .dbline 42
0016 ; if ( status & (1<<FE)|(1<<DOR)|(1<<PE) )//if(status & 0x1c)//数据益处,数据贞错误,校验错误
0016 822F mov R24,R18
0018 8071 andi R24,16
001A 8C60 ori R24,12
001C 19F0 breq L8
001E .dbline 43
001E ; return -1;
001E 0FEF ldi R16,-1
0020 1FEF ldi R17,-1
0022 01C0 xjmp L5
0024 L8:
0024 .dbline 45
0024 ; else
0024 ; return res;
0024 1127 clr R17
0026 .dbline -2
0026 L5:
0026 .dbline 0 ; func end
0026 0895 ret
0028 .dbsym r res 16 c
0028 .dbsym r status 18 c
0028 .dbend
0028 .dbfunc e Uart_Send_Frame _Uart_Send_Frame fV
0028 ; Len -> R20,R21
0028 ; Frame -> R22,R23
.even
0028 _Uart_Send_Frame::
0028 0E940000 xcall push_gset2
002C A901 movw R20,R18
002E B801 movw R22,R16
0030 .dbline -1
0030 .dbline 59
0030 ; }
0030 ;
0030 ; //============================================================
0030 ; //函 数:void Uart_Send_Frame(unsigned char *Frame, int Len)
0030 ; //功 能:发送一个字符串
0030 ; //入口参数:*Frame发送一个字符串数据,Len发送的长度
0030 ; //返 回 值:无
0030 ; //设 计 者:覃道堂
0030 ; //创作时间:2006-03-16
0030 ; //修改时间:
0030 ; //修改目的:
0030 ; //============================================================
0030 ; void Uart_Send_Frame(unsigned char *Frame, int Len)
0030 ; {
0030 07C0 xjmp L12
0032 L11:
0032 .dbline 61
0032 .dbline 62
0032 FB01 movw R30,R22
0034 0081 ldd R16,z+0
0036 E4DF xcall _Uart_PutChar
0038 .dbline 63
0038 6F5F subi R22,255 ; offset = 1
003A 7F4F sbci R23,255
003C .dbline 64
003C 4150 subi R20,1
003E 5040 sbci R21,0
0040 .dbline 65
0040 L12:
0040 .dbline 60
0040 ; while(Len > 0)
0040 2224 clr R2
0042 3324 clr R3
0044 2416 cp R2,R20
0046 3506 cpc R3,R21
0048 A4F3 brlt L11
004A .dbline -2
004A .dbline 66
004A ; {
004A ; Uart_PutChar(*Frame);
004A ; Frame ++;
004A ; Len --;
004A ; }
004A ; }
004A L10:
004A 0E940000 xcall pop_gset2
004E .dbline 0 ; func end
004E 0895 ret
0050 .dbsym r Len 20 I
0050 .dbsym r Frame 22 pc
0050 .dbend
0050 .dbfunc e Uart_Receive_Frame _Uart_Receive_Frame fc
0050 ; Len -> R20,R21
0050 ; ReceiveLen -> R22,R23
0050 ; TimerCount -> R10,R11
0050 ; ByteData -> R14,R15
0050 ; OverTime -> R12,R13
0050 ; Frame -> y+10
.even
0050 _Uart_Receive_Frame::
0050 0E940000 xcall push_arg4
0054 0E940000 xcall push_gset5
0058 6901 movw R12,R18
005A .dbline -1
005A .dbline 80
005A ;
005A ; //============================================================
005A ; //函 数:unsigned char Uart_Receive_Frame(unsigned char *Frame,
005A ; // int OverTime)
005A ; //功 能:接收一个字符串
005A ; //入口参数:*Frame接收一个字符串数据存放地址,OverTime超时时间
005A ; //返 回 值:无
005A ; //设 计 者:覃道堂
005A ; //创作时间:2006-03-16
005A ; //修改时间:
005A ; //修改目的:
005A ; //============================================================
005A ; unsigned char Uart_Receive_Frame(unsigned char *Frame,int OverTime)
005A ; {
005A .dbline 82
005A ; int ByteData;
005A ; int TimerCount = 0;
005A AA24 clr R10
005C BB24 clr R11
005E .dbline 83
005E ; int ReceiveLen = 0;
005E 6627 clr R22
0060 7727 clr R23
0062 .dbline 84
0062 ; int Len = 255;
0062 4FEF ldi R20,255
0064 50E0 ldi R21,0
0066 29C0 xjmp L16
0068 X0:
0068 .dbline 87
0068 ;
0068 ; while(ReceiveLen < Len)
0068 ; {
0068 L18:
0068 .dbline 89
0068 ; while((ByteData = Uart_GetChar()) == -1)
0068 ; {
0068 .dbline 90
0068 ; if(TIFR& 0x02)
0068 28B6 in R2,0x38
006A 21FE sbrs R2,1
006C 0BC0 rjmp L21
006E .dbline 91
006E ; {
006E .dbline 92
006E ; if(++TimerCount > OverTime)
006E C501 movw R24,R10
0070 0196 adiw R24,1
0072 5C01 movw R10,R24
0074 CA14 cp R12,R10
0076 DB04 cpc R13,R11
0078 14F4 brge L23
007A .dbline 93
007A ; return 0;//等待超时如果还没接收到数据,则返回数据长度0
007A 0027 clr R16
007C 22C0 xjmp L14
007E L23:
007E .dbline 94
007E ; TIFR=TIFR|0x02;
007E 88B7 in R24,0x38
0080 8260 ori R24,2
0082 88BF out 0x38,R24
0084 .dbline 95
0084 ; }
0084 L21:
0084 .dbline 96
0084 L19:
0084 .dbline 88
0084 C1DF xcall _Uart_GetChar
0086 7801 movw R14,R16
0088 0F3F cpi R16,255
008A EFEF ldi R30,255
008C 1E07 cpc R17,R30
008E 61F3 breq L18
0090 .dbline 97
0090 ; }
0090 ; Frame[ReceiveLen] = (unsigned char)ByteData;
0090 FB01 movw R30,R22
0092 0A84 ldd R0,y+10
0094 1B84 ldd R1,y+11
0096 E00D add R30,R0
0098 F11D adc R31,R1
009A E082 std z+0,R14
009C .dbline 98
009C ; if(ReceiveLen == 0x04)
009C 6430 cpi R22,4
009E E0E0 ldi R30,0
00A0 7E07 cpc R23,R30
00A2 39F4 brne L25
00A4 .dbline 99
00A4 ; Len = Frame[ReceiveLen] + 0x02;
00A4 FB01 movw R30,R22
00A6 E00D add R30,R0
00A8 F11D adc R31,R1
00AA 4081 ldd R20,z+0
00AC 5527 clr R21
00AE 4E5F subi R20,254 ; offset = 2
00B0 5F4F sbci R21,255
00B2 L25:
00B2 .dbline 100
00B2 6F5F subi R22,255 ; offset = 1
00B4 7F4F sbci R23,255
00B6 .dbline 101
00B6 AA24 clr R10
00B8 BB24 clr R11
00BA .dbline 102
00BA L16:
00BA .dbline 86
00BA 6417 cp R22,R20
00BC 7507 cpc R23,R21
00BE 14F3 brlt L19
00C0 .dbline 103
00C0 ; ReceiveLen ++;
00C0 ; TimerCount = 0;
00C0 ; }
00C0 ; return ReceiveLen;
00C0 062F mov R16,R22
00C2 .dbline -2
00C2 L14:
00C2 0E940000 xcall pop_gset5
00C6 2496 adiw R28,4
00C8 .dbline 0 ; func end
00C8 0895 ret
00CA .dbsym r Len 20 I
00CA .dbsym r ReceiveLen 22 I
00CA .dbsym r TimerCount 10 I
00CA .dbsym r ByteData 14 I
00CA .dbsym r OverTime 12 I
00CA .dbsym l Frame 10 pc
00CA .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -