📄 ds18b20.s
字号:
.module DS18B20.C
.area text(rom, con, rel)
.dbfile C:/icc/include/AVR_PQ1A.h
.dbfunc e Delayus _Delayus fV
; i -> R20,R21
; US -> R22,R23
.even
_Delayus::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 28
; /*******************************************
; 文件:DS18B20.C
; 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
; 硬件:ATMEGA16芯片
; 日期:2006年12月10日
; 功能:驱动开发板上的温度传感器DS18B20(作者只做了正温度值的显示,负温度值的显示读者可自行编写)。
; 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
; /******************************************/
; #include <iom16v.h> //包含型号头文件
; #include <macros.h> //包含"位"操作头文件
; #include <stdio.h> //标准输入输出头文件
; #include <AVR_PQ1A.h> //包含自定义常量头文件
; #include "SMG.C" //包含数码管显示函数
;
; /*******************************************
; 函数名称: B20_init
; 功 能: 复位DS18B20
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void B20_init(void)
; {
; DDRA|=BIT(DS18B20); //配置为输出
; PORTA&=~BIT(DS18B20); //拉低
; Delayus(600); //等待600微秒
; PORTA|=BIT(DS18B20); //释放总线
; Delayus(60); //等待60微秒
; DDRA&=~BIT(DS18B20); //配置为输入
.dbline 30
; while((PINA&(BIT(DS18B20)))); //等待DS18B20拉低
; while(!(PINA&(BIT(DS18B20)))); //等待DS18B20释放总线
ldi R16,5
ldi R17,0
movw R18,R22
xcall empy16s
movw R22,R16
lsr R23
ror R22
lsr R23
ror R22
.dbline 31
clr R20
clr R21
xjmp L5
L2:
.dbline 31
L3:
.dbline 31
subi R20,255 ; offset = 1
sbci R21,255
L5:
.dbline 31
; }
cp R20,R22
cpc R21,R23
brlo L2
.dbline -2
.dbline 32
; /*******************************************
L1:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r US 22 i
.dbend
.dbfunc e Delayms _Delayms fV
; i -> R20,R21
; j -> R22,R23
; MS -> R16,R17
.even
_Delayms::
xcall push_gset2
.dbline -1
.dbline 40
; 函数名称: B20_readB
; 功 能: 读取一个字节的数据
; 参 数: 无
; 返回值 : retd--返回的一个字节数据
; /********************************************/
; uchar B20_readB(void)
; {
; uchar i,retd=0;
.dbline 42
; for(i=0;i<8;i++) //位计数值
; {
clr R20
clr R21
xjmp L10
L7:
.dbline 43
clr R22
clr R23
xjmp L14
L11:
.dbline 43
L12:
.dbline 43
subi R22,255 ; offset = 1
sbci R23,255
L14:
.dbline 43
cpi R22,117
ldi R30,4
cpc R23,R30
brlo L11
L8:
.dbline 42
subi R20,255 ; offset = 1
sbci R21,255
L10:
.dbline 42
cp R20,R16
cpc R21,R17
brlo L7
.dbline -2
.dbline 44
; retd>>=1; //右移,准备接受新的数据位
; DDRA|=BIT(DS18B20); //配置为输出
L6:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r j 22 i
.dbsym r MS 16 i
.dbend
.dbfunc e Board_init _Board_init fV
.even
_Board_init::
.dbline -1
.dbline 52
; PORTA&=~BIT(DS18B20); //拉低,启动读数据位
; PORTA|=BIT(DS18B20); //释放总线
; Delayus(5); //等待5微秒
; DDRA&=~BIT(DS18B20); //配置为输入,开始读取数据位
; if(PINA&BIT(DS18B20)) //该位是否为高
; {
; retd|=0x80; //是就将此位置高
; }
.dbline 53
; Delayus(50); //等待50微秒
ldi R24,255
out 0x1a,R24
.dbline 54
; }
out 0x17,R24
.dbline 55
; return retd; //将读到的一个字节返回
out 0x14,R24
.dbline 56
; }
out 0x11,R24
.dbline 58
; /*******************************************
; 函数名称: B20_writeB
clr R2
out 0xd,R2
.dbline 60
; 功 能: 写入一个字节的数据
; 参 数: wrd--要写入的数据
sbi 0x1b,6
.dbline 61
; 返回值 : 无
cbi 0x15,6
.dbline 62
; /********************************************/
cbi 0x1b,1
.dbline 63
; void B20_writeB(uchar wrd)
out 0x18,R24
.dbline 64
; {
sbi 0x1b,2
.dbline 65
; uchar i;
ldi R16,5
ldi R17,0
xcall _Delayus
.dbline 66
; for(i=0;i<8;i++) //位计数值
cbi 0x1b,2
.dbline 68
; {
; DDRA|=BIT(DS18B20); //配置为输出
clr R2
out 0x18,R2
.dbline 69
; PORTA&=~BIT(DS18B20); //拉低,启动写数据位
sbi 0x1b,3
.dbline 70
; Delayus(1); //等待1微秒
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 71
; if(wrd&0x01) //此位数据是否为高
cbi 0x1b,3
.dbline 73
; {
; PORTA|=BIT(DS18B20); //是高则将单总线拉高
ldi R24,255
out 0x18,R24
.dbline 74
; }
sbi 0x1b,4
.dbline 75
; else
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 76
; {
cbi 0x1b,4
.dbline 78
; PORTA&=~BIT(DS18B20); //是低则将单总线拉低
; }
ldi R24,255
out 0x12,R24
.dbline 79
; Delayus(50); //等待50微秒
sbi 0x1b,7
.dbline 80
; PORTA|=BIT(DS18B20); //释放总线
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 81
; wrd>>=1; //右移,为写入新的数据位做准备
cbi 0x1b,7
.dbline -2
.dbline 84
; }
; Delayus(50); //等待50微秒
; }
L15:
.dbline 0 ; func end
ret
.dbend
.area code(ram, con, rel)
.dbfile C:/icc/include/AVR_PQ1A.h
.area lit(rom, con, rel)
_SEGMENT::
.word 63
.word 6
.word 91
.word 79
.word 102
.word 109
.word 125
.word 7
.word 127
.word 111
.word 119
.word 124
.word 57
.word 94
.word 121
.word 113
.word 191
.word 134
.word 219
.word 207
.word 230
.word 237
.word 253
.word 135
.word 255
.word 239
.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\11_DS18B20/SMG.C
.dbsym e SEGMENT _SEGMENT A[52:26]I
.area text(rom, con, rel)
.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\11_DS18B20/SMG.C
.dbfunc e One_smg_display _One_smg_display fV
; number -> R20
; data -> R22
.even
_One_smg_display::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 27
.dbline 28
in R24,0x18
ori R24,63
out 0x18,R24
.dbline 29
sbi 0x1b,4
.dbline 30
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 31
cbi 0x1b,4
.dbline 33
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_SEGMENT
ldi R25,>_SEGMENT
add R30,R24
adc R31,R25
lpm R0,Z+
lpm R1,Z
movw R30,R0
out 0x18,R30
.dbline 34
sbi 0x1b,3
.dbline 35
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 36
cbi 0x1b,3
.dbline 38
mov R17,R20
subi R17,1
ldi R16,1
xcall lsl8
mov R20,R16
com R20
.dbline 39
out 0x18,R20
.dbline 40
sbi 0x1b,4
.dbline 41
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 42
cbi 0x1b,4
.dbline -2
.dbline 43
L16:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r number 20 c
.dbsym r data 22 c
.dbend
.dbfunc e All_smg_display _All_smg_display fV
; i -> R20
; pdata -> R22,R23
.even
_All_smg_display::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 51
.dbline 53
clr R20
xjmp L21
L18:
.dbline 54
.dbline 55
mov R18,R20
subi R18,255 ; addi 1
mov R30,R20
clr R31
add R30,R22
adc R31,R23
ldd R16,z+0
xcall _One_smg_display
.dbline 56
ldi R16,1
ldi R17,0
xcall _Delayms
.dbline 57
L19:
.dbline 53
inc R20
L21:
.dbline 53
cpi R20,6
brlo L18
.dbline -2
.dbline 58
L17:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r pdata 22 pc
.dbend
.dbfunc e Cycle_smg_display _Cycle_smg_display fV
; i -> R20
; j -> R10
; pdata -> R22,R23
.even
_Cycle_smg_display::
xcall push_gset3
movw R22,R16
.dbline -1
.dbline 66
.dbline 68
clr R20
xjmp L26
L23:
.dbline 69
.dbline 70
clr R10
xjmp L30
L27:
.dbline 71
.dbline 72
mov R18,R10
subi R18,255 ; addi 1
ldi R24,40
ldi R25,0
mov R16,R20
clr R17
push R18
push R19
movw R18,R24
xcall div16s
movw R2,R16
pop R19
pop R18
mov R4,R10
clr R5
add R2,R4
adc R3,R5
ldi R24,6
ldi R25,0
push R18
push R19
movw R18,R24
movw R16,R2
xcall mod16s
movw R30,R16
pop R19
pop R18
add R30,R22
adc R31,R23
ldd R16,z+0
xcall _One_smg_display
.dbline 73
ldi R16,2000
ldi R17,7
xcall _Delayus
.dbline 74
L28:
.dbline 70
inc R10
L30:
.dbline 70
mov R24,R10
cpi R24,6
brlo L27
.dbline 75
L24:
.dbline 68
inc R20
L26:
.dbline 68
cpi R20,240
brlo L23
.dbline -2
.dbline 76
L22:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r j 10 c
.dbsym r pdata 22 pc
.dbend
.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\11_DS18B20\DS18B20.C
.dbfunc e B20_init _B20_init fV
.even
_B20_init::
.dbline -1
.dbline 22
.dbline 23
sbi 0x1a,5
.dbline 24
cbi 0x1b,5
.dbline 25
ldi R16,600
ldi R17,2
xcall _Delayus
.dbline 26
sbi 0x1b,5
.dbline 27
ldi R16,60
ldi R17,0
xcall _Delayus
.dbline 28
cbi 0x1a,5
L32:
.dbline 29
L33:
.dbline 29
sbic 0x19,5
rjmp L32
L35:
.dbline 30
L36:
.dbline 30
sbis 0x19,5
rjmp L35
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -