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