📄 18b20.s
字号:
.module _18b20.c
.area text(rom, con, rel)
.dbfile D:\时钟芯片\1302\1302-162\18b20.c
.dbfunc e delayb _delayb fV
; x -> R16,R17
.even
_delayb::
.dbline -1
.dbline 6
; #include <io8515v.h>
; #include <macros.h>
; #include <162-1302.h>
; //时间延迟
; void delayb(uint x) //1.5us左右
; {
rjmp L3
L2:
.dbline 8
.dbline 9
subi R16,1
sbci R17,0
.dbline 10
L3:
.dbline 7
; while(x)
cpi R16,0
cpc R16,R17
brne L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r x 16 i
.dbend
.dbfunc e init_1820 _init_1820 fc
; ack -> R20
.even
_init_1820::
rcall push_gset1
.dbline -1
.dbline 14
; {
; x--;
; }
; }
; //18b20初始化
; uchar init_1820()
; { uchar ack;
.dbline 15
; B20_DATA_DDR|=B20_DATA_IO ; //输出
sbi 0x14,0
.dbline 16
; B20_DATA_PORT&=~B20_DATA_IO ;
cbi 0x15,0
.dbline 17
; delayb(600); //复位低电平480us~960us
ldi R16,600
ldi R17,2
rcall _delayb
.dbline 18
; B20_DATA_PORT|=B20_DATA_IO ; //电平拉高
sbi 0x15,0
.dbline 19
; B20_DATA_DDR&=~B20_DATA_IO ; //输入
cbi 0x14,0
.dbline 20
; delayb(90); //延时60us~240us
ldi R16,90
ldi R17,0
rcall _delayb
.dbline 21
; ack=B20_DATA_PIN; //读出ack的值
in R20,0x13
.dbline 22
; ack&=B20_DATA_IO;
andi R20,1
.dbline 23
; delayb(200); //等待480us以上
ldi R16,200
ldi R17,0
rcall _delayb
.dbline 24
; B20_DATA_DDR|=B20_DATA_IO ; //输出
sbi 0x14,0
.dbline 25
; return(ack);
mov R16,R20
.dbline -2
L5:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r ack 20 c
.dbend
.dbfunc e write_1820 _write_1820 fV
; m -> R20
; i -> R22
; x -> R10
.even
_write_1820::
rcall push_gset3
mov R10,R16
.dbline -1
.dbline 29
; }
; //写一个字节
; void write_1820(uchar x)
; {
.dbline 31
; uchar i,m;
; B20_DATA_DDR|=B20_DATA_IO; //输出
sbi 0x14,0
.dbline 32
; for(i=0;i<8;i++)
clr R22
rjmp L10
L7:
.dbline 33
; {
.dbline 34
; m=x&0x01;
mov R20,R10
andi R20,1
.dbline 35
; if(m==0x01)
cpi R20,1
brne L11
.dbline 36
; {
.dbline 37
; delayb(1); //延时>1us
ldi R16,1
ldi R17,0
rcall _delayb
.dbline 38
; B20_DATA_PORT&=~B20_DATA_IO; //产生写起始信号
cbi 0x15,0
.dbline 39
; delayb(3); //延时1us~15us 8us
ldi R16,3
ldi R17,0
rcall _delayb
.dbline 40
; B20_DATA_PORT|=B20_DATA_IO; //数据线电平拉高
sbi 0x15,0
.dbline 41
; delayb(55); //延时60us~120us 85us
ldi R16,55
ldi R17,0
rcall _delayb
.dbline 42
; }
rjmp L12
L11:
.dbline 44
; else
; {
.dbline 45
; delayb(1); //延时>1us
ldi R16,1
ldi R17,0
rcall _delayb
.dbline 46
; B20_DATA_PORT&=~B20_DATA_IO; //产生写起始信号
cbi 0x15,0
.dbline 47
; delayb(55); //B20采样要60us到120us 85us
ldi R16,55
ldi R17,0
rcall _delayb
.dbline 48
; B20_DATA_PORT|=B20_DATA_IO; //数据线电平拉高
sbi 0x15,0
.dbline 49
; }
L12:
.dbline 50
lsr R10
.dbline 51
L8:
.dbline 32
inc R22
L10:
.dbline 32
cpi R22,8
brlo L7
.dbline -2
L6:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r m 20 c
.dbsym r i 22 c
.dbsym r x 10 c
.dbend
.dbfunc e read_1820 _read_1820 fc
; temp -> R20
; k -> R22
; n -> R10
.even
_read_1820::
rcall push_gset3
.dbline -1
.dbline 55
; x=x>>1; //右移一位
; }
; }
; //读一个字节
; uchar read_1820()
; {
.dbline 57
; uchar temp,k,n;
; temp=0;
clr R20
.dbline 58
; for(n=0;n<8;n++)
clr R10
rjmp L17
L14:
.dbline 59
; {
.dbline 60
; B20_DATA_DDR|=B20_DATA_IO; //输出
sbi 0x14,0
.dbline 61
; B20_DATA_PORT&=~B20_DATA_IO; //产生读起始信号
cbi 0x15,0
.dbline 62
; asm("nop");
nop
.dbline 63
; asm("nop");
nop
.dbline 64
; asm("nop");
nop
.dbline 65
; asm("nop"); //延时1us~15us 2us
nop
.dbline 66
; B20_DATA_PORT|=B20_DATA_IO; //电平拉高
sbi 0x15,0
.dbline 67
; B20_DATA_DDR&=~B20_DATA_IO; //接收数据
cbi 0x14,0
.dbline 68
; asm("nop"); //要在15us内完成读数
nop
.dbline 69
; asm("nop");
nop
.dbline 70
; k=B20_DATA_PIN; //读数据,从低位开始
in R22,0x13
.dbline 71
; k&=0x01;
andi R22,1
.dbline 72
; if(k)
breq L18
.dbline 73
; temp|=(1<<n);
ldi R16,1
mov R17,R10
rcall lsl8
or R20,R16
rjmp L19
L18:
.dbline 75
; else
; temp&=~(1<<n);
ldi R16,1
mov R17,R10
rcall lsl8
mov R2,R16
com R2
and R20,R2
L19:
.dbline 76
ldi R16,40
ldi R17,0
rcall _delayb
.dbline 77
sbi 0x14,0
.dbline 78
sbi 0x15,0
.dbline 79
L15:
.dbline 58
inc R10
L17:
.dbline 58
mov R24,R10
cpi R24,8
brlo L14
.dbline 80
; delayb(40); //60~120us
; B20_DATA_DDR|=B20_DATA_IO; //输出
; B20_DATA_PORT|=B20_DATA_IO;
; }
; return temp;
mov R16,R20
.dbline -2
L13:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbsym r k 22 c
.dbsym r n 10 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -