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

📄 ds1302_18b20_1602.lst

📁 这是一个用温度计和时钟程序,芯片是ATmega16,电路稳定,绝对好用而且易懂
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0027) 		LCD_write_byte(0,temp_h+48);
     164 2D2A      MOV	R18,R10
     165 5D20      SUBI	R18,0xD0
     166 2700      CLR	R16
     167 DF58      RCALL	_LCD_write_byte
(0028) 		LCD_write_byte(0,temp_l+48);
     168 2F26      MOV	R18,R22
     169 5D20      SUBI	R18,0xD0
     16A 2700      CLR	R16
     16B DF54      RCALL	_LCD_write_byte
(0029) 		switch(temp_decimal)
     16C 2755      CLR	R21
     16D 3040      CPI	R20,0
     16E E0E0      LDI	R30,0
     16F 075E      CPC	R21,R30
     170 F40C      BGE	0x0172
     171 C090      RJMP	0x0202
     172 E08F      LDI	R24,0xF
     173 E090      LDI	R25,0
     174 1784      CP	R24,R20
     175 0795      CPC	R25,R21
     176 F40C      BGE	0x0178
     177 C08A      RJMP	0x0202
     178 E584      LDI	R24,0x54
     179 E090      LDI	R25,0
     17A 01FA      MOVW	R30,R20
     17B 0FEE      LSL	R30
     17C 1FFF      ROL	R31
     17D 0FE8      ADD	R30,R24
     17E 1FF9      ADC	R31,R25
     17F 9025      LPM	R2,Z+
     180 9034      LPM	R3,0(Z)
     181 01F1      MOVW	R30,R2
     182 9409      IJMP
(0030) 		{
(0031) 		 	case 0  : LCD_write_string(12,2,".00");break;
     183 EC86      LDI	R24,0xC6
     184 E090      LDI	R25,0
     185 8399      STD	Y+1,R25
     186 8388      STD	Y+0,R24
     187 E022      LDI	R18,2
     188 E00C      LDI	R16,0xC
     189 DF6C      RCALL	_LCD_write_string
     18A C077      RJMP	0x0202
(0032) 			case 1  : LCD_write_string(12,2,".06");break;
     18B EC82      LDI	R24,0xC2
     18C E090      LDI	R25,0
     18D 8399      STD	Y+1,R25
     18E 8388      STD	Y+0,R24
     18F E022      LDI	R18,2
     190 E00C      LDI	R16,0xC
     191 DF64      RCALL	_LCD_write_string
     192 C06F      RJMP	0x0202
(0033) 			case 2  : LCD_write_string(12,2,".12");break;
     193 EB8E      LDI	R24,0xBE
     194 E090      LDI	R25,0
     195 8399      STD	Y+1,R25
     196 8388      STD	Y+0,R24
     197 E022      LDI	R18,2
     198 E00C      LDI	R16,0xC
     199 DF5C      RCALL	_LCD_write_string
     19A C067      RJMP	0x0202
(0034) 			case 3  : LCD_write_string(12,2,".18");break;
     19B EB8A      LDI	R24,0xBA
     19C E090      LDI	R25,0
     19D 8399      STD	Y+1,R25
     19E 8388      STD	Y+0,R24
     19F E022      LDI	R18,2
     1A0 E00C      LDI	R16,0xC
     1A1 DF54      RCALL	_LCD_write_string
     1A2 C05F      RJMP	0x0202
(0035) 			case 4  : LCD_write_string(12,2,".25");break;
     1A3 EB86      LDI	R24,0xB6
     1A4 E090      LDI	R25,0
     1A5 8399      STD	Y+1,R25
     1A6 8388      STD	Y+0,R24
     1A7 E022      LDI	R18,2
     1A8 E00C      LDI	R16,0xC
     1A9 DF4C      RCALL	_LCD_write_string
     1AA C057      RJMP	0x0202
(0036) 			case 5  : LCD_write_string(12,2,".31");break;
     1AB EB82      LDI	R24,0xB2
     1AC E090      LDI	R25,0
     1AD 8399      STD	Y+1,R25
     1AE 8388      STD	Y+0,R24
     1AF E022      LDI	R18,2
     1B0 E00C      LDI	R16,0xC
     1B1 DF44      RCALL	_LCD_write_string
     1B2 C04F      RJMP	0x0202
(0037) 			case 6  : LCD_write_string(12,2,".37");break;
     1B3 EA8E      LDI	R24,0xAE
     1B4 E090      LDI	R25,0
     1B5 8399      STD	Y+1,R25
     1B6 8388      STD	Y+0,R24
     1B7 E022      LDI	R18,2
     1B8 E00C      LDI	R16,0xC
     1B9 DF3C      RCALL	_LCD_write_string
     1BA C047      RJMP	0x0202
(0038) 			case 7  : LCD_write_string(12,2,".43");break;
     1BB EA8A      LDI	R24,0xAA
     1BC E090      LDI	R25,0
     1BD 8399      STD	Y+1,R25
     1BE 8388      STD	Y+0,R24
     1BF E022      LDI	R18,2
     1C0 E00C      LDI	R16,0xC
     1C1 DF34      RCALL	_LCD_write_string
     1C2 C03F      RJMP	0x0202
(0039) 			case 8  : LCD_write_string(12,2,".50");break;
     1C3 EA86      LDI	R24,0xA6
     1C4 E090      LDI	R25,0
     1C5 8399      STD	Y+1,R25
     1C6 8388      STD	Y+0,R24
     1C7 E022      LDI	R18,2
     1C8 E00C      LDI	R16,0xC
     1C9 DF2C      RCALL	_LCD_write_string
     1CA C037      RJMP	0x0202
(0040) 			case 9  : LCD_write_string(12,2,".56");break;
     1CB EA82      LDI	R24,0xA2
     1CC E090      LDI	R25,0
     1CD 8399      STD	Y+1,R25
     1CE 8388      STD	Y+0,R24
     1CF E022      LDI	R18,2
     1D0 E00C      LDI	R16,0xC
     1D1 DF24      RCALL	_LCD_write_string
     1D2 C02F      RJMP	0x0202
(0041) 			case 10 : LCD_write_string(12,2,".61");break;
     1D3 E98E      LDI	R24,0x9E
     1D4 E090      LDI	R25,0
     1D5 8399      STD	Y+1,R25
     1D6 8388      STD	Y+0,R24
     1D7 E022      LDI	R18,2
     1D8 E00C      LDI	R16,0xC
     1D9 DF1C      RCALL	_LCD_write_string
     1DA C027      RJMP	0x0202
(0042) 			case 11 : LCD_write_string(12,2,".68");break;
     1DB E98A      LDI	R24,0x9A
     1DC E090      LDI	R25,0
     1DD 8399      STD	Y+1,R25
     1DE 8388      STD	Y+0,R24
     1DF E022      LDI	R18,2
     1E0 E00C      LDI	R16,0xC
     1E1 DF14      RCALL	_LCD_write_string
     1E2 C01F      RJMP	0x0202
(0043) 			case 12 : LCD_write_string(12,2,".75");break;
     1E3 E986      LDI	R24,0x96
     1E4 E090      LDI	R25,0
     1E5 8399      STD	Y+1,R25
     1E6 8388      STD	Y+0,R24
     1E7 E022      LDI	R18,2
     1E8 E00C      LDI	R16,0xC
     1E9 DF0C      RCALL	_LCD_write_string
     1EA C017      RJMP	0x0202
(0044) 			case 13 : LCD_write_string(12,2,".81");break;
     1EB E982      LDI	R24,0x92
     1EC E090      LDI	R25,0
     1ED 8399      STD	Y+1,R25
     1EE 8388      STD	Y+0,R24
     1EF E022      LDI	R18,2
     1F0 E00C      LDI	R16,0xC
     1F1 DF04      RCALL	_LCD_write_string
     1F2 C00F      RJMP	0x0202
(0045) 			case 14 : LCD_write_string(12,2,".87");break;
     1F3 E88E      LDI	R24,0x8E
     1F4 E090      LDI	R25,0
     1F5 8399      STD	Y+1,R25
     1F6 8388      STD	Y+0,R24
     1F7 E022      LDI	R18,2
     1F8 E00C      LDI	R16,0xC
     1F9 DEFC      RCALL	_LCD_write_string
     1FA C007      RJMP	0x0202
(0046) 			case 15 : LCD_write_string(12,2,".93");break;		
     1FB E88A      LDI	R24,0x8A
     1FC E090      LDI	R25,0
     1FD 8399      STD	Y+1,R25
     1FE 8388      STD	Y+0,R24
     1FF E022      LDI	R18,2
     200 E00C      LDI	R16,0xC
     201 DEF4      RCALL	_LCD_write_string
     202 9622      ADIW	R28,2
     203 940C 048A JMP	pop_xgsetF03C
_Temperature:
  tl_l                 --> R14
  th_h                 --> R20
  temp_negative        --> R20
  Tl                   --> R10
  Th                   --> R12
     205 940E 0452 CALL	push_xgset30FC
     207 2EA2      MOV	R10,R18
     208 2EC0      MOV	R12,R16
(0047) 		}
(0048) }
(0049) /************************************************
(0050) ************************************************/
(0051) void Temperature(uint8_t Th,uint8_t Tl)
(0052) { 
(0053) 	uint16_t temp_negative,th_h,tl_l;
(0054) 	if((Th&0x80)==0)//温度为正
     209 FCC7      SBRC	R12,7
     20A C00A      RJMP	0x0215
(0055) 	{
(0056) 	 	LCD_set_xy(9,2);
     20B E022      LDI	R18,2
     20C E009      LDI	R16,0x9
     20D DED8      RCALL	_LCD_set_xy
(0057) 		Positive();
     20E E22B      LDI	R18,0x2B
     20F 2700      CLR	R16
     210 DEAF      RCALL	_LCD_write_byte
(0058) 		Temp_display(Tl,Th);
     211 2D2C      MOV	R18,R12
     212 2D0A      MOV	R16,R10
     213 DF37      RCALL	_Temp_display
(0059) 	}
     214 C019      RJMP	0x022E
(0060) 	else			//温度为负
(0061) 	{
(0062) 	 	LCD_set_xy(9,2);
     215 E022      LDI	R18,2
     216 E009      LDI	R16,0x9
     217 DECE      RCALL	_LCD_set_xy
(0063) 		Negative();
     218 E22D      LDI	R18,0x2D
     219 2700      CLR	R16
     21A DEA5      RCALL	_LCD_write_byte
(0064) 		th_h=(uint16_t)Th;
     21B 2D4C      MOV	R20,R12
     21C 2755      CLR	R21
(0065) 		tl_l=(uint16_t)Tl;
     21D 2CEA      MOV	R14,R10
     21E 24FF      CLR	R15
(0066) 		th_h<<=8;
     21F 2F54      MOV	R21,R20
     220 2744      CLR	R20
(0067) 		temp_negative=(th_h|tl_l);
     221 294E      OR	R20,R14
     222 295F      OR	R21,R15
(0068) 		temp_negative=~temp_negative+1;
     223 9540      COM	R20
     224 9550      COM	R21
     225 5F4F      SUBI	R20,0xFF
     226 4F5F      SBCI	R21,0xFF
(0069) 		Tl=(uint8_t)temp_negative;
     227 2EA4      MOV	R10,R20
(0070) 		temp_negative>>=8;
     228 2F45      MOV	R20,R21
     229 2755      CLR	R21
(0071) 		Th=(uint8_t)temp_negative;	
     22A 2EC4      MOV	R12,R20
(0072) 		Temp_display(Tl,Th);
     22B 2D2C      MOV	R18,R12
     22C 2D0A      MOV	R16,R10
     22D DF1D      RCALL	_Temp_display
(0073) 	}
     22E 940C 043C JMP	pop_xgset30FC
(0074) }
(0075) /*************************************************
(0076) 函 数 名:Delay_us
(0077) 功    能:软件延时1.1us
(0078) 入口参数:us 延时时间
(0079) 出口参数:无
(0080) 修改时间:2007.02.16
(0081) *************************************************/
(0082) void Delay_us(uint16_t us) 
(0083) {    
_Delay_us:
  us                   --> R16
     230 C002      RJMP	0x0233
(0084)      while(us>1)
(0085) 	 { 
(0086)        us--;
     231 5001      SUBI	R16,1
     232 4010      SBCI	R17,0
     233 E081      LDI	R24,1
     234 E090      LDI	R25,0
     235 1780      CP	R24,R16
     236 0791      CPC	R25,R17
     237 F3C8      BCS	0x0231
     238 9508      RET
_Init_18b20:
  exist                --> R20
     239 934A      ST	R20,-Y
(0087) 	 }  
(0088) } 
(0089) /*************************************************
(0090) 函 数 名:Reset_18b20
(0091) 功    能:复位DS18B20
(0092) 入口参数:无
(0093) 出口参数:exist : exist=1,存在;exist=0,不存在
(0094) 修改日期:2007.02.16
(0095) *************************************************/
(0096) uint8_t Init_18b20(void)
(0097) {
(0098)  	uint8_t exist=1;    	  
     23A E041      LDI	R20,1
(0099) 	Set_low();			  //设置成输出模式
     23B 9A8F      SBI	0x11,7
     23C 9897      CBI	0x12,7
(0100) 	Delay_us(600);		  //复位低电平480us~960us
     23D E508      LDI	R16,0x58
     23E E012      LDI	R17,2
     23F DFF0      RCALL	_Delay_us
(0101) 	Set_high();			  //拉高电平
     240 9A8F      SBI	0x11,7
     241 9A97      SBI	0x12,7
(0102) 	Read();				  //设置成输入模式
     242 988F      CBI	0x11,7
(0103) 	Delay_us(100);		  //延时100us
     243 E604      LDI	R16,0x64
     244 E010      LDI	R17,0
     245 DFEA      RCALL	_Delay_us
(0104) 	exist=~(DS18B20_PIN&DS18B20_IO);	  //读端口电平
     246 B340      IN	R20,0x10
     247 7840      ANDI	R20,0x80
     248 9540      COM	R20
(0105) 	Delay_us(480);		  //延时480us
     249 EE00      LDI	R16,0xE0
     24A E011      LDI	R17,1
     24B DFE4      RCALL	_Delay_us
(0106) 	DDRA|=0X10;	  		  //设置成输出模式
     24C 9AD4      SBI	0x1A,4
(0107) 	return (exist);		  //返回exist的值	
     24D 2F04      MOV	R16,R20
     24E 9149      LD	R20,Y+
     24F 9508      RET
_Read_1_byte:
  r_data               --> R10
  temp                 --> R22
  i                    --> R20
     250 940E 0465 CALL	push_xgsetF00C
(0108) }
(0109) /*************************************************
(0110) 函 数 名:Read_1_byte
(0111) 功    能:从DS18B20读取一个字节的数据
(0112) 入口参数:无
(0113) 出口参数:r_data
(0114) 修改日期:2007.02.16
(0115) *************************************************/
(0116) uint8_t Read_1_byte(void)
(0117) {
(0118)  	uint8_t i,r_data=0x00,temp;
     252 24AA      CLR	R10
(0119) 	for(i=0;i<8;i++)
     253 2744      CLR	R20
     254 C01F      RJMP	0x0274
(0120) 	{
(0121) 	 	Set_low();
     255 9A8F      SBI	0x11,7
     256 9897      CBI	0x12,7
(0122) 		Delay_us(3);
     257 E003      LDI	R16,3
     258 E010      LDI	R17,0
     259 DFD6      RCALL	_Delay_us
(0123) 		Read();
     25A 988F      CBI	0x11,7
(0124) 		Delay_us(8);
     25B E008      LDI	R16,0x8
     25C E010      LDI	R17,0
     25D DFD2      RCALL	_Delay_us
(0125) 		temp=(DS18B20_PIN&DS18B20_IO);
     25E B360      IN	R22,0x10
     25F 7860      ANDI	R22,0x80
(0126) 		if(temp)
     260 F031      BEQ	0x0267
(0127) 		{
(0128) 			r_data|=(1<<i);
     261 E001      LDI	R16,1
     262 2F14      MOV	R17,R20
     263 940E 0493 CALL	lsl8
     265 2AA0      OR	R10,R16
(0129) 		}
     266 C007      RJMP	0x026E
(0130) 		else
(0131) 		{
(0132) 			r_data&=~(1<<i);
     267 E001      LDI	R16,1
     268 2F14      MOV	R17,R20
     269 940E 0493 CALL	lsl8
     26B 2E20      MOV	R2,R16
     26C 9420      COM	R2
     26D 20A2      AND	R10,R2
(0133) 		}	
(0134) 		Delay_us(50);
     26E E302      LDI	R16,0x32
     26F E010      LDI	R17,0
     270 DFBF      RCALL	_Delay_us
(0135) 		Set_high();	
     271 9A8F      SBI	0x11,7
     272 9A97      SBI	0x12,7
     273 9543      INC	R20
     274 3048      CPI	R20,0x8
     275 F2F8      BCS	0x0255
(0136) 	}
(0137) 	return (r_data);
     276 2D0A      MOV	R16,R10
     277 940C 046C JMP	pop_xgsetF00C
_Write_1_byte:
  temp                 --> R22
  i                    --> R20
  cmd                  --> R10
     279 940E 0465 CALL	push_xgsetF00C
     27B 2EA0      MOV	R10,R16
(0138) }
(0139) /*************************************************
(0140) 函 数 名:Write_1_byte
(0141) 功    能:写一个字节到DS18B20
(0142) 入口参数:cmd
(0143) 出口参数:无
(0144) 修改日期:2007.02.16
(0145) *************************************************/
(0146) void Write_1_byte(uint8_t cmd)
(0147) {
(0148)  	 uint8_t i,temp;
(0149) 	 for(i=0;i<8;i++)
     27C 2744      CLR	R20
     27D C00B      RJMP	0x0289
(0150) 	 {
(0151) 	  	temp=(cmd>>i);
     27E 2D0A      MOV	R16,R10
     27F 2F14      MOV	R17,R20
     280 940E 0499 CALL	lsr8
     282 2F60      MOV	R22,R16
(0152) 		temp&=0x01;
     283 7061      ANDI	R22,1
(0153) 		if(temp)
     284 F011      BEQ	0x0287
(0154) 		{
(0155) 		 	Write_1();
     285 D007      RCALL	_Write_1
(0156) 		}
     286 C001      RJMP	0x0288
(0157) 		else
(0158) 		{
(0159) 		 	Write_0();
     287 D010      RCALL	_Write_0
     288 9543      INC	R20
     289 3048      CPI	R20,0x8
     28A F398      BCS	0x027E
     28B 940C 046C JMP	pop_xgsetF00C
(0160) 		}
(0161) 	 }   	  

⌨️ 快捷键说明

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