📄 boot128.lst
字号:
(0044) {
(0045) while(!(UCSR0A & 0x20));
_Uart_PutChar:
Data --> R16
F344 9B5D SBIS 0x0B,5
F345 CFFE RJMP _Uart_PutChar
(0046) UDR0 = Data;
F346 B90C OUT 0x0C,R16
F347 9508 RET
(0047) }
(0048)
(0049) //============================================================
(0050) //函 数:int Uart_GetChar(void)
(0051) //功 能:接收一个字符
(0052) //入口参数:无
(0053) //返 回 值:返回-1接受数据错误,否则为接收到的一个字符数据
(0054) //设 计 者:覃道堂
(0055) //创作时间:2006-03-16
(0056) //修改时间:
(0057) //修改目的:
(0058) //============================================================
(0059) int Uart_GetChar(void)
(0060) {
(0061) unsigned char status,res;
(0062)
(0063) if(!(UCSR0A&0x80))
_Uart_GetChar:
res --> R16
status --> R18
F348 995F SBIC 0x0B,7
F349 C003 RJMP 0xF34D
(0064) return -1;
F34A EF0F LDI R16,0xFF
F34B EF1F LDI R17,0xFF
F34C C009 RJMP 0xF356
(0065) status = UCSR0A;
F34D B12B IN R18,0x0B
(0066) res = UDR0;
F34E B10C IN R16,0x0C
(0067) if(status & 0x1c)
F34F 2F82 MOV R24,R18
F350 718C ANDI R24,0x1C
F351 F019 BEQ 0xF355
(0068) return -1;
F352 EF0F LDI R16,0xFF
F353 EF1F LDI R17,0xFF
F354 C001 RJMP 0xF356
(0069) else
(0070) return res;
F355 2711 CLR R17
F356 9508 RET
_Uart_Send_Frame:
Len --> R20
Frame --> R22
F357 940EF5FD CALL push_gset2
F359 01A9 MOVW R20,R18
F35A 01B8 MOVW R22,R16
(0071) }
(0072)
(0073) //============================================================
(0074) //函 数:void Uart_Send_Frame(unsigned char *Frame, int Len)
(0075) //功 能:发送一个字符串
(0076) //入口参数:*Frame发送一个字符串数据,Len发送的长度
(0077) //返 回 值:无
(0078) //设 计 者:覃道堂
(0079) //创作时间:2006-03-16
(0080) //修改时间:
(0081) //修改目的:
(0082) //============================================================
(0083) void Uart_Send_Frame(unsigned char *Frame, int Len)
(0084) {
F35B C007 RJMP 0xF363
(0085) while(Len > 0)
(0086) {
(0087) Uart_PutChar(*Frame);
F35C 01FB MOVW R30,R22
F35D 8100 LDD R16,Z+0
F35E DFE5 RCALL _Uart_PutChar
(0088) Frame ++;
F35F 5F6F SUBI R22,0xFF
F360 4F7F SBCI R23,0xFF
(0089) Len --;
F361 5041 SUBI R20,1
F362 4050 SBCI R21,0
F363 2422 CLR R2
F364 2433 CLR R3
F365 1624 CP R2,R20
F366 0635 CPC R3,R21
F367 F3A4 BLT 0xF35C
F368 940EF5EF CALL pop_gset2
F36A 9508 RET
_Uart_Receive_Frame:
Len --> R20
ReceiveLen --> R22
TimerCount --> R10
ByteData --> R14
OverTime --> R12
Frame --> Y+10
F36B 940EF5DA CALL push_arg4
F36D 940EF5F7 CALL push_gset5
F36F 0169 MOVW R12,R18
(0090) }
(0091) }
(0092)
(0093) //============================================================
(0094) //函 数:unsigned char Uart_Receive_Frame(unsigned char *Frame,
(0095) // int OverTime)
(0096) //功 能:接收一个字符串
(0097) //入口参数:*Frame接收一个字符串数据存放地址,OverTime超时时间
(0098) //返 回 值:无
(0099) //设 计 者:覃道堂
(0100) //创作时间:2006-03-16
(0101) //修改时间:
(0102) //修改目的:
(0103) //============================================================
(0104) unsigned char Uart_Receive_Frame(unsigned char *Frame,int OverTime)
(0105) {
(0106) int ByteData;
(0107) int TimerCount = 0;
F370 24AA CLR R10
F371 24BB CLR R11
(0108) int ReceiveLen = 0;
F372 2766 CLR R22
F373 2777 CLR R23
(0109) int Len = 255;
F374 EF4F LDI R20,0xFF
F375 E050 LDI R21,0
F376 C029 RJMP 0xF3A0
(0110)
(0111) while(ReceiveLen < Len)
(0112) {
(0113) while((ByteData = Uart_GetChar()) == -1)
(0114) {
(0115) if(TIFR& 0x02)
F377 B626 IN R2,0x36
F378 FE21 SBRS R2,1
F379 C00B RJMP 0xF385
(0116) {
(0117) if(++TimerCount > OverTime)
F37A 01C5 MOVW R24,R10
F37B 9601 ADIW R24,1
F37C 015C MOVW R10,R24
F37D 14CA CP R12,R10
F37E 04DB CPC R13,R11
F37F F414 BGE 0xF382
(0118) return 0;//等待超时如果还没接收到数据,则返回数据长度0
F380 2700 CLR R16
F381 C022 RJMP 0xF3A4
(0119) TIFR=TIFR|0x02;
F382 B786 IN R24,0x36
F383 6082 ORI R24,2
F384 BF86 OUT 0x36,R24
F385 DFC2 RCALL _Uart_GetChar
F386 0178 MOVW R14,R16
F387 3F0F CPI R16,0xFF
F388 EFEF LDI R30,0xFF
F389 071E CPC R17,R30
F38A F361 BEQ 0xF377
(0120) }
(0121) }
(0122) Frame[ReceiveLen] = (unsigned char)ByteData;
F38B 01FB MOVW R30,R22
F38C 840A LDD R0,Y+10
F38D 841B LDD R1,Y+11
F38E 0DE0 ADD R30,R0
F38F 1DF1 ADC R31,R1
F390 82E0 STD Z+0,R14
(0123) if(ReceiveLen == 0x04)
F391 3064 CPI R22,4
F392 E0E0 LDI R30,0
F393 077E CPC R23,R30
F394 F439 BNE 0xF39C
(0124) Len = Frame[ReceiveLen] + 0x02;
F395 01FB MOVW R30,R22
F396 0DE0 ADD R30,R0
F397 1DF1 ADC R31,R1
F398 8140 LDD R20,Z+0
F399 2755 CLR R21
F39A 5F4E SUBI R20,0xFE
F39B 4F5F SBCI R21,0xFF
(0125) ReceiveLen ++;
F39C 5F6F SUBI R22,0xFF
F39D 4F7F SBCI R23,0xFF
(0126) TimerCount = 0;
F39E 24AA CLR R10
F39F 24BB CLR R11
F3A0 1764 CP R22,R20
F3A1 0775 CPC R23,R21
F3A2 F314 BLT 0xF385
(0127) }
(0128) return ReceiveLen;
F3A3 2F06 MOV R16,R22
F3A4 940EF5F5 CALL pop_gset5
F3A6 9624 ADIW R28,4
F3A7 9508 RET
_PC_Send_Err:
Crc_Data --> R22
SendBuf --> R20
Err_Ret --> R22
F3A8 940EF5FD CALL push_gset2
F3AA 01A9 MOVW R20,R18
F3AB 2F60 MOV R22,R16
(0129) }
(0130)
(0131) //============================================================
(0132) //函 数:void PC_Send_Err(unsigned char Ret,unsigned char *SendBuf)
(0133) //功 能:向PC返回执行结果
(0134) //入口参数:结果代码,发送缓冲区
(0135) //返 回 值:无
(0136) //设 计 者:覃道堂
(0137) //创作时间:2006-03-16
(0138) //修改时间:
(0139) //修改目的:
(0140) //============================================================
(0141) void PC_Send_Err(unsigned char Err_Ret,unsigned char *SendBuf)
(0142) {
(0143) unsigned short Crc_Data;
(0144)
(0145) SendBuf[0] = 0x45;
F3AC E485 LDI R24,0x45
F3AD 01FA MOVW R30,R20
F3AE 8380 STD Z+0,R24
(0146) SendBuf[1] = 0x52;
F3AF E582 LDI R24,0x52
F3B0 8381 STD Z+1,R24
(0147) SendBuf[2] = 0x00;
F3B1 2422 CLR R2
F3B2 01FA MOVW R30,R20
F3B3 8222 STD Z+2,R2
(0148) SendBuf[3] = 0x05;
F3B4 E085 LDI R24,5
F3B5 01FA MOVW R30,R20
F3B6 8383 STD Z+3,R24
(0149) SendBuf[4] = Err_Ret;
F3B7 01FA MOVW R30,R20
F3B8 8364 STD Z+4,R22
(0150) Crc_Data = CRC16(SendBuf,5);
F3B9 E025 LDI R18,5
F3BA E030 LDI R19,0
F3BB 018A MOVW R16,R20
F3BC 940EF2D0 CALL _CRC16
F3BE 01B8 MOVW R22,R16
(0151) SendBuf[5] = Crc_Data / 0x100;
F3BF 011B MOVW R2,R22
F3C0 2C23 MOV R2,R3
F3C1 2433 CLR R3
F3C2 01FA MOVW R30,R20
F3C3 8225 STD Z+5,R2
(0152) SendBuf[6] = (unsigned char)Crc_Data;
F3C4 01FA MOVW R30,R20
F3C5 8366 STD Z+6,R22
(0153) Uart_Send_Frame(SendBuf, 7);
F3C6 E027 LDI R18,7
F3C7 E030 LDI R19,0
F3C8 018A MOVW R16,R20
F3C9 DF8D RCALL _Uart_Send_Frame
F3CA 940EF5EF CALL pop_gset2
F3CC 9508 RET
_PC_Send_Ok:
Crc_Data --> R10
i --> R10
Len --> R22
SendBuf --> R20
Ok_Coad --> R10
Ok_Frame --> R12
F3CD 940EF5F9 CALL push_gset4
F3CF 2EA2 MOV R10,R18
F3D0 0168 MOVW R12,R16
F3D1 8548 LDD R20,Y+8
F3D2 8559 LDD R21,Y+9
F3D3 856A LDD R22,Y+10
F3D4 857B LDD R23,Y+11
(0154) }
(0155)
(0156) //============================================================
(0157) //函 数:void PC_Send_Ok(unsigned char *Ok_Frame,unsigned char Ok_Coad,
(0158) // unsigned char *SendBuf,int Len)
(0159) //功 能:向PC返回执行结果
(0160) //入口参数:发送数据,结果代码,发送缓冲区,发送数据长度
(0161) //返 回 值:无
(0162) //设 计 者:覃道堂
(0163) //创作时间:2006-03-16
(0164) //修改时间:
(0165) //修改目的:
(0166) //============================================================
(0167) void PC_Send_Ok(unsigned char *Ok_Frame,unsigned char Ok_Coad,unsigned char *SendBuf,int Len)
(0168) {
(0169) int i;
(0170) unsigned short Crc_Data;
(0171)
(0172) SendBuf[0] = 0x4F;
F3D5 E48F LDI R24,0x4F
F3D6 01FA MOVW R30,R20
F3D7 8380 STD Z+0,R24
(0173) SendBuf[1] = 0x4B;
F3D8 E48B LDI R24,0x4B
F3D9 8381 STD Z+1,R24
(0174) SendBuf[2] = 0x00; //包序号
F3DA 2422 CLR R2
F3DB 01FA MOVW R30,R20
F3DC 8222 STD Z+2,R2
(0175) SendBuf[3] = 0x04 + Len; //数据长度
F3DD 01CB MOVW R24,R22
F3DE 9604 ADIW R24,4
F3DF 01FA MOVW R30,R20
F3E0 8383 STD Z+3,R24
(0176) if(Len == 1)
F3E1 3061 CPI R22,1
F3E2 E0E0 LDI R30,0
F3E3 077E CPC R23,R30
F3E4 F419 BNE 0xF3E8
(0177) SendBuf[4] = Ok_Coad;
F3E5 01FA MOVW R30,R20
F3E6 82A4 STD Z+4,R10
F3E7 C01A RJMP 0xF402
(0178) else if(Len > 1)
F3E8 E081 LDI R24,1
F3E9 E090 LDI R25,0
F3EA 1786 CP R24,R22
F3EB 0797 CPC R25,R23
F3EC F494 BGE 0xF3FF
(0179) {
(0180) for(i = 0;i < Len;i ++)
F3ED 24AA CLR R10
F3EE 24BB CLR R11
F3EF C00B RJMP 0xF3FB
(0181) SendBuf[4+i] = Ok_Frame[i];
F3F0 01F5 MOVW R30,R10
F3F1 0DEC ADD R30,R12
F3F2 1DFD ADC R31,R13
F3F3 8020 LDD R2,Z+0
F3F4 01F5 MOVW R30,R10
F3F5 0FE4 ADD R30,R20
F3F6 1FF5 ADC R31,R21
F3F7 8224 STD Z+4,R2
F3F8 01C5 MOVW R24,R10
F3F9 9601 ADIW R24,1
F3FA 015C MOVW R10,R24
F3FB 16A6 CP R10,R22
F3FC 06B7 CPC R11,R23
F3FD F394 BLT 0xF3F0
(0182) }
F3FE C003 RJMP 0xF402
(0183) else
(0184) SendBuf[4] = 0;
F3FF 2422 CLR R2
F400 01FA MOVW R30,R20
F401 8224 STD Z+4,R2
(0185) Crc_Data = CRC16(SendBuf,4+Len);
F402 019B MOVW R18,R22
F403 5F2C SUBI R18,0xFC
F404 4F3F SBCI R19,0xFF
F405 018A MOVW R16,R20
F406 940EF2D0 CALL _CRC16
F408 0158 MOVW R10,R16
(0186) SendBuf[Len+4] = Crc_Data / 0x100;
F409 01FB MOVW R30,R22
F40A 0FE4 ADD R30,R20
F40B 1FF5 ADC R31,R21
F40C 0115 MOVW R2,R10
F40D 2C23 MOV R2,R3
F40E 2433 CLR R3
F40F 8224 STD Z+4,R2
(0187) SendBuf[Len+5] = (unsigned char)Crc_Data;
F410 01FB MOVW R30,R22
F411 0FE4 ADD R30,R20
F412 1FF5 ADC R31,R21
F413 82A5 STD Z+5,R10
(0188) Uart_Send_Frame(SendBuf, Len+6);
F414 019B MOVW R18,R22
F415 5F2A SUBI R18,0xFA
F416 4F3F SBCI R19,0xFF
F417 018A MOVW R16,R20
F418 DF3E RCALL _Uart_Send_Frame
F419 940EF5F3 CALL pop_gset4
F41B 9508 RET
FILE: E:\程序\AVR程序\BOOTLoadICC\Eeprom128.c
(0001) #include <iom128v.h>
(0002) #include "Eeprom128.h"
(0003)
(0004) //============================================================
(0005) //函 数:unsigned char eeprom_read_byte(unsigned long *addr)
(0006) //功 能:读取EE一个字节
(0007) //入口参数:读取地址
(0008) //返 回 值:读取的字节数据
(0009) //设 计 者:覃道堂
(0010) //创作时间:2006-03-28
(0011) //修改时间:
(0012) //修改目的:
(0013) //============================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -