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

📄 18b20.lst

📁 一个不错的DS1820的程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
     157 EC0C      LDI	R16,0xCC
     158 DFB7      RCALL	_write_1820
(0069)      write_1820(0xbe);  
     159 EB0E      LDI	R16,0xBE
     15A DFB5      RCALL	_write_1820
(0070)      teml=read_1820();  //读数据  
     15B DFD0      RCALL	_read_1820
     15C 2EC0      MOV	R12,R16
(0071)      temh=read_1820();  
     15D DFCE      RCALL	_read_1820
     15E 2F60      MOV	R22,R16
(0072)      wm0=teml>>4;       //只要高8位的低四位和低8位的高四位,温度范围0~99啦! 
     15F 2D4C      MOV	R20,R12
     160 9542      SWAP	R20
     161 704F      ANDI	R20,0xF
(0073)      wm1=temh<<4;
     162 2F86      MOV	R24,R22
     163 708F      ANDI	R24,0xF
     164 9582      SWAP	R24
     165 2EA8      MOV	R10,R24
(0074) 	 
(0075) //count=(temh*256+teml)*6.25;  //计算具体温度 	 
(0076) if((temh&0xF8) == 0xF8)  
     166 2F86      MOV	R24,R22
     167 7F88      ANDI	R24,0xF8
     168 3F88      CPI	R24,0xF8
     169 F561      BNE	0x0196
(0077) { 
(0078)    flag=1; 
     16A E081      LDI	R24,1
     16B 9380 0081 STS	flag,R24
(0079)    count=((0xFF-temh)*256+(0xFF-teml))*6.25; 
     16D E504      LDI	R16,0x54
     16E E010      LDI	R17,0
     16F 940E 02F3 CALL	lpm32
     171 0118      MOVW	R2,R16
     172 0129      MOVW	R4,R18
     173 2E66      MOV	R6,R22
     174 2477      CLR	R7
     175 EF2F      LDI	R18,0xFF
     176 E030      LDI	R19,0
     177 1926      SUB	R18,R6
     178 0937      SBC	R19,R7
     179 E000      LDI	R16,0
     17A E011      LDI	R17,1
     17B 940E 02A2 CALL	empy16s
     17D 0138      MOVW	R6,R16
     17E 2C8C      MOV	R8,R12
     17F 2499      CLR	R9
     180 EF8F      LDI	R24,0xFF
     181 E090      LDI	R25,0
     182 1988      SUB	R24,R8
     183 0999      SBC	R25,R9
     184 0E68      ADD	R6,R24
     185 1E79      ADC	R7,R25
     186 0183      MOVW	R16,R6
     187 940E 033B CALL	int2fp
     189 933A      ST	R19,-Y
     18A 932A      ST	R18,-Y
     18B 931A      ST	R17,-Y
     18C 930A      ST	R16,-Y
     18D 0181      MOVW	R16,R2
     18E 0192      MOVW	R18,R4
     18F 940E 0431 CALL	fpmule2
     191 940E 030D CALL	fpint
     193 9300 0080 STS	count,R16
(0080)    //count=((0xFF-temh)*256+(0xFF-teml))*625; 
(0081) } 
     195 C023      RJMP	0x01B9
(0082) else 
(0083) {    
(0084)    flag=0; 
     196 2422      CLR	R2
     197 9220 0081 STS	flag,R2
(0085)    count=(temh*256+teml)*6.25; 
     199 E504      LDI	R16,0x54
     19A E010      LDI	R17,0
     19B 940E 02F3 CALL	lpm32
     19D 0118      MOVW	R2,R16
     19E 0129      MOVW	R4,R18
     19F 2F26      MOV	R18,R22
     1A0 2733      CLR	R19
     1A1 E000      LDI	R16,0
     1A2 E011      LDI	R17,1
     1A3 940E 02A2 CALL	empy16s
     1A5 0138      MOVW	R6,R16
     1A6 2C8C      MOV	R8,R12
     1A7 2499      CLR	R9
     1A8 0C68      ADD	R6,R8
     1A9 1C79      ADC	R7,R9
     1AA 0183      MOVW	R16,R6
     1AB 940E 033B CALL	int2fp
     1AD 933A      ST	R19,-Y
     1AE 932A      ST	R18,-Y
     1AF 931A      ST	R17,-Y
     1B0 930A      ST	R16,-Y
     1B1 0181      MOVW	R16,R2
     1B2 0192      MOVW	R18,R4
     1B3 940E 0431 CALL	fpmule2
     1B5 940E 030D CALL	fpint
     1B7 9300 0080 STS	count,R16
(0086)    //count=(temh*256+teml)*625; //计算具体温度  
(0087) }
(0088)      wm2=wm1+wm0;        //16进制转10进制 
     1B9 0EA4      ADD	R10,R20
(0089)      wm3=wm2/100; 
     1BA E614      LDI	R17,0x64
     1BB 2D0A      MOV	R16,R10
     1BC 940E 028C CALL	div8u
     1BE 2EC0      MOV	R12,R16
(0090)      wmh=(wm2%100)/10;   //出口参数了!wmh是显示的高位,wml是显示的低位 
     1BF E614      LDI	R17,0x64
     1C0 2D0A      MOV	R16,R10
     1C1 940E 028A CALL	mod8u
     1C3 E01A      LDI	R17,0xA
     1C4 940E 028C CALL	div8u
     1C6 9300 0083 STS	wmh,R16
(0091)      wml=(wm2%100)%10;
     1C8 E614      LDI	R17,0x64
     1C9 2D0A      MOV	R16,R10
     1CA 940E 028A CALL	mod8u
     1CC E01A      LDI	R17,0xA
     1CD 940E 028A CALL	mod8u
     1CF 9300 0082 STS	wml,R16
     1D1 940C 02E1 JMP	pop_xgsetF03C
FILE: F:\单片机资料\AVR单片机\制作ds18b20\18B20\led.c
(0001) /**********************************
(0002) ** file_name led.c             **
(0003) ** describe  七段数码管函数        **
(0004) ** auther    古欣 www.avrvi.com  **
(0005) ** Time      200-2-25           **
(0006) ** temp=(data*1000)%1; 这个式子中的%为取余数,temp为data的第三位小数,0.023(data) --> 3(temp) 
(0007) ***********************************/
(0008) #include "config.h"
(0009) 
(0010) 
(0011) //LED数据 不显点,亮的段为1,连接为P0~P7对应a~g,dp
(0012) const led_data[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x73,0x39,0x63,0x79};
(0013) 
(0014) /***********************
(0015) ** 初始化对应端口为输出 
(0016) ** ABCD 和 abcdefg dpi 共12个IO口
(0017) ** 默认为 PB(0123) 和 PA
(0018) ***********************/
(0019) void led_init(void)
(0020) {
(0021)  led_ddr = 0xFF; //abcdefg dpi 各位设为输出
_led_init:
     1D3 EF8F      LDI	R24,0xFF
     1D4 BB8A      OUT	0x1A,R24
(0022)  led_contrl_ddr |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d); //ABCD四个控制设为输出
     1D5 B387      IN	R24,0x17
     1D6 608F      ORI	R24,0xF
     1D7 BB87      OUT	0x17,R24
     1D8 9508      RET
_display_one:
  data                 --> R12
  count                --> R10
     1D9 92AA      ST	R10,-Y
     1DA 92CA      ST	R12,-Y
     1DB 2EC2      MOV	R12,R18
     1DC 2EA0      MOV	R10,R16
(0023)  
(0024)  // 以下两句将会使LED全亮,如果立即更改状态,将看不出来效果
(0025)  // led_port = 0xFF;
(0026)  // led_contrl_port |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d);
(0027) }
(0028) 
(0029) /***********************
(0030) ** 显示一位
(0031) ** 输入:count显示在第几位(3210),data 要显示的数(0~f)
(0032) ************************/
(0033) void display_one(uint8 count, uint8 data)
(0034) {
(0035)  led_port = led_data[data];    //显示的数
     1DD E680      LDI	R24,0x60
     1DE E090      LDI	R25,0
     1DF 2DEC      MOV	R30,R12
     1E0 27FF      CLR	R31
     1E1 0FEE      LSL	R30
     1E2 1FFF      ROL	R31
     1E3 0FE8      ADD	R30,R24
     1E4 1FF9      ADC	R31,R25
     1E5 8020      LDD	R2,Z+0
     1E6 8031      LDD	R3,Z+1
     1E7 BA2B      OUT	0x1B,R2
(0036)  led_contrl_port |= (1<<count); //选中对应要显示的位,从右至左,0123
     1E8 E001      LDI	R16,1
     1E9 2D1A      MOV	R17,R10
     1EA 940E 0307 CALL	lsl8
     1EC B228      IN	R2,0x18
     1ED 2A20      OR	R2,R16
     1EE BA28      OUT	0x18,R2
     1EF 90C9      LD	R12,Y+
     1F0 90A9      LD	R10,Y+
     1F1 9508      RET
_display:
  temp                 --> R10
  mode                 --> R20
  data                 --> R12
     1F2 940E 02CA CALL	push_xgset303C
     1F4 2F42      MOV	R20,R18
     1F5 0168      MOVW	R12,R16
(0037)  //如果对位进行了调整,就不在是0123,而是对应的值
(0038) }
(0039) 
(0040) /***********************
(0041) ** 显示四位整数
(0042) ** 输入:要显示的四位数data,显示模式mode,1为补零显示模式,默认不显示零
(0043) ** 说明:可以小于四位数,mode=1时 自动补零
(0044) ************************/
(0045) void display(uint16 data,uint8 mode)
(0046) {
(0047)  uint8 temp;
(0048)  //千位
(0049)  if(data>1000)
     1F6 EE88      LDI	R24,0xE8
     1F7 E093      LDI	R25,3
     1F8 158C      CP	R24,R12
     1F9 059D      CPC	R25,R13
     1FA F478      BCC	0x020A
(0050)  {
(0051)   temp=data/1000;
     1FB EE28      LDI	R18,0xE8
     1FC E033      LDI	R19,3
     1FD 0186      MOVW	R16,R12
     1FE 940E 0270 CALL	div16u
     200 0158      MOVW	R10,R16
(0052)   display_one(3,temp);
     201 2D2A      MOV	R18,R10
     202 E003      LDI	R16,3
     203 DFD5      RCALL	_display_one
(0053)   delay_ms(6);  //6ms 是个经验值,刚好无闪烁,并且亮度较高
     204 E006      LDI	R16,6
     205 E010      LDI	R17,0
     206 940E 00A0 CALL	_delay_ms
(0054)   led_contrl_port &=~ (1<<3);
     208 98C3      CBI	0x18,3
(0055)  }
     209 C00A      RJMP	0x0214
(0056)  else
(0057)  {
(0058)   if(mode==1)
     20A 3041      CPI	R20,1
     20B F441      BNE	0x0214
(0059)   {
(0060)   display_one(3,0);
     20C 2722      CLR	R18
     20D E003      LDI	R16,3
     20E DFCA      RCALL	_display_one
(0061)   delay_ms(6);
     20F E006      LDI	R16,6
     210 E010      LDI	R17,0
     211 940E 00A0 CALL	_delay_ms
(0062)   led_contrl_port &=~ (1<<3);
     213 98C3      CBI	0x18,3
(0063)   }
(0064)  }
(0065)  //百位
(0066)  if(data>100)
     214 E684      LDI	R24,0x64
     215 E090      LDI	R25,0
     216 158C      CP	R24,R12
     217 059D      CPC	R25,R13
     218 F498      BCC	0x022C
(0067)  {
(0068)   temp=(data%1000)/100;
     219 EE28      LDI	R18,0xE8
     21A E033      LDI	R19,3
     21B 0186      MOVW	R16,R12
     21C 940E 026E CALL	mod16u
     21E E624      LDI	R18,0x64
     21F E030      LDI	R19,0
     220 940E 0270 CALL	div16u
     222 0158      MOVW	R10,R16
(0069)   display_one(2,temp);
     223 2D2A      MOV	R18,R10
     224 E002      LDI	R16,2
     225 DFB3      RCALL	_display_one
(0070)   delay_ms(6);
     226 E006      LDI	R16,6
     227 E010      LDI	R17,0
     228 940E 00A0 CALL	_delay_ms
(0071)   led_contrl_port &=~ (1<<2);
     22A 98C2      CBI	0x18,2
(0072)  }
     22B C00A      RJMP	0x0236
(0073)  else
(0074)  {
(0075)   if(mode==1)
     22C 3041      CPI	R20,1
     22D F441      BNE	0x0236
(0076)   {
(0077)   display_one(2,0);
     22E 2722      CLR	R18
     22F E002      LDI	R16,2
     230 DFA8      RCALL	_display_one
(0078)   delay_ms(6);
     231 E006      LDI	R16,6
     232 E010      LDI	R17,0
     233 940E 00A0 CALL	_delay_ms
(0079)   led_contrl_port &=~ (1<<2);
     235 98C2      CBI	0x18,2
(0080)   }
(0081)  }
(0082)  //十位
(0083)  if(data>10)
     236 E08A      LDI	R24,0xA
     237 E090      LDI	R25,0
     238 158C      CP	R24,R12
     239 059D      CPC	R25,R13
     23A F498      BCC	0x024E
(0084)  {
(0085)   temp=(data%100)/10;
     23B E624      LDI	R18,0x64
     23C E030      LDI	R19,0
     23D 0186      MOVW	R16,R12
     23E 940E 026E CALL	mod16u
     240 E02A      LDI	R18,0xA
     241 E030      LDI	R19,0
     242 940E 0270 CALL	div16u
     244 0158      MOVW	R10,R16
(0086)   display_one(1,temp);
     245 2D2A      MOV	R18,R10
     246 E001      LDI	R16,1
     247 DF91      RCALL	_display_one
(0087)   delay_ms(6);
     248 E006      LDI	R16,6
     249 E010      LDI	R17,0
     24A 940E 00A0 CALL	_delay_ms
(0088)   led_contrl_port &=~ (1<<1);
     24C 98C1      CBI	0x18,1
(0089)  }
     24D C00A      RJMP	0x0258
(0090)  else
(0091)  {
(0092)   if(mode==1)
     24E 3041      CPI	R20,1
     24F F441      BNE	0x0258
(0093)   {
(0094)   display_one(1,0);
     250 2722      CLR	R18
     251 E001      LDI	R16,1
     252 DF86      RCALL	_display_one
(0095)   delay_ms(6);
     253 E006      LDI	R16,6
     254 E010      LDI	R17,0
     255 940E 00A0 CALL	_delay_ms
(0096)   led_contrl_port &=~ (1<<1);
     257 98C1      CBI	0x18,1
(0097)   }
(0098)  }
(0099)  //个位
(0100)   temp=data%10;
     258 E02A      LDI	R18,0xA
     259 E030      LDI	R19,0
     25A 0186      MOVW	R16,R12
     25B 940E 026E CALL	mod16u
     25D 0158      MOVW	R10,R16
(0101)   display_one(0,temp);
     25E 2D2A      MOV	R18,R10
     25F 2700      CLR	R16
     260 DF78      RCALL	_display_one
(0102)   delay_ms(6);
     261 E006      LDI	R16,6
     262 E010      LDI	R17,0
     263 940E 00A0 CALL	_delay_ms
(0103)   led_contrl_port &=~ (1<<0);
     265 98C0      CBI	0x18,0
     266 940C 02D1 JMP	pop_xgset303C
(0104) }
(0105) 
(0106) /***********************
(0107) ** 显示四位浮点数
(0108) ** 输入:要显示的四位数
(0109) ** 说明:可以小于四位数,自动补零
(0110)    没有调通
(0111) ************************/
(0112) /*
(0113) void display_float(float data)
(0114) {
(0115)  uint8 temp;
(0116)  // 人为保证data的值,可以不要错误处理。
(0117)  if (data>1000)
(0118)  {
(0119)   led_error();
(0120)   break;
(0121)  }
(0122)  if (data<0)
(0123)  {
(0124)   led_error();
(0125)   break;
(0126)  }
(0127)  //
(0128)  if(data<1)       //比如 0.123
(0129)  {
(0130)   display_one(3,0);   //显示0.
(0131)   led_port |= 0x07; //点亮对应小数点
(0132)   delay_ms(6);
(0133)   led_contrl_port &=~ (1<<3);
(0134)   
(0135)   temp=(data*10);   // 0.123*10 = 1
(0136)   display_one(2,temp);
(0137)   delay_ms(6);
(0138)   led_contrl_port &=~ (1<<2);
(0139)   
(0140)   temp=(data*100)%10; // 0.123*100%10 = 2
(0141)   display_one(1,temp);
(0142)   delay_ms(6);
(0143)   led_contrl_port &=~ (1<<1);
(0144)   
(0145)   temp=(data*1000)%10; // 0.123*100%10 = 3
(0146)   display_one(0,temp);
(0147)   delay_ms(6);
(0148)   led_contrl_port &=~ (1<<0);
(0149)  }
(0150)  else if(data<10)  //比如1.234
(0151)  {
(0152)   temp=(data/1);   // 1.234/1 = 1
(0153)   display_one(3,temp);
(0154)   led_port |= 0x07; //点亮对应小数点
(0155)   delay_ms(6);
(0156)   led_contrl_port &=~ (1<<3);
(0157)   //第一位小数
(0158)   temp=(data*10)%10; // 1.234*10%10 = 2
(0159)   display_one(2,temp);
(0160)   delay_ms(6);
(0161)   led_contrl_port &=~ (1<<2);
(0162)   //第二位小数
(0163)   temp=(data*100)%10; // 1.234*100%10 = 3
(0164)   display_one(1,temp);
(0165)   delay_ms(6);
(0166)   led_contrl_port &=~ (1<<1);
(0167)   //第三位小数
(0168)   temp=(data*1000)%10; // 1.234*1000%10 = 4
(0169)   display_one(0,temp);
(0170)   delay_ms(6);
(0171)   led_contrl_port &=~ (1<<0);
(0172)  }
(0173)  else if(data<100)   // 例如12.34
(0174)  {
(0175)   temp=(data/10);   // 12.34/10=1
(0176)   display_one(3,temp);
(0177)   delay_ms(6);
(0178)   led_contrl_port &=~ (1<<3);
(0179)   
(0180)   temp=(data%10);   // 12.34%10=2
(0181)   display_one(2,temp);
(0182)   led_port |= 0x07; //点亮对应小数点
(0183)   delay_ms(6);
(0184)   led_contrl_port &=~ (1<<2);
(0185)   
(0186)   temp=(data*10)%10; // 12.34*10%10=3
(0187)   display_one(1,temp);
(0188)   delay_ms(6);
(0189)   led_contrl_port &=~ (1<<1);
(0190)    
(0191)   temp=(data*100)%10;// 12.34*100%10=4
(0192)   display_one(0,temp);
(0193)   delay_ms(6);
(0194)   led_contrl_port &=~ (1<<0);
(0195)  }
(0196)  else if(data<1000)  //比如123.4
(0197)  {
(0198)   temp=(data/100);// 123.4/100=1
(0199)   display_one(3,temp);
(0200)   delay_ms(6);
(0201)   led_contrl_port &=~ (1<<3);
(0202)   
(0203)   temp=(data%100)/10;// 123.4%100/10=2
(0204)   display_one(2,temp);
(0205)   delay_ms(6);
(0206)   led_contrl_port &=~ (1<<2);
(0207)   
(0208)   temp=(data%10);// 123.4%10=3
(0209)   display_one(1,temp);
(0210)   delay_ms(6);
(0211)   led_contrl_port &=~ (1<<1);
(0212)   
(0213)   temp=(data*10)%10;// 123.4*10%10=4
(0214)   display_one(0,temp);
(0215)   delay_ms(6);
(0216)   led_contrl_port &=~ (1<<0);
(0217)  }
(0218)  else led_error();
(0219) }
(0220) */
(0221) /***********************************************
(0222) ** 异常处理,led全亮 8。8。8。8。
(0223) ***********************************************/
(0224) void led_error(void)
(0225) {
(0226)  // 以下两句将会使LED全亮,如果立即更改状态,将看不出来效果
(0227)   led_port = 0xFF;
_led_error:

⌨️ 快捷键说明

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