📄 18b20.lst
字号:
19B C001 RJMP 0x019D
(0078) else
(0079) {
(0080) b20_port&=~(1<<b20_io); //是低则将单总线拉低
19C 98AF CBI 0x15,7
(0081) }
(0082) Sensor_Delay(50); //等待50微秒
19D E302 LDI R16,0x32
19E E010 LDI R17,0
19F DFB1 RCALL _Sensor_Delay
(0083) b20_port|=(1<<b20_io); //释放总线
1A0 9AAF SBI 0x15,7
(0084) wrd>>=1; //右移,为写入新的数据位做准备
1A1 94A6 LSR R10
1A2 9543 INC R20
1A3 3048 CPI R20,0x8
1A4 F370 BCS 0x0193
(0085) }
(0086) Sensor_Delay(50); //等待50微秒
1A5 E302 LDI R16,0x32
1A6 E010 LDI R17,0
1A7 DFA9 RCALL _Sensor_Delay
1A8 9149 LD R20,Y+
1A9 90A9 LD R10,Y+
1AA 9508 RET
_Read_temp:
temph --> R10
templ --> R12
1AB D092 RCALL push_xgset003C
1AC 0159 MOVW R10,R18
1AD 0168 MOVW R12,R16
(0087) }
(0088)
(0089) /*******************************************
(0090) 函数名称: Read_temp
(0091) 功 能: 读取温度值
(0092) 参 数: templ温度值低位,temph温度值高位
(0093) 返回值 : 无
(0094) ********************************************/
(0095) void Read_temp(unsigned char *templ,unsigned char *temph)
(0096) {
(0097) B20_init(); //初始化,每次写命令都从初始化开始
1AE DFB6 RCALL _B20_init
(0098) B20_writeB(0xcc); //跳过ROM
1AF EC0C LDI R16,0xCC
1B0 DFDD RCALL _B20_writeB
(0099) B20_writeB(0x44); //启动温度转换
1B1 E404 LDI R16,0x44
1B2 DFDB RCALL _B20_writeB
(0100) B20_init(); //初始化,每次写命令都从初始化开始
1B3 DFB1 RCALL _B20_init
(0101) B20_writeB(0xcc); //跳过ROM
1B4 EC0C LDI R16,0xCC
1B5 DFD8 RCALL _B20_writeB
(0102) B20_writeB(0xbe); //读寄存器
1B6 EB0E LDI R16,0xBE
1B7 DFD6 RCALL _B20_writeB
(0103) *templ=B20_readB(); //读温度低字节
1B8 DFBB RCALL _B20_readB
1B9 01F6 MOVW R30,R12
1BA 8300 STD Z+0,R16
(0104) *temph=B20_readB(); //读温度高字节
1BB DFB8 RCALL _B20_readB
1BC 01F5 MOVW R30,R10
1BD 8300 STD Z+0,R16
1BE C074 RJMP pop_xgset003C
_b20_display:
fraction --> R10
inter --> R12
b20_l --> Y,+1
b20_h --> Y,+0
lz --> R20
1BF D08D RCALL push_xgset303C
1C0 2F40 MOV R20,R16
1C1 9722 SBIW R28,2
(0105) }
(0106) /*******************************************
(0107) 函数名称: b20_display
(0108) 功 能: 温度值显示
(0109) 参 数: lz为液晶显示位置
(0110) 返回值 : 无
(0111) ********************************************/
(0112) void b20_display(unsigned char lz)
(0113) {
(0114) unsigned char b20_h=0,b20_l=0;
1C2 2422 CLR R2
1C3 8228 STD Y+0,R2
1C4 8229 STD Y+1,R2
(0115) unsigned char inter=0;
1C5 24CC CLR R12
(0116) unsigned int fraction=0;
1C6 24AA CLR R10
1C7 24BB CLR R11
(0117) Read_temp(&b20_l,&b20_h); //读取温度值
1C8 019E MOVW R18,R28
1C9 018E MOVW R16,R28
1CA 5F0F SUBI R16,0xFF
1CB 4F1F SBCI R17,0xFF
1CC DFDE RCALL _Read_temp
(0118) if(b20_h&0xf8)
1CD 8188 LDD R24,Y+0
1CE 7F88 ANDI R24,0xF8
1CF F061 BEQ 0x01DC
(0119) {
(0120) lcd_write(command,lz);
1D0 2F24 MOV R18,R20
1D1 2700 CLR R16
1D2 DEAB RCALL _lcd_write
(0121) lcd_write(data,' -');
1D3 E220 LDI R18,0x20
1D4 E001 LDI R16,1
1D5 DEA8 RCALL _lcd_write
(0122) b20_l=~b20_l;
1D6 8029 LDD R2,Y+1
1D7 9420 COM R2
1D8 8229 STD Y+1,R2
(0123) b20_h=~b20_h;
1D9 8028 LDD R2,Y+0
1DA 9420 COM R2
1DB 8228 STD Y+0,R2
(0124) }
(0125) inter=b20_h*16+(b20_l>>4);//整数部分
1DC 8028 LDD R2,Y+0
1DD E180 LDI R24,0x10
1DE 9D82 MUL R24,R2
1DF 2CC0 MOV R12,R0
1E0 8189 LDD R24,Y+1
1E1 9582 SWAP R24
1E2 708F ANDI R24,0xF
1E3 0EC8 ADD R12,R24
(0126) int_disp(lz+1,inter);
1E4 2D2C MOV R18,R12
1E5 2733 CLR R19
1E6 2F04 MOV R16,R20
1E7 5F0F SUBI R16,0xFF
1E8 DF28 RCALL _int_disp
(0127) lcd_write(data,'.');
1E9 E22E LDI R18,0x2E
1EA E001 LDI R16,1
1EB DE92 RCALL _lcd_write
(0128) fraction=(b20_l&0x0f)*625;//小数部分,只显示小数点后一位
1EC 8129 LDD R18,Y+1
1ED 2733 CLR R19
1EE 702F ANDI R18,0xF
1EF 7030 ANDI R19,0
1F0 E701 LDI R16,0x71
1F1 E012 LDI R17,2
1F2 D030 RCALL empy16s
1F3 0158 MOVW R10,R16
(0129) lcd_write(data,fraction/1000+48);
1F4 EE28 LDI R18,0xE8
1F5 E033 LDI R19,3
1F6 D012 RCALL div16u
1F7 2F20 MOV R18,R16
1F8 5D20 SUBI R18,0xD0
1F9 4F3F SBCI R19,0xFF
1FA E001 LDI R16,1
1FB DE82 RCALL _lcd_write
1FC 9622 ADIW R28,2
1FD C056 RJMP pop_xgset303C
FILE: D:\mega16_32实验板资料\ICCAVR源程序\18b20\18b20_test.c
(0001) //ICC-AVR application builder : 2008-5-8 17:24:29
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007)
(0008) #include "delay.h"
(0009) #include "lcd12232.h"
(0010) #include "18b20.h"
(0011)
(0012) void main(void)
(0013) {
(0014) LCD_init();
_main:
1FE DEBC RCALL _LCD_init
(0015) line1_display("18B20 温度显示 ");
1FF E600 LDI R16,0x60
200 E010 LDI R17,0
201 DEED RCALL _line1_display
202 C002 RJMP 0x0205
(0016) while(1)
(0017) {
(0018) b20_display(0x93);
FILE: <library>
203 E903 LDI R16,0x93
204 DFBA RCALL _b20_display
205 CFFD RJMP 0x0203
206 9508 RET
mod16u:
207 9468 BSET 6
208 C001 RJMP xdiv16u
div16u:
209 94E8 BCLR 6
xdiv16u:
20A 92EA ST R14,-Y
20B 92FA ST R15,-Y
20C 938A ST R24,-Y
20D 24EE CLR R14
20E 24FF CLR R15
20F E180 LDI R24,0x10
210 0F00 LSL R16
211 1F11 ROL R17
212 1CEE ROL R14
213 1CFF ROL R15
214 16E2 CP R14,R18
215 06F3 CPC R15,R19
216 F018 BCS 0x021A
217 1AE2 SUB R14,R18
218 0AF3 SBC R15,R19
219 9503 INC R16
21A 958A DEC R24
21B F7A1 BNE 0x0210
21C F416 BRTC 0x021F
21D 2D0E MOV R16,R14
21E 2D1F MOV R17,R15
21F 9189 LD R24,Y+
220 90F9 LD R15,Y+
221 90E9 LD R14,Y+
222 9508 RET
empy16s:
223 920A ST R0,-Y
224 921A ST R1,-Y
225 938A ST R24,-Y
226 939A ST R25,-Y
227 9F02 MUL R16,R18
228 01C0 MOVW R24,R0
229 9F12 MUL R17,R18
22A 0D90 ADD R25,R0
22B 9F03 MUL R16,R19
22C 0D90 ADD R25,R0
22D 018C MOVW R16,R24
22E 9199 LD R25,Y+
22F 9189 LD R24,Y+
230 9019 LD R1,Y+
231 9009 LD R0,Y+
232 9508 RET
pop_xgset003C:
233 90A9 LD R10,Y+
234 90B9 LD R11,Y+
235 90C9 LD R12,Y+
236 90D9 LD R13,Y+
237 9508 RET
push_xgsetF0FC:
238 937A ST R23,-Y
239 936A ST R22,-Y
push_xgset30FC:
23A 935A ST R21,-Y
23B 934A ST R20,-Y
push_xgset00FC:
23C 92FA ST R15,-Y
23D 92EA ST R14,-Y
push_xgset003C:
23E 92DA ST R13,-Y
23F 92CA ST R12,-Y
240 92BA ST R11,-Y
241 92AA ST R10,-Y
242 9508 RET
push_xgset300C:
243 935A ST R21,-Y
244 934A ST R20,-Y
245 92BA ST R11,-Y
246 92AA ST R10,-Y
247 9508 RET
pop_xgset300C:
248 90A9 LD R10,Y+
249 90B9 LD R11,Y+
24A 9149 LD R20,Y+
24B 9159 LD R21,Y+
24C 9508 RET
push_xgset303C:
24D 935A ST R21,-Y
24E 934A ST R20,-Y
24F 92DA ST R13,-Y
250 92CA ST R12,-Y
251 92BA ST R11,-Y
252 92AA ST R10,-Y
253 9508 RET
pop_xgset303C:
254 940E 0272 CALL 0x0272
256 9508 RET
push_xgsetF03C:
257 937A ST R23,-Y
258 936A ST R22,-Y
259 935A ST R21,-Y
25A 934A ST R20,-Y
25B 92DA ST R13,-Y
25C 92CA ST R12,-Y
25D 92BA ST R11,-Y
25E 92AA ST R10,-Y
25F 9508 RET
pop_xgsetF03C:
260 940E 0272 CALL 0x0272
262 9169 LD R22,Y+
263 9179 LD R23,Y+
264 9508 RET
<created procedures>:
265 2FE4 MOV R30,R20
266 27FF CLR R31
267 0DEA ADD R30,R10
268 1DFB ADC R31,R11
269 8120 LDD R18,Z+0
26A E001 LDI R16,1
26B 9508 RET
26C 01CE MOVW R24,R28
26D 2FE4 MOV R30,R20
26E 27FF CLR R31
26F 0FE8 ADD R30,R24
270 1FF9 ADC R31,R25
271 9508 RET
272 90A9 LD R10,Y+
273 90B9 LD R11,Y+
274 90C9 LD R12,Y+
275 90D9 LD R13,Y+
276 9149 LD R20,Y+
277 9159 LD R21,Y+
278 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -