📄 18b20.lst
字号:
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 + -