📄 atmegal16l.lst
字号:
(0045) // 形参: void
(0046) // 返回: void
(0047) // 编写: 2004/8/25
(0048) ===================================================================*/
(0049) void delay_us(unsigned int time)
(0050) {
(0051) do
(0052) {
(0053) time--;
_delay_us:
time --> R16
0200 5001 SUBI R16,1
0201 4010 SBCI R17,0
(0054) }
(0055) while (time>1);
0202 E081 LDI R24,1
0203 E090 LDI R25,0
0204 1780 CP R24,R16
0205 0791 CPC R25,R17
0206 F3C8 BCS 0x0200
(0056) }
0207 9508 RET
_ds1820_ack:
ack --> R20
0208 940E0412 CALL push_gset1
(0057)
(0058) /*===================================================================
(0059) // 函数功能: 判断总线应答
(0060) // 形参: void
(0061) // 返回: unsigned char true为应答
(0062) // 编写: 2004/8/25
(0063) ===================================================================*/
(0064) unsigned char ds1820_ack(void)
(0065) {
(0066) unsigned char ack;
(0067) DDRD |= DQ;
020A 9A8E SBI 0x11,6
(0068) PORTD &= ~DQ;
020B B382 IN R24,0x12
020C 7880 ANDI R24,0x80
020D BB82 OUT 0x12,R24
(0069) delay_us(300); //480US以上 // reset
020E E20C LDI R16,0x2C
020F E011 LDI R17,1
0210 DFEF RCALL _delay_us
(0070) PORTD |= DQ;
0211 9A96 SBI 0x12,6
(0071) DDRD &= ~DQ;
0212 B381 IN R24,0x11
0213 7880 ANDI R24,0x80
0214 BB81 OUT 0x11,R24
(0072) delay_us(25);
0215 E109 LDI R16,0x19
0216 E010 LDI R17,0
0217 DFE8 RCALL _delay_us
(0073) ack = DQ & PIND;
0218 B340 IN R20,0x10
0219 7440 ANDI R20,0x40
(0074) delay_us(300); // host receive
021A E20C LDI R16,0x2C
021B E011 LDI R17,1
021C DFE3 RCALL _delay_us
(0075) if(ack)
021D 2344 TST R20
021E F011 BEQ 0x0221
(0076) return false;
021F E001 LDI R16,1
0220 C001 RJMP 0x0222
(0077) else
(0078) return true;
0221 2700 CLR R16
0222 940E0415 CALL pop_gset1
0224 9508 RET
_read_byte:
value --> R20
i --> R22
0225 940E0429 CALL push_gset2
(0079) }
(0080)
(0081) /*===================================================================
(0082) // 函数功能: 从 1-wire 总线上读取一个字节
(0083) // 形参: void
(0084) // 返回: unsigned char 读到的值
(0085) // 编写: 2004/8/25
(0086) ===================================================================*/
(0087) unsigned char read_byte(void)
(0088) {
(0089) unsigned char i;
(0090) unsigned char value = 0;
0227 2744 CLR R20
(0091) for(i = 8; i > 0; i--)
0228 E068 LDI R22,0x8
0229 C01A RJMP 0x0244
(0092) {
(0093) value >>= 1; // low bit first
022A 9546 LSR R20
(0094) DDRD |= DQ;
022B 9A8E SBI 0x11,6
(0095) PORTD &= ~DQ; // pull DQ low to start timeslot
022C B382 IN R24,0x12
022D 7880 ANDI R24,0x80
022E BB82 OUT 0x12,R24
(0096) delay_us(2);
022F E002 LDI R16,2
0230 E010 LDI R17,0
0231 DFCE RCALL _delay_us
(0097) PORTD|= DQ;
0232 9A96 SBI 0x12,6
(0098) DDRD &= ~DQ; // release bus
0233 B381 IN R24,0x11
0234 7880 ANDI R24,0x80
0235 BB81 OUT 0x11,R24
(0099) delay_us(5);
0236 E005 LDI R16,5
0237 E010 LDI R17,0
0238 DFC7 RCALL _delay_us
(0100) if(DQ & PIND)
0239 9B86 SBIS 0x10,6
023A C001 RJMP 0x023C
(0101) value|=0x80;
023B 6840 ORI R20,0x80
(0102) delay_us(100);
023C E604 LDI R16,0x64
023D E010 LDI R17,0
023E DFC1 RCALL _delay_us
(0103) DDRD |= DQ;
023F 9A8E SBI 0x11,6
(0104) delay_us(3); // time interval
0240 E003 LDI R16,3
0241 E010 LDI R17,0
0242 DFBD RCALL _delay_us
0243 956A DEC R22
0244 2422 CLR R2
0245 1626 CP R2,R22
0246 F318 BCS 0x022A
(0105) }
(0106) return(value);
0247 2F04 MOV R16,R20
0248 940E0406 CALL pop_gset2
024A 9508 RET
_write_byte:
i --> R20
value --> R22
024B 940E0429 CALL push_gset2
024D 2F60 MOV R22,R16
(0107) }
(0108)
(0109)
(0110)
(0111) /*===================================================================
(0112) // 函数功能: 向 1-WIRE 总线上写一个字节
(0113) // 形参: value 写到总线上的值
(0114) // 返回: void
(0115) // 编写: 2004/8/25
(0116) ===================================================================*/
(0117) void write_byte(unsigned char value)
(0118) {
(0119) unsigned char i;
(0120) DDRD|= DQ;
024E 9A8E SBI 0x11,6
(0121) for(i = 8; i > 0; i--)
024F E048 LDI R20,0x8
0250 C019 RJMP 0x026A
(0122) {
(0123) if(value & 0x01)
0251 FF60 SBRS R22,0
0252 C00B RJMP 0x025E
(0124) {
(0125) PORTD &= ~DQ; // pull DQ low to start timeslot
0253 B382 IN R24,0x12
0254 7880 ANDI R24,0x80
0255 BB82 OUT 0x12,R24
(0126) delay_us(5);
0256 E005 LDI R16,5
0257 E010 LDI R17,0
0258 DFA7 RCALL _delay_us
(0127) PORTD |= DQ;
0259 9A96 SBI 0x12,6
(0128) delay_us(50);
025A E302 LDI R16,0x32
025B E010 LDI R17,0
025C DFA3 RCALL _delay_us
(0129) }
025D C00A RJMP 0x0268
(0130) else
(0131) {
(0132) PORTD&= ~DQ; // pull DQ low to start timeslot
025E B382 IN R24,0x12
025F 7880 ANDI R24,0x80
0260 BB82 OUT 0x12,R24
(0133) delay_us(50);
0261 E302 LDI R16,0x32
0262 E010 LDI R17,0
0263 DF9C RCALL _delay_us
(0134) PORTD|= DQ;
0264 9A96 SBI 0x12,6
(0135) delay_us(5);
0265 E005 LDI R16,5
0266 E010 LDI R17,0
0267 DF98 RCALL _delay_us
(0136) }
(0137) value >>= 1;
0268 9566 LSR R22
0269 954A DEC R20
026A 2422 CLR R2
026B 1624 CP R2,R20
026C F320 BCS 0x0251
(0138) }
(0139) }
026D 940E0406 CALL pop_gset2
026F 9508 RET
_Read_Temperature:
t --> R20
temporary --> Y+0
i --> R20
0270 940E0412 CALL push_gset1
0272 9729 SBIW R28,0x9
(0140)
(0141)
(0142) /*===================================================================
(0143) // 函数功能: 读取温度
(0144) // 形参: *temperature 温度存储空间
(0145) // 返回: unsigned char true为有效
(0146) // 编写: 2004/8/25
(0147) ===================================================================*/
(0148) unsigned char Read_Temperature(void)
(0149) {
(0150) unsigned char i;
(0151) unsigned int t;
(0152) unsigned char temporary[9];
(0153)
(0154) ds1820_ack();
0273 DF94 RCALL _ds1820_ack
(0155) write_byte(0xCC); // Skip ROM
0274 EC0C LDI R16,0xCC
0275 DFD5 RCALL _write_byte
(0156) write_byte(0x44); // Start Conversion
0276 E404 LDI R16,0x44
0277 DFD3 RCALL _write_byte
(0157) for(i = 0; i < 5; i++)
0278 2744 CLR R20
0279 C004 RJMP 0x027E
(0158) delay_us(50000);
027A E500 LDI R16,0x50
027B EC13 LDI R17,0xC3
027C DF83 RCALL _delay_us
027D 9543 INC R20
027E 3045 CPI R20,5
027F F3D0 BCS 0x027A
(0159) ds1820_ack();
0280 DF87 RCALL _ds1820_ack
(0160) write_byte(0xCC); // Skip ROM
0281 EC0C LDI R16,0xCC
0282 DFC8 RCALL _write_byte
(0161) write_byte(0xBE); // Read Scratch Pad
0283 EB0E LDI R16,0xBE
0284 DFC6 RCALL _write_byte
(0162) for(i = 0; i < 9; i++)
0285 2744 CLR R20
0286 C008 RJMP 0x028F
(0163) temporary[i] = read_byte();
0287 DF9D RCALL _read_byte
0288 01CE MOVW R24,R28
0289 2FE4 MOV R30,R20
028A 27FF CLR R31
028B 0FE8 ADD R30,R24
028C 1FF9 ADC R31,R25
028D 8300 STD Z+0,R16
028E 9543 INC R20
028F 3049 CPI R20,0x9
0290 F3B0 BCS 0x0287
(0164) if(crccheck(temporary,9))
0291 E029 LDI R18,0x9
0292 018E MOVW R16,R28
0293 DF3D RCALL _crccheck
0294 2300 TST R16
0295 F011 BEQ 0x0298
(0165) return false;
0296 E001 LDI R16,1
0297 C075 RJMP 0x030D
(0166) else
(0167) {
(0168) t=temporary[0]+temporary[1]*256;
0298 8129 LDD R18,Y+1
0299 2733 CLR R19
029A E000 LDI R16,0
029B E011 LDI R17,1
029C 940E03F6 CALL empy16s
029E 8148 LDD R20,Y+0
029F 2755 CLR R21
02A0 0F40 ADD R20,R16
02A1 1F51 ADC R21,R17
(0169) if(temporary[1]>0xf)
02A2 E08F LDI R24,0xF
02A3 8029 LDD R2,Y+1
02A4 1582 CP R24,R2
02A5 F5B0 BCC 0x02DC
(0170) temperature=(~t+1)*0.0625;
02A6 01CA MOVW R24,R20
02A7 9580 COM R24
02A8 9590 COM R25
02A9 9601 ADIW R24,1
02AA 011C MOVW R2,R24
02AB E508 LDI R16,0x58
02AC E010 LDI R17,0
02AD 940E0442 CALL lpm32
02AF 933A ST R19,-Y
02B0 932A ST R18,-Y
02B1 931A ST R17,-Y
02B2 930A ST R16,-Y
02B3 E504 LDI R16,0x54
02B4 E010 LDI R17,0
02B5 940E0442 CALL lpm32
02B7 933A ST R19,-Y
02B8 932A ST R18,-Y
02B9 931A ST R17,-Y
02BA 930A ST R16,-Y
02BB 0181 MOVW R16,R2
02BC 9516 LSR R17
02BD 9507 ROR R16
02BE 940E0456 CALL int2fp
02C0 933A ST R19,-Y
02C1 932A ST R18,-Y
02C2 931A ST R17,-Y
02C3 930A ST R16,-Y
02C4 940E051D CALL empy32fs
02C6 0181 MOVW R16,R2
02C7 7001 ANDI R16,1
02C8 7010 ANDI R17,0
02C9 940E0456 CALL int2fp
02CB 933A ST R19,-Y
02CC 932A ST R18,-Y
02CD 931A ST R17,-Y
02CE 930A ST R16,-Y
02CF 940E04B0 CALL add32fs
02D1 940E0520 CALL empy32f
02D3 93100235 STS _temperature+1,R17
02D5 93000234 STS _temperature,R16
02D7 93300237 STS _temperature+3,R19
02D9 93200236 STS _temperature+2,R18
02DB C030 RJMP 0x030C
(0171) else
(0172) {
(0173) temperature=t*0.0625;
02DC E508 LDI R16,0x58
02DD E010 LDI R17,0
02DE 940E0442 CALL lpm32
02E0 933A ST R19,-Y
02E1 932A ST R18,-Y
02E2 931A ST R17,-Y
02E3 930A ST R16,-Y
02E4 E504 LDI R16,0x54
02E5 E010 LDI R17,0
02E6 940E0442 CALL lpm32
02E8 933A ST R19,-Y
02E9 932A ST R18,-Y
02EA 931A ST R17,-Y
02EB 930A ST R16,-Y
02EC 018A MOVW R16,R20
02ED 9516 LSR R17
02EE 9507 ROR R16
02EF 940E0456 CALL int2fp
02F1 933A ST R19,-Y
02F2 932A ST R18,-Y
02F3 931A ST R17,-Y
02F4 930A ST R16,-Y
02F5 940E051D CALL empy32fs
02F7 018A MOVW R16,R20
02F8 7001 ANDI R16,1
02F9 7010 ANDI R17,0
02FA 940E0456 CALL int2fp
02FC 933A ST R19,-Y
02FD 932A ST R18,-Y
02FE 931A ST R17,-Y
02FF 930A ST R16,-Y
0300 940E04B0 CALL add32fs
0302 940E0520 CALL empy32f
0304 93100235 STS _temperature+1,R17
0306 93000234 STS _temperature,R16
0308 93300237 STS _temperature+3,R19
030A 93200236 STS _temperature+2,R18
(0174) }
(0175)
(0176) return true;
030C 2700 CLR R16
030D 9629 ADIW R28,0x9
030E 940E0415 CALL pop_gset1
0310 9508 RET
_Read_RomCode:
temp --> R20
0311 940E0412 CALL push_gset1
0313 01A8 MOVW R20,R16
(0177) }
(0178) }
(0179)
(0180) /*===================================================================
(0181) // 函数功能: 读取Rom Code
(0182) // 形参: *temp DS18B20的Rom Code存储空间
(0183) // 返回: unsigned char true为有效
(0184) // 编写: 2004/8/25
(0185) ===================================================================*/
(0186) unsigned char Read_RomCode(unsigned char *temp)
(0187) {
(0188) ds1820_ack();
0314 DEF3 RCALL _ds1820_ack
(0189) write_byte(0x33);
0315 E303 LDI R16,0x33
0316 DF34 RCALL _write_byte
(0190) temp[0] = read_byte();
0317 DF0D RCALL _read_byte
0318 01FA MOVW R30,R20
0319 8300 STD Z+0,R16
(0191) temp[1] = read_byte();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -