📄 read90.txt
字号:
;read ds1990a ds1991--ds1996 rom
;r0: RAM address . length = 7 byte
readdsrom:
mov r3,#33h
sjmp rddsrom
;---------------------
;read ds1990 ds1990a rom
;r0: RAM address . length = 7 byte
readds1990:
mov r3,#0fh
sjmp rddsrom
;=====================
rddsrom:
lcall dsrdprg
jnb f0,rddsrom1 ;检查标志,若出错了,则退出,否则则到rddsrom1,
ret
rddsrom1:
mov a,r3 ;r3 cammand ;其实至此已经设置好了主机可以接收数据了
lcall dswrbyte
mov r3,#0 ;r3 CRC init data,现在可以读了
mov r5,#7 ;因总共是7个字节,即6个数据及一个CRC检验
rddsrom5: ;read family code and serNr.
mov r6,#8 ;一字节位数8
rddsrom6:
lcall dsrdprg ;读了一位
mov a,r4 ;R4用于存放读回的数的
mov c,f0 ;读刚读回来的那位
rrc a ;存入R4中,用到的是循环右移,因为刚读回的数是低位的
mov r4,a
lcall bit_crc ;creat CRC verify
djnz r6,rddsrom6
mov a,r4 ;读完一字节了
mov @r0,a ;存刚读回的一个字节
inc r0 ;指向下一字节
djnz r5,rddsrom5 ;接收完开始的7个字节不?
lcall dsrdbyte ;read CRC
mov @r0,a ;保存CRC
clr f0 ;清F0
xrl a,r3 ;比较接收到的CRC与计算出的是不是相同
jz rddsrom8 ;相同则到rddsrom8
setb f0 ;f0=1 error ;不同,则置位报错
rddsrom8:
ret
;write one byte
;input A
dswrbyte:
clr ea ;禁止中断
mov r6,#8 ;一个字节的位数
dswrbyt2:
clr p_sio ;置低
rrc a ;带进位循环右移A,即R3
jc dswrbyt3 ; 若R3.0为1,则到dswrbyt3
lcall del70us ; 若R3.0为0,则等70US
setb p_sio ;等完70US后就到dswrbyt4
sjmp dswrbyt4
dswrbyt3:
setb p_sio ;因为前面已经知C==1,故置1 P_SIO
lcall del70us ;再等70US
dswrbyt4:
djnz r6,dswrbyt2
setb ea
ret
;read one byte
;output A
;write zero
dswzprg:
clr p_sio
lcall del70us
setb p_sio
ret
;write one
dswoprg:
clr ea
clr p_sio
nop
setb p_sio
setb ea
lcall del70us
ret
;read data
dsrdprg:
clr ea ; 禁止中断
clr p_sio ; 置低总线
nop ; 等待一下
setb p_sio ; 再置高
nop ; 再等待一下
mov c,p_sio ; 读总线的数
mov f0,c ; 暂存到F0中
setb ea ; 允许中断
lcall del70us ; 等待70US
ret
dsrdbyte:
clr ea ;禁止中断
mov r6,#8 ;一个字节的数8
dsrdbyt1:
clr p_sio ;置低总线
nop ;等一下
setb p_sio ;置高总线
nop ;再等一下
nop
mov c,p_sio ;读一位
rrc a ;
lcall del70us ;延时70US
djnz r6,dsrdbyt1 ;读完这个RCC字节不?
setb ea ;允许中断
ret
dsiprg:
clr f0 ;清标志
clr p_sio ;置低总线
clr ea ;不许中断
lcall del480us ;这是RESET信号,这信号的长度必须大于480US,这信号后主机就释放总线,从而进入接收状态
setb p_sio ;这里循环是用于等待P_SIO变高的
mov r7,#3
dsiprg1:
jb p_sio,dsiprg2 ;变高则立即到dsiprg2
djnz r7,dsiprg1
sjmp dsiprg6 ;出错了,置标志
dsiprg2:
; mov wdrst,#1eh ;reste wtd
; mov wdrst,#0e1h
mov r7,#20h ;这里要等15~60US,在此是要等60US
dsiprg3:
jnb p_sio,dsiprg4 ;就是在60US内要等p_sio变低,若变低了就到dsiprg4
djnz r7,dsiprg3
sjmp dsiprg6
dsiprg4:
mov r7,#80h ;其实此处的数值实际上都大了,
dsiprg5:
jb p_sio,dsiprg7 ;就是要在240US内等p_sio变高
djnz r7,dsiprg5
dsiprg6:
setb f0 ;置标志位
dsiprg7:
setb ea ;允许中断
ret
;--------------------
bit_crc: ;此CRC是采用右移的
mov a,r3
rrc a ;将a带进位位循环右移,此时R4刚移出的那位就移入a中了,此时C就是A刚移出的位
jnb f0,bitcrc1 ;若读回的那位为0,则跳,否则就往下执行
cpl c ;若读回的那位为1则取反
bitcrc1:
mov a,r3 ;为
jnc bitcrc2 ;
xrl a,#18h
bitcrc2:
rrc a
mov r3,a
ret
;--------------------
;
;do_crc:
; push acc
; push b
; push acc
; mov b,#8
;crc_loop:
; xrl a,crc
; rrc a
; mov a,crc
; jnc zero
; xrl a,#18h
;zero:
; rrc a
; mov crc,a
; pop acc
; rr a
; push acc
; djnz b,crc_loop
; pop acc
; pop b
; pop acc
; ret
del480us:
mov r7,#160
sjmp del70us1
del70us:
mov r7,#23
del70us1:
nop
nop
djnz r7,del70us1
ret
del100ms:
mov dt2,#100
sjmp delms
del15ms:
mov dt2,#15
delms:
mov dt1,#0
del15ms1:
nop
nop
djnz dt1,del15ms1
djnz dt2,del15ms1
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -