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

📄 18b20_1602.lst

📁 非常经典的基于AVR m16的DS18B20 C 程序 !1
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0100) 		if(temp)
    00E9 F011      BEQ	0x00EC
(0101) 		RLS_DS18B20;		//释放总线
    00EA 988D      CBI	0x11,5
    00EB C001      RJMP	0x00ED
(0102) 		else
(0103) 		CLR_DS18B20;		//强制拉低
    00EC 9895      CBI	0x12,5
(0104) 		delay_us(16);	 	//14.92us
    00ED E100      LDI	R16,0x10
    00EE E010      LDI	R17,0
    00EF 940E004B  CALL	_delay_us
(0105) 		delay_us(35);	 	//30.38us
    00F1 E203      LDI	R16,0x23
    00F2 E010      LDI	R17,0
    00F3 940E004B  CALL	_delay_us
(0106) 		RLS_DS18B20;		//释放总线
    00F5 988D      CBI	0x11,5
(0107) 		delay_us(2);	 	//2.71us(大于1us就行了)
    00F6 E002      LDI	R16,2
    00F7 E010      LDI	R17,0
    00F8 940E004B  CALL	_delay_us
    00FA 9563      INC	R22
    00FB 3068      CPI	R22,0x8
    00FC F300      BCS	0x00DD
    00FD 940E029E  CALL	pop_gset3
    00FF 9508      RET
_read_Temp:
  x                    --> R20
  tempH                --> R20
  tempL                --> R22
    0100 940E02A7  CALL	push_gset2
(0108) 	    }
(0109)     }
(0110) 
(0111) /****************************************
(0112) * 函数名称: uint read_Temp(void)	    *
(0113) * 函数功能:读DS18B20温度				*
(0114) * 入    口:无							*
(0115) * 返    回:读出的数据字节				*
(0116) ****************************************/
(0117) uint read_Temp(void)
(0118) 	{
(0119) 	uchar tempL,tempH;
(0120) 	uint x;
(0121) 	rst_DS18B20();
    0102 DF72      RCALL	_rst_DS18B20
(0122) 	write_DS18B20(0xcc); 	    //跳过ROM
    0103 EC0C      LDI	R16,0xCC
    0104 DFD2      RCALL	_write_DS18B20
(0123) 	write_DS18B20(0x44);		//启动温度转换
    0105 E404      LDI	R16,0x44
    0106 DFD0      RCALL	_write_DS18B20
(0124) 	delay_us(1);
    0107 E001      LDI	R16,1
    0108 E010      LDI	R17,0
    0109 940E004B  CALL	_delay_us
(0125) 	rst_DS18B20();
    010B DF69      RCALL	_rst_DS18B20
(0126) 	write_DS18B20(0xcc);		//跳过ROM
    010C EC0C      LDI	R16,0xCC
    010D DFC9      RCALL	_write_DS18B20
(0127) 	write_DS18B20(0xbe);		//读数据
    010E EB0E      LDI	R16,0xBE
    010F DFC7      RCALL	_write_DS18B20
(0128) 	tempL=read_DS18B20();
    0110 DF98      RCALL	_read_DS18B20
    0111 2F60      MOV	R22,R16
(0129) 	tempH=read_DS18B20();
    0112 DF96      RCALL	_read_DS18B20
    0113 2F40      MOV	R20,R16
(0130) 	x=(tempH<<8)|tempL;
    0114 2F54      MOV	R21,R20
    0115 2F46      MOV	R20,R22
(0131) 	return(x);
    0116 018A      MOVW	R16,R20
    0117 940E029B  CALL	pop_gset2
    0119 9508      RET
_lcd_da:
  a                    --> R20
  data                 --> R22
    011A 940E02A7  CALL	push_gset2
    011C 2F60      MOV	R22,R16
FILE: E:\DS18B20\lcd1602_4h.h
(0001) /*******************************************
(0002) *    机柜控制器22版LCD1602联接库函数	   *
(0003) *    LCD1602操作库函数,4位数据联接关系:  *
(0004) *	 LCD1602:DB4-DB7 __ M16:PA4-PA7		   *
(0005) *	 LCD1602:RS _______ M16:PA2			   *
(0006) *	 LCD1602:E ________	M16:PA3			   *
(0007) *	 LCD1602:R/W ______	GND				   *
(0008) *	 时钟频率:外部7.3728M晶体			   * 
(0009) *	 作    者:tonghe  					   *
(0010) *	 日	   期:2007年3月31日			   *
(0011) *******************************************/
(0012) #include <iom16v.h>
(0013) #include <macros.h>
(0014) 
(0015) //LCD相关端口定义
(0016) #define RS1602 PA2 					//RS接在PORTA.2上
(0017) #define E1602 PA3					//E接在PORTA.3上
(0018) #define LCD_CON PORTA				//控制接在PA口
(0019) #define CLR_RS LCD_CON&=~(1<<RS1602)//RS清0
(0020) #define SET_RS LCD_CON|=1<<RS1602	//RS置1
(0021) #define CLR_E LCD_CON&=~(1<<E1602)	//E清0
(0022) #define SET_E LCD_CON|=1<<E1602		//E置1
(0023) #define LCD_DATA PORTA				//数据接在PA口
(0024) //简化宏定义
(0025) #define uchar unsigned char
(0026) #define uint unsigned int
(0027) 
(0028) //延时函数1:入口i,需要定时的时长
(0029) /*void delay_ms(uint i)  			  	//在7.3728M时钟下为i ms
(0030)     {
(0031) 	uint j;
(0032) 	for(;i;i--)
(0033) 	   {
(0034) 	   for(j=1220;j;j--)
(0035) 	      {;}
(0036) 	   }
(0037)     }
(0038) 
(0039) //延时函数2:入口i,需要定时的时长
(0040) void delay_us(uint i)  			  	//在7.3728M时钟下为i us
(0041)     {
(0042) 	uint j=i*4;
(0043) 	for(;j;j--)
(0044) 	   {
(0045) 	   ;
(0046) 	   }
(0047)     }
(0048) 	*/
(0049) /*************************************
(0050) *         LCD1602操作函数组			 *
(0051) *************************************/
(0052) //写数据到LCD的函数:入口data,需写入的显示数据
(0053) void lcd_da(uchar data)
(0054)    {
(0055)    uchar a;
(0056)    SET_RS;				    		//RS置高,写数据
    011D 9ADA      SBI	0x1B,2
(0057)    delay_ms(1);
    011E E001      LDI	R16,1
    011F E010      LDI	R17,0
    0120 940E0053  CALL	_delay_ms
(0058)    SET_E;
    0122 9ADB      SBI	0x1B,3
(0059)    a=data|0x0F;						//将低四位置1,保留高4位
    0123 2F46      MOV	R20,R22
    0124 604F      ORI	R20,0xF
(0060)    LCD_DATA=((LCD_DATA|0xF0)&a);	//数据高4位送端口
    0125 B38B      IN	R24,0x1B
    0126 6F80      ORI	R24,0xF0
    0127 2384      AND	R24,R20
    0128 BB8B      OUT	0x1B,R24
(0061)    delay_us(50);
    0129 E302      LDI	R16,0x32
    012A E010      LDI	R17,0
    012B 940E004B  CALL	_delay_us
(0062)    CLR_E;							//E下降沿写入数据
    012D 98DB      CBI	0x1B,3
(0063)    delay_us(50);					//延时50uS
    012E E302      LDI	R16,0x32
    012F E010      LDI	R17,0
    0130 940E004B  CALL	_delay_us
(0064)    
(0065)    SET_E;
    0132 9ADB      SBI	0x1B,3
(0066)    a=((data<<4)|0x0F);				//将低四位移到高四位并保留
    0133 2F46      MOV	R20,R22
    0134 704F      ANDI	R20,0xF
    0135 9542      SWAP	R20
    0136 604F      ORI	R20,0xF
(0067)    LCD_DATA=((LCD_DATA|0xF0)&a);	//数据低4位送端口
    0137 B38B      IN	R24,0x1B
    0138 6F80      ORI	R24,0xF0
    0139 2384      AND	R24,R20
    013A BB8B      OUT	0x1B,R24
(0068)    delay_us(50);
    013B E302      LDI	R16,0x32
    013C E010      LDI	R17,0
    013D 940E004B  CALL	_delay_us
(0069)    CLR_E;							//E下降沿写入数据
    013F 98DB      CBI	0x1B,3
(0070)    delay_us(50);					//延时50uS
    0140 E302      LDI	R16,0x32
    0141 E010      LDI	R17,0
    0142 940E004B  CALL	_delay_us
    0144 940E029B  CALL	pop_gset2
    0146 9508      RET
_lcd_comm:
  a                    --> R20
  data                 --> R22
    0147 940E02A7  CALL	push_gset2
    0149 2F60      MOV	R22,R16
(0071)    } 
(0072) 
(0073) //写指令到LCD的函数:入口data,需写入的控制指令
(0074) void lcd_comm(uchar data)
(0075)    {
(0076)    uchar a;
(0077)    CLR_RS;				 			//RS清0,写指令
    014A 98DA      CBI	0x1B,2
(0078)    delay_us(50);					//延时50uS
    014B E302      LDI	R16,0x32
    014C E010      LDI	R17,0
    014D 940E004B  CALL	_delay_us
(0079)    SET_E;
    014F 9ADB      SBI	0x1B,3
(0080)    a=data|0x0F;						//将低四位置1,保留高4位
    0150 2F46      MOV	R20,R22
    0151 604F      ORI	R20,0xF
(0081)    LCD_DATA=((LCD_DATA|0xF0)&a);	//指令高4位送端口
    0152 B38B      IN	R24,0x1B
    0153 6F80      ORI	R24,0xF0
    0154 2384      AND	R24,R20
    0155 BB8B      OUT	0x1B,R24
(0082)    delay_us(50);
    0156 E302      LDI	R16,0x32
    0157 E010      LDI	R17,0
    0158 940E004B  CALL	_delay_us
(0083)    CLR_E;							//E下降沿写入指令
    015A 98DB      CBI	0x1B,3
(0084)    delay_us(50);					//延时50uS
    015B E302      LDI	R16,0x32
    015C E010      LDI	R17,0
    015D 940E004B  CALL	_delay_us
(0085)    
(0086)    SET_E;
    015F 9ADB      SBI	0x1B,3
(0087)    a=((data<<4)|0x0F);				//将低四位移到高四位并保留
    0160 2F46      MOV	R20,R22
    0161 704F      ANDI	R20,0xF
    0162 9542      SWAP	R20
    0163 604F      ORI	R20,0xF
(0088)    LCD_DATA=((LCD_DATA|0xF0)&a);	//指令低4位送端口
    0164 B38B      IN	R24,0x1B
    0165 6F80      ORI	R24,0xF0
    0166 2384      AND	R24,R20
    0167 BB8B      OUT	0x1B,R24
(0089)    delay_us(50);
    0168 E302      LDI	R16,0x32
    0169 E010      LDI	R17,0
    016A 940E004B  CALL	_delay_us
(0090)    CLR_E;							//E下降沿写入指令
    016C 98DB      CBI	0x1B,3
(0091)    delay_us(50);					//延时50uS
    016D E302      LDI	R16,0x32
    016E E010      LDI	R17,0
    016F 940E004B  CALL	_delay_us
    0171 940E029B  CALL	pop_gset2
    0173 9508      RET
(0092)    }
(0093) //数据在LCD上显示   
(0094) void xs_lcd(void)
(0095)    {
(0096)    lcd_comm(0x80);			 	 	 //写指令:第1行地址
_xs_lcd:
    0174 E800      LDI	R16,0x80
    0175 DFD1      RCALL	_lcd_comm
(0097)    lcd_da(0x32); 				 	 //留3个空格,使显示数据居中
    0176 E302      LDI	R16,0x32
    0177 DFA2      RCALL	_lcd_da
(0098)    lcd_da(0x33); 
    0178 E303      LDI	R16,0x33
    0179 DFA0      RCALL	_lcd_da
(0099)    lcd_da(0x31); 
    017A E301      LDI	R16,0x31
    017B DF9E      RCALL	_lcd_da
(0100)    lcd_da(0x32);		 		 	 //显示世纪位:2
    017C E302      LDI	R16,0x32
    017D DF9C      RCALL	_lcd_da
(0101)    lcd_da(0x38);		 		 	 //0
    017E E308      LDI	R16,0x38
    017F DF9A      RCALL	_lcd_da
(0102) 
(0103)    lcd_comm(0xC0);			 		 //写指令:第2行地址
    0180 EC00      LDI	R16,0xC0
    0181 DFC5      RCALL	_lcd_comm
(0104)    lcd_da(39);				 		 //留1个空格
    0182 E207      LDI	R16,0x27
    0183 DF96      RCALL	_lcd_da
(0105) 
(0106)    lcd_da(20);						 //时间与星期间留1空格
    0184 E104      LDI	R16,0x14
    0185 DF94      RCALL	_lcd_da
(0107)    lcd_da('W');						 //星期的前导字
    0186 E507      LDI	R16,0x57
    0187 DF92      RCALL	_lcd_da
(0108)    lcd_da('e');
    0188 E605      LDI	R16,0x65
    0189 DF90      RCALL	_lcd_da
(0109)    lcd_da('e');
    018A E605      LDI	R16,0x65
    018B DF8E      RCALL	_lcd_da
(0110)    lcd_da('k');
    018C E60B      LDI	R16,0x6B
    018D DF8C      RCALL	_lcd_da
    018E 9508      RET
(0111)    }
(0112)    
(0113) //LCD1602初始化函数
(0114) void lcd_init(void)
(0115)    {
(0116)    lcd_comm(0x20);			 		 //写指令:4位数据
_lcd_init:
    018F E200      LDI	R16,0x20
    0190 DFB6      RCALL	_lcd_comm
(0117) //   delay_us(80);   
(0118)    lcd_comm(0x28);			 		 //写指令:4位数据、2行显示、5*8点阵
    0191 E208      LDI	R16,0x28
    0192 DFB4      RCALL	_lcd_comm
(0119)    delay_us(80);
    0193 E500      LDI	R16,0x50
    0194 E010      LDI	R17,0
    0195 940E004B  CALL	_delay_us
(0120)    lcd_comm(0x0C);			 		 //写指令:显示开
    0197 E00C      LDI	R16,0xC
    0198 DFAE      RCALL	_lcd_comm
(0121)    delay_us(80);
    0199 E500      LDI	R16,0x50
    019A E010      LDI	R17,0
    019B 940E004B  CALL	_delay_us
(0122)    lcd_comm(0x06);			 		 //写指令:自左向右显示
    019D E006      LDI	R16,6
    019E DFA8      RCALL	_lcd_comm
(0123)    delay_us(80);
    019F E500      LDI	R16,0x50
    01A0 E010      LDI	R17,0
    01A1 940E004B  CALL	_delay_us
(0124) //   lcd_comm(0x14);			 	 //写指令:移动
(0125)    delay_us(80);
    01A3 E500      LDI	R16,0x50
    01A4 E010      LDI	R17,0
    01A5 940E004B  CALL	_delay_us
(0126) //   delay_ms(10);
(0127) //   lcd_comm(0x80);			 	 //写指令:第1行地址
(0128) //   delay_ms(5);		
(0129)    lcd_comm(0x01);			 		 //写指令:CLS
    01A7 E001      LDI	R16,1
    01A8 DF9E      RCALL	_lcd_comm
(0130)    delay_ms(5);
    01A9 E005      LDI	R16,5
    01AA E010      LDI	R17,0
    01AB 940E0053  CALL	_delay_ms
    01AD 9508      RET
(0131)    }
(0132) 
(0133) //清屏指令函数
(0134) void cls(void)
(0135)    {
(0136)    lcd_comm(0x01);
_cls:
    01AE E001      LDI	R16,1
    01AF DF97      RCALL	_lcd_comm
(0137)    delay_ms(5);
    01B0 E005      LDI	R16,5
    01B1 E010      LDI	R17,0

⌨️ 快捷键说明

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