📄 18b20_test.s
字号:
ldi R19,0
xcall div16u
std y+1,R16
.dbline 120
ldi R18,10
ldi R19,0
movw R16,R12
xcall mod16u
movw R12,R16
.dbline 121
; dispi[0]=adc;
std y+0,R12
.dbline 122
; lcd_write(command,wz);
mov R18,R10
clr R16
xcall _lcd_write
xjmp L60
L59:
.dbline 124
; while(j--)
; {
.dbline 125
; if((dispi[j]==0)&&(i==1)&&(j!=0))
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
tst R2
brne L62
X13:
cpi R22,1
brne L62
X14:
tst R20
breq L62
X15:
.dbline 126
; {
.dbline 127
; lcd_write(data,dispi[j]+0x20);
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R18,z+0
subi R18,224 ; addi 32
ldi R16,1
xcall _lcd_write
.dbline 128
; }
xjmp L63
L62:
.dbline 130
; else
; {
.dbline 131
; lcd_write(data,dispi[j]+0x30);
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R18,z+0
subi R18,208 ; addi 48
ldi R16,1
xcall _lcd_write
.dbline 132
; i=0;
clr R22
.dbline 133
; }
L63:
.dbline 134
; }
L60:
.dbline 123
mov R2,R20
clr R3
subi R20,1
tst R2
brne L59
X16:
.dbline -2
L56:
.dbline 0 ; func end
adiw R28,3
xjmp pop_xgsetF03C
.dbsym r i 22 c
.dbsym l dispi 0 A[3:3]c
.dbsym r j 20 c
.dbsym r adc 12 i
.dbsym r wz 10 c
.dbend
.dbfile D:\mega16_32实验板资料\ICCAVR源程序\18b20\18b20.h
.dbfunc e Sensor_Delay _Sensor_Delay fV
; i -> R20,R21
; US -> R10,R11
.even
_Sensor_Delay::
xcall push_xgset300C
movw R10,R16
.dbline -1
.dbline 12
; #define b20_io PC7
; #define b20_port PORTC
; #define b20_pin PINC
; #define b20_ddr DDRC
; /********************************************************************************************
; * 函数名称:Sensor_Delay(uint16 count)//延时函数
; * 功 能:DS18B20软件延时专用
; * 入口参数:count
; * 出口参数:无
; *********************************************************************************************/
; void Sensor_Delay(unsigned int US)
; {
.dbline 14
; unsigned int i;
; US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
ldi R16,5
ldi R17,0
movw R18,R10
xcall empy16s
movw R10,R16
lsr R11
ror R10
lsr R11
ror R10
.dbline 15
; for(i=0;i<US;i++);
clr R20
clr R21
xjmp L68
L65:
.dbline 15
L66:
.dbline 15
subi R20,255 ; offset = 1
sbci R21,255
L68:
.dbline 15
cp R20,R10
cpc R21,R11
brlo L65
X17:
.dbline -2
L64:
.dbline 0 ; func end
xjmp pop_xgset300C
.dbsym r i 20 i
.dbsym r US 10 i
.dbend
.dbfunc e B20_init _B20_init fV
.even
_B20_init::
.dbline -1
.dbline 24
; }
; /*******************************************
; 函数名称: B20_init
; 功 能: 复位DS18B20
; 参 数: 无
; 返回值 : 无
; ********************************************/
; void B20_init(void)
; {
.dbline 25
; b20_ddr|=(1<<b20_io); //配置为输出
sbi 0x14,7
.dbline 26
; b20_port&=~(1<<b20_io); //拉低
cbi 0x15,7
.dbline 27
; Sensor_Delay(600); //等待600微秒
ldi R16,600
ldi R17,2
xcall _Sensor_Delay
.dbline 28
; b20_port|=(1<<b20_io); //释放总线
sbi 0x15,7
.dbline 29
; Sensor_Delay(60); //等待60微秒
ldi R16,60
ldi R17,0
xcall _Sensor_Delay
.dbline 30
; b20_ddr&=~(1<<b20_io); //配置为输入
cbi 0x14,7
L70:
.dbline 31
; while((b20_pin&(1<<b20_io))); //等待DS18B20拉低
L71:
.dbline 31
sbic 0x13,7
rjmp L70
X18:
L73:
.dbline 32
; while(!(b20_pin&(1<<b20_io))); //等待DS18B20释放总线
L74:
.dbline 32
sbis 0x13,7
rjmp L73
X19:
.dbline -2
L69:
.dbline 0 ; func end
ret
.dbend
.dbfunc e B20_readB _B20_readB fc
; retd -> R20
; i -> R22
.even
_B20_readB::
st -y,R20
st -y,R22
.dbline -1
.dbline 42
; }
;
; /*******************************************
; 函数名称: B20_readB
; 功 能: 读取一个字节的数据
; 参 数: 无
; 返回值 : retd--返回的一个字节数据
; ********************************************/
; unsigned char B20_readB(void)
; {
.dbline 43
; unsigned char i,retd=0;
clr R20
.dbline 44
; for(i=0;i<8;i++) //位计数值
clr R22
xjmp L80
L77:
.dbline 45
; {
.dbline 46
; retd>>=1; //右移,准备接受新的数据位
lsr R20
.dbline 47
; b20_ddr|=(1<<b20_io); //配置为输出
sbi 0x14,7
.dbline 48
; b20_port&=~(1<<b20_io); //拉低,启动读数据位
cbi 0x15,7
.dbline 49
; b20_port|=(1<<b20_io); //释放总线
sbi 0x15,7
.dbline 50
; Sensor_Delay(5); //等待5微秒
ldi R16,5
ldi R17,0
xcall _Sensor_Delay
.dbline 51
; b20_ddr&=~(1<<b20_io); //配置为输入,开始读取数据位
cbi 0x14,7
.dbline 52
; if(b20_pin&(1<<b20_io)) //该位是否为高
sbis 0x13,7
rjmp L81
X20:
.dbline 53
; {
.dbline 54
; retd|=0x80; //是就将此位置高
ori R20,128
.dbline 55
; }
L81:
.dbline 56
; Sensor_Delay(50); //等待50微秒
ldi R16,50
ldi R17,0
xcall _Sensor_Delay
.dbline 57
; }
L78:
.dbline 44
inc R22
L80:
.dbline 44
cpi R22,8
brlo L77
X21:
.dbline 58
; return retd; //将读到的一个字节返回
mov R16,R20
.dbline -2
L76:
.dbline 0 ; func end
ld R22,y+
ld R20,y+
ret
.dbsym r retd 20 c
.dbsym r i 22 c
.dbend
.dbfunc e B20_writeB _B20_writeB fV
; i -> R20
; wrd -> R10
.even
_B20_writeB::
st -y,R10
st -y,R20
mov R10,R16
.dbline -1
.dbline 67
; }
; /*******************************************
; 函数名称: B20_writeB
; 功 能: 写入一个字节的数据
; 参 数: wrd--要写入的数据
; 返回值 : 无
; ********************************************/
; void B20_writeB(unsigned char wrd)
; {
.dbline 69
; unsigned char i;
; for(i=0;i<8;i++) //位计数值
clr R20
xjmp L87
L84:
.dbline 70
; {
.dbline 71
; b20_ddr|=(1<<b20_io); //配置为输出
sbi 0x14,7
.dbline 72
; b20_port&=~(1<<b20_io); //拉低,启动写数据位
cbi 0x15,7
.dbline 73
; Sensor_Delay(1); //等待1微秒
ldi R16,1
ldi R17,0
xcall _Sensor_Delay
.dbline 74
; if(wrd&0x01) //此位数据是否为高
sbrs R10,0
rjmp L88
X22:
.dbline 75
; {
.dbline 76
; b20_port|=(1<<b20_io); //是高则将单总线拉高
sbi 0x15,7
.dbline 77
; }
xjmp L89
L88:
.dbline 79
; else
; {
.dbline 80
; b20_port&=~(1<<b20_io); //是低则将单总线拉低
cbi 0x15,7
.dbline 81
; }
L89:
.dbline 82
; Sensor_Delay(50); //等待50微秒
ldi R16,50
ldi R17,0
xcall _Sensor_Delay
.dbline 83
; b20_port|=(1<<b20_io); //释放总线
sbi 0x15,7
.dbline 84
; wrd>>=1; //右移,为写入新的数据位做准备
lsr R10
.dbline 85
; }
L85:
.dbline 69
inc R20
L87:
.dbline 69
cpi R20,8
brlo L84
X23:
.dbline 86
; Sensor_Delay(50); //等待50微秒
ldi R16,50
ldi R17,0
xcall _Sensor_Delay
.dbline -2
L83:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ret
.dbsym r i 20 c
.dbsym r wrd 10 c
.dbend
.dbfunc e Read_temp _Read_temp fV
; temph -> R10,R11
; templ -> R12,R13
.even
_Read_temp::
xcall push_xgset003C
movw R10,R18
movw R12,R16
.dbline -1
.dbline 96
; }
;
; /*******************************************
; 函数名称: Read_temp
; 功 能: 读取温度值
; 参 数: templ温度值低位,temph温度值高位
; 返回值 : 无
; ********************************************/
; void Read_temp(unsigned char *templ,unsigned char *temph)
; {
.dbline 97
; B20_init(); //初始化,每次写命令都从初始化开始
xcall _B20_init
.dbline 98
; B20_writeB(0xcc); //跳过ROM
ldi R16,204
xcall _B20_writeB
.dbline 99
; B20_writeB(0x44); //启动温度转换
ldi R16,68
xcall _B20_writeB
.dbline 100
; B20_init(); //初始化,每次写命令都从初始化开始
xcall _B20_init
.dbline 101
; B20_writeB(0xcc); //跳过ROM
ldi R16,204
xcall _B20_writeB
.dbline 102
; B20_writeB(0xbe); //读寄存器
ldi R16,190
xcall _B20_writeB
.dbline 103
; *templ=B20_readB(); //读温度低字节
xcall _B20_readB
movw R30,R12
std z+0,R16
.dbline 104
; *temph=B20_readB(); //读温度高字节
xcall _B20_readB
movw R30,R10
std z+0,R16
.dbline -2
L90:
.dbline 0 ; func end
xjmp pop_xgset003C
.dbsym r temph 10 pc
.dbsym r templ 12 pc
.dbend
.dbfunc e b20_display _b20_display fV
; fraction -> R10,R11
; inter -> R12
; b20_l -> y+1
; b20_h -> y+0
; lz -> R20
.even
_b20_display::
xcall push_xgset303C
mov R20,R16
sbiw R28,2
.dbline -1
.dbline 113
; }
; /*******************************************
; 函数名称: b20_display
; 功 能: 温度值显示
; 参 数: lz为液晶显示位置
; 返回值 : 无
; ********************************************/
; void b20_display(unsigned char lz)
; {
.dbline 114
; unsigned char b20_h=0,b20_l=0;
clr R2
std y+0,R2
.dbline 114
std y+1,R2
.dbline 115
; unsigned char inter=0;
clr R12
.dbline 116
; unsigned int fraction=0;
clr R10
clr R11
.dbline 117
; Read_temp(&b20_l,&b20_h); //读取温度值
movw R18,R28
movw R16,R28
subi R16,255 ; offset = 1
sbci R17,255
xcall _Read_temp
.dbline 118
; if(b20_h&0xf8)
ldd R24,y+0
andi R24,248
breq L92
X24:
.dbline 119
; {
.dbline 120
; lcd_write(command,lz);
mov R18,R20
clr R16
xcall _lcd_write
.dbline 121
; lcd_write(data,' -');
ldi R18,32
ldi R16,1
xcall _lcd_write
.dbline 122
; b20_l=~b20_l;
ldd R2,y+1
com R2
std y+1,R2
.dbline 123
; b20_h=~b20_h;
ldd R2,y+0
com R2
std y+0,R2
.dbline 124
; }
L92:
.dbline 125
; inter=b20_h*16+(b20_l>>4);//整数部分
ldd R2,y+0
ldi R24,16
mul R24,R2
mov R12,R0
ldd R24,y+1
swap R24
andi R24,#0x0F
add R12,R24
.dbline 126
; int_disp(lz+1,inter);
mov R18,R12
clr R19
mov R16,R20
subi R16,255 ; addi 1
xcall _int_disp
.dbline 127
; lcd_write(data,'.');
ldi R18,46
ldi R16,1
xcall _lcd_write
.dbline 128
; fraction=(b20_l&0x0f)*625;//小数部分,只显示小数点后一位
ldd R18,y+1
clr R19
andi R18,15
andi R19,0
ldi R16,625
ldi R17,2
xcall empy16s
movw R10,R16
.dbline 129
; lcd_write(data,fraction/1000+48);
ldi R18,1000
ldi R19,3
xcall div16u
mov R18,R16
subi R18,208 ; offset = 48
sbci R19,255
ldi R16,1
xcall _lcd_write
.dbline -2
L91:
.dbline 0 ; func end
adiw R28,2
xjmp pop_xgset303C
.dbsym r fraction 10 i
.dbsym r inter 12 c
.dbsym l b20_l 1 c
.dbsym l b20_h 0 c
.dbsym r lz 20 c
.dbend
.dbfile D:\mega16_32实验板资料\ICCAVR源程序\18b20\18b20_test.c
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 13
; //ICC-AVR application builder : 2008-5-8 17:24:29
; // Target : M16
; // Crystal: 8.0000Mhz
;
; #include <iom16v.h>
; #include <macros.h>
;
; #include "delay.h"
; #include "lcd12232.h"
; #include "18b20.h"
;
; void main(void)
; {
.dbline 14
; LCD_init();
xcall _LCD_init
.dbline 15
; line1_display("18B20 温度显示 ");
ldi R16,<L95
ldi R17,>L95
xcall _line1_display
xjmp L97
L96:
.dbline 17
; while(1)
; {
.dbline 18
; b20_display(0x93);
ldi R16,147
xcall _b20_display
.dbline 19
; }
L97:
.dbline 16
xjmp L96
X25:
.dbline -2
L94:
.dbline 0 ; func end
ret
.dbend
.area data(ram, con, rel)
.dbfile D:\mega16_32实验板资料\ICCAVR源程序\18b20\18b20_test.c
L95:
.blkb 16
.area idata
.byte 49,56,'B,50,48,32,206,194,182,200,207,212,202,190,32,0
.area data(ram, con, rel)
.dbfile D:\mega16_32实验板资料\ICCAVR源程序\18b20\18b20_test.c
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -