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

📄 boot128.lst

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