⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boot128.lst

📁 AVR16源代码 ICC编译器
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -