📄 18b20_test.lis
字号:
02C8 .dbline 69
02C8 ; unsigned char i;
02C8 ; for(i=0;i<8;i++) //位计数值
02C8 4427 clr R20
02CA 10C0 xjmp L87
02CC L84:
02CC .dbline 70
02CC ; {
02CC .dbline 71
02CC ; b20_ddr|=(1<<b20_io); //配置为输出
02CC A79A sbi 0x14,7
02CE .dbline 72
02CE ; b20_port&=~(1<<b20_io); //拉低,启动写数据位
02CE AF98 cbi 0x15,7
02D0 .dbline 73
02D0 ; Sensor_Delay(1); //等待1微秒
02D0 01E0 ldi R16,1
02D2 10E0 ldi R17,0
02D4 B6DF xcall _Sensor_Delay
02D6 .dbline 74
02D6 ; if(wrd&0x01) //此位数据是否为高
02D6 A0FE sbrs R10,0
02D8 02C0 rjmp L88
02DA X22:
02DA .dbline 75
02DA ; {
02DA .dbline 76
02DA ; b20_port|=(1<<b20_io); //是高则将单总线拉高
02DA AF9A sbi 0x15,7
02DC .dbline 77
02DC ; }
02DC 01C0 xjmp L89
02DE L88:
02DE .dbline 79
02DE ; else
02DE ; {
02DE .dbline 80
02DE ; b20_port&=~(1<<b20_io); //是低则将单总线拉低
02DE AF98 cbi 0x15,7
02E0 .dbline 81
02E0 ; }
02E0 L89:
02E0 .dbline 82
02E0 ; Sensor_Delay(50); //等待50微秒
02E0 02E3 ldi R16,50
02E2 10E0 ldi R17,0
02E4 AEDF xcall _Sensor_Delay
02E6 .dbline 83
02E6 ; b20_port|=(1<<b20_io); //释放总线
02E6 AF9A sbi 0x15,7
02E8 .dbline 84
02E8 ; wrd>>=1; //右移,为写入新的数据位做准备
02E8 A694 lsr R10
02EA .dbline 85
02EA ; }
02EA L85:
02EA .dbline 69
02EA 4395 inc R20
02EC L87:
02EC .dbline 69
02EC 4830 cpi R20,8
02EE 70F3 brlo L84
02F0 X23:
02F0 .dbline 86
02F0 ; Sensor_Delay(50); //等待50微秒
02F0 02E3 ldi R16,50
02F2 10E0 ldi R17,0
02F4 A6DF xcall _Sensor_Delay
02F6 .dbline -2
02F6 L83:
02F6 .dbline 0 ; func end
02F6 4991 ld R20,y+
02F8 A990 ld R10,y+
02FA 0895 ret
02FC .dbsym r i 20 c
02FC .dbsym r wrd 10 c
02FC .dbend
02FC .dbfunc e Read_temp _Read_temp fV
02FC ; temph -> R10,R11
02FC ; templ -> R12,R13
.even
02FC _Read_temp::
02FC 0E940000 xcall push_xgset003C
0300 5901 movw R10,R18
0302 6801 movw R12,R16
0304 .dbline -1
0304 .dbline 96
0304 ; }
0304 ;
0304 ; /*******************************************
0304 ; 函数名称: Read_temp
0304 ; 功 能: 读取温度值
0304 ; 参 数: templ温度值低位,temph温度值高位
0304 ; 返回值 : 无
0304 ; ********************************************/
0304 ; void Read_temp(unsigned char *templ,unsigned char *temph)
0304 ; {
0304 .dbline 97
0304 ; B20_init(); //初始化,每次写命令都从初始化开始
0304 B5DF xcall _B20_init
0306 .dbline 98
0306 ; B20_writeB(0xcc); //跳过ROM
0306 0CEC ldi R16,204
0308 DCDF xcall _B20_writeB
030A .dbline 99
030A ; B20_writeB(0x44); //启动温度转换
030A 04E4 ldi R16,68
030C DADF xcall _B20_writeB
030E .dbline 100
030E ; B20_init(); //初始化,每次写命令都从初始化开始
030E B0DF xcall _B20_init
0310 .dbline 101
0310 ; B20_writeB(0xcc); //跳过ROM
0310 0CEC ldi R16,204
0312 D7DF xcall _B20_writeB
0314 .dbline 102
0314 ; B20_writeB(0xbe); //读寄存器
0314 0EEB ldi R16,190
0316 D5DF xcall _B20_writeB
0318 .dbline 103
0318 ; *templ=B20_readB(); //读温度低字节
0318 BADF xcall _B20_readB
031A F601 movw R30,R12
031C 0083 std z+0,R16
031E .dbline 104
031E ; *temph=B20_readB(); //读温度高字节
031E B7DF xcall _B20_readB
0320 F501 movw R30,R10
0322 0083 std z+0,R16
0324 .dbline -2
0324 L90:
0324 .dbline 0 ; func end
0324 0C940000 xjmp pop_xgset003C
0328 .dbsym r temph 10 pc
0328 .dbsym r templ 12 pc
0328 .dbend
0328 .dbfunc e b20_display _b20_display fV
0328 ; fraction -> R10,R11
0328 ; inter -> R12
0328 ; b20_l -> y+1
0328 ; b20_h -> y+0
0328 ; lz -> R20
.even
0328 _b20_display::
0328 0E940000 xcall push_xgset303C
032C 402F mov R20,R16
032E 2297 sbiw R28,2
0330 .dbline -1
0330 .dbline 113
0330 ; }
0330 ; /*******************************************
0330 ; 函数名称: b20_display
0330 ; 功 能: 温度值显示
0330 ; 参 数: lz为液晶显示位置
0330 ; 返回值 : 无
0330 ; ********************************************/
0330 ; void b20_display(unsigned char lz)
0330 ; {
0330 .dbline 114
0330 ; unsigned char b20_h=0,b20_l=0;
0330 2224 clr R2
0332 2882 std y+0,R2
0334 .dbline 114
0334 2982 std y+1,R2
0336 .dbline 115
0336 ; unsigned char inter=0;
0336 CC24 clr R12
0338 .dbline 116
0338 ; unsigned int fraction=0;
0338 AA24 clr R10
033A BB24 clr R11
033C .dbline 117
033C ; Read_temp(&b20_l,&b20_h); //读取温度值
033C 9E01 movw R18,R28
033E 8E01 movw R16,R28
0340 0F5F subi R16,255 ; offset = 1
0342 1F4F sbci R17,255
0344 DBDF xcall _Read_temp
0346 .dbline 118
0346 ; if(b20_h&0xf8)
0346 8881 ldd R24,y+0
0348 887F andi R24,248
034A 61F0 breq L92
034C X24:
034C .dbline 119
034C ; {
034C .dbline 120
034C ; lcd_write(command,lz);
034C 242F mov R18,R20
034E 0027 clr R16
0350 81DE xcall _lcd_write
0352 .dbline 121
0352 ; lcd_write(data,' -');
0352 20E2 ldi R18,32
0354 01E0 ldi R16,1
0356 7EDE xcall _lcd_write
0358 .dbline 122
0358 ; b20_l=~b20_l;
0358 2980 ldd R2,y+1
035A 2094 com R2
035C 2982 std y+1,R2
035E .dbline 123
035E ; b20_h=~b20_h;
035E 2880 ldd R2,y+0
0360 2094 com R2
0362 2882 std y+0,R2
0364 .dbline 124
0364 ; }
0364 L92:
0364 .dbline 125
0364 ; inter=b20_h*16+(b20_l>>4);//整数部分
0364 2880 ldd R2,y+0
0366 80E1 ldi R24,16
0368 829D mul R24,R2
036A C02C mov R12,R0
036C 8981 ldd R24,y+1
036E 8295 swap R24
0370 8F70 andi R24,#0x0F
0372 C80E add R12,R24
0374 .dbline 126
0374 ; int_disp(lz+1,inter);
0374 2C2D mov R18,R12
0376 3327 clr R19
0378 042F mov R16,R20
037A 0F5F subi R16,255 ; addi 1
037C 12DF xcall _int_disp
037E .dbline 127
037E ; lcd_write(data,'.');
037E 2EE2 ldi R18,46
0380 01E0 ldi R16,1
0382 68DE xcall _lcd_write
0384 .dbline 128
0384 ; fraction=(b20_l&0x0f)*625;//小数部分,只显示小数点后一位
0384 2981 ldd R18,y+1
0386 3327 clr R19
0388 2F70 andi R18,15
038A 3070 andi R19,0
038C 01E7 ldi R16,625
038E 12E0 ldi R17,2
0390 0E940000 xcall empy16s
0394 5801 movw R10,R16
0396 .dbline 129
0396 ; lcd_write(data,fraction/1000+48);
0396 28EE ldi R18,1000
0398 33E0 ldi R19,3
039A 0E940000 xcall div16u
039E 202F mov R18,R16
03A0 205D subi R18,208 ; offset = 48
03A2 3F4F sbci R19,255
03A4 01E0 ldi R16,1
03A6 56DE xcall _lcd_write
03A8 .dbline -2
03A8 L91:
03A8 .dbline 0 ; func end
03A8 2296 adiw R28,2
03AA 0C940000 xjmp pop_xgset303C
03AE .dbsym r fraction 10 i
03AE .dbsym r inter 12 c
03AE .dbsym l b20_l 1 c
03AE .dbsym l b20_h 0 c
03AE .dbsym r lz 20 c
03AE .dbend
03AE .dbfile D:\mega16_32实验板资料\ICCAVR源程序\18b20\18b20_test.c
03AE .dbfunc e main _main fV
.even
03AE _main::
03AE .dbline -1
03AE .dbline 13
03AE ; //ICC-AVR application builder : 2008-5-8 17:24:29
03AE ; // Target : M16
03AE ; // Crystal: 8.0000Mhz
03AE ;
03AE ; #include <iom16v.h>
03AE ; #include <macros.h>
03AE ;
03AE ; #include "delay.h"
03AE ; #include "lcd12232.h"
03AE ; #include "18b20.h"
03AE ;
03AE ; void main(void)
03AE ; {
03AE .dbline 14
03AE ; LCD_init();
03AE 91DE xcall _LCD_init
03B0 .dbline 15
03B0 ; line1_display("18B20 温度显示 ");
03B0 00E0 ldi R16,<L95
03B2 10E0 ldi R17,>L95
03B4 C8DE xcall _line1_display
03B6 02C0 xjmp L97
03B8 L96:
03B8 .dbline 17
03B8 ; while(1)
03B8 ; {
03B8 .dbline 18
03B8 ; b20_display(0x93);
03B8 03E9 ldi R16,147
03BA B6DF xcall _b20_display
03BC .dbline 19
03BC ; }
03BC L97:
03BC .dbline 16
03BC FDCF xjmp L96
03BE X25:
03BE .dbline -2
03BE L94:
03BE .dbline 0 ; func end
03BE 0895 ret
03C0 .dbend
.area data(ram, con, rel)
0000 .dbfile D:\mega16_32实验板资料\ICCAVR源程序\18b20\18b20_test.c
0000 L95:
0000 .blkb 16
.area idata
0000 313842323020CEC2B6C8CFD4CABE2000 .byte 49,56,'B,50,48,32,206,194,182,200,207,212,202,190,32,0
.area data(ram, con, rel)
0010 .dbfile D:\mega16_32实验板资料\ICCAVR源程序\18b20\18b20_test.c
0010 ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -