📄 boot128.lst
字号:
0110 01F5 MOVW R30,R10
0111 9732 SBIW R30,2
0112 0FE6 ADD R30,R22
0113 1FF7 ADC R31,R23
0114 8120 LDD R18,Z+0
0115 2733 CLR R19
0116 E000 LDI R16,0
0117 E011 LDI R17,1
0118 940E022B CALL empy16s
011A 01A8 MOVW R20,R16
011B 01F5 MOVW R30,R10
011C 9731 SBIW R30,1
011D 0FE6 ADD R30,R22
011E 1FF7 ADC R31,R23
011F 8020 LDD R2,Z+0
0120 2433 CLR R3
0121 0D42 ADD R20,R2
0122 1D53 ADC R21,R3
(0059)
(0060) if((CRC16(ReceiveBuf, Len-2)) !=Crc_Tmp)
0123 0195 MOVW R18,R10
0124 5022 SUBI R18,2
0125 4030 SBCI R19,0
0126 018B MOVW R16,R22
0127 DFA4 RCALL _CRC16
0128 1704 CP R16,R20
0129 0715 CPC R17,R21
012A F011 BEQ 0x012D
(0061) return 3;
012B E003 LDI R16,3
012C C001 RJMP 0x012E
(0062) return 0;
012D 2700 CLR R16
012E 940E023E CALL pop_gset3
0130 9508 RET
FILE: D:\avr16\atmegal16\Uart.c
(0001) #include <iom16v.h>
(0002) #include "Uart.h"
(0003) #include "Crc.h"
(0004)
(0005) //============================================================
(0006) //计算和设置16的波特率参数 chenzuan 2006-03-16
(0007) #define BAUD 9600
(0008) #define CRYSTAL 4000000
(0009) #define BAUD_SETTING (unsigned char)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
(0010) #define BAUD_H (unsigned char)(BAUD_SETTING>>8)
(0011) #define BAUD_L (unsigned char)BAUD_SETTING
(0012)
(0013) //============================================================
(0014) //函 数:void Init_Com(void)
(0015) //功 能:初始化串口设置
(0016) //入口参数:无
(0017) //返 回 值:无
(0018) //设 计 者:覃道堂
(0019) //创作时间:2006-03-16
(0020) //修改时间:
(0021) //修改目的:
(0022) //============================================================
(0023) /*void Init_Com(void)
(0024) {
(0025) UBRRH = BAUD_H;
(0026) UBRRL = BAUD_L;
(0027) UCSRB = 0x18;
(0028) UCSRC = 0x0E;
(0029) OCR0 = 0xEA;
(0030) TCCR0 = 0x0F;
(0031) }*/
(0032) void Init_Com( void )
(0033) {
(0034) /* 设置波特率*/
(0035) UBRRH =BAUD_H;
_Init_Com:
0131 2422 CLR R2
0132 BC20 OUT 0x20,R2
(0036) UBRRL =BAUD_L;
0133 E189 LDI R24,0x19
0134 B989 OUT 0x09,R24
(0037) /* 接收器与发送器使能*/
(0038) UCSRB = (1<<RXEN)|(1<<TXEN);
0135 E188 LDI R24,0x18
0136 B98A OUT 0x0A,R24
(0039) /* 设置帧格式: 8 个数据位, 2 个停止位*/
(0040) UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
0137 E88E LDI R24,0x8E
0138 BD80 OUT 0x20,R24
0139 9508 RET
(0041) }
(0042) //============================================================
(0043) //函 数:void Uart_PutChar(unsigned char Data)
(0044) //功 能:发送一个字符
(0045) //入口参数:发送的字符数据
(0046) //返 回 值:无
(0047) //设 计 者:覃道堂
(0048) //创作时间:2006-03-16
(0049) //修改时间:
(0050) //修改目的:
(0051) //============================================================
(0052) void Uart_PutChar(unsigned char Data)
(0053) {
(0054) //while(!(UCSRA & 0x20));
(0055) while ( !( UCSRA & (1<<UDRE)) );
_Uart_PutChar:
Data --> R16
013A 9B5D SBIS 0x0B,5
013B CFFE RJMP _Uart_PutChar
(0056) UDR = Data;
013C B90C OUT 0x0C,R16
013D 9508 RET
(0057) }
(0058)
(0059) //============================================================
(0060) //函 数:int Uart_GetChar(void)
(0061) //功 能:接收一个字符
(0062) //入口参数:无
(0063) //返 回 值:返回-1接受数据错误,否则为接收到的一个字符数据
(0064) //设 计 者:覃道堂
(0065) //创作时间:2006-03-16
(0066) //修改时间:
(0067) //修改目的:
(0068) //============================================================
(0069) int Uart_GetChar(void)
(0070) {
(0071) unsigned char status,res;
(0072)
(0073) if(!(UCSRA&0x80))
_Uart_GetChar:
res --> R16
status --> R18
013E 995F SBIC 0x0B,7
013F C003 RJMP 0x0143
(0074) return -1;
0140 EF0F LDI R16,0xFF
0141 EF1F LDI R17,0xFF
0142 C009 RJMP 0x014C
(0075) status = UCSRA;
0143 B12B IN R18,0x0B
(0076) res = UDR;
0144 B10C IN R16,0x0C
(0077) if(status & 0x1c)
0145 2F82 MOV R24,R18
0146 718C ANDI R24,0x1C
0147 F019 BEQ 0x014B
(0078) return -1;
0148 EF0F LDI R16,0xFF
0149 EF1F LDI R17,0xFF
014A C001 RJMP 0x014C
(0079) else
(0080) return res;
014B 2711 CLR R17
014C 9508 RET
_Uart_Send_Frame:
Len --> R20
Frame --> R22
014D 940E024A CALL push_gset2
014F 01A9 MOVW R20,R18
0150 01B8 MOVW R22,R16
(0081) }
(0082)
(0083) //============================================================
(0084) //函 数:void Uart_Send_Frame(unsigned char *Frame, int Len)
(0085) //功 能:发送一个字符串
(0086) //入口参数:*Frame发送一个字符串数据,Len发送的长度
(0087) //返 回 值:无
(0088) //设 计 者:覃道堂
(0089) //创作时间:2006-03-16
(0090) //修改时间:
(0091) //修改目的:
(0092) //============================================================
(0093) void Uart_Send_Frame(unsigned char *Frame, int Len)
(0094) {
0151 C007 RJMP 0x0159
(0095) while(Len > 0)
(0096) {
(0097) Uart_PutChar(*Frame);
0152 01FB MOVW R30,R22
0153 8100 LDD R16,Z+0
0154 DFE5 RCALL _Uart_PutChar
(0098) Frame ++;
0155 5F6F SUBI R22,0xFF
0156 4F7F SBCI R23,0xFF
(0099) Len --;
0157 5041 SUBI R20,1
0158 4050 SBCI R21,0
0159 2422 CLR R2
015A 2433 CLR R3
015B 1624 CP R2,R20
015C 0635 CPC R3,R21
015D F3A4 BLT 0x0152
015E 940E023B CALL pop_gset2
0160 9508 RET
_Uart_Receive_Frame:
Len --> R20
ReceiveLen --> R22
TimerCount --> R10
ByteData --> R14
OverTime --> R12
Frame --> Y+10
0161 940E0226 CALL push_arg4
0163 940E0244 CALL push_gset5
0165 0169 MOVW R12,R18
(0100) }
(0101) }
(0102)
(0103) //============================================================
(0104) //函 数:unsigned char Uart_Receive_Frame(unsigned char *Frame,
(0105) // int OverTime)
(0106) //功 能:接收一个字符串
(0107) //入口参数:*Frame接收一个字符串数据存放地址,OverTime超时时间
(0108) //返 回 值:无
(0109) //设 计 者:覃道堂
(0110) //创作时间:2006-03-16
(0111) //修改时间:
(0112) //修改目的:
(0113) //============================================================
(0114) unsigned char Uart_Receive_Frame(unsigned char *Frame,int OverTime)
(0115) {
(0116) int ByteData;
(0117) int TimerCount = 0;
0166 24AA CLR R10
0167 24BB CLR R11
(0118) int ReceiveLen = 0;
0168 2766 CLR R22
0169 2777 CLR R23
(0119) int Len = 255;
016A EF4F LDI R20,0xFF
016B E050 LDI R21,0
016C C029 RJMP 0x0196
(0120)
(0121) while(ReceiveLen < Len)
(0122) {
(0123) while((ByteData = Uart_GetChar()) == -1)
(0124) {
(0125) if(TIFR& 0x02)
016D B628 IN R2,0x38
016E FE21 SBRS R2,1
016F C00B RJMP 0x017B
(0126) {
(0127) if(++TimerCount > OverTime)
0170 01C5 MOVW R24,R10
0171 9601 ADIW R24,1
0172 015C MOVW R10,R24
0173 14CA CP R12,R10
0174 04DB CPC R13,R11
0175 F414 BGE 0x0178
(0128) return 0;//等待超时如果还没接收到数据,则返回数据长度0
0176 2700 CLR R16
0177 C022 RJMP 0x019A
(0129) TIFR=TIFR|0x02;
0178 B788 IN R24,0x38
0179 6082 ORI R24,2
017A BF88 OUT 0x38,R24
017B DFC2 RCALL _Uart_GetChar
017C 0178 MOVW R14,R16
017D 3F0F CPI R16,0xFF
017E EFEF LDI R30,0xFF
017F 071E CPC R17,R30
0180 F361 BEQ 0x016D
(0130) }
(0131) }
(0132) Frame[ReceiveLen] = (unsigned char)ByteData;
0181 01FB MOVW R30,R22
0182 840A LDD R0,Y+10
0183 841B LDD R1,Y+11
0184 0DE0 ADD R30,R0
0185 1DF1 ADC R31,R1
0186 82E0 STD Z+0,R14
(0133) if(ReceiveLen == 0x04)
0187 3064 CPI R22,4
0188 E0E0 LDI R30,0
0189 077E CPC R23,R30
018A F439 BNE 0x0192
(0134) Len = Frame[ReceiveLen] + 0x02;
018B 01FB MOVW R30,R22
018C 0DE0 ADD R30,R0
018D 1DF1 ADC R31,R1
018E 8140 LDD R20,Z+0
018F 2755 CLR R21
0190 5F4E SUBI R20,0xFE
0191 4F5F SBCI R21,0xFF
(0135) ReceiveLen ++;
0192 5F6F SUBI R22,0xFF
0193 4F7F SBCI R23,0xFF
(0136) TimerCount = 0;
0194 24AA CLR R10
0195 24BB CLR R11
0196 1764 CP R22,R20
0197 0775 CPC R23,R21
0198 F314 BLT 0x017B
(0137) }
(0138) return ReceiveLen;
0199 2F06 MOV R16,R22
019A 940E0241 CALL pop_gset5
019C 9624 ADIW R28,4
019D 9508 RET
_PC_Send_Err:
Crc_Data --> R22
SendBuf --> R20
Err_Ret --> R22
019E 940E024A CALL push_gset2
01A0 01A9 MOVW R20,R18
01A1 2F60 MOV R22,R16
(0139) }
(0140)
(0141) //============================================================
(0142) //函 数:void PC_Send_Err(unsigned char Ret,unsigned char *SendBuf)
(0143) //功 能:向PC返回执行结果
(0144) //入口参数:结果代码,发送缓冲区
(0145) //返 回 值:无
(0146) //设 计 者:覃道堂
(0147) //创作时间:2006-03-16
(0148) //修改时间:
(0149) //修改目的:
(0150) //============================================================
(0151) void PC_Send_Err(unsigned char Err_Ret,unsigned char *SendBuf)
(0152) {
(0153) unsigned short Crc_Data;
(0154)
(0155) SendBuf[0] = 0x45;
01A2 E485 LDI R24,0x45
01A3 01FA MOVW R30,R20
01A4 8380 STD Z+0,R24
(0156) SendBuf[1] = 0x52;
01A5 E582 LDI R24,0x52
01A6 8381 STD Z+1,R24
(0157) SendBuf[2] = 0x00;
01A7 2422 CLR R2
01A8 01FA MOVW R30,R20
01A9 8222 STD Z+2,R2
(0158) SendBuf[3] = 0x05;
01AA E085 LDI R24,5
01AB 01FA MOVW R30,R20
01AC 8383 STD Z+3,R24
(0159) SendBuf[4] = Err_Ret;
01AD 01FA MOVW R30,R20
01AE 8364 STD Z+4,R22
(0160) Crc_Data = CRC16(SendBuf,5);
01AF E025 LDI R18,5
01B0 E030 LDI R19,0
01B1 018A MOVW R16,R20
01B2 940E00CC CALL _CRC16
01B4 01B8 MOVW R22,R16
(0161) SendBuf[5] = Crc_Data / 0x100;
01B5 011B MOVW R2,R22
01B6 2C23 MOV R2,R3
01B7 2433 CLR R3
01B8 01FA MOVW R30,R20
01B9 8225 STD Z+5,R2
(0162) SendBuf[6] = (unsigned char)Crc_Data;
01BA 01FA MOVW R30,R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -