📄 measure_temp.lst
字号:
__text_start:
__start:
0058 EFCF LDI R28,0xFF
0059 E1D0 LDI R29,0x10
005A BFCD OUT 0x3D,R28
005B BFDE OUT 0x3E,R29
005C 51C0 SUBI R28,0x10
005D 40D0 SBCI R29,0
005E EA0A LDI R16,0xAA
005F 8308 STD Y+0,R16
0060 2400 CLR R0
0061 E0E0 LDI R30,0
0062 E0F1 LDI R31,1
0063 E011 LDI R17,1
0064 30E8 CPI R30,0x8
0065 07F1 CPC R31,R17
0066 F011 BEQ 0x0069
0067 9201 ST R0,Z+
0068 CFFB RJMP 0x0064
0069 8300 STD Z+0,R16
006A EBE0 LDI R30,0xB0
006B E0F0 LDI R31,0
006C E0A0 LDI R26,0
006D E0B1 LDI R27,1
006E E010 LDI R17,0
006F 3BE0 CPI R30,0xB0
0070 07F1 CPC R31,R17
0071 F021 BEQ 0x0076
0072 95C8 LPM
0073 9631 ADIW R30,1
0074 920D ST R0,X+
0075 CFF9 RJMP 0x006F
0076 940E038E CALL _main
_exit:
0078 CFFF RJMP _exit
FILE: C:\DOCUME~1\xzy_bupt\桌面\measure_temp\measure.c
(0001) #include <iom128v.h> //Microcontroller specific library, e.g. port definitions
(0002)
(0003) #include <math.h> //Keil library
(0004) #include <stdio.h> //Keil library
(0005) #include <macros.h>
(0006) const float C1=-4.0; // for 12 Bit
(0007) const float C2=+0.0405; // for 12 Bit
(0008) const float C3=-0.0000028; // for 12 Bit
(0009) const float T1=+0.01; // for 14 Bit @ 5V
(0010) const float T2=+0.00008; // for 14 Bit @ 5V
(0011)
(0012) unsigned char cwendu1,cwendu2;
(0013) unsigned int uwendu;
(0014) float fwendu;
(0015)
(0016)
(0017) enum {TEMP,HUMI};
(0018)
(0019)
(0020)
(0021) #define noACK 0
(0022) #define ACK 1
(0023) //adr command r/w
(0024) #define STATUS_REG_W 0x06 //000 0011 0
(0025) #define STATUS_REG_R 0x07 //000 0011 1
(0026) #define MEASURE_TEMP 0x03 //000 0001 1
(0027) #define MEASURE_HUMI 0x05 //000 0010 1
(0028) #define RESET 0x1e //000 1111 0
(0029)
(0030)
(0031) #define DATA_SHTxx (1<<1) // PF0
(0032) #define DATA_TO_1() (PORTF |= DATA_SHTxx) // PF0='0' //置0
(0033) #define DATA_TO_0() (PORTF &= ~DATA_SHTxx) // PF0='float' //置1
(0034) #define DATA_status() (PINF & DATA_SHTxx) // read PF0 pin
(0035)
(0036) #define SCK_SHTxx (1<<2) // PF0
(0037) #define SCK_TO_0() (PORTF &= ~SCK_SHTxx) // PF0='0'
(0038) #define SCK_TO_1() (PORTF |= SCK_SHTxx) // PF0='float' //置0
(0039) #define SCK_status() (PINF & SCK_SHTxx) // read PF0 pin //置1
(0040) //----------------------------------------------------------------------------------
(0041)
(0042) void shxx_config()
(0043) {
(0044) //DDRF &= ~DATA_SHTxx ; // 输入模式(上电时为高电平)
(0045) DDRF |= 0x02;//(1<<1)//DATA_SHTxx; //配置为输出
_shxx_config:
0079 91800061 LDS R24,0x61
007B 6082 ORI R24,2
007C 93800061 STS 0x61,R24
(0046) PORTF |= 0x02;//(1<<1)//DATA_SHTxx ; // 输出锁存器写0
007E 91800062 LDS R24,0x62
0080 6082 ORI R24,2
0081 93800062 STS 0x62,R24
(0047)
(0048)
(0049) // DDRF &= ~SCK_SHTxx; // 输入模式(上电时为高电平)
(0050) DDRF |=0x04;//(1<<2);// SCK_SHTxx; //配置为输出
0083 91800061 LDS R24,0x61
0085 6084 ORI R24,4
0086 93800061 STS 0x61,R24
(0051) PORTF &= 0xfb;//~SCK_SHTxx; // 输出锁存器写0
0088 91800062 LDS R24,0x62
008A 7F8B ANDI R24,0xFB
008B 93800062 STS 0x62,R24
008D 9508 RET
_s_write_byte:
merror --> R20
error --> R10
i --> R22
value --> R16
008E 940E0403 CALL push_xgset5
(0052)
(0053) }
(0054) char s_write_byte(unsigned char value)
(0055) //----------------------------------------------------------------------------------
(0056) // writes a byte on the Sensibus and checks the acknowledge
(0057) {
(0058) unsigned char i,error=0,merror=0;
0090 24AA CLR R10
0091 2744 CLR R20
(0059) DDRF |=0x06;
0092 91800061 LDS R24,0x61
0094 6086 ORI R24,6
0095 93800061 STS 0x61,R24
(0060) // for (i=0x80;i>0;i/=2)
(0061) /*// while(i>0) //shift bit for masking
(0062) { if (i & value) PORTF |=0x02;//DATA=1; //masking value with i , write to SENSI-BUS
(0063) else PORTF &=0xfd;//DATA=0;
(0064) PORTF |=0x04;//SCK=1; //clk for SENSI-BUS
(0065) //_NOP();_NOP();_NOP(); //pulswith approx. 5 us
(0066) PORTF &=0xfb;//SCK=0;
(0067) //i=i/2;
(0068) }
(0069) */
(0070) PORTF |=0x02;
0097 91800062 LDS R24,0x62
0099 6082 ORI R24,2
009A 93800062 STS 0x62,R24
(0071) PORTF &=0xfb;
009C 91800062 LDS R24,0x62
009E 7F8B ANDI R24,0xFB
009F 93800062 STS 0x62,R24
(0072) _NOP();_NOP();_NOP();
00A1 0000 NOP
00A2 0000 NOP
00A3 0000 NOP
(0073) i=0x80; //shift bit for masking
00A4 E860 LDI R22,0x80
(0074) { if (i & value)
00A5 2E26 MOV R2,R22
00A6 2220 AND R2,R16
00A7 F031 BEQ 0x00AE
(0075) PORTF |=0x02;//DATA=1; //masking value with i , write to SENSI-BUS
00A8 91800062 LDS R24,0x62
00AA 6082 ORI R24,2
00AB 93800062 STS 0x62,R24
00AD C005 RJMP 0x00B3
(0076) else PORTF &=0xfd;//DATA=0;
00AE 91800062 LDS R24,0x62
00B0 7F8D ANDI R24,0xFD
00B1 93800062 STS 0x62,R24
(0077) _NOP();_NOP();_NOP();
00B3 0000 NOP
00B4 0000 NOP
00B5 0000 NOP
(0078) PORTF |=0x04;//SCK=1; //clk for SENSI-BUS
00B6 91800062 LDS R24,0x62
00B8 6084 ORI R24,4
00B9 93800062 STS 0x62,R24
(0079) _NOP();_NOP();_NOP(); //pulswith approx. 5 us
00BB 0000 NOP
00BC 0000 NOP
00BD 0000 NOP
(0080) PORTF &=0xfb;//SCK=0;
00BE 91800062 LDS R24,0x62
00C0 7F8B ANDI R24,0xFB
00C1 93800062 STS 0x62,R24
(0081)
(0082) }
(0083) i=0x40;
00C3 E460 LDI R22,0x40
(0084) { if (i & value)
00C4 2E26 MOV R2,R22
00C5 2220 AND R2,R16
00C6 F031 BEQ 0x00CD
(0085) PORTF |=0x02;//DATA=1; //masking value with i , write to SENSI-BUS
00C7 91800062 LDS R24,0x62
00C9 6082 ORI R24,2
00CA 93800062 STS 0x62,R24
00CC C005 RJMP 0x00D2
(0086) else PORTF &=0xfd;//DATA=0;
00CD 91800062 LDS R24,0x62
00CF 7F8D ANDI R24,0xFD
00D0 93800062 STS 0x62,R24
(0087) _NOP();_NOP();_NOP();
00D2 0000 NOP
00D3 0000 NOP
00D4 0000 NOP
(0088) PORTF |=0x04;//SCK=1; //clk for SENSI-BUS
00D5 91800062 LDS R24,0x62
00D7 6084 ORI R24,4
00D8 93800062 STS 0x62,R24
(0089) _NOP();_NOP();_NOP(); //pulswith approx. 5 us
00DA 0000 NOP
00DB 0000 NOP
00DC 0000 NOP
(0090) PORTF &=0xfb;//SCK=0;
00DD 91800062 LDS R24,0x62
00DF 7F8B ANDI R24,0xFB
00E0 93800062 STS 0x62,R24
(0091)
(0092) }
(0093) i=0x20;
00E2 E260 LDI R22,0x20
(0094) { if (i & value)
00E3 2E26 MOV R2,R22
00E4 2220 AND R2,R16
00E5 F031 BEQ 0x00EC
(0095) PORTF |=0x02;//DATA=1; //masking value with i , write to SENSI-BUS
00E6 91800062 LDS R24,0x62
00E8 6082 ORI R24,2
00E9 93800062 STS 0x62,R24
00EB C005 RJMP 0x00F1
(0096) else PORTF &=0xfd;//DATA=0;
00EC 91800062 LDS R24,0x62
00EE 7F8D ANDI R24,0xFD
00EF 93800062 STS 0x62,R24
(0097) _NOP();_NOP();_NOP();
00F1 0000 NOP
00F2 0000 NOP
00F3 0000 NOP
(0098) PORTF |=0x04;//SCK=1; //clk for SENSI-BUS
00F4 91800062 LDS R24,0x62
00F6 6084 ORI R24,4
00F7 93800062 STS 0x62,R24
(0099) _NOP();_NOP();_NOP(); //pulswith approx. 5 us
00F9 0000 NOP
00FA 0000 NOP
00FB 0000 NOP
(0100) PORTF &=0xfb;//SCK=0;
00FC 91800062 LDS R24,0x62
00FE 7F8B ANDI R24,0xFB
00FF 93800062 STS 0x62,R24
(0101)
(0102) }
(0103) i=0x10;
0101 E160 LDI R22,0x10
(0104) { if (i & value)
0102 2E26 MOV R2,R22
0103 2220 AND R2,R16
0104 F031 BEQ 0x010B
(0105) PORTF |=0x02;//DATA=1; //masking value with i , write to SENSI-BUS
0105 91800062 LDS R24,0x62
0107 6082 ORI R24,2
0108 93800062 STS 0x62,R24
010A C005 RJMP 0x0110
(0106) else PORTF &=0xfd;//DATA=0;
010B 91800062 LDS R24,0x62
010D 7F8D ANDI R24,0xFD
010E 93800062 STS 0x62,R24
(0107) _NOP();_NOP();_NOP();
0110 0000 NOP
0111 0000 NOP
0112 0000 NOP
(0108) PORTF |=0x04;//SCK=1; //clk for SENSI-BUS
0113 91800062 LDS R24,0x62
0115 6084 ORI R24,4
0116 93800062 STS 0x62,R24
(0109) _NOP();_NOP();_NOP(); //pulswith approx. 5 us
0118 0000 NOP
0119 0000 NOP
011A 0000 NOP
(0110) PORTF &=0xfb;//SCK=0;
011B 91800062 LDS R24,0x62
011D 7F8B ANDI R24,0xFB
011E 93800062 STS 0x62,R24
(0111)
(0112) }
(0113) i=0x08;
0120 E068 LDI R22,0x8
(0114) { if (i & value)
0121 2E26 MOV R2,R22
0122 2220 AND R2,R16
0123 F031 BEQ 0x012A
(0115) PORTF |=0x02;//DATA=1; //masking value with i , write to SENSI-BUS
0124 91800062 LDS R24,0x62
0126 6082 ORI R24,2
0127 93800062 STS 0x62,R24
0129 C005 RJMP 0x012F
(0116) else PORTF &=0xfd;//DATA=0;
012A 91800062 LDS R24,0x62
012C 7F8D ANDI R24,0xFD
012D 93800062 STS 0x62,R24
(0117) _NOP();_NOP();_NOP();
012F 0000 NOP
0130 0000 NOP
0131 0000 NOP
(0118) PORTF |=0x04;//SCK=1; //clk for SENSI-BUS
0132 91800062 LDS R24,0x62
0134 6084 ORI R24,4
0135 93800062 STS 0x62,R24
(0119) _NOP();_NOP();_NOP(); //pulswith approx. 5 us
0137 0000 NOP
0138 0000 NOP
0139 0000 NOP
(0120) PORTF &=0xfb;//SCK=0;
013A 91800062 LDS R24,0x62
013C 7F8B ANDI R24,0xFB
013D 93800062 STS 0x62,R24
(0121)
(0122) }
(0123) i=0x04;
013F E064 LDI R22,4
(0124) { if (i & value)
0140 2E26 MOV R2,R22
0141 2220 AND R2,R16
0142 F031 BEQ 0x0149
(0125) PORTF |=0x02;//DATA=1; //masking value with i , write to SENSI-BUS
0143 91800062 LDS R24,0x62
0145 6082 ORI R24,2
0146 93800062 STS 0x62,R24
0148 C005 RJMP 0x014E
(0126) else PORTF &=0xfd;//DATA=0;
0149 91800062 LDS R24,0x62
014B 7F8D ANDI R24,0xFD
014C 93800062 STS 0x62,R24
(0127) _NOP();_NOP();_NOP();
014E 0000 NOP
014F 0000 NOP
0150 0000 NOP
(0128) PORTF |=0x04;//SCK=1; //clk for SENSI-BUS
0151 91800062 LDS R24,0x62
0153 6084 ORI R24,4
0154 93800062 STS 0x62,R24
(0129) _NOP();_NOP();_NOP(); //pulswith approx. 5 us
0156 0000 NOP
0157 0000 NOP
0158 0000 NOP
(0130) PORTF &=0xfb;//SCK=0;
0159 91800062 LDS R24,0x62
015B 7F8B ANDI R24,0xFB
015C 93800062 STS 0x62,R24
(0131)
(0132) }
(0133) i=0x02;
015E E062 LDI R22,2
(0134) { if (i & value)
015F 2E26 MOV R2,R22
0160 2220 AND R2,R16
0161 F031 BEQ 0x0168
(0135) PORTF |=0x02;//DATA=1; //masking value with i , write to SENSI-BUS
0162 91800062 LDS R24,0x62
0164 6082 ORI R24,2
0165 93800062 STS 0x62,R24
0167 C005 RJMP 0x016D
(0136) else PORTF &=0xfd;//DATA=0;
0168 91800062 LDS R24,0x62
016A 7F8D ANDI R24,0xFD
016B 93800062 STS 0x62,R24
(0137) _NOP();_NOP();_NOP();
016D 0000 NOP
016E 0000 NOP
016F 0000 NOP
(0138) PORTF |=0x04;//SCK=1; //clk for SENSI-BUS
0170 91800062 LDS R24,0x62
0172 6084 ORI R24,4
0173 93800062 STS 0x62,R24
(0139) _NOP();_NOP();_NOP(); //pulswith approx. 5 us
0175 0000 NOP
0176 0000 NOP
0177 0000 NOP
(0140) PORTF &=0xfb;//SCK=0;
0178 91800062 LDS R24,0x62
017A 7F8B ANDI R24,0xFB
017B 93800062 STS 0x62,R24
(0141)
(0142) }
(0143) i=0x01;
017D E061 LDI R22,1
(0144) { if (i & value)
017E 2E26 MOV R2,R22
017F 2220 AND R2,R16
0180 F031 BEQ 0x0187
(0145) PORTF |=0x02;//DATA=1; //masking value with i , write to SENSI-BUS
0181 91800062 LDS R24,0x62
0183 6082 ORI R24,2
0184 93800062 STS 0x62,R24
0186 C005 RJMP 0x018C
(0146) else PORTF &=0xfd;//DATA=0;
0187 91800062 LDS R24,0x62
0189 7F8D ANDI R24,0xFD
018A 93800062 STS 0x62,R24
(0147) PORTF |=0x04;//SCK=1; //clk for SENSI-BUS
018C 91800062 LDS R24,0x62
018E 6084 ORI R24,4
018F 93800062 STS 0x62,R24
(0148) _NOP();_NOP();_NOP();
0191 0000 NOP
0192 0000 NOP
0193 0000 NOP
(0149) //pulswith approx. 5 us
(0150)
(0151)
(0152) }
(0153)
(0154) PORTF |=0x02;//DATA=1;
0194 91800062 LDS R24,0x62
0196 6082 ORI R24,2
0197 93800062 STS 0x62,R24
(0155) DDRF &=0xfd;
0199 91800061 LDS R24,0x61
019B 7F8D ANDI R24,0xFD
019C 93800061 STS 0x61,R24
(0156) _NOP();_NOP();_NOP();
019E 0000 NOP
019F 0000 NOP
01A0 0000 NOP
(0157) PORTF &=0xfb;//SCK=0; //release DATA-line
01A1 91800062 LDS R24,0x62
01A3 7F8B ANDI R24,0xFB
01A4 93800062 STS 0x62,R24
(0158)
(0159) _NOP();_NOP();_NOP(); //clk #9 for ack
01A6 0000 NOP
01A7 0000 NOP
01A8 0000 NOP
(0160) merror=PINF&0x02;//error=DATA;
01A9 B140 IN R20,0x00
01AA 7042 ANDI R20,2
(0161) error=merror;
01AB 2EA4 MOV R10,R20
(0162) PORTF |=0x04;//SCK=1;
01AC 91800062 LDS R24,0x62
01AE 6084 ORI R24,4
01AF 93800062 STS 0x62,R24
(0163) _NOP();_NOP();_NOP(); //check ack (DATA will be pulled down by SHT11)
01B1 0000 NOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -