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