📄 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 + -