📄 display_dhtxx.lst
字号:
00DC 24DD CLR R13
00DD 91800079 LDS R24,i
00DF 3083 CPI R24,3
00E0 F421 BNE 0x00E5
00E1 E081 LDI R24,1
00E2 E090 LDI R25,0
00E3 015C MOVW R10,R24
00E4 C002 RJMP 0x00E7
00E5 24AA CLR R10
00E6 24BB CLR R11
00E7 91800079 LDS R24,i
00E9 3085 CPI R24,5
00EA F419 BNE 0x00EE
00EB E061 LDI R22,1
00EC E070 LDI R23,0
00ED C002 RJMP 0x00F0
00EE 2766 CLR R22
00EF 2777 CLR R23
00F0 0117 MOVW R2,R14
00F1 282C OR R2,R12
00F2 283D OR R3,R13
00F3 282A OR R2,R10
00F4 283B OR R3,R11
00F5 2A26 OR R2,R22
00F6 2A37 OR R3,R23
00F7 2022 TST R2
00F8 F411 BNE 0x00FB
00F9 2033 TST R3
00FA F009 BEQ 0x00FC
(0185) {
(0186) PORTB|=0x80;
00FB 9AC7 SBI 0x18,7
(0187) }
(0188) DelaymS(1);
00FC E001 LDI R16,1
00FD E010 LDI R17,0
00FE DF6E RCALL _DelaymS
00FF 91800079 LDS R24,i
0101 5F8F SUBI R24,0xFF
0102 93800079 STS i,R24
0104 E085 LDI R24,5
0105 90200079 LDS R2,i
0107 1582 CP R24,R2
0108 F008 BCS 0x010A
0109 CF7B RJMP 0x0085
(0189) }
(0190) PORTD&=0x03;
010A B382 IN R24,0x12
010B 7083 ANDI R24,3
010C BB82 OUT 0x12,R24
(0191) PORTC&=0xF3;
010D B385 IN R24,0x15
010E 7F83 ANDI R24,0xF3
010F BB85 OUT 0x15,R24
0110 D1E6 RCALL pop_gset5
0111 9508 RET
(0192) }
(0193)
(0194) void delay1N(unsigned int Dcount) //(1u*Dcount)
(0195) {
_delay1N:
Dcount --> R16
0112 C003 RJMP 0x0116
(0196) while(Dcount--)
(0197) {
(0198) NOP();
0113 0000 NOP
(0199) NOP();
0114 0000 NOP
(0200) NOP();
0115 0000 NOP
0116 D21A RCALL 0x0331
0117 F7D9 BNE 0x0113
0118 2033 TST R3
0119 F7C9 BNE 0x0113
011A 9508 RET
(0201) }
(0202) }
(0203)
(0204) void Delay_10us(void)
(0205) {
(0206) U8 i; //2M时延时为 10us
(0207) i--;
_Delay_10us:
i --> R16
011B 950A DEC R16
(0208) i--;
011C 950A DEC R16
(0209) i--;
011D 950A DEC R16
(0210) i--;
011E 950A DEC R16
(0211) i--;
011F 950A DEC R16
(0212) i--;
0120 950A DEC R16
(0213) i--;
0121 950A DEC R16
(0214) i--;
0122 950A DEC R16
(0215) i--;
0123 950A DEC R16
(0216) i--;
0124 950A DEC R16
(0217) i--;
0125 950A DEC R16
(0218) i--;
0126 950A DEC R16
(0219) i--;
0127 950A DEC R16
0128 9508 RET
_COM:
i --> R20
0129 D1D7 RCALL push_gset1
(0220)
(0221) }
(0222)
(0223) void COM(void)
(0224) {
(0225)
(0226) U8 i;
(0227) for(i=0;i<8;i++)
012A 2744 CLR R20
012B C03E RJMP 0x016A
(0228) {
(0229)
(0230) U8FLAG=2;
012C E082 LDI R24,2
012D 93800078 STS U8FLAG,R24
(0231)
(0232) //while((!P2_0)&&U8FLAG++);
(0233) while((!(COM_R))&&U8FLAG++);
012F 999D SBIC 0x13,5
0130 C009 RJMP 0x013A
0131 90200078 LDS R2,U8FLAG
0133 2433 CLR R3
0134 2D82 MOV R24,R2
0135 5F8F SUBI R24,0xFF
0136 93800078 STS U8FLAG,R24
0138 2022 TST R2
0139 F7A9 BNE 0x012F
(0234) if(U8FLAG==1)break;
013A 91800078 LDS R24,U8FLAG
013C 3081 CPI R24,1
013D F409 BNE 0x013F
013E C02E RJMP 0x016D
(0235) Delay_10us();
013F DFDB RCALL _Delay_10us
(0236) Delay_10us();
0140 DFDA RCALL _Delay_10us
(0237) Delay_10us();
0141 DFD9 RCALL _Delay_10us
(0238) U8temp=0;
0142 2422 CLR R2
0143 92200075 STS U8temp,R2
(0239) //if(P2_0)U8temp=1;
(0240) if(COM_R)U8temp=1;
0145 9B9D SBIS 0x13,5
0146 C003 RJMP 0x014A
0147 E081 LDI R24,1
0148 93800075 STS U8temp,R24
(0241) U8FLAG=2;
014A E082 LDI R24,2
014B 93800078 STS U8FLAG,R24
(0242) //while((P2_0)&&U8FLAG++);
(0243) while((COM_R)&&U8FLAG++);
014D 9B9D SBIS 0x13,5
014E C009 RJMP 0x0158
014F 90200078 LDS R2,U8FLAG
0151 2433 CLR R3
0152 2D82 MOV R24,R2
0153 5F8F SUBI R24,0xFF
0154 93800078 STS U8FLAG,R24
0156 2022 TST R2
0157 F7A9 BNE 0x014D
(0244) //超时则跳出for循环
(0245) if(U8FLAG==1)break;
0158 91800078 LDS R24,U8FLAG
015A 3081 CPI R24,1
015B F409 BNE 0x015D
015C C010 RJMP 0x016D
(0246) //判断数据位是0还是1
(0247)
(0248) // 如果高电平高过预定0高电平值则数据位为 1
(0249)
(0250) U8comdata<<=1;
015D 9020006A LDS R2,U8comdata
015F 0C22 LSL R2
0160 9220006A STS U8comdata,R2
(0251) U8comdata|=U8temp; //0
0162 90200075 LDS R2,U8temp
0164 9030006A LDS R3,U8comdata
0166 2832 OR R3,R2
0167 9230006A STS U8comdata,R3
0169 9543 INC R20
016A 3048 CPI R20,0x8
016B F408 BCC 0x016D
016C CFBF RJMP 0x012C
016D D196 RCALL pop_gset1
016E 9508 RET
(0252) }//rof
(0253)
(0254) }
(0255)
(0256) //--------------------------------
(0257) //-----湿度读取子程序 ------------
(0258) //--------------------------------
(0259) //----以下变量均为全局变量--------
(0260) //----温度高8位== U8T_data_H------
(0261) //----温度低8位== U8T_data_L------
(0262) //----湿度高8位== U8RH_data_H-----
(0263) //----湿度低8位== U8RH_data_L-----
(0264) //----校验 8位 == U8checkdata-----
(0265) //----调用相关子程序如下----------
(0266) //---- Delay();, Delay_10us();,COM();
(0267) //--------------------------------
(0268)
(0269) void RH(void)
(0270) {
(0271)
(0272) //主机拉低18ms
(0273) //P2_0=0;
(0274) COM_OUT;
_RH:
016F 9AA5 SBI 0x14,5
(0275) COM_CLR;
0170 98AD CBI 0x15,5
(0276) //DelaymS(18);
(0277) DelaymS(5);
0171 E005 LDI R16,5
0172 E010 LDI R17,0
0173 DEF9 RCALL _DelaymS
(0278) Display(); //总延时22ms
0174 DF0B RCALL _Display
(0279) DelaymS(5);
0175 E005 LDI R16,5
0176 E010 LDI R17,0
0177 DEF5 RCALL _DelaymS
(0280) Display();
0178 DF07 RCALL _Display
(0281) //P2_0=1;
(0282) COM_IN;
0179 98A5 CBI 0x14,5
(0283) COM_SET;
017A 9AAD SBI 0x15,5
(0284)
(0285) //总线由上拉电阻拉高 主机延时20us
(0286) Delay_10us();
017B DF9F RCALL _Delay_10us
(0287) Delay_10us();
017C DF9E RCALL _Delay_10us
(0288) Delay_10us();
017D DF9D RCALL _Delay_10us
(0289) Delay_10us();
017E DF9C RCALL _Delay_10us
(0290) //主机设为输入 判断从机响应信号
(0291) //P2_0=1;
(0292)
(0293) //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
(0294) // if(!P2_0) //T !
(0295) if(COM_R)U8FLAG=1;
017F 9B9D SBIS 0x13,5
0180 C05D RJMP 0x01DE
0181 E081 LDI R24,1
0182 93800078 STS U8FLAG,R24
0184 C059 RJMP 0x01DE
(0296) while(!(COM_R))
(0297) {
(0298) U8FLAG=2;
0185 E082 LDI R24,2
0186 93800078 STS U8FLAG,R24
(0299) //判断从机是否发出 80us 的低电平响应信号是否结束
(0300) //while((!P2_0)&&U8FLAG++);
(0301) while((!(COM_R))&&U8FLAG++);
0188 999D SBIC 0x13,5
0189 C009 RJMP 0x0193
018A 90200078 LDS R2,U8FLAG
018C 2433 CLR R3
018D 2D82 MOV R24,R2
018E 5F8F SUBI R24,0xFF
018F 93800078 STS U8FLAG,R24
0191 2022 TST R2
0192 F7A9 BNE 0x0188
(0302) if(U8FLAG==1)break;
0193 91800078 LDS R24,U8FLAG
0195 3081 CPI R24,1
0196 F409 BNE 0x0198
0197 C048 RJMP 0x01E0
(0303) U8FLAG=2;
0198 E082 LDI R24,2
0199 93800078 STS U8FLAG,R24
(0304) //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
(0305) //while((P2_0)&&U8FLAG++);
(0306) while((COM_R)&&U8FLAG++);
019B 9B9D SBIS 0x13,5
019C C009 RJMP 0x01A6
019D 90200078 LDS R2,U8FLAG
019F 2433 CLR R3
01A0 2D82 MOV R24,R2
01A1 5F8F SUBI R24,0xFF
01A2 93800078 STS U8FLAG,R24
01A4 2022 TST R2
01A5 F7A9 BNE 0x019B
(0307) if(U8FLAG==1)break;
01A6 91800078 LDS R24,U8FLAG
01A8 3081 CPI R24,1
01A9 F409 BNE 0x01AB
01AA C035 RJMP 0x01E0
(0308) //数据接收状态
(0309) COM();
01AB DF7D RCALL _COM
(0310) if(U8FLAG==1)break;
01AC 91800078 LDS R24,U8FLAG
01AE 3081 CPI R24,1
01AF F409 BNE 0x01B1
01B0 C02F RJMP 0x01E0
(0311) U8T_data_H_temp=U8comdata;
01B1 9020006A LDS R2,U8comdata
01B3 9220006F STS U8T_data_H_temp,R2
(0312) COM();
01B5 DF73 RCALL _COM
(0313) if(U8FLAG==1)break;
01B6 91800078 LDS R24,U8FLAG
01B8 3081 CPI R24,1
01B9 F409 BNE 0x01BB
01BA C025 RJMP 0x01E0
(0314) U8T_data_L_temp=U8comdata;
01BB 9020006A LDS R2,U8comdata
01BD 9220006E STS U8T_data_L_temp,R2
(0315) COM();
01BF DF69 RCALL _COM
(0316) if(U8FLAG==1)break;
01C0 91800078 LDS R24,U8FLAG
01C2 3081 CPI R24,1
01C3 F409 BNE 0x01C5
01C4 C01B RJMP 0x01E0
(0317) U8RH_data_H_temp=U8comdata;
01C5 9020006A LDS R2,U8comdata
01C7 9220006D STS U8RH_data_H_temp,R2
(0318) COM();
01C9 DF5F RCALL _COM
(0319) if(U8FLAG==1)break;
01CA 91800078 LDS R24,U8FLAG
01CC 3081 CPI R24,1
01CD F409 BNE 0x01CF
01CE C011 RJMP 0x01E0
(0320) U8RH_data_L_temp=U8comdata;
01CF 9020006A LDS R2,U8comdata
01D1 9220006C STS U8RH_data_L_temp,R2
(0321) COM();
01D3 DF55 RCALL _COM
(0322) if(U8FLAG==1)break;
01D4 91800078 LDS R24,U8FLAG
01D6 3081 CPI R24,1
01D7 F409 BNE 0x01D9
01D8 C007 RJMP 0x01E0
(0323) U8checkdata_temp=U8comdata;
01D9 9020006A LDS R2,U8comdata
01DB 9220006B STS U8checkdata_temp,R2
(0324) break;
01DD C002 RJMP 0x01E0
01DE 9B9D SBIS 0x13,5
01DF CFA5 RJMP 0x0185
(0325) }//while
(0326) //P2_0=1;
(0327) COM_IN;
01E0 98A5 CBI 0x14,5
(0328) COM_SET;
01E1 9AAD SBI 0x15,5
(0329) //数据校验
(0330)
(0331) U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
01E2 9020006E LDS R2,U8T_data_L_temp
01E4 9030006F LDS R3,U8T_data_H_temp
01E6 0C32 ADD R3,R2
01E7 9020006D LDS R2,U8RH_data_H_temp
01E9 0C32 ADD R3,R2
01EA 9020006C LDS R2,U8RH_data_L_temp
01EC 0C32 ADD R3,R2
01ED 92300075 STS U8temp,R3
(0332) if(U8temp==U8checkdata_temp)
01EF 9020006B LDS R2,U8checkdata_temp
01F1 1432 CP R3,R2
01F2 F4A1 BNE 0x0207
(0333) {
(0334) U8T_data_H=U8T_data_H_temp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -