📄 ze015_1.lst
字号:
05C1 924001EF STS i_humid_AD,R4
(0230) if (i_humid_AD<=9) i_humid10 =0; //20071229无电压时为0.1635V(AD=9)
05C3 E089 LDI R24,0x9
05C4 1584 CP R24,R4
05C5 F020 BCS 0x05CA
05C6 2422 CLR R2
05C7 92200190 STS i_humid10,R2
05C9 C059 RJMP 0x0623
(0231) else i_humid10 =i_humid_AD*0.8-3; //20071105 5A时电压为1.234V,4A时电压为1V。
05CA EF0C LDI R16,0xFC
05CB E014 LDI R17,4
05CC 940E26F3 CALL lpm32
05CE 933A ST R19,-Y
05CF 932A ST R18,-Y
05D0 931A ST R17,-Y
05D1 930A ST R16,-Y
05D2 910001EF LDS R16,i_humid_AD
05D4 2711 CLR R17
05D5 940E2784 CALL int2fp
05D7 933A ST R19,-Y
05D8 932A ST R18,-Y
05D9 931A ST R17,-Y
05DA 930A ST R16,-Y
05DB 940E2870 CALL empy32fs
05DD EF08 LDI R16,0xF8
05DE E014 LDI R17,4
05DF 940E26F3 CALL lpm32
05E1 933A ST R19,-Y
05E2 932A ST R18,-Y
05E3 931A ST R17,-Y
05E4 930A ST R16,-Y
05E5 940E27E9 CALL sub32f
05E7 01FE MOVW R30,R28
05E8 8300 STD Z+0,R16
05E9 8311 STD Z+1,R17
05EA 8322 STD Z+2,R18
05EB 8333 STD Z+3,R19
05EC 01FE MOVW R30,R28
05ED 8020 LDD R2,Z+0
05EE 8031 LDD R3,Z+1
05EF 8042 LDD R4,Z+2
05F0 8053 LDD R5,Z+3
05F1 925A ST R5,-Y
05F2 924A ST R4,-Y
05F3 923A ST R3,-Y
05F4 922A ST R2,-Y
05F5 EF04 LDI R16,0xF4
05F6 E014 LDI R17,4
05F7 940E26F3 CALL lpm32
05F9 933A ST R19,-Y
05FA 932A ST R18,-Y
05FB 931A ST R17,-Y
05FC 930A ST R16,-Y
05FD 940E283F CALL cmp32f
05FF F0CC BLT 0x0619
0600 01FE MOVW R30,R28
0601 8020 LDD R2,Z+0
0602 8031 LDD R3,Z+1
0603 8042 LDD R4,Z+2
0604 8053 LDD R5,Z+3
0605 925A ST R5,-Y
0606 924A ST R4,-Y
0607 923A ST R3,-Y
0608 922A ST R2,-Y
0609 EF04 LDI R16,0xF4
060A E014 LDI R17,4
060B 940E26F3 CALL lpm32
060D 933A ST R19,-Y
060E 932A ST R18,-Y
060F 931A ST R17,-Y
0610 930A ST R16,-Y
0611 940E27E9 CALL sub32f
0613 940E273C CALL fp2int
0615 01A8 MOVW R20,R16
0616 5040 SUBI R20,0
0617 4850 SBCI R21,0x80
0618 C008 RJMP 0x0621
0619 01FE MOVW R30,R28
061A 8100 LDD R16,Z+0
061B 8111 LDD R17,Z+1
061C 8122 LDD R18,Z+2
061D 8133 LDD R19,Z+3
061E 940E273C CALL fp2int
0620 01A8 MOVW R20,R16
0621 93400190 STS i_humid10,R20
(0232) ADsum_times=0;
0623 2422 CLR R2
0624 922001F0 STS ADsum_times,R2
(0233) i_i_humid_sumADH=00; //
0626 2433 CLR R3
0627 923001DB STS i_i_humid_sumADH+1,R3
0629 922001DA STS i_i_humid_sumADH,R2
(0234) i_i_humid_sumADL=00; //
062B 923001DD STS i_i_humid_sumADL+1,R3
062D 922001DC STS i_i_humid_sumADL,R2
(0235) }
062F 9624 ADIW R28,4
0630 940E26D6 CALL pop_gset1
0632 9508 RET
_s_write_byte:
error --> R20
i --> R20
value --> R22
0633 940E26D1 CALL push_gset2
0635 2F60 MOV R22,R16
(0236) }
(0237)
(0238)
(0239)
(0240) /**************************************************/
(0241) //writes a byte on the Sensibus and checks the acknowlege
(0242) //char s_write_byte(unsigned char value)
(0243) void s_write_byte(unsigned char value)
(0244) {
(0245) unsigned char i,error=0;
0636 2744 CLR R20
(0246) for (i=0x80;i>0;i/=2) //从最高位开始取数据,右移8次,送到DATA线上后,置SCK脉冲输出
0637 E840 LDI R20,0x80
0638 C011 RJMP 0x064A
(0247) {
(0248) if (i & value) PORTC |=b_rt1_data; //1则置DATA=1
0639 2E24 MOV R2,R20
063A 2226 AND R2,R22
063B F011 BEQ 0x063E
063C 9AAA SBI 0x15,2
063D C001 RJMP 0x063F
(0249) else PORTC &=~b_rt1_data; //0则置DATA=0
063E 98AA CBI 0x15,2
(0250) NOP(); NOP();NOP(); NOP();NOP(); NOP();
063F 0000 NOP
0640 0000 NOP
0641 0000 NOP
0642 0000 NOP
0643 0000 NOP
0644 0000 NOP
(0251) PORTD |=b_rt1_sck; //sck=1
0645 9A97 SBI 0x12,7
(0252) delay_20us();
0646 D37D RCALL _delay_20us
(0253) PORTD &=~b_rt1_sck; //sck=0
0647 9897 CBI 0x12,7
(0254) delay_20us();
0648 D37B RCALL _delay_20us
0649 9546 LSR R20
064A 2422 CLR R2
064B 1624 CP R2,R20
064C F360 BCS 0x0639
(0255) }
(0256) PORTC |=b_rt1_data; //送完8位-1个字节后将数据线置高,检查SHT的应答。
064D 9AAA SBI 0x15,2
(0257) NOP();NOP();
064E 0000 NOP
064F 0000 NOP
(0258) PORTD |=b_rt1_sck; //sck=1
0650 9A97 SBI 0x12,7
(0259) NOP();NOP();
0651 0000 NOP
0652 0000 NOP
(0260) DDRC &=~b_rt1_data; //DATA置0为输入口
0653 98A2 CBI 0x14,2
(0261) NOP(); NOP();//检测SHT的应答改在测量程序中,如有应答则等待测试完成后读,如无应答则发复位
0654 0000 NOP
0655 0000 NOP
0656 940E26BF CALL pop_gset2
0658 9508 RET
_s_read_byte_old:
val --> R20
i --> R22
ack --> R10
0659 940E26CF CALL push_gset3
065B 2EA0 MOV R10,R16
(0262)
(0263) }
(0264)
(0265) //从SHT读1个字节
(0266) unsigned char s_read_byte_old(unsigned char ack) //读字节
(0267) {
(0268) unsigned char i,val=0;
065C 2744 CLR R20
(0269) DDRC &=~b_rt1_data; //DATA置0为输入口
065D 98A2 CBI 0x14,2
(0270) NOP(); NOP(); NOP(); NOP();
065E 0000 NOP
065F 0000 NOP
0660 0000 NOP
0661 0000 NOP
(0271) NOP(); NOP(); NOP();
0662 0000 NOP
0663 0000 NOP
0664 0000 NOP
(0272) for (i=0x80;i>0;i/=2) //从最高位开始取数据,右移8次,读入DATA线上数据后,置SCK脉冲输出
0665 E860 LDI R22,0x80
0666 C008 RJMP 0x066F
(0273) {PORTD |=b_rt1_sck; //sck=1
0667 9A97 SBI 0x12,7
(0274) delay_20us();
0668 D35B RCALL _delay_20us
(0275) if (PINC &b_rt1_data) val=(val | i); //读入数据为1时,字节该位置1
0669 9B9A SBIS 0x13,2
066A C001 RJMP 0x066C
066B 2B46 OR R20,R22
(0276) PORTD &=~b_rt1_sck; //sck=0
066C 9897 CBI 0x12,7
(0277) delay_20us();
066D D356 RCALL _delay_20us
066E 9566 LSR R22
066F 2422 CLR R2
0670 1626 CP R2,R22
0671 F3A8 BCS 0x0667
(0278) }
(0279) DDRC |=b_rt1_data; //DATA置1为输出口
0672 9AA2 SBI 0x14,2
(0280) NOP(); NOP(); NOP(); NOP();
0673 0000 NOP
0674 0000 NOP
0675 0000 NOP
0676 0000 NOP
(0281) if (ack) PORTC |=b_rt1_data; //应答1继续通讯
0677 20AA TST R10
0678 F011 BEQ 0x067B
0679 9AAA SBI 0x15,2
067A C001 RJMP 0x067C
(0282) else PORTC &=~b_rt1_data; //应答0结束通讯
067B 98AA CBI 0x15,2
(0283) NOP(); NOP(); NOP(); NOP();NOP(); NOP();
067C 0000 NOP
067D 0000 NOP
067E 0000 NOP
067F 0000 NOP
0680 0000 NOP
0681 0000 NOP
(0284) PORTD |=b_rt1_sck; //sck=1
0682 9A97 SBI 0x12,7
(0285) delay_20us();
0683 D340 RCALL _delay_20us
(0286) PORTD &=~b_rt1_sck; //sck=0
0684 9897 CBI 0x12,7
(0287) delay_20us();
0685 D33E RCALL _delay_20us
(0288) PORTC |=b_rt1_data; //data=1
0686 9AAA SBI 0x15,2
(0289) delay_20us();
0687 D33C RCALL _delay_20us
(0290) return val; //返回读入值
0688 2F04 MOV R16,R20
0689 940E26C2 CALL pop_gset3
068B 9508 RET
(0291) }
(0292)
(0293) void s_transstart(void) //起始步
(0294) {
(0295) DDRC |=b_rt1_data; //DATA置1为输出口
_s_transstart:
068C 9AA2 SBI 0x14,2
(0296) delay_20us();
068D D336 RCALL _delay_20us
(0297) PORTC |=b_rt1_data; //data=1
068E 9AAA SBI 0x15,2
(0298) delay_20us();
068F D334 RCALL _delay_20us
(0299) PORTD &=~b_rt1_sck; //sck=0
0690 9897 CBI 0x12,7
(0300) delay_20us();
0691 D332 RCALL _delay_20us
(0301) PORTD |=b_rt1_sck; //sck=1
0692 9A97 SBI 0x12,7
(0302) delay_20us();
0693 D330 RCALL _delay_20us
(0303) PORTC &=~b_rt1_data; //data=0
0694 98AA CBI 0x15,2
(0304) delay_20us();
0695 D32E RCALL _delay_20us
(0305) PORTD &=~b_rt1_sck; //sck=0
0696 9897 CBI 0x12,7
(0306) delay_20us();
0697 D32C RCALL _delay_20us
(0307) PORTD |=b_rt1_sck; //sck=1
0698 9A97 SBI 0x12,7
(0308) delay_20us();
0699 D32A RCALL _delay_20us
(0309) PORTC |=b_rt1_data; //data=1
069A 9AAA SBI 0x15,2
(0310) delay_20us();
069B D328 RCALL _delay_20us
(0311) PORTD &=~b_rt1_sck; //sck=0
069C 9897 CBI 0x12,7
(0312) delay_20us();
069D D326 RCALL _delay_20us
069E 9508 RET
_s_connectionreset:
i --> R20
069F 940E26D3 CALL push_gset1
(0313) }
(0314)
(0315) void s_connectionreset(void) //SHT失控时连续发9个SCK使其复位
(0316) {
(0317) unsigned char i;
(0318) DDRC |=b_rt1_data; //DATA置1为输出口
06A1 9AA2 SBI 0x14,2
(0319) NOP();
06A2 0000 NOP
(0320) NOP();
06A3 0000 NOP
(0321) PORTC |=b_rt1_data; //data=1
06A4 9AAA SBI 0x15,2
(0322) PORTD &=~b_rt1_sck; //sck=0
06A5 9897 CBI 0x12,7
(0323) NOP();
06A6 0000 NOP
(0324) for(i=0; i<9; i++) //9 SCK cycle
06A7 2744 CLR R20
06A8 C005 RJMP 0x06AE
(0325) {
(0326) PORTD |=b_rt1_sck; //sck=1
06A9 9A97 SBI 0x12,7
(0327) delay_20us();
06AA D319 RCALL _delay_20us
(0328) PORTD &=~b_rt1_sck; //sck=0
06AB 9897 CBI 0x12,7
(0329) delay_20us();
06AC D317 RCALL _delay_20us
06AD 9543 INC R20
06AE 3049 CPI R20,0x9
06AF F3C8 BCS 0x06A9
(0330) }
(0331) s_transstart(); //起始步
06B0 DFDB RCALL _s_transstart
06B1 940E26D6 CALL pop_gset1
06B3 9508 RET
_fun_measure_temp:
i --> Y+1
error --> R20
06B4 940E26D3 CALL push_gset1
(0332) }
(0333)
(0334) void fun_measure_temp(void) //测量温度程序
(0335) {
(0336) unsigned char error=0;
06B6 2744 CLR R20
(0337) unsigned int i;
(0338) s_transstart(); //起始步
06B7 DFD4 RCALL _s_transstart
(0339) s_write_byte(MEASURE_TEMP);//写入SHT温度测量命令
06B8 E003 LDI R16,3
06B9 DF79 RCALL _s_write_byte
(0340) if (PINC &b_rt1_data) //无应答error=1;
06BA 9B9A SBIS 0x13,2
06BB C00A RJMP 0x06C6
(0341) {
(0342) PORTD &=~b_rt1_sck; //sck=0
06BC 9897 CBI 0x12,7
(0343) DDRC |=b_rt1_data; //DATA置1为输出口
06BD 9AA2 SBI 0x14,2
(0344) delay_tt(20); //延时0.4ms
06BE E104 LDI R16,0x14
06BF E010 LDI R17,0
06C0 D2B9 RCALL _delay_tt
(0345) s_connectionreset(); //连续发9个脉冲让SHT复位
06C1 DFDD RCALL _s_connectionreset
(0346) s_write_byte(RESET); //向SHT发复位命令
06C2 E10E LDI R16,0x1E
06C3 DF6F RCALL _s_write_byte
(0347) NOP();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -