📄 ds18b20_lcd.lst
字号:
(0196) * 功能:向总线写一个字节 *
(0197) * 输入:需要写的字 *
(0198) ***************************************************************/
(0199) void WriteBits(char Byte)
(0200) {
(0201) char i = 0;
015A 2744 CLR R20
(0202) for (i=0;i<8;i++)
015B C007 RJMP 0x0163
(0203) {
(0204) if (Byte & 0x01)
015C FF60 SBRS R22,0
015D C002 RJMP 0x0160
(0205) {
(0206) Writr1();
015E DFEF RCALL _Writr1
(0207) }
015F C001 RJMP 0x0161
(0208) else
(0209) {
(0210) Writr0();
0160 DFE2 RCALL _Writr0
(0211) }
(0212) Byte>>=1;
0161 9566 LSR R22
0162 9543 INC R20
0163 3048 CPI R20,0x8
0164 F3B8 BCS 0x015C
0165 D129 RCALL pop_gset2
0166 9508 RET
(0213) }
(0214) }
(0215)
(0216) /***************************************************************
(0217) * 功能:DS18B20复位程序 *
(0218) * 返回:总线复位成功,返回1 *
(0219) ***************************************************************/
(0220) char Reset1820(void)
(0221) {
(0222) static char CheckTimes = 0;
(0223) static char CheckValue = 1;
(0224) delayus(664);
_Reset1820:
0167 E908 LDI R16,0x98
0168 E012 LDI R17,2
0169 DF69 RCALL _delayus
016A D2A0 RCALL 0x040B
(0225) Set_DQ1;
(0226) Set_DQ0; //拉低总线480us
(0227) delayus(332);
016B E40C LDI R16,0x4C
016C E011 LDI R17,1
016D DF65 RCALL _delayus
016E D2B4 RCALL 0x0423
(0228) Set_DQ1;
(0229) DDRC &= 0xf7; //设置端口为输入状态,读取数据
(0230) PORTC |= 0x08;
(0231) while(PINC&0x08); //等待,直至确认复位成功
016F 999B SBIC 0x13,3
0170 CFFE RJMP 0x016F
(0232) CheckValue = Read_DQ;
0171 B383 IN R24,0x13
0172 7088 ANDI R24,0x8
0173 93800061 STS CheckValue,R24
(0233) delayus(150);
0175 E906 LDI R16,0x96
0176 E010 LDI R17,0
0177 DF5B RCALL _delayus
(0234) return CheckValue;
0178 91000061 LDS R16,CheckValue
017A 9508 RET
(0235) }
(0236)
(0237) void Init1820(void)
(0238) {
(0239) /* if (Reset1820() == 0x08)
(0240) {
(0241) DisplayListChar(0,0,"1820 Not Detect $");
(0242) DisplayListChar(0,1," $");
(0243) }
(0244) else
(0245) {
(0246) DisplayListChar(0,0,"Init DS18B20 OK!$");
(0247) DisplayListChar(0,1," $");
(0248) }
(0249) */
(0250) WriteBits(MatchROM);
_Init1820:
017B EC0C LDI R16,0xCC
017C DFDB RCALL _WriteBits
(0251) WriteBits(WriteMode);
017D E40E LDI R16,0x4E
017E DFD9 RCALL _WriteBits
(0252) WriteBits(TH);
017F E604 LDI R16,0x64
0180 DFD7 RCALL _WriteBits
(0253) WriteBits(TL);
0181 E80A LDI R16,0x8A
0182 DFD5 RCALL _WriteBits
(0254) WriteBits(MatchTemp);
0183 E70F LDI R16,0x7F
0184 DFD3 RCALL _WriteBits
0185 9508 RET
_ReadBit:
i --> R20
Read_Value --> R20
0186 D116 RCALL push_gset1
(0255) }
(0256)
(0257) /***************************************************************
(0258) * 功能:从总线中读取数据位 *
(0259) * 返回:读取值 *
(0260) ***************************************************************/
(0261) char ReadBit(void)
(0262) {
(0263) char i = 0;
0187 2744 CLR R20
0188 D282 RCALL 0x040B
(0264) char Read_Value = 0;
(0265) Set_DQ1;
(0266) Set_DQ0;
(0267) asm("nop");
0189 0000 NOP
(0268) asm("nop");
018A 0000 NOP
(0269) asm("nop");
018B 0000 NOP
018C D25F RCALL <created procedures>
018D D295 RCALL 0x0423
(0270) asm("nop");
(0271) asm("nop");
(0272) asm("nop");
(0273) asm("nop");
(0274) asm("nop");
(0275) asm("nop");
(0276) asm("nop");
(0277) asm("nop");
(0278)
(0279) Set_DQ1;
(0280)
(0281) DDRC &= 0xf7; //设置端口为输入状态,读取数据
(0282) PORTC |= 0x08;
(0283)
(0284) Read_Value = Read_DQ;
018E B343 IN R20,0x13
018F 7048 ANDI R20,0x8
(0285) asm("nop");
0190 0000 NOP
(0286) asm("nop");
0191 0000 NOP
(0287) delayus(30);
0192 E10E LDI R16,0x1E
0193 E010 LDI R17,0
0194 DF3E RCALL _delayus
(0288) return Read_Value;
0195 2F04 MOV R16,R20
0196 D109 RCALL pop_gset1
0197 9508 RET
_ReadBits:
b --> R20
i --> R22
ReadBits_Value --> R10
0198 D100 RCALL push_gset3
(0289) }
(0290)
(0291)
(0292) /***************************************************************
(0293) * 功能:从总线读取一个字节 *
(0294) * 返回:读取到的字符 *
(0295) ***************************************************************/
(0296) char ReadBits(void)
(0297) {
(0298) char i = 0;
0199 2766 CLR R22
(0299) char b = 0;
019A 2744 CLR R20
(0300) char ReadBits_Value = 0;
019B 24AA CLR R10
(0301) for (i=8;i>0;i--)
019C E068 LDI R22,0x8
019D C009 RJMP 0x01A7
(0302) {
(0303) ReadBits_Value = ReadBits_Value>>1;
019E 94A6 LSR R10
(0304) b = ReadBit();
019F DFE6 RCALL _ReadBit
01A0 2F40 MOV R20,R16
(0305) if(b)
01A1 2300 TST R16
01A2 F019 BEQ 0x01A6
(0306) {
(0307) ReadBits_Value = ReadBits_Value|0x80;
01A3 2D8A MOV R24,R10
01A4 6880 ORI R24,0x80
01A5 2EA8 MOV R10,R24
01A6 956A DEC R22
01A7 2422 CLR R2
01A8 1626 CP R2,R22
01A9 F3A0 BCS 0x019E
(0308) }
(0309)
(0310) }
(0311) //DEC_Num_Disp(0,1,ReadBits_Value,5);
(0312) return ReadBits_Value;
01AA 2D0A MOV R16,R10
01AB D0E5 RCALL pop_gset3
01AC 9508 RET
_Get_Temperature:
i --> Y+3
01AD 9722 SBIW R28,2
(0313) }
(0314)
(0315) /***************************************************************
(0316) * 功能:获得温度值 *
(0317) * 返回:温度值--摄氏温度 *
(0318) ***************************************************************/
(0319) void Get_Temperature(void)
(0320) {
(0321) uint i;
(0322) static int TempLow = 0;
(0323) static int TempHi = 0;
(0324) static char Temp2 = 0;
(0325) static long final = 0;
(0326) Reset1820();
01AE DFB8 RCALL _Reset1820
(0327) WriteBits(MatchROM);
01AF EC0C LDI R16,0xCC
01B0 DFA7 RCALL _WriteBits
(0328) WriteBits(ConverTem);
01B1 E404 LDI R16,0x44
01B2 DFA5 RCALL _WriteBits
(0329) //for(i=0;i<20;i++)
(0330) //delayus(66);
(0331)
(0332) Reset1820();
01B3 DFB3 RCALL _Reset1820
(0333) WriteBits(MatchROM);
01B4 EC0C LDI R16,0xCC
01B5 DFA2 RCALL _WriteBits
(0334) WriteBits(Get_Value);
01B6 EB0E LDI R16,0xBE
01B7 DFA0 RCALL _WriteBits
(0335) //for(i=0;i<20;i++)
(0336) delayus(70);
01B8 E406 LDI R16,0x46
01B9 E010 LDI R17,0
01BA DF18 RCALL _delayus
(0337) TempLow = ReadBits(); //温度低位
01BB DFDC RCALL _ReadBits
01BC 2E20 MOV R2,R16
01BD 2433 CLR R3
01BE 92300063 STS TempLow+1,R3
01C0 92200062 STS TempLow,R2
(0338) delayus(70);
01C2 E406 LDI R16,0x46
01C3 E010 LDI R17,0
01C4 DF0E RCALL _delayus
(0339) TempHi = ReadBits();
01C5 DFD2 RCALL _ReadBits
01C6 2E20 MOV R2,R16
01C7 2433 CLR R3
01C8 92300065 STS TempHi+1,R3
01CA 92200064 STS TempHi,R2
(0340) //温度高位
(0341)
(0342)
(0343) final = (((TempHi)<<8)|TempLow)*0.0625;
01CC E206 LDI R16,0x26
01CD E010 LDI R17,0
01CE D0EE RCALL lpm32
01CF D24E RCALL 0x041E
01D0 90200062 LDS R2,TempLow
01D2 90300063 LDS R3,TempLow+1
01D4 91000064 LDS R16,TempHi
01D6 91100065 LDS R17,TempHi+1
01D8 2F10 MOV R17,R16
01D9 2700 CLR R16
01DA 2902 OR R16,R2
01DB 2913 OR R17,R3
01DC D12F RCALL int2fp
01DD D240 RCALL 0x041E
01DE D189 RCALL empy32f
01DF D0FC RCALL fp2long
01E0 93100068 STS final+1,R17
01E2 93000067 STS final,R16
01E4 9330006A STS final+3,R19
01E6 93200069 STS final+2,R18
(0344)
(0345)
(0346)
(0347) process(final,data);
01E8 EC80 LDI R24,0xC0
01E9 E090 LDI R25,0
01EA 8399 STD Y+1,R25
01EB 8388 STD Y+0,R24
01EC DE7D RCALL _process
(0348) DisplayListChar(3,1,data);
01ED EC80 LDI R24,0xC0
01EE D23B RCALL 0x042A
01EF E003 LDI R16,3
01F0 DF32 RCALL _DisplayListChar
01F1 9622 ADIW R28,2
01F2 9508 RET
(0349) }
(0350)
(0351) //call this routine to initialize all peripherals
(0352) void init_devices(void)
(0353) {
(0354) //stop errant interrupts until set up
(0355) CLI(); //disable all interrupts
_init_devices:
01F3 94F8 BCLR 7
(0356) port_init();
01F4 DEE5 RCALL _port_init
(0357) LCMInit(); //清屏
01F5 DF10 RCALL _LCMInit
(0358) MCUCR = 0x00;
01F6 2422 CLR R2
01F7 BE25 OUT 0x35,R2
(0359) GICR = 0x00;
01F8 BE2B OUT 0x3B,R2
(0360) TIMSK = 0x04; //timer interrupt sources
01F9 E084 LDI R24,4
01FA BF89 OUT 0x39,R24
(0361) SEI(); //re-enable interrupts
01FB 9478 BSET 7
01FC 9508 RET
_main:
i --> R20
01FD 9722 SBIW R28,2
(0362) //all peripherals are now initialized
(0363) }
(0364)
(0365) void main(void)
(0366) {
(0367) uchar i;
(0368) init_devices();
01FE DFF4 RCALL _init_devices
(0369) /*
(0370) delayms(5);
(0371) DisplayListChar(0,0,"Reset after sure$");
(0372) DisplayListChar(0,1," C $");
(0373) Init1820();
(0374) delayms(10);
(0375) */
(0376) DisplayListChar(0,0,"DS18B20+LCD$");
01FF EB83 LDI R24,0xB3
0200 D217 RCALL 0x0418
0201 DF21 RCALL _DisplayListChar
(0377) DisplayListChar(0,1,"Made by zhang_he$");
0202 EA81 LDI R24,0xA1
0203 D226 RCALL 0x042A
0204 2700 CLR R16
0205 DF1D RCALL _DisplayListChar
(0378) delayms(80);
0206 E500 LDI R16,0x50
0207 E010 LDI R17,0
0208 DEB8 RCALL _delayms
(0379) DisplayListChar(0,0,"Press the button$");
0209 E88F LDI R24,0x8F
020A D20D RCALL 0x0418
020B DF17 RCALL _DisplayListChar
(0380) while(PIND!=0xfe);
020C B380 IN R24,0x10
020D 3F8E CPI R24,0xFE
020E F7E9 BNE 0x020C
(0381) DisplayListChar(0,0," Now Temp: $");
020F E78D LDI R24,0x7D
0210 D207 RCALL 0x0418
0211 DF11 RCALL _DisplayListChar
(0382) DisplayListChar(0,1," C $");
0212 E68B LDI R24,0x6B
0213 D216 RCALL 0x042A
0214 2700 CLR R16
0215 DF0D RCALL _DisplayListChar
(0383)
(0384) for(i=0;;i++)
0216 2744 CLR R20
(0385) {
(0386) Get_Temperature();
FILE: <library>
0217 DF95 RCALL _Get_Temperature
0218 9543 INC R20
0219 CFFD RJMP 0x0217
021A 9622 ADIW R28,2
021B 9508 RET
push_arg4:
021C D201 RCALL 0x041E
push_arg2:
021D 9508 RET
div32u:
021E 94E8 BCLR 6
021F C001 RJMP 0x0221
mod32u:
0220 9468 BSET 6
0221 D02F RCALL long_div_prolog
0222 24CC CLR R12
0223 C008 RJMP 0x022C
div32s:
0224 94E8 BCLR 6
0225 C001 RJMP 0x0227
mod32s:
0226 9468 BSET 6
0227 D029 RCALL long_div_prolog
0228 FD37 SBRC R19,7
0229 D053 RCALL neg_R16_R19
022A FDB7 SBRC R27,7
022B D05A RCALL neg_R24_R27
022C 2477 CLR R7
022D 2488 CLR R8
022E 2499 CLR R9
022F 24AA CLR R10
0230 24BB CLR R11
0231 D041 RCALL tst_R16_R19
0232 F0C1 BEQ 0x024B
0233 D044 RCALL tst_R24_R27
0234 F0B1 BEQ 0x024B
0235 E2E8 LDI R30,0x28
0236 0F00 LSL R16
0237 1F11 ROL R17
0238 1F22 ROL R18
0239 1F33 ROL R19
023A 1C77 ROL R7
023B 1C88 ROL R8
023C 1C99 ROL R9
023D 1CAA ROL R10
023E 1CBB ROL R11
023F 1688 CP R8,R24
0240 0699 CPC R9,R25
0241 06AA CPC R10,R26
0242 06BB CPC R11,R27
0243 F028 BCS 0x0249
0244 1A88 SUB R8,R24
0245 0A99 SBC R9,R25
0246 0AAA SBC R10,R26
0247 0ABB SBC R11,R27
0248 9503 INC R16
0249 95EA DEC R30
024A F759 BNE 0x0236
024B F426 BRTC 0x0250
024C 2D08 MOV R16,R8
024D 2D19 MOV R17,R9
024E 2D2A MOV R18,R10
024F 2D3B MOV R19,R11
0250 C013 RJMP long_div_epilog
long_div_prolog:
0251 927A ST R7,-Y
0252 928A ST R8,-Y
0253 929A ST R9,-Y
0254 92AA ST R10,-Y
0255 92BA ST R11,-Y
0256 92CA ST R12,-Y
0257 93EA ST R30,-Y
0258 938A ST R24,-Y
0259 939A ST R25,-Y
025A 93AA ST R26,-Y
025B 93BA ST R27,-Y
025C 858B LDD R24,Y+11
025D 859C LDD R25,Y+12
025E 85AD LDD R26,Y+13
025F 85BE LDD R27,Y+14
0260 2EC3 MOV R12,R19
0261 F00E BRTS 0x0263
0262 26CB EOR R12,R27
0263 9508 RET
long_div_epilog:
0264 FCC7 SBRC R12,7
0265 D017 RCALL neg_R16_R19
0266 91B9 LD R27,Y+
0267 91A9 LD R26,Y+
0268 9199 LD R25,Y+
0269 9189 LD R24,Y+
026A 91E9 LD R30,Y+
026B 90C9 LD R12,Y+
026C 90B9 LD R11,Y+
026D 90A9 LD R10,Y+
026E 9099 LD R9,Y+
026F 9089 LD R8,Y+
0270 9079 LD R7,Y+
0271 9624 ADIW R28,4
0272 9508 RET
tst_R16_R19:
0273 2FE0 MOV R30,R16
0274 2BE1 OR R30,R17
0275 2BE2 OR R30,R18
0276 2BE3 OR R30,R19
0277 9508 RET
tst_R24_R27:
0278 2FE8 MOV R30,R24
0279 2BE9 OR R30,R25
027A 2BEA OR R30,R26
027B 2BEB OR R30,R27
027C 9508 RET
neg_R16_R19:
027D 9500 COM R16
027E 9510 COM R17
027F 9520 COM R18
0280 9530 COM R19
0281 5F0F SUBI R16,0xFF
0282 4F1F SBCI R17,0xFF
0283 4F2F SBCI R18,0xFF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -