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

📄 18b20.lst

📁 mega16_32实验板的上程序mega16+LCD12232-9+ds18B20
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0090)   lcd_write(data,chn[15+i]);
      E4 2FE4      MOV	R30,R20
      E5 27FF      CLR	R31
      E6 0DEA      ADD	R30,R10
      E7 1DFB      ADC	R31,R11
      E8 8527      LDD	R18,Z+15
      E9 E001      LDI	R16,1
      EA DF93      RCALL	_lcd_write
      EB 9543      INC	R20
      EC 304F      CPI	R20,0xF
      ED F3B0      BCS	0x00E4
      EE C159      RJMP	pop_xgset300C
_line1_display:
  i                    --> R20
  chn                  --> R10
      EF D153      RCALL	push_xgset300C
      F0 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);
      F1 E320      LDI	R18,0x30
      F2 2700      CLR	R16
      F3 DF8A      RCALL	_lcd_write
(0098)   lcd_write(command,x1);
      F4 E820      LDI	R18,0x80
      F5 2700      CLR	R16
      F6 DF87      RCALL	_lcd_write
(0099)   for (i=0;i<15;i++)
      F7 2744      CLR	R20
      F8 C004      RJMP	0x00FD
(0100)    lcd_write(data,chn[i]);
      F9 940E 0265 CALL	<created procedures>
      FB DF82      RCALL	_lcd_write
      FC 9543      INC	R20
      FD 304F      CPI	R20,0xF
      FE F3D0      BCS	0x00F9
      FF C148      RJMP	pop_xgset300C
_line2_display:
  i                    --> R20
  chn                  --> R10
     100 D142      RCALL	push_xgset300C
     101 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);
     102 E320      LDI	R18,0x30
     103 2700      CLR	R16
     104 DF79      RCALL	_lcd_write
(0108)   lcd_write(command,x2);
     105 E920      LDI	R18,0x90
     106 2700      CLR	R16
     107 DF76      RCALL	_lcd_write
(0109)   for (i=0;i<15;i++)
     108 2744      CLR	R20
     109 C004      RJMP	0x010E
(0110)   lcd_write(data,chn[i]);
     10A 940E 0265 CALL	<created procedures>
     10C DF71      RCALL	_lcd_write
     10D 9543      INC	R20
     10E 304F      CPI	R20,0xF
     10F F3D0      BCS	0x010A
     110 C137      RJMP	pop_xgset300C
_int_disp:
  i                    --> R22
  dispi                --> Y,+0
  j                    --> R20
  adc                  --> R12
  wz                   --> R10
     111 D145      RCALL	push_xgsetF03C
     112 0169      MOVW	R12,R18
     113 2EA0      MOV	R10,R16
     114 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;
     115 E043      LDI	R20,3
(0117)  unsigned char i=1;
     116 E061      LDI	R22,1
(0118)  adc=adc%1000;
     117 EE28      LDI	R18,0xE8
     118 E033      LDI	R19,3
     119 0186      MOVW	R16,R12
     11A D0EC      RCALL	mod16u
     11B 0168      MOVW	R12,R16
(0119)  dispi[2]=adc/100; adc=adc%100;
     11C E624      LDI	R18,0x64
     11D E030      LDI	R19,0
     11E D0EA      RCALL	div16u
     11F 830A      STD	Y+2,R16
     120 E624      LDI	R18,0x64
     121 E030      LDI	R19,0
     122 0186      MOVW	R16,R12
     123 D0E3      RCALL	mod16u
     124 0168      MOVW	R12,R16
(0120)  dispi[1]=adc/10; adc=adc%10;
     125 E02A      LDI	R18,0xA
     126 E030      LDI	R19,0
     127 D0E1      RCALL	div16u
     128 8309      STD	Y+1,R16
     129 E02A      LDI	R18,0xA
     12A E030      LDI	R19,0
     12B 0186      MOVW	R16,R12
     12C D0DA      RCALL	mod16u
     12D 0168      MOVW	R12,R16
(0121)  dispi[0]=adc;
     12E 82C8      STD	Y+0,R12
(0122)  lcd_write(command,wz);
     12F 2D2A      MOV	R18,R10
     130 2700      CLR	R16
     131 DF4C      RCALL	_lcd_write
     132 C017      RJMP	0x014A
(0123)  while(j--)
(0124)  {
(0125)   if((dispi[j]==0)&&(i==1)&&(j!=0))
     133 940E 026C CALL	0x026C
     135 8020      LDD	R2,Z+0
     136 2022      TST	R2
     137 F459      BNE	0x0143
     138 3061      CPI	R22,1
     139 F449      BNE	0x0143
     13A 2344      TST	R20
     13B F039      BEQ	0x0143
     13C 940E 026C CALL	0x026C
(0126)   {
(0127)    lcd_write(data,dispi[j]+0x20);	  
     13E 8120      LDD	R18,Z+0
     13F 5E20      SUBI	R18,0xE0
     140 E001      LDI	R16,1
     141 DF3C      RCALL	_lcd_write
(0128)   }
     142 C007      RJMP	0x014A
(0129)   else
(0130)   { 
(0131)    lcd_write(data,dispi[j]+0x30);
     143 940E 026C CALL	0x026C
     145 8120      LDD	R18,Z+0
     146 5D20      SUBI	R18,0xD0
     147 E001      LDI	R16,1
     148 DF35      RCALL	_lcd_write
(0132)    i=0;
     149 2766      CLR	R22
     14A 2E24      MOV	R2,R20
     14B 2433      CLR	R3
     14C 5041      SUBI	R20,1
     14D 2022      TST	R2
     14E F721      BNE	0x0133
     14F 9623      ADIW	R28,3
     150 C10F      RJMP	pop_xgsetF03C
_Sensor_Delay:
  i                    --> R20
  US                   --> R10
     151 D0F1      RCALL	push_xgset300C
     152 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 count)//延时函数
(0007) * 功    能:DS18B20软件延时专用
(0008) * 入口参数:count    
(0009) * 出口参数:无
(0010) *********************************************************************************************/
(0011) void Sensor_Delay(unsigned int US)
(0012) {
(0013)  unsigned int i;
(0014)  US=US*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
     153 E005      LDI	R16,5
     154 E010      LDI	R17,0
     155 0195      MOVW	R18,R10
     156 D0CC      RCALL	empy16s
     157 0158      MOVW	R10,R16
     158 94B6      LSR	R11
     159 94A7      ROR	R10
     15A 94B6      LSR	R11
     15B 94A7      ROR	R10
(0015)  for(i=0;i<US;i++); 
     15C 2744      CLR	R20
     15D 2755      CLR	R21
     15E C002      RJMP	0x0161
     15F 5F4F      SUBI	R20,0xFF
     160 4F5F      SBCI	R21,0xFF
     161 154A      CP	R20,R10
     162 055B      CPC	R21,R11
     163 F3D8      BCS	0x015F
     164 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:
     165 9AA7      SBI	0x14,7
(0026)  b20_port&=~(1<<b20_io);			//拉低
     166 98AF      CBI	0x15,7
(0027)  Sensor_Delay(600);					//等待600微秒
     167 E508      LDI	R16,0x58
     168 E012      LDI	R17,2
     169 DFE7      RCALL	_Sensor_Delay
(0028)  b20_port|=(1<<b20_io);			//释放总线
     16A 9AAF      SBI	0x15,7
(0029)  Sensor_Delay(60);					//等待60微秒
     16B E30C      LDI	R16,0x3C
     16C E010      LDI	R17,0
     16D DFE3      RCALL	_Sensor_Delay
(0030)  b20_ddr&=~(1<<b20_io);			//配置为输入 
     16E 98A7      CBI	0x14,7
(0031)  while((b20_pin&(1<<b20_io)));	//等待DS18B20拉低
     16F 999F      SBIC	0x13,7
     170 CFFE      RJMP	0x016F
(0032)  while(!(b20_pin&(1<<b20_io))); //等待DS18B20释放总线
     171 9B9F      SBIS	0x13,7
     172 CFFE      RJMP	0x0171
     173 9508      RET
_B20_readB:
  retd                 --> R20
  i                    --> R22
     174 934A      ST	R20,-Y
     175 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;
     176 2744      CLR	R20
(0044)  for(i=0;i<8;i++)	 			//位计数值
     177 2766      CLR	R22
     178 C00F      RJMP	0x0188
(0045)  {
(0046)   retd>>=1;						//右移,准备接受新的数据位
     179 9546      LSR	R20
(0047)   b20_ddr|=(1<<b20_io);			//配置为输出
     17A 9AA7      SBI	0x14,7
(0048)   b20_port&=~(1<<b20_io);			//拉低,启动读数据位
     17B 98AF      CBI	0x15,7
(0049)   b20_port|=(1<<b20_io);			//释放总线
     17C 9AAF      SBI	0x15,7
(0050)   Sensor_Delay(5);					//等待5微秒
     17D E005      LDI	R16,5
     17E E010      LDI	R17,0
     17F DFD1      RCALL	_Sensor_Delay
(0051)   b20_ddr&=~(1<<b20_io);			//配置为输入,开始读取数据位
     180 98A7      CBI	0x14,7
(0052)   if(b20_pin&(1<<b20_io))			//该位是否为高
     181 9B9F      SBIS	0x13,7
     182 C001      RJMP	0x0184
(0053)   {
(0054)    retd|=0x80;					//是就将此位置高
     183 6840      ORI	R20,0x80
(0055)   }
(0056)   Sensor_Delay(50);					//等待50微秒
     184 E302      LDI	R16,0x32
     185 E010      LDI	R17,0
     186 DFCA      RCALL	_Sensor_Delay
     187 9563      INC	R22
     188 3068      CPI	R22,0x8
     189 F378      BCS	0x0179
(0057)  }
(0058)  return retd;					//将读到的一个字节返回
     18A 2F04      MOV	R16,R20
     18B 9169      LD	R22,Y+
     18C 9149      LD	R20,Y+
     18D 9508      RET
_B20_writeB:
  i                    --> R20
  wrd                  --> R10
     18E 92AA      ST	R10,-Y
     18F 934A      ST	R20,-Y
     190 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++)	  	        //位计数值
     191 2744      CLR	R20
     192 C010      RJMP	0x01A3
(0070)  {
(0071)   b20_ddr|=(1<<b20_io);			//配置为输出
     193 9AA7      SBI	0x14,7
(0072)   b20_port&=~(1<<b20_io);			//拉低,启动写数据位
     194 98AF      CBI	0x15,7
(0073)   Sensor_Delay(1);					//等待1微秒
     195 E001      LDI	R16,1
     196 E010      LDI	R17,0
     197 DFB9      RCALL	_Sensor_Delay
(0074)   if(wrd&0x01)					//此位数据是否为高
     198 FEA0      SBRS	R10,0
     199 C002      RJMP	0x019C
(0075)   {
(0076)    b20_port|=(1<<b20_io);			//是高则将单总线拉高
     19A 9AAF      SBI	0x15,7
(0077)   }

⌨️ 快捷键说明

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