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

📄 18b20.lst

📁 一个关于AVR单片机的例程
💻 LST
📖 第 1 页 / 共 4 页
字号:
    013D B366      IN	R22,0x16
    013E 7160      ANDI	R22,0x10
(0050)       if(k)  
    013F F031      BEQ	0x0146
(0051)       temp|=(1<<n);  
    0140 E001      LDI	R16,1
    0141 2D1A      MOV	R17,R10
    0142 940E0382  CALL	lsl8
    0144 2B40      OR	R20,R16
    0145 C007      RJMP	0x014D
(0052)       else  
(0053)       temp&=~(1<<n);  
    0146 E001      LDI	R16,1
    0147 2D1A      MOV	R17,R10
    0148 940E0382  CALL	lsl8
    014A 2E20      MOV	R2,R16
    014B 9420      COM	R2
    014C 2142      AND	R20,R2
(0054)       delay_us(50); //60~120us      
    014D E302      LDI	R16,0x32
    014E E010      LDI	R17,0
    014F 940E0098  CALL	_delay_us
(0055)       SET_DIR_1WIRE;  
    0151 9ABC      SBI	0x17,4
    0152 94A3      INC	R10
    0153 2D8A      MOV	R24,R10
    0154 3088      CPI	R24,0x8
    0155 F320      BCS	0x013A
(0056)     }  
(0057)    return (temp);  
    0156 2F04      MOV	R16,R20
    0157 940E0340  CALL	pop_gset3
    0159 9508      RET
_gettemp:
  wm3                  --> R22
  wm1                  --> R22
  wm0                  --> R20
  teml                 --> R10
  wm2                  --> R20
  temh                 --> R12
    015A 940E0346  CALL	push_gset5
    015C 9724      SBIW	R28,4
(0058) }   
(0059) 
(0060) void gettemp(void)         //读取温度值 
(0061) {  
(0062)      unsigned char temh,teml,wm0,wm1,wm2,wm3;  
(0063)      init_1820();        //复位18b20  
    015D DFA5      RCALL	_init_1820
(0064)      write_1820(0xcc);   // 发出转换命令  
    015E EC0C      LDI	R16,0xCC
    015F DFB9      RCALL	_write_1820
(0065)      write_1820(0x44); 
    0160 E404      LDI	R16,0x44
    0161 DFB7      RCALL	_write_1820
(0066)  //  delay_nms(800);     //不延时也好使,不知道怎么回事! 
(0067)      init_1820();  
    0162 DFA0      RCALL	_init_1820
(0068)      write_1820(0xcc);  //发出读命令  
    0163 EC0C      LDI	R16,0xCC
    0164 DFB4      RCALL	_write_1820
(0069)      write_1820(0xbe);  
    0165 EB0E      LDI	R16,0xBE
    0166 DFB2      RCALL	_write_1820
(0070)      teml=read_1820();  //读数据  
    0167 DFCD      RCALL	_read_1820
    0168 2EA0      MOV	R10,R16
(0071)      temh=read_1820();  
    0169 DFCB      RCALL	_read_1820
    016A 2EC0      MOV	R12,R16
(0072)      wm0=teml>>4;       //只要高8位的低四位和低8位的高四位,温度范围0~99啦! 
    016B 2D4A      MOV	R20,R10
    016C 9542      SWAP	R20
    016D 704F      ANDI	R20,0xF
(0073)      wm1=temh<<4;
    016E 2D6C      MOV	R22,R12
    016F 706F      ANDI	R22,0xF
    0170 9562      SWAP	R22
(0074) 	 
(0075) //count=(temh*256+teml)*6.25;  //计算具体温度 	 
(0076) if((temh&0xF8) == 0xF8)  
    0171 2D8C      MOV	R24,R12
    0172 7F88      ANDI	R24,0xF8
    0173 3F88      CPI	R24,0xF8
    0174 F009      BEQ	0x0176
    0175 C065      RJMP	0x01DB
(0077) { 
(0078)    flag=1; 
    0176 E081      LDI	R24,1
    0177 93800061  STS	flag,R24
(0079)    count=((0xFF-temh)*256+(0xFF-teml))*6.25; 
    0179 E508      LDI	R16,0x58
    017A E010      LDI	R17,0
    017B 940E036E  CALL	lpm32
    017D 933A      ST	R19,-Y
    017E 932A      ST	R18,-Y
    017F 931A      ST	R17,-Y
    0180 930A      ST	R16,-Y
    0181 2C2C      MOV	R2,R12
    0182 2433      CLR	R3
    0183 EF2F      LDI	R18,0xFF
    0184 E030      LDI	R19,0
    0185 1922      SUB	R18,R2
    0186 0933      SBC	R19,R3
    0187 E000      LDI	R16,0
    0188 E011      LDI	R17,1
    0189 940E032D  CALL	empy16s
    018B 0118      MOVW	R2,R16
    018C 2C4A      MOV	R4,R10
    018D 2455      CLR	R5
    018E EF8F      LDI	R24,0xFF
    018F E090      LDI	R25,0
    0190 1984      SUB	R24,R4
    0191 0995      SBC	R25,R5
    0192 0E28      ADD	R2,R24
    0193 1E39      ADC	R3,R25
    0194 0181      MOVW	R16,R2
    0195 940E03D0  CALL	int2fp
    0197 933A      ST	R19,-Y
    0198 932A      ST	R18,-Y
    0199 931A      ST	R17,-Y
    019A 930A      ST	R16,-Y
    019B 940E04BF  CALL	empy32f
    019D 01FE      MOVW	R30,R28
    019E 8300      STD	Z+0,R16
    019F 8311      STD	Z+1,R17
    01A0 8322      STD	Z+2,R18
    01A1 8333      STD	Z+3,R19
    01A2 01FE      MOVW	R30,R28
    01A3 8020      LDD	R2,Z+0
    01A4 8031      LDD	R3,Z+1
    01A5 8042      LDD	R4,Z+2
    01A6 8053      LDD	R5,Z+3
    01A7 925A      ST	R5,-Y
    01A8 924A      ST	R4,-Y
    01A9 923A      ST	R3,-Y
    01AA 922A      ST	R2,-Y
    01AB E504      LDI	R16,0x54
    01AC E010      LDI	R17,0
    01AD 940E036E  CALL	lpm32
    01AF 933A      ST	R19,-Y
    01B0 932A      ST	R18,-Y
    01B1 931A      ST	R17,-Y
    01B2 930A      ST	R16,-Y
    01B3 940E048B  CALL	cmp32f
    01B5 F0D4      BLT	0x01D0
    01B6 01FE      MOVW	R30,R28
    01B7 8020      LDD	R2,Z+0
    01B8 8031      LDD	R3,Z+1
    01B9 8042      LDD	R4,Z+2
    01BA 8053      LDD	R5,Z+3
    01BB 925A      ST	R5,-Y
    01BC 924A      ST	R4,-Y
    01BD 923A      ST	R3,-Y
    01BE 922A      ST	R2,-Y
    01BF E504      LDI	R16,0x54
    01C0 E010      LDI	R17,0
    01C1 940E036E  CALL	lpm32
    01C3 933A      ST	R19,-Y
    01C4 932A      ST	R18,-Y
    01C5 931A      ST	R17,-Y
    01C6 930A      ST	R16,-Y
    01C7 940E0435  CALL	sub32f
    01C9 940E0388  CALL	fp2int
    01CB 01C8      MOVW	R24,R16
    01CC 5080      SUBI	R24,0
    01CD 4890      SBCI	R25,0x80
    01CE 017C      MOVW	R14,R24
    01CF C008      RJMP	0x01D8
    01D0 01FE      MOVW	R30,R28
    01D1 8100      LDD	R16,Z+0
    01D2 8111      LDD	R17,Z+1
    01D3 8122      LDD	R18,Z+2
    01D4 8133      LDD	R19,Z+3
    01D5 940E0388  CALL	fp2int
    01D7 0178      MOVW	R14,R16
    01D8 92E00060  STS	count,R14
(0080)    //count=((0xFF-temh)*256+(0xFF-teml))*625; 
(0081) } 
    01DA C05C      RJMP	0x0237
(0082) else 
(0083) {    
(0084)    flag=0; 
    01DB 2422      CLR	R2
    01DC 92200061  STS	flag,R2
(0085)    count=(temh*256+teml)*6.25; 
    01DE E508      LDI	R16,0x58
    01DF E010      LDI	R17,0
    01E0 940E036E  CALL	lpm32
    01E2 933A      ST	R19,-Y
    01E3 932A      ST	R18,-Y
    01E4 931A      ST	R17,-Y
    01E5 930A      ST	R16,-Y
    01E6 2D2C      MOV	R18,R12
    01E7 2733      CLR	R19
    01E8 E000      LDI	R16,0
    01E9 E011      LDI	R17,1
    01EA 940E032D  CALL	empy16s
    01EC 0118      MOVW	R2,R16
    01ED 2C4A      MOV	R4,R10
    01EE 2455      CLR	R5
    01EF 0C24      ADD	R2,R4
    01F0 1C35      ADC	R3,R5
    01F1 0181      MOVW	R16,R2
    01F2 940E03D0  CALL	int2fp
    01F4 933A      ST	R19,-Y
    01F5 932A      ST	R18,-Y
    01F6 931A      ST	R17,-Y
    01F7 930A      ST	R16,-Y
    01F8 940E04BF  CALL	empy32f
    01FA 01FE      MOVW	R30,R28
    01FB 8300      STD	Z+0,R16
    01FC 8311      STD	Z+1,R17
    01FD 8322      STD	Z+2,R18
    01FE 8333      STD	Z+3,R19
    01FF 01FE      MOVW	R30,R28
    0200 8020      LDD	R2,Z+0
    0201 8031      LDD	R3,Z+1
    0202 8042      LDD	R4,Z+2
    0203 8053      LDD	R5,Z+3
    0204 925A      ST	R5,-Y
    0205 924A      ST	R4,-Y
    0206 923A      ST	R3,-Y
    0207 922A      ST	R2,-Y
    0208 E504      LDI	R16,0x54
    0209 E010      LDI	R17,0
    020A 940E036E  CALL	lpm32
    020C 933A      ST	R19,-Y
    020D 932A      ST	R18,-Y
    020E 931A      ST	R17,-Y
    020F 930A      ST	R16,-Y
    0210 940E048B  CALL	cmp32f
    0212 F0D4      BLT	0x022D
    0213 01FE      MOVW	R30,R28
    0214 8020      LDD	R2,Z+0
    0215 8031      LDD	R3,Z+1
    0216 8042      LDD	R4,Z+2
    0217 8053      LDD	R5,Z+3
    0218 925A      ST	R5,-Y
    0219 924A      ST	R4,-Y
    021A 923A      ST	R3,-Y
    021B 922A      ST	R2,-Y
    021C E504      LDI	R16,0x54
    021D E010      LDI	R17,0
    021E 940E036E  CALL	lpm32
    0220 933A      ST	R19,-Y
    0221 932A      ST	R18,-Y
    0222 931A      ST	R17,-Y
    0223 930A      ST	R16,-Y
    0224 940E0435  CALL	sub32f
    0226 940E0388  CALL	fp2int
    0228 01C8      MOVW	R24,R16
    0229 5080      SUBI	R24,0
    022A 4890      SBCI	R25,0x80
    022B 015C      MOVW	R10,R24
    022C C008      RJMP	0x0235
    022D 01FE      MOVW	R30,R28
    022E 8100      LDD	R16,Z+0
    022F 8111      LDD	R17,Z+1
    0230 8122      LDD	R18,Z+2
    0231 8133      LDD	R19,Z+3
    0232 940E0388  CALL	fp2int
    0234 0158      MOVW	R10,R16
    0235 92A00060  STS	count,R10
(0086)    //count=(temh*256+teml)*625; //计算具体温度  
(0087) }
(0088)      wm2=wm1+wm0;        //16进制转10进制 
    0237 2E26      MOV	R2,R22
    0238 0E24      ADD	R2,R20
    0239 2D42      MOV	R20,R2
(0089)      wm3=wm2/100; 
    023A E614      LDI	R17,0x64
    023B 2D02      MOV	R16,R2
    023C 940E0317  CALL	div8u
    023E 2F60      MOV	R22,R16
(0090)      wmh=(wm2%100)/10;   //出口参数了!wmh是显示的高位,wml是显示的低位 
    023F E614      LDI	R17,0x64
    0240 2F04      MOV	R16,R20
    0241 940E0315  CALL	mod8u
    0243 E01A      LDI	R17,0xA
    0244 940E0317  CALL	div8u
    0246 93000063  STS	wmh,R16
(0091)      wml=(wm2%100)%10;
    0248 E614      LDI	R17,0x64
    0249 2F04      MOV	R16,R20
    024A 940E0315  CALL	mod8u
    024C E01A      LDI	R17,0xA
    024D 940E0315  CALL	mod8u
    024F 93000062  STS	wml,R16
    0251 9624      ADIW	R28,4
    0252 940E0343  CALL	pop_gset5
    0254 9508      RET
FILE: C:\DOCUME~1\administrator\桌面\教程\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:
    0255 EF8F      LDI	R24,0xFF
    0256 BB8A      OUT	0x1A,R24
(0022)  led_contrl_ddr |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d); //ABCD四个控制设为输出
    0257 B387      IN	R24,0x17
    0258 608F      ORI	R24,0xF
    0259 BB87      OUT	0x17,R24
    025A 9508      RET
_display_one:
  data                 --> R22
  count                --> R20
    025B 940E034C  CALL	push_gset2
    025D 2F62      MOV	R22,R18
    025E 2F40      MOV	R20,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];    //显示的数
    025F E082      LDI	R24,2
    0260 9F86      MUL	R24,R22
    0261 01F0      MOVW	R30,R0
    0262 E58C      LDI	R24,0x5C
    0263 E090      LDI	R25,0
    0264 0FE8      ADD	R30,R24
    0265 1FF9      ADC	R31,R25
    0266 9005      LPM	R0,Z+
    0267 9014      LPM	R1,0(Z)
    0268 01F0      MOVW	R30,R0
    0269 BBEB      OUT	0x1B,R30
(0036)  led_contrl_port |= (1<<count); //选中对应要显示的位,从右至左,0123
    026A E001      LDI	R16,1
    026B 2F14      MOV	R17,R20
    026C 940E0382  CALL	lsl8
    026E B228      IN	R2,0x18
    026F 2A20      OR	R2,R16
    0270 BA28      OUT	0x18,R2
    0271 940E033D  CALL	pop_gset2
    0273 9508      RET
_display:
  temp                 --> R20
  mode                 --> R10
  data                 --> R22
    0274 940E034A  CALL	push_gset3
    0276 2EA2      MOV	R10,R18
    0277 01B8      MOVW	R22,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)
    0278 EE88      LDI	R24,0xE8
    0279 E093      LDI	R25,3
    027A 1786      CP	R24,R22
    027B 0797      CPC	R25,R23
    027C F478      BCC	0x028C
(0050)  {
(0051)   temp=data/1000;
    027D EE28      LDI	R18,0xE8
    027E E033      LDI	R19,3
    027F 018B      MOVW	R16,R22
    0280 940E02FB  CALL	div16u
    0282 2F40      MOV	R20,R16
(0052)   display_one(3,temp);
    0283 2F24      MOV	R18,R20
    0284 E003      LDI	R16,3
    0285 DFD5      RCALL	_display_one
(0053)   delay_ms(6);  //6ms 是个经验值,刚好无闪烁,并且亮度较高
    0286 E006      LDI	R16,6
    0287 E010      LDI	R17,0
    0288 940E00A6  CALL	_delay_ms
(0054)   led_contrl_port &=~ (1<<3);
    028A 98C3      CBI	0x18,3
(0055)  }
    028B C00B      RJMP	0x0297
(0056)  else
(0057)  {
(0058)   if(mode==1)
    028C 2D8A      MOV	R24,R10
    028D 3081      CPI	R24,1
    028E F441      BNE	0x0297
(0059)   {
(0060)   display_one(3,0);
    028F 2722      CLR	R18
    0290 E003      LDI	R16,3
    0291 DFC9      RCALL	_display_one
(0061)   delay_ms(6);
    0292 E006      LDI	R16,6
    0293 E010      LDI	R17,0
    0294 940E00A6  CALL	_delay_ms
(0062)   led_contrl_port &=~ (1<<3);
    0296 98C3      CBI	0x18,3
(0063)   }
(0064)  }
(0065)  //百位
(0066)  if(data>100)
    0297 E684      LDI	R24,0x64
    0298 E090      LDI	R25,0
    0299 1786      CP	R24,R22
    029A 0797      CPC	R25,R23
    029B F498      BCC	0x02AF
(0067)  {
(0068)   temp=(data%1000)/100;
    029C EE28      LDI	R18,0xE8
    029D E033      LDI	R19,3
    029E 018B      MOVW	R16,R22
    029F 940E02F9  CALL	mod16u

⌨️ 快捷键说明

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