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

📄 atmegal16l.lst

📁 AVR16源代码 ICC编译器
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0045) //	形参:		void
(0046) //	返回:		void
(0047) //	编写:		2004/8/25
(0048) ===================================================================*/
(0049) void	delay_us(unsigned int time)
(0050) {     
(0051) 	do
(0052) 	{
(0053) 		time--;
_delay_us:
  time                 --> R16
    0200 5001      SUBI	R16,1
    0201 4010      SBCI	R17,0
(0054) 	}	
(0055) 	while (time>1);
    0202 E081      LDI	R24,1
    0203 E090      LDI	R25,0
    0204 1780      CP	R24,R16
    0205 0791      CPC	R25,R17
    0206 F3C8      BCS	0x0200
(0056) }
    0207 9508      RET
_ds1820_ack:
  ack                  --> R20
    0208 940E0412  CALL	push_gset1
(0057) 
(0058) /*===================================================================
(0059) //	函数功能:	判断总线应答
(0060) //	形参:		void
(0061) //	返回:		unsigned char	true为应答
(0062) //	编写:		2004/8/25
(0063) ===================================================================*/
(0064) unsigned char ds1820_ack(void)
(0065) {
(0066) 	unsigned char ack;
(0067) 	DDRD |= DQ;
    020A 9A8E      SBI	0x11,6
(0068) 	PORTD &= ~DQ;
    020B B382      IN	R24,0x12
    020C 7880      ANDI	R24,0x80
    020D BB82      OUT	0x12,R24
(0069) 	delay_us(300);		//480US以上					//	reset
    020E E20C      LDI	R16,0x2C
    020F E011      LDI	R17,1
    0210 DFEF      RCALL	_delay_us
(0070) 	PORTD |= DQ;
    0211 9A96      SBI	0x12,6
(0071) 	DDRD &= ~DQ;
    0212 B381      IN	R24,0x11
    0213 7880      ANDI	R24,0x80
    0214 BB81      OUT	0x11,R24
(0072) 	delay_us(25);
    0215 E109      LDI	R16,0x19
    0216 E010      LDI	R17,0
    0217 DFE8      RCALL	_delay_us
(0073) 	ack = DQ & PIND;
    0218 B340      IN	R20,0x10
    0219 7440      ANDI	R20,0x40
(0074) 	delay_us(300);							//	host receive
    021A E20C      LDI	R16,0x2C
    021B E011      LDI	R17,1
    021C DFE3      RCALL	_delay_us
(0075) 	if(ack)
    021D 2344      TST	R20
    021E F011      BEQ	0x0221
(0076) 		return false;
    021F E001      LDI	R16,1
    0220 C001      RJMP	0x0222
(0077) 	else
(0078) 		return true;
    0221 2700      CLR	R16
    0222 940E0415  CALL	pop_gset1
    0224 9508      RET
_read_byte:
  value                --> R20
  i                    --> R22
    0225 940E0429  CALL	push_gset2
(0079) }
(0080) 
(0081) /*===================================================================
(0082) //	函数功能:	从 1-wire 总线上读取一个字节
(0083) //	形参:		void
(0084) //	返回:		unsigned char	读到的值
(0085) //	编写:		2004/8/25
(0086) ===================================================================*/
(0087) unsigned char	read_byte(void)
(0088) {
(0089) 	unsigned char	i;
(0090) 	unsigned char	value = 0;
    0227 2744      CLR	R20
(0091) 	for(i = 8; i > 0; i--)
    0228 E068      LDI	R22,0x8
    0229 C01A      RJMP	0x0244
(0092) 	{
(0093) 		value >>= 1;						//	low bit first
    022A 9546      LSR	R20
(0094) 		DDRD |= DQ;
    022B 9A8E      SBI	0x11,6
(0095) 		PORTD &= ~DQ;						//	pull DQ low to start timeslot
    022C B382      IN	R24,0x12
    022D 7880      ANDI	R24,0x80
    022E BB82      OUT	0x12,R24
(0096) 		delay_us(2);
    022F E002      LDI	R16,2
    0230 E010      LDI	R17,0
    0231 DFCE      RCALL	_delay_us
(0097) 		PORTD|= DQ;
    0232 9A96      SBI	0x12,6
(0098) 		DDRD &= ~DQ;						//	release bus
    0233 B381      IN	R24,0x11
    0234 7880      ANDI	R24,0x80
    0235 BB81      OUT	0x11,R24
(0099) 		delay_us(5);
    0236 E005      LDI	R16,5
    0237 E010      LDI	R17,0
    0238 DFC7      RCALL	_delay_us
(0100) 		if(DQ & PIND)
    0239 9B86      SBIS	0x10,6
    023A C001      RJMP	0x023C
(0101) 			value|=0x80;
    023B 6840      ORI	R20,0x80
(0102) 		delay_us(100);
    023C E604      LDI	R16,0x64
    023D E010      LDI	R17,0
    023E DFC1      RCALL	_delay_us
(0103) 		DDRD |= DQ;
    023F 9A8E      SBI	0x11,6
(0104) 		delay_us(3);						//	time interval
    0240 E003      LDI	R16,3
    0241 E010      LDI	R17,0
    0242 DFBD      RCALL	_delay_us
    0243 956A      DEC	R22
    0244 2422      CLR	R2
    0245 1626      CP	R2,R22
    0246 F318      BCS	0x022A
(0105) 	}
(0106) 	return(value);
    0247 2F04      MOV	R16,R20
    0248 940E0406  CALL	pop_gset2
    024A 9508      RET
_write_byte:
  i                    --> R20
  value                --> R22
    024B 940E0429  CALL	push_gset2
    024D 2F60      MOV	R22,R16
(0107) }
(0108) 
(0109) 
(0110) 
(0111) /*===================================================================
(0112) //	函数功能:	向 1-WIRE 总线上写一个字节
(0113) //	形参:		value		写到总线上的值
(0114) //	返回:		void
(0115) //	编写:		2004/8/25
(0116) ===================================================================*/
(0117) void	write_byte(unsigned char value)
(0118) {
(0119) 	unsigned char	i;
(0120) 	DDRD|= DQ;
    024E 9A8E      SBI	0x11,6
(0121) 	for(i = 8; i > 0; i--)
    024F E048      LDI	R20,0x8
    0250 C019      RJMP	0x026A
(0122) 	{
(0123) 		if(value & 0x01)
    0251 FF60      SBRS	R22,0
    0252 C00B      RJMP	0x025E
(0124) 		{
(0125) 			PORTD &= ~DQ;					//	pull DQ low to start timeslot
    0253 B382      IN	R24,0x12
    0254 7880      ANDI	R24,0x80
    0255 BB82      OUT	0x12,R24
(0126) 			delay_us(5);
    0256 E005      LDI	R16,5
    0257 E010      LDI	R17,0
    0258 DFA7      RCALL	_delay_us
(0127) 			PORTD |= DQ;
    0259 9A96      SBI	0x12,6
(0128) 			delay_us(50);
    025A E302      LDI	R16,0x32
    025B E010      LDI	R17,0
    025C DFA3      RCALL	_delay_us
(0129) 		}
    025D C00A      RJMP	0x0268
(0130) 		else
(0131) 		{
(0132) 			PORTD&= ~DQ;					//	pull DQ low to start timeslot
    025E B382      IN	R24,0x12
    025F 7880      ANDI	R24,0x80
    0260 BB82      OUT	0x12,R24
(0133) 			delay_us(50);
    0261 E302      LDI	R16,0x32
    0262 E010      LDI	R17,0
    0263 DF9C      RCALL	_delay_us
(0134) 			PORTD|= DQ;
    0264 9A96      SBI	0x12,6
(0135) 			delay_us(5);
    0265 E005      LDI	R16,5
    0266 E010      LDI	R17,0
    0267 DF98      RCALL	_delay_us
(0136) 		}
(0137) 		value >>= 1;
    0268 9566      LSR	R22
    0269 954A      DEC	R20
    026A 2422      CLR	R2
    026B 1624      CP	R2,R20
    026C F320      BCS	0x0251
(0138) 	}
(0139) }
    026D 940E0406  CALL	pop_gset2
    026F 9508      RET
_Read_Temperature:
  t                    --> R20
  temporary            --> Y+0
  i                    --> R20
    0270 940E0412  CALL	push_gset1
    0272 9729      SBIW	R28,0x9
(0140) 
(0141) 
(0142) /*===================================================================
(0143) //	函数功能:	读取温度
(0144) //	形参:		*temperature	温度存储空间
(0145) //	返回:		unsigned char	true为有效
(0146) //	编写:		2004/8/25
(0147) ===================================================================*/
(0148) unsigned char	Read_Temperature(void)
(0149) {
(0150) 	unsigned char	i;
(0151) 	unsigned int t;
(0152) 	unsigned char	temporary[9]; 
(0153) 	 
(0154) 	ds1820_ack();
    0273 DF94      RCALL	_ds1820_ack
(0155) 	write_byte(0xCC);						//	Skip ROM
    0274 EC0C      LDI	R16,0xCC
    0275 DFD5      RCALL	_write_byte
(0156) 	write_byte(0x44);						//	Start Conversion
    0276 E404      LDI	R16,0x44
    0277 DFD3      RCALL	_write_byte
(0157) 	for(i = 0; i < 5; i++)
    0278 2744      CLR	R20
    0279 C004      RJMP	0x027E
(0158) 		delay_us(50000);
    027A E500      LDI	R16,0x50
    027B EC13      LDI	R17,0xC3
    027C DF83      RCALL	_delay_us
    027D 9543      INC	R20
    027E 3045      CPI	R20,5
    027F F3D0      BCS	0x027A
(0159) 	ds1820_ack();
    0280 DF87      RCALL	_ds1820_ack
(0160) 	write_byte(0xCC);						//	Skip ROM
    0281 EC0C      LDI	R16,0xCC
    0282 DFC8      RCALL	_write_byte
(0161) 	write_byte(0xBE);						//	Read Scratch Pad
    0283 EB0E      LDI	R16,0xBE
    0284 DFC6      RCALL	_write_byte
(0162) 	for(i = 0; i < 9; i++)
    0285 2744      CLR	R20
    0286 C008      RJMP	0x028F
(0163) 		temporary[i] = read_byte();	
    0287 DF9D      RCALL	_read_byte
    0288 01CE      MOVW	R24,R28
    0289 2FE4      MOV	R30,R20
    028A 27FF      CLR	R31
    028B 0FE8      ADD	R30,R24
    028C 1FF9      ADC	R31,R25
    028D 8300      STD	Z+0,R16
    028E 9543      INC	R20
    028F 3049      CPI	R20,0x9
    0290 F3B0      BCS	0x0287
(0164) 	if(crccheck(temporary,9))
    0291 E029      LDI	R18,0x9
    0292 018E      MOVW	R16,R28
    0293 DF3D      RCALL	_crccheck
    0294 2300      TST	R16
    0295 F011      BEQ	0x0298
(0165) 		return	false;
    0296 E001      LDI	R16,1
    0297 C075      RJMP	0x030D
(0166) 	else
(0167) 	{	
(0168) 	    t=temporary[0]+temporary[1]*256;
    0298 8129      LDD	R18,Y+1
    0299 2733      CLR	R19
    029A E000      LDI	R16,0
    029B E011      LDI	R17,1
    029C 940E03F6  CALL	empy16s
    029E 8148      LDD	R20,Y+0
    029F 2755      CLR	R21
    02A0 0F40      ADD	R20,R16
    02A1 1F51      ADC	R21,R17
(0169) 	    if(temporary[1]>0xf)
    02A2 E08F      LDI	R24,0xF
    02A3 8029      LDD	R2,Y+1
    02A4 1582      CP	R24,R2
    02A5 F5B0      BCC	0x02DC
(0170) 	       temperature=(~t+1)*0.0625;
    02A6 01CA      MOVW	R24,R20
    02A7 9580      COM	R24
    02A8 9590      COM	R25
    02A9 9601      ADIW	R24,1
    02AA 011C      MOVW	R2,R24
    02AB E508      LDI	R16,0x58
    02AC E010      LDI	R17,0
    02AD 940E0442  CALL	lpm32
    02AF 933A      ST	R19,-Y
    02B0 932A      ST	R18,-Y
    02B1 931A      ST	R17,-Y
    02B2 930A      ST	R16,-Y
    02B3 E504      LDI	R16,0x54
    02B4 E010      LDI	R17,0
    02B5 940E0442  CALL	lpm32
    02B7 933A      ST	R19,-Y
    02B8 932A      ST	R18,-Y
    02B9 931A      ST	R17,-Y
    02BA 930A      ST	R16,-Y
    02BB 0181      MOVW	R16,R2
    02BC 9516      LSR	R17
    02BD 9507      ROR	R16
    02BE 940E0456  CALL	int2fp
    02C0 933A      ST	R19,-Y
    02C1 932A      ST	R18,-Y
    02C2 931A      ST	R17,-Y
    02C3 930A      ST	R16,-Y
    02C4 940E051D  CALL	empy32fs
    02C6 0181      MOVW	R16,R2
    02C7 7001      ANDI	R16,1
    02C8 7010      ANDI	R17,0
    02C9 940E0456  CALL	int2fp
    02CB 933A      ST	R19,-Y
    02CC 932A      ST	R18,-Y
    02CD 931A      ST	R17,-Y
    02CE 930A      ST	R16,-Y
    02CF 940E04B0  CALL	add32fs
    02D1 940E0520  CALL	empy32f
    02D3 93100235  STS	_temperature+1,R17
    02D5 93000234  STS	_temperature,R16
    02D7 93300237  STS	_temperature+3,R19
    02D9 93200236  STS	_temperature+2,R18
    02DB C030      RJMP	0x030C
(0171) 		else
(0172) 		   {
(0173) 		   temperature=t*0.0625;
    02DC E508      LDI	R16,0x58
    02DD E010      LDI	R17,0
    02DE 940E0442  CALL	lpm32
    02E0 933A      ST	R19,-Y
    02E1 932A      ST	R18,-Y
    02E2 931A      ST	R17,-Y
    02E3 930A      ST	R16,-Y
    02E4 E504      LDI	R16,0x54
    02E5 E010      LDI	R17,0
    02E6 940E0442  CALL	lpm32
    02E8 933A      ST	R19,-Y
    02E9 932A      ST	R18,-Y
    02EA 931A      ST	R17,-Y
    02EB 930A      ST	R16,-Y
    02EC 018A      MOVW	R16,R20
    02ED 9516      LSR	R17
    02EE 9507      ROR	R16
    02EF 940E0456  CALL	int2fp
    02F1 933A      ST	R19,-Y
    02F2 932A      ST	R18,-Y
    02F3 931A      ST	R17,-Y
    02F4 930A      ST	R16,-Y
    02F5 940E051D  CALL	empy32fs
    02F7 018A      MOVW	R16,R20
    02F8 7001      ANDI	R16,1
    02F9 7010      ANDI	R17,0
    02FA 940E0456  CALL	int2fp
    02FC 933A      ST	R19,-Y
    02FD 932A      ST	R18,-Y
    02FE 931A      ST	R17,-Y
    02FF 930A      ST	R16,-Y
    0300 940E04B0  CALL	add32fs
    0302 940E0520  CALL	empy32f
    0304 93100235  STS	_temperature+1,R17
    0306 93000234  STS	_temperature,R16
    0308 93300237  STS	_temperature+3,R19
    030A 93200236  STS	_temperature+2,R18
(0174) 		   }
(0175) 		
(0176) 		return	true; 
    030C 2700      CLR	R16
    030D 9629      ADIW	R28,0x9
    030E 940E0415  CALL	pop_gset1
    0310 9508      RET
_Read_RomCode:
  temp                 --> R20
    0311 940E0412  CALL	push_gset1
    0313 01A8      MOVW	R20,R16
(0177) 	}
(0178) }
(0179) 
(0180) /*===================================================================
(0181) //	函数功能:	读取Rom Code
(0182) //	形参:		*temp		DS18B20的Rom Code存储空间
(0183) //	返回:		unsigned char	true为有效
(0184) //	编写:		2004/8/25
(0185) ===================================================================*/
(0186) unsigned char	Read_RomCode(unsigned char *temp)
(0187) {
(0188) 	ds1820_ack();
    0314 DEF3      RCALL	_ds1820_ack
(0189) 	write_byte(0x33);
    0315 E303      LDI	R16,0x33
    0316 DF34      RCALL	_write_byte
(0190) 	temp[0] = read_byte();
    0317 DF0D      RCALL	_read_byte
    0318 01FA      MOVW	R30,R20
    0319 8300      STD	Z+0,R16
(0191) 	temp[1] = read_byte();

⌨️ 快捷键说明

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