?? temperasm.asm
字號:
.global _xx
date_size .set 0ah
_xx .usect ".out", date_size
.text
PARMS:
dsadd0 .word 0c00000h
dsaddr1 .word 0c00001h
destaddr2 .word _xx
.text
.global _temper
;測溫程序
_temper:
;ldp PARMS
;ldi @dsaddr1, ar1 ;定時入口
;call set
call rsreset; 復位傳感器
ldi 0fh, r3
subi r2, r3;檢測有無傳感器
bnz tss2 ;有傳感器
br tss20 ;無傳感器
tss2: ldi 0cch, r7;跳過rom匹配
call tswrite
ldi 044h, r7;轉換命令
call tswrite
ldi 8235h, r1;延時1s
and 0ffffh, r1
call delay15
ldi 8235h, r1;延時1s
and 0ffffh, r1
call delay15
call rsreset
ldi 0fh, r3
subi r2, r3;檢測有無傳感器
bnz tss1 ;有傳感器
br tss20 ;無傳感器
tss1: ldi 0cch, r7;跳過rom匹配
call tswrite
ldi 0beh, r7;讀命令
call tswrite
call tsread ;讀溫度值
tss20:
rets ;定時返回
;復位
rsreset:
ldi @dsaddr1, ar1
call logic1 ;write
call set
call clear ;發復位脈沖
ldi 28h, r1;延時600us
call delay15
call logic2; 釋放總線
ldi 3h, r1 ;延時45us等待
call delay15
ldi *ar1, ar0
and 1, ar0
ldi 1, r3
cmpi ar0, r3
bnz tsr2
br tsr3
tsr2: ldi 00h, r2;有傳感器
br tsr4
tsr3: ldi 0fh, r2;無傳感器 r2為標志
br tsr5
tsr4: ldi 28h, r1;延時600us
;ldi 1dh, r1;延時435us
call delay15
tsr5: ;call set
rets
;寫入子程序
tswrite:ldi @dsaddr1, ar1
ldi r7, r3 ; R7?
ldi 08h, r6;循環8次,寫1個字節
tsw1: call set
call delay2 ;高電平延時2us
call clear ;產生寫信? ;ldi 1, r1
;call delay15
call delay2 ; 延時2us
ldi r3, r4
and 1, r4;取最低位數
sti r4, *ar1;命令字按位依次送給ds18b20
;ldi 1, r1;延時15us, ds18b20read
ldi 3, r1;延時45us, ds18b20read
call delay15
;call set
;ldi 3, r1;延時約45us保證持續寫>60us ???
;call delay15
ror r3 ;rotate right
subi 1, r6;判斷是否傳完1個字節
bnz tsw1
call set ;發送完畢,置1
rets
;讀出子程序
tsread:;ldp PARMS
ldi @destaddr2, ar2;存儲從ds18b20收到的9個字節到806000h開始的單元
ldi 09h, r5;讀9個寄存器
tsrd1: ldi 08h, r6;循環8次,讀1個字節
ldi 0, r3
tsrd2: ldi @dsaddr1, ar1
call set
call delay2 ;高電平延時2us
call clear ;產生讀信號
call delay2 ;低電平延時2us
call logic2 ;釋放總線
;ldi 1, r1;延時15us ,(maybe too long)
;call delay15
call delay2
call delay2
;call delay2
;call delay2
ldi *ar1, r4
and 1, r4
or r4, r3
ror r3
ldi 4, r1;延時約45ns保證持續讀>60ns,delay60 seconds
call delay15
subi 1, r6;判斷是否讀完1個字節
bnz tsrd2
call set ;發送完畢,置1
ldi 24, r2
tsrd3: ror r3
subi 1, r2
bnz tsrd3
; ldi -24, r4;放在r3低8位
; ash r4, r3
sti r3, *ar2++(1)
subi 1, r5;判斷是否讀完9個寄存器
bnz tsrd1
rets
;延時子程序(15us)
delay15: push r0
push r1
delay151: ldi 1b9h, r0 ;15us
del15: subi 1, r0
bnz del15
subi 1, r1 ;delay R1*15us
bnz delay151
pop r1
pop r0
rets
;延時2us
delay2: push r0
ldi 3Ah, r0 ;延時2us
del2: subi 1, r0
bnz del2
pop r0
rets
; logical control
logic1: ldi @dsadd0, ar3;select74l244,write data
ldi 0h, r0
sti r0, *ar3
rets
logic2: ldi @dsadd0, ar3;close74l244,read data
ldi 7h, r0
sti r0, *ar3
rets
;set/clear dsadd1
set: call logic1
ldi 1, r0
sti r0, *ar1
rets
clear: call logic1
ldi 0, r0
sti r0, *ar1
rets
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -