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

📄 sle4442.inc

📁 sle4442源代码
💻 INC
字号:
;*****************************************************************************
;                    SLE4442驱动程序说明                            	     *
;ReadCard 读出从SubAdr开始的ByteCnt字节,结果存放于(RcvDat)中,读出正确,ACC中返*
;回#0,返回#01表示无效卡或者卡损坏,(注读函数已经对数据进行了校验)	     *
;*****************************************************************************
       
;*************IC卡位定义*************************
ICin          	BIT  	P1.4               	;IC卡插入连锁端口
VCC1          	BIT  	P2.0               	;IC卡电源控制端口 
RST           	BIT  	P1.1               	;IC卡复位端  
SD            	BIT  	P1.2               	;IC卡数据线  
CLK           	BIT  	P1.0               	;IC卡时钟线  
ICN           	BIT  	P0.7               	;IC卡短路检测端口

;*******************变量定义**********99999*********
ReadBuf		EQU	30H		;读IC卡缓冲区首址
WriteBuf	EQU	40H		;写IC卡缓冲区首址
SubAdr		Data 	01H		;被控器单元地址
BitCnt		Data 	02H		;I2C数据位计数器
ByteCnt		Data 	03H		;I2C数据字节计数器

;*************IC卡常数***************************
Idetify1    	EQU   	0A2H     		;此处为IC卡保护区00~03单元的值,用于识别卡
Idetify2    	EQU   	13H
Idetify3    	EQU   	10H
Idetify4    	EQU   	91H     
;************************************************

ReadCard:
	PUSH	05H
	PUSH	02H
	PUSH	00H
	ACALL	ANRST				;
	JNZ	ReadExit			;       
	MOV	R5,SubAdr			;被控器件地址单元
	MOV	R0,#ReadBuf			;读缓冲区
	MOV	R2,#16				;16个字节
	ACALL	Remm				;读主存储器
	MOV	R0,#ReadBuf			;
	mov	R2,#14				;
	MOV	A,@R0				;
checksum:					;和校验
	INC	R0
	XRL	A,@R0				;
	DJNZ	R2,checksum			;
	INC	R0				;
	CLR	C				;
	SUBB	A,@R0				;校验后返回值在ACC中
ReadExit:
	POP	00H
	POP	02H
	POP	05H
	RET

;***************************************
;发送命令子程序
;参数R4,R5,R6分别是命令、地址、数据字节
;***************************************
SendComm:
	PUSH	ACC
	SETB  	SD                    		;产生开始条件
	ACALL 	Delay10uS            
	SETB  	CLK
	ACALL 	Delay10uS              
	CLR   	SD                    
	ACALL 	Delay10uS              
	CLR   	CLK
	MOV   	A,R4				;命令字节
	ACALL 	SendByte1			;发送
	MOV   	A,R5				;地址字节
	ACALL 	SendByte1			;发送
	MOV   	A,R6				;数据字节
	ACALL 	SendByte1			;发送
	CLR   	SD    				;                
	ACALL 	Delay10uS			;
	SETB  	CLK				;
	ACALL 	Delay10uS              
	SETB  	sd                    		;产生停止条件
	ACALL 	Delay10uS              		;
	POP	ACC
	RET

;**************发送字节子程序********************
SendByte1:
	PUSH	03H
	MOV   	R3,#8           	     	;位计数器
SendLoop:
	RRC   	A                     
	MOV   	SD,C             	     	;送1位到数据线上
	ACALL 	Delay10uS         	    	;
	SETB  	CLK
	ACALL 	Delay10uS         	    	;
	CLR   	CLK
	DJNZ  	R3,SendLoop			;送完了吗?
	POP	03H
	RET

;**************************************************
;R2--字节数, R5--起始地址,@R0--返回数据
;**************************************************
Remm:      
	PUSH	04H				;读主存储器
	mov	R4,#30h            
	
	PUSH	03H
	PUSH	02H
	PUSH	00H
	Acall	SendComm			;调用发送命令子程序
Remm2:    
	CLR	A
	MOV	R3,#8				;8个bit
Remm1:   
	CLR	CLK
	NOP					;延时4ms
	NOP
	NOP
	NOP
	SETB	SD				;取出这1位
	NOP
	MOV    	C,SD
	RRC    	A
	NOP
	NOP
	SETB   	CLK
	ACALL  	Delay10uS           		;
	DJNZ   	R3,Remm1			;8位完了吗?
	MOV    	@R0,a               		;取出这个字节
	INC    	R0
	DJNZ   	R2,Remm2			;完了吗?
	ACALL  	Break				;中止
	POP	00H
	POP	02H
	POP	03H
	POP	04H
	RET

;***************中止子程序****************
Break:    
	CLR    	CLK
        ACALL  	Delay10uS
        SETB   	RST
        ACALL  	Delay10uS
        CLR    	RST
        RET


;**************************************************************************
;复位及复位应答子程序
;读出卡内前4个字节,存在(@R0,@(R0+1),@(R0+2),@(R0+3))中
;这4个字节是卡的信息,用来判断卡的来源以及合法性
;**************************************************************************
Anrst:
	PUSH	00H
	PUSH	ByteCnt
	PUSH	BitCnt
	PUSH	PSW
	MOV    	R0,#ReadBuf
	CLR    	A
	SETB   	RST			;拉高复位线
	ACALL  	Delay10uS
	SETB   	CLK			;拉高时钟线
	ACALL  	Delay10uS
	CLR    	CLK			;拉低时钟线
	ACALL  	Delay10uS 
	CLR    	RST			;拉低复位线
	MOV    	ByteCnt,#4              ;4个字节
Anrst1:   
	MOV    	BitCnt,#8               ;8个bit
Anrst2:   
	ACALL  	Delay10uS 
	SETB   	CLK
	SETB   	SD 
	NOP
	NOP
	MOV    	C,SD
	RRC    	A
	ACALL  	Delay10uS 
	CLR    	CLK
	DJNZ   	BitCnt,Anrst2		;8 bit 读完了吗?
	MOV    	@R0,A			;保存
	INC    	R0			;下1字节
	DJNZ   	ByteCnt,Anrst1		;4个字节完了吗?
	MOV   	R0,#ReadBuf		;准备核对卡内信息
	MOV   	A,@R0
	CJNE  	A,#Idetify1,CardErr	;第1字节相同吗?
	INC   	R0			;下1字节
	MOV   	A,@R0
	CJNE  	A,#Idetify2,CardErr 	;第2字节相同吗?     
	INC   	R0			;下1字节
	MOV   	A,@R0
	CJNE  	A,#Idetify3,CardErr	;第3字节相同吗?      
	INC   	R0			;下1字节
	MOV   	A,@R0
	CJNE  	A,#Idetify4,CardErr	;第4字节相同吗?      
	MOV   	A,#00H			;全相同,合法卡,ACC中返回#0
	AJMP	Anrstend		;
CardErr:  
	MOV   	A,#01H			;不同,非法卡ACC中返回#01
Anrstend:
	POP	PSW
	POP	BitCnt
	POP	ByteCnt
	POP	00h
        RET
;*************延时10微秒子程序*******************
Delay10uS:
	PUSH	07H
	MOV    	R7,#03H
	DJNZ   	R7,$
	POP	07H
	RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -