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

📄 atmegal16l.lst

📁 AVR16源代码 ICC编译器
💻 LST
📖 第 1 页 / 共 5 页
字号:
    031A DF0A      RCALL	_read_byte
    031B 01FA      MOVW	R30,R20
    031C 8301      STD	Z+1,R16
(0192) 	temp[2] = read_byte();
    031D DF07      RCALL	_read_byte
    031E 01FA      MOVW	R30,R20
    031F 8302      STD	Z+2,R16
(0193) 	temp[3] = read_byte();
    0320 DF04      RCALL	_read_byte
    0321 01FA      MOVW	R30,R20
    0322 8303      STD	Z+3,R16
(0194) 	temp[4] = read_byte();
    0323 DF01      RCALL	_read_byte
    0324 01FA      MOVW	R30,R20
    0325 8304      STD	Z+4,R16
(0195) 	temp[5] = read_byte();
    0326 DEFE      RCALL	_read_byte
    0327 01FA      MOVW	R30,R20
    0328 8305      STD	Z+5,R16
(0196) 	temp[6] = read_byte();
    0329 DEFB      RCALL	_read_byte
    032A 01FA      MOVW	R30,R20
    032B 8306      STD	Z+6,R16
(0197) 	temp[7] = read_byte();
    032C DEF8      RCALL	_read_byte
    032D 01FA      MOVW	R30,R20
    032E 8307      STD	Z+7,R16
(0198) 	if(crccheck(temp,8))
    032F E028      LDI	R18,0x8
    0330 018A      MOVW	R16,R20
    0331 DE9F      RCALL	_crccheck
    0332 2300      TST	R16
    0333 F011      BEQ	0x0336
(0199) 		return	false;
    0334 E001      LDI	R16,1
    0335 C001      RJMP	0x0337
(0200) 	else
(0201) 		return	true;
    0336 2700      CLR	R16
    0337 940E0415  CALL	pop_gset1
    0339 9508      RET
_ds1820_match:
  i                    --> R20
  p                    --> R22
    033A 940E0429  CALL	push_gset2
    033C 01B8      MOVW	R22,R16
(0202) }
(0203) 
(0204) /*===================================================================
(0205) //	函数功能:	匹配DS18B20
(0206) //	形参:		*p	DS18B20的Rom Code
(0207) //	返回:		void
(0208) //	编写:		2004/8/25
(0209) ===================================================================*/
(0210) void ds1820_match(unsigned char *p)
(0211) {
(0212) 	unsigned char i;
(0213) 	ds1820_ack();
    033D DECA      RCALL	_ds1820_ack
(0214) 	write_byte(0x55);	 
    033E E505      LDI	R16,0x55
    033F DF0B      RCALL	_write_byte
(0215) 	for(i=0;i<8;i++)
    0340 2744      CLR	R20
    0341 C007      RJMP	0x0349
(0216) 		write_byte(p[i]);
    0342 2FE4      MOV	R30,R20
    0343 27FF      CLR	R31
    0344 0FE6      ADD	R30,R22
    0345 1FF7      ADC	R31,R23
    0346 8100      LDD	R16,Z+0
    0347 DF03      RCALL	_write_byte
    0348 9543      INC	R20
    0349 3048      CPI	R20,0x8
    034A F3B8      BCS	0x0342
(0217) }
    034B 940E0406  CALL	pop_gset2
    034D 9508      RET
FILE: D:\MY_COMPUTER\d\avr16\atmegal16\Uart.c
(0001) #include	<iom16v.h>
(0002) #include	"Uart.h"
(0003) #include	"Crc.h"
(0004) 
(0005) 
(0006)    		 
(0007) //============================================================
(0008) //函	数:void Uart_PutChar(unsigned char Data)
(0009) //功	能:发送一个字符
(0010) //入口参数:发送的字符数据  
(0011) //返 回 值:无 
(0012) //设 计 者:覃道堂 
(0013) //创作时间:2006-03-16
(0014) //修改时间:
(0015) //修改目的:
(0016) //============================================================
(0017) void Uart_PutChar(unsigned char Data)
(0018) {
(0019)   	//while(!(UCSRA & 0x20));
(0020) 	while ( !( UCSRA & (1<<UDRE)) );
_Uart_PutChar:
  Data                 --> R16
    034E 9B5D      SBIS	0x0B,5
    034F CFFE      RJMP	_Uart_PutChar
(0021)   	UDR = Data; 
    0350 B90C      OUT	0x0C,R16
(0022) }
    0351 9508      RET
(0023) 
(0024) //============================================================
(0025) //函	数:int Uart_GetChar(void)
(0026) //功	能:接收一个字符
(0027) //入口参数:无  
(0028) //返 回 值:返回-1接受数据错误,否则为接收到的一个字符数据 
(0029) //设 计 者:覃道堂 
(0030) //创作时间:2006-03-16
(0031) //修改时间:
(0032) //修改目的:
(0033) //============================================================
(0034) int Uart_GetChar(void)
(0035) {
(0036) 	unsigned char 	status,res;
(0037) 	
(0038)   	if(!(UCSRA&(1<<RXC)))
_Uart_GetChar:
  res                  --> R16
  status               --> R18
    0352 995F      SBIC	0x0B,7
    0353 C003      RJMP	0x0357
(0039)   		return -1;
    0354 EF0F      LDI	R16,0xFF
    0355 EF1F      LDI	R17,0xFF
    0356 C00A      RJMP	0x0361
(0040)   	status = UCSRA;
    0357 B12B      IN	R18,0x0B
(0041)   	res = UDR;
    0358 B10C      IN	R16,0x0C
(0042)   	if ( status & (1<<FE)|(1<<DOR)|(1<<PE) )//if(status & 0x1c)//数据益处,数据贞错误,校验错误 
    0359 2F82      MOV	R24,R18
    035A 7180      ANDI	R24,0x10
    035B 608C      ORI	R24,0xC
    035C F019      BEQ	0x0360
(0043)   		return -1;
    035D EF0F      LDI	R16,0xFF
    035E EF1F      LDI	R17,0xFF
    035F C001      RJMP	0x0361
(0044)   	else
(0045)   		return res;
    0360 2711      CLR	R17
    0361 9508      RET
_Uart_Send_Frame:
  Len                  --> R20
  Frame                --> R22
    0362 940E0429  CALL	push_gset2
    0364 01A9      MOVW	R20,R18
    0365 01B8      MOVW	R22,R16
(0046) } 
(0047) 
(0048) //============================================================
(0049) //函	数:void Uart_Send_Frame(unsigned char *Frame, int Len)
(0050) //功	能:发送一个字符串
(0051) //入口参数:*Frame发送一个字符串数据,Len发送的长度  
(0052) //返 回 值:无
(0053) //设 计 者:覃道堂 
(0054) //创作时间:2006-03-16
(0055) //修改时间:
(0056) //修改目的:
(0057) //============================================================
(0058) void Uart_Send_Frame(unsigned char *Frame, int Len)
(0059) {
    0366 C007      RJMP	0x036E
(0060) 	while(Len > 0)
(0061) 	{
(0062) 	 	Uart_PutChar(*Frame);
    0367 01FB      MOVW	R30,R22
    0368 8100      LDD	R16,Z+0
    0369 DFE4      RCALL	_Uart_PutChar
(0063) 	 	Frame ++;
    036A 5F6F      SUBI	R22,0xFF
    036B 4F7F      SBCI	R23,0xFF
(0064) 	 	Len --;
    036C 5041      SUBI	R20,1
    036D 4050      SBCI	R21,0
    036E 2422      CLR	R2
    036F 2433      CLR	R3
    0370 1624      CP	R2,R20
    0371 0635      CPC	R3,R21
    0372 F3A4      BLT	0x0367
(0065) 	}
(0066) }
    0373 940E0406  CALL	pop_gset2
    0375 9508      RET
_Uart_Receive_Frame:
  Len                  --> R20
  ReceiveLen           --> R22
  TimerCount           --> R10
  ByteData             --> R14
  OverTime             --> R12
  Frame                --> Y+10
    0376 940E03F1  CALL	push_arg4
    0378 940E0435  CALL	push_gset5
    037A 0169      MOVW	R12,R18
(0067) 
(0068) //============================================================
(0069) //函	数:unsigned char Uart_Receive_Frame(unsigned char *Frame,
(0070) //					     int OverTime)
(0071) //功	能:接收一个字符串
(0072) //入口参数:*Frame接收一个字符串数据存放地址,OverTime超时时间  
(0073) //返 回 值:无
(0074) //设 计 者:覃道堂 
(0075) //创作时间:2006-03-16
(0076) //修改时间:
(0077) //修改目的:
(0078) //============================================================
(0079) unsigned char Uart_Receive_Frame(unsigned char *Frame,int OverTime)
(0080) {
(0081) 	int 	ByteData;
(0082) 	int	TimerCount = 0;
    037B 24AA      CLR	R10
    037C 24BB      CLR	R11
(0083) 	int	ReceiveLen = 0;
    037D 2766      CLR	R22
    037E 2777      CLR	R23
(0084) 	int	Len = 255;
    037F EF4F      LDI	R20,0xFF
    0380 E050      LDI	R21,0
    0381 C029      RJMP	0x03AB
(0085)   
(0086) 	while(ReceiveLen < Len)
(0087) 	{	
(0088)   		while((ByteData = Uart_GetChar()) == -1)
(0089)        		{
(0090)        			if(TIFR& 0x02)
    0382 B628      IN	R2,0x38
    0383 FE21      SBRS	R2,1
    0384 C00B      RJMP	0x0390
(0091)           		{
(0092)           			if(++TimerCount > OverTime) 
    0385 01C5      MOVW	R24,R10
    0386 9601      ADIW	R24,1
    0387 015C      MOVW	R10,R24
    0388 14CA      CP	R12,R10
    0389 04DB      CPC	R13,R11
    038A F414      BGE	0x038D
(0093) 	       				return 0;//等待超时如果还没接收到数据,则返回数据长度0
    038B 2700      CLR	R16
    038C C022      RJMP	0x03AF
(0094) 	       			TIFR=TIFR|0x02;
    038D B788      IN	R24,0x38
    038E 6082      ORI	R24,2
    038F BF88      OUT	0x38,R24
    0390 DFC1      RCALL	_Uart_GetChar
    0391 0178      MOVW	R14,R16
    0392 3F0F      CPI	R16,0xFF
    0393 EFEF      LDI	R30,0xFF
    0394 071E      CPC	R17,R30
    0395 F361      BEQ	0x0382
(0095) 	      		}	 
(0096) 		    }  
(0097)   		Frame[ReceiveLen] = (unsigned char)ByteData;
    0396 01FB      MOVW	R30,R22
    0397 840A      LDD	R0,Y+10
    0398 841B      LDD	R1,Y+11
    0399 0DE0      ADD	R30,R0
    039A 1DF1      ADC	R31,R1
    039B 82E0      STD	Z+0,R14
(0098)   		if(ReceiveLen == 0x04)
    039C 3064      CPI	R22,4
    039D E0E0      LDI	R30,0
    039E 077E      CPC	R23,R30
    039F F439      BNE	0x03A7
(0099)   			Len = Frame[ReceiveLen] + 0x02;
    03A0 01FB      MOVW	R30,R22
    03A1 0DE0      ADD	R30,R0
    03A2 1DF1      ADC	R31,R1
    03A3 8140      LDD	R20,Z+0
    03A4 2755      CLR	R21
    03A5 5F4E      SUBI	R20,0xFE
    03A6 4F5F      SBCI	R21,0xFF
(0100)   		ReceiveLen ++; 
    03A7 5F6F      SUBI	R22,0xFF
    03A8 4F7F      SBCI	R23,0xFF
(0101)   		TimerCount = 0;
    03A9 24AA      CLR	R10
    03AA 24BB      CLR	R11
    03AB 1764      CP	R22,R20
    03AC 0775      CPC	R23,R21
    03AD F314      BLT	0x0390
(0102)    }
(0103) 	return ReceiveLen;
    03AE 2F06      MOV	R16,R22
    03AF 940E040F  CALL	pop_gset5
    03B1 9624      ADIW	R28,4
    03B2 9508      RET
FILE: D:\MY_COMPUTER\d\avr16\atmegal16\init.c
(0001) 
(0002) 
(0003) #include <iom16v.h>
(0004) #include <macros.h>
(0005) #include	"Uart.h"
(0006) #include	"init.h"
(0007) //============================================================
(0008) //计算和设置16的特率参数 覃道堂 2007-01-16
(0009) #define   BAUD 		    9600
(0010) #define   CRYSTAL 	    4000000
(0011) #define   BAUD_SETTING 	(unsigned char)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
(0012) #define   BAUD_H 	    (unsigned char)(BAUD_SETTING>>8)
(0013) #define   BAUD_L 	    (unsigned char)BAUD_SETTING
(0014) 
(0015) /**************************************
(0016) **芯片类型:ATmega16
(0017) **时钟频率:8M
(0018) **硬件接口说明:
(0019) 	PD0:串口接收 主要用于232/485的接收
(0020) 	PD1:串口发送 主要用于232/485的发送
(0021) 	PD2:主要用于对超声波变送器的收到回波的检测(连到Pin5)
(0022) 	PD3:主要用于对超声波的开始检测的触发(连到Pin3)
(0023) 	PD4:主要用于485收发的使能
(0024) 	PD5:用于超声波范围控制引脚1(置为内部上拉)
(0025) 	PD6:用于超声波范围控制引脚2(置为内部上拉)
(0026) **************************************/
(0027) void port_init(void)    //ATMEGA16口的初始化
(0028) {
(0029)  PORTA = 0x20;
_port_init:
    03B3 E280      LDI	R24,0x20
    03B4 BB8B      OUT	0x1B,R24
(0030)  DDRA  |= 0x20;
    03B5 9AD5      SBI	0x1A,5
(0031)  PORTB = 0x00;
    03B6 2422      CLR	R2
    03B7 BA28      OUT	0x18,R2
(0032)  DDRB  = 0x00;
    03B8 BA27      OUT	0x17,R2
(0033)  PORTC = 0x00; 
    03B9 BA25      OUT	0x15,R2
(0034)  DDRC  = 0x00;
    03BA BA24      OUT	0x14,R2
(0035)  PORTD = 0x80;
    03BB E880      LDI	R24,0x80
    03BC BB82      OUT	0x12,R24
(0036)  DDRD  = 0x80;//口初始化,初始化PD.3口为输出
    03BD BB81      OUT	0x11,R24
(0037) }
    03BE 9508      RET
(0038) //============================================================
(0039) //函	数:void Init_Com(void)
(0040) //功	能:初始化串口设置
(0041) //入口参数:无 
(0042) //返 回 值:无  
(0043) //设 计 者:覃道堂 
(0044) //创作时间:2007-01-16
(0045) //修改时间:
(0046) //修改目的:
(0047) //============================================================
(0048) void uart0_init(void)
(0049) {
(0050)  UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
    03BF 2422      CLR	R2
    03C0 B82A      OUT	0x0A,R2
(0051)  UCSRA = 0x00;
    03C1 B82B      OUT	0x0B,R2
(0052)  UCSRC = BIT(URSEL) | 0x06;
    03C2 E886      LDI	R24,0x86
    03C3 BD80      OUT	0x20,R24
(0053)  UBRRL =BAUD_L;//设置波特率为9600
    03C4 E189      LDI	R24,0x19
    03C5 B989      OUT	0x09,R24
(0054)  UBRRH =BAUD_H;
    03C6 BC20      OUT	0x20,R2
(0055)  UCSRB = 0x18;
    03C7 E188      LDI	R24,0x18
    03C8 B98A      OUT	0x0A,R24
(0056) }
    03C9 9508      RET
(0057) /**************************************
(0058) **芯片类型:ATmega16
(0059) **时钟频率:8M
(0060) **硬件接口说明:无
(0061) **函数功能说明:对定时器0进行初始化,使定时器0的溢出频率为40HZ
(0062) **函数输入参数及说明:无
(0063) **函数返回值:无
(0064) **在本函数以外定义的变量:无
(0065) **调用的函数说明:无
(0066) **修改人:
(0067) **修改日期:
(0068) **修改说明:
(0069) **************************************/
(0070) void timer0_init(void)//定时器初始化
(0071) {
(0072)  TCCR0 = 0x00; //stop
_timer0_init:
    03CA 2422      CLR	R2
    03CB BE23      OUT	0x33,R2
(0073)  TCNT0 = 0x3D; //set count
    03CC E38D      LDI	R24,0x3D
    03CD BF82      OUT	0x32,R24
(0074)  OCR0  = 0xC3;  //set compare
    03CE EC83      LDI	R24,0xC3
    03CF BF8C      OUT	0x3C,R24
(0075) }
    03D0 9508      RET
(0076) /**************************************
(0077) **芯片类型:ATmega16
(0078) **时钟频率:4M
(0079) **硬件接口说明:无
(0080) **函数功能说明:对定时器1进行初始化,计数初值为0
(0081) **函数输入参数及说明:无
(0082) **函数返回值:无
(0083) **在本函数以外定义的变量:无
(0084) **调用的函数说明:无
(0085) **修改人:
(0086) **修改日期:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -