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

📄 18b20.lst

📁 18b20的器件使用
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0090)   lcd_write(data,chn[15+i]);
      E3 2FE4      MOV	R30,R20
      E4 27FF      CLR	R31
      E5 0DEA      ADD	R30,R10
      E6 1DFB      ADC	R31,R11
      E7 8527      LDD	R18,Z+15
      E8 E001      LDI	R16,1
      E9 DF94      RCALL	_lcd_write
      EA 9543      INC	R20
      EB 304F      CPI	R20,0xF
      EC F3B0      BCS	0x00E3
      ED C159      RJMP	pop_xgset300C
_line1_display:
  i                    --> R20
  chn                  --> R10
      EE D153      RCALL	push_xgset300C
      EF 0158      MOVW	R10,R16
(0091) }
(0092) 
(0093) //LCD第一行显示字符
(0094) void line1_display(unsigned char chn[15])
(0095) {
(0096)   unsigned char i;
(0097)   lcd_write(command,0x30);
      F0 E320      LDI	R18,0x30
      F1 2700      CLR	R16
      F2 DF8B      RCALL	_lcd_write
(0098)   lcd_write(command,x1);
      F3 E820      LDI	R18,0x80
      F4 2700      CLR	R16
      F5 DF88      RCALL	_lcd_write
(0099)   for (i=0;i<15;i++)
      F6 2744      CLR	R20
      F7 C004      RJMP	0x00FC
(0100)    lcd_write(data,chn[i]);
      F8 940E 0264 CALL	<created procedures>
      FA DF83      RCALL	_lcd_write
      FB 9543      INC	R20
      FC 304F      CPI	R20,0xF
      FD F3D0      BCS	0x00F8
      FE C148      RJMP	pop_xgset300C
_line2_display:
  i                    --> R20
  chn                  --> R10
      FF D142      RCALL	push_xgset300C
     100 0158      MOVW	R10,R16
(0101) }
(0102) 
(0103) //LCD第二行显示字符
(0104) void line2_display(unsigned char chn[15])
(0105) {
(0106)   unsigned char i;
(0107)   lcd_write(command,0x30);
     101 E320      LDI	R18,0x30
     102 2700      CLR	R16
     103 DF7A      RCALL	_lcd_write
(0108)   lcd_write(command,x2);
     104 E920      LDI	R18,0x90
     105 2700      CLR	R16
     106 DF77      RCALL	_lcd_write
(0109)   for (i=0;i<15;i++)
     107 2744      CLR	R20
     108 C004      RJMP	0x010D
(0110)   lcd_write(data,chn[i]);
     109 940E 0264 CALL	<created procedures>
     10B DF72      RCALL	_lcd_write
     10C 9543      INC	R20
     10D 304F      CPI	R20,0xF
     10E F3D0      BCS	0x0109
     10F C137      RJMP	pop_xgset300C
_int_disp:
  i                    --> R22
  dispi                --> Y,+0
  j                    --> R20
  adc                  --> R12
  wz                   --> R10
     110 D145      RCALL	push_xgsetF03C
     111 0169      MOVW	R12,R18
     112 2EA0      MOV	R10,R16
     113 9723      SBIW	R28,3
(0111) }
(0112) 
(0113) //////////////////////////////////////////////////////最前面的零不显示
(0114) void int_disp(unsigned char wz,unsigned int adc)
(0115) {
(0116)  unsigned char dispi[3],j=3;
     114 E043      LDI	R20,3
(0117)  unsigned char i=1;
     115 E061      LDI	R22,1
(0118)  adc=adc%1000;
     116 EE28      LDI	R18,0xE8
     117 E033      LDI	R19,3
     118 0186      MOVW	R16,R12
     119 D0EC      RCALL	mod16u
     11A 0168      MOVW	R12,R16
(0119)  dispi[2]=adc/100; adc=adc%100;
     11B E624      LDI	R18,0x64
     11C E030      LDI	R19,0
     11D D0EA      RCALL	div16u
     11E 830A      STD	Y+2,R16
     11F E624      LDI	R18,0x64
     120 E030      LDI	R19,0
     121 0186      MOVW	R16,R12
     122 D0E3      RCALL	mod16u
     123 0168      MOVW	R12,R16
(0120)  dispi[1]=adc/10; adc=adc%10;
     124 E02A      LDI	R18,0xA
     125 E030      LDI	R19,0
     126 D0E1      RCALL	div16u
     127 8309      STD	Y+1,R16
     128 E02A      LDI	R18,0xA
     129 E030      LDI	R19,0
     12A 0186      MOVW	R16,R12
     12B D0DA      RCALL	mod16u
     12C 0168      MOVW	R12,R16
(0121)  dispi[0]=adc;
     12D 82C8      STD	Y+0,R12
(0122)  lcd_write(command,wz);
     12E 2D2A      MOV	R18,R10
     12F 2700      CLR	R16
     130 DF4D      RCALL	_lcd_write
     131 C017      RJMP	0x0149
(0123)  while(j--)
(0124)  {
(0125)   if((dispi[j]==0)&&(i==1)&&(j!=0))
     132 940E 026B CALL	0x026B
     134 8020      LDD	R2,Z+0
     135 2022      TST	R2
     136 F459      BNE	0x0142
     137 3061      CPI	R22,1
     138 F449      BNE	0x0142
     139 2344      TST	R20
     13A F039      BEQ	0x0142
     13B 940E 026B CALL	0x026B
(0126)   {
(0127)    lcd_write(data,dispi[j]+0x20);	  
     13D 8120      LDD	R18,Z+0
     13E 5E20      SUBI	R18,0xE0
     13F E001      LDI	R16,1
     140 DF3D      RCALL	_lcd_write
(0128)   }
     141 C007      RJMP	0x0149
(0129)   else
(0130)   { 
(0131)    lcd_write(data,dispi[j]+0x30);
     142 940E 026B CALL	0x026B
     144 8120      LDD	R18,Z+0
     145 5D20      SUBI	R18,0xD0
     146 E001      LDI	R16,1
     147 DF36      RCALL	_lcd_write
(0132)    i=0;
     148 2766      CLR	R22
     149 2E24      MOV	R2,R20
     14A 2433      CLR	R3
     14B 5041      SUBI	R20,1
     14C 2022      TST	R2
     14D F721      BNE	0x0132
     14E 9623      ADIW	R28,3
     14F C10F      RJMP	pop_xgsetF03C
_Sensor_Delay:
  i                    --> R20
  US                   --> R10
     150 D0F1      RCALL	push_xgset300C
     151 0158      MOVW	R10,R16
FILE: D:\mega16_32实验板资料\ICCAVR源程序\18b20\18b20.h
(0001) #define b20_io   PC7
(0002) #define b20_port PORTC
(0003) #define b20_pin  PINC
(0004) #define b20_ddr  DDRC
(0005) /********************************************************************************************
(0006) * 函数名称:Sensor_Delay(uint16 US)//延时函数
(0007) * 功    能:DS18B20软件延时专用
(0008) * 入口参数:US    
(0009) * 出口参数:无
(0010) *********************************************************************************************/
(0011) void Sensor_Delay(unsigned int US)
(0012) {
(0013)  unsigned int i;
(0014)  US=US*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
     152 E005      LDI	R16,5
     153 E010      LDI	R17,0
     154 0195      MOVW	R18,R10
     155 D0CC      RCALL	empy16s
     156 0158      MOVW	R10,R16
     157 94B6      LSR	R11
     158 94A7      ROR	R10
     159 94B6      LSR	R11
     15A 94A7      ROR	R10
(0015)  for(i=0;i<US;i++); 
     15B 2744      CLR	R20
     15C 2755      CLR	R21
     15D C002      RJMP	0x0160
     15E 5F4F      SUBI	R20,0xFF
     15F 4F5F      SBCI	R21,0xFF
     160 154A      CP	R20,R10
     161 055B      CPC	R21,R11
     162 F3D8      BCS	0x015E
     163 C0E3      RJMP	pop_xgset300C
(0016) }
(0017) /*******************************************
(0018) 函数名称: B20_init
(0019) 功    能: 复位DS18B20
(0020) 参    数: 无
(0021) 返回值  : 无
(0022) ********************************************/
(0023) void B20_init(void)
(0024) {
(0025)  b20_ddr|=(1<<b20_io);			//配置为输出			  
_B20_init:
     164 9AA7      SBI	0x14,7
(0026)  b20_port&=~(1<<b20_io);			//拉低
     165 98AF      CBI	0x15,7
(0027)  Sensor_Delay(600);					//等待600微秒
     166 E508      LDI	R16,0x58
     167 E012      LDI	R17,2
     168 DFE7      RCALL	_Sensor_Delay
(0028)  b20_port|=(1<<b20_io);			//释放总线
     169 9AAF      SBI	0x15,7
(0029)  Sensor_Delay(60);					//等待60微秒
     16A E30C      LDI	R16,0x3C
     16B E010      LDI	R17,0
     16C DFE3      RCALL	_Sensor_Delay
(0030)  b20_ddr&=~(1<<b20_io);			//配置为输入 
     16D 98A7      CBI	0x14,7
(0031)  while((b20_pin&(1<<b20_io)));	//等待DS18B20拉低
     16E 999F      SBIC	0x13,7
     16F CFFE      RJMP	0x016E
(0032)  while(!(b20_pin&(1<<b20_io))); //等待DS18B20释放总线
     170 9B9F      SBIS	0x13,7
     171 CFFE      RJMP	0x0170
     172 9508      RET
_B20_readB:
  retd                 --> R20
  i                    --> R22
     173 934A      ST	R20,-Y
     174 936A      ST	R22,-Y
(0033) }
(0034) 
(0035) /*******************************************
(0036) 函数名称: B20_readB
(0037) 功    能: 读取一个字节的数据
(0038) 参    数: 无
(0039) 返回值  : retd--返回的一个字节数据
(0040) ********************************************/
(0041) unsigned char B20_readB(void)
(0042) {
(0043)  unsigned char i,retd=0;
     175 2744      CLR	R20
(0044)  for(i=0;i<8;i++)	 			//位计数值
     176 2766      CLR	R22
     177 C00F      RJMP	0x0187
(0045)  {
(0046)   retd>>=1;						//右移,准备接受新的数据位
     178 9546      LSR	R20
(0047)   b20_ddr|=(1<<b20_io);			//配置为输出
     179 9AA7      SBI	0x14,7
(0048)   b20_port&=~(1<<b20_io);			//拉低,启动读数据位
     17A 98AF      CBI	0x15,7
(0049)   b20_port|=(1<<b20_io);			//释放总线
     17B 9AAF      SBI	0x15,7
(0050)   Sensor_Delay(5);					//等待5微秒
     17C E005      LDI	R16,5
     17D E010      LDI	R17,0
     17E DFD1      RCALL	_Sensor_Delay
(0051)   b20_ddr&=~(1<<b20_io);			//配置为输入,开始读取数据位
     17F 98A7      CBI	0x14,7
(0052)   if(b20_pin&(1<<b20_io))			//该位是否为高
     180 9B9F      SBIS	0x13,7
     181 C001      RJMP	0x0183
(0053)   {
(0054)    retd|=0x80;					//是就将此位置高
     182 6840      ORI	R20,0x80
(0055)   }
(0056)   Sensor_Delay(50);					//等待50微秒
     183 E302      LDI	R16,0x32
     184 E010      LDI	R17,0
     185 DFCA      RCALL	_Sensor_Delay
     186 9563      INC	R22
     187 3068      CPI	R22,0x8
     188 F378      BCS	0x0178
(0057)  }
(0058)  return retd;					//将读到的一个字节返回
     189 2F04      MOV	R16,R20
     18A 9169      LD	R22,Y+
     18B 9149      LD	R20,Y+
     18C 9508      RET
_B20_writeB:
  i                    --> R20
  wrd                  --> R10
     18D 92AA      ST	R10,-Y
     18E 934A      ST	R20,-Y
     18F 2EA0      MOV	R10,R16
(0059) }
(0060) /*******************************************
(0061) 函数名称: B20_writeB
(0062) 功    能: 写入一个字节的数据
(0063) 参    数: wrd--要写入的数据
(0064) 返回值  : 无
(0065) ********************************************/
(0066) void B20_writeB(unsigned char wrd)
(0067) {
(0068)  unsigned char i;
(0069)  for(i=0;i<8;i++)	  	        //位计数值
     190 2744      CLR	R20
     191 C010      RJMP	0x01A2
(0070)  {
(0071)   b20_ddr|=(1<<b20_io);			//配置为输出
     192 9AA7      SBI	0x14,7
(0072)   b20_port&=~(1<<b20_io);			//拉低,启动写数据位
     193 98AF      CBI	0x15,7
(0073)   Sensor_Delay(1);					//等待1微秒
     194 E001      LDI	R16,1
     195 E010      LDI	R17,0
     196 DFB9      RCALL	_Sensor_Delay
(0074)   if(wrd&0x01)					//此位数据是否为高
     197 FEA0      SBRS	R10,0
     198 C002      RJMP	0x019B
(0075)   {
(0076)    b20_port|=(1<<b20_io);			//是高则将单总线拉高
     199 9AAF      SBI	0x15,7

⌨️ 快捷键说明

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