⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 read90.txt

📁 此程序用来读IBUTTON TM卡的唯一序列号
💻 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 + -