📄 sle4442.inc
字号:
;********************************************************************************************
; SLE4442 通用读写模块使用说明
; ReadCard 读出从StartAdr开始的ByteNum字节,结果存放于ReadBuf中,读出正确,ACC中返回#0,
;返回#01表示无效卡或者卡损坏。
; WriteCard从StartAdr开始写入ByteNum字节,待写入数据存放于WriteBuf中,写入正确ACC中返回#0,
;返回#01表示无效卡或者卡损坏。
; ReadCard和WriteCard的ByteNum的最大值为16, 见下面的变量定义
; 写卡之前一定要调用CheckPassword核对密码,密码存放于PSWD开始的三个单元,ACC中返回#0表示核对正确,
;#01表示无效卡或者卡损坏,#02表示密码错,#03H表示卡已被锁闭,#04H表示该卡还有一次试验机会。
; 核对密码完成后,EC开始的4个单元返回错误计数值及密码。
; 若要对保护存储区进行写保护,请调用WriteProtect子程序,参数及返回值与WriteCard相同。
;读保护存储器调用ReadProtect,参数及返回值同ReadCard。
;********************************************************************************************
;*************IC卡引脚位定义*************************
RST BIT P1.2 ;复位
IO BIT P1.0 ;数据
CLK BIT P1.1 ;脉冲
;*******************变量定义*********************
;Variabal
ReadBuf EQU 30H ;读缓冲区,16个字节
WriteBuf EQU 40H ;写缓冲区,16个字节
EC EQU 50H ;4字节临时单元
PSWD EQU 54H ;3字节密码单元
ByteNum EQU 57H ;读写的字节数
StartAdr EQU 58H ;读写时的起始地址
;*************IC卡常数***************************
Idetify1 EQU 0A2H ;此处为IC卡保护区00~03单元的值,用于识别卡
Idetify2 EQU 13H
Idetify3 EQU 10H
Idetify4 EQU 91H
;************************************************
;****************************************
;函数名称: ReadCard
;功能描述: 从主存储器中读出数据块
;入口参数:RecBuf --- 接收缓冲区地址
; ByteNum --- 要求读的字节数
; StartAdr --- 主存储器的起始地址
;返回参数: A --- 为0读成功
; A --- 表示无效卡或者卡损坏
;*****************************************
ReadCard: LCALL Anrst
JNZ ReadExit ;复位不成功,退出
MOV R0,#ReadBuf ;接收缓冲区地址
MOV R2,ByteNum
MOV R5,StartAdr
LCALL Remm ;调用读主存储器子程序
MOV A,#00H
ReadExit: RET
;*********************************************
;函数名称: WriteCard
;功能描述: 向主存储器中写入数据块
;入口参数:WriteBuf --- 发送缓冲区地址
; ByteNum --- 要写入的字节数
; StartAdr --- 写主存储器的起始地址
;返回参数: A --- 为0写成功
; A --- 表示无效卡或者卡损坏
;*********************************************
WriteCard:
LCALL Anrst
JNZ WriteExit
MOV R0,#WriteBuf
MOV R2,ByteNum
MOV R5,StartAdr ;给出各个入口参数
WriteLoop:
MOV A,@R0
MOV R6,A
LCALL Wrmm ;写入一个字节
INC R0
INC R5
DJNZ R2,WriteLoop ;判断是否写入了指定的字节数
MOV A,#00H ;读成功,返回0
WriteExit:
RET
;*******************************************************
;函数名称: ReadProtect
;功能描述: 从保护存储器中读出数据块
;入口参数:RecBuf --- 接收缓冲区地址
; ByteNum --- 要求读的字节数(取值1 - 4)
; StartAdr --- 保护存储器的起始地址(取值0 - 3)
;返回参数: A --- 为0读成功
; A --- 表示无效卡或者卡损坏
;*******************************************************
ReadProtect:
LCALL Anrst
JNZ RpExit
MOV R0,#ReadBuf
MOV R2,ByteNum
MOV R5,StartAdr ;给出各个入口参数
LCALL Repm ;读保护存储器
MOV A,#00H ;读成功,返回0
RpExit:
RET
;**********************************************
;函数名称: WriteProtect
;功能描述: 保护保护数据区(32字节)中的数据块,
; 写入的数据必须与原数据相等
;入口参数:WriteBuf --- 发送缓冲区地址
; ByteNum --- 要写入的字节数
; StartAdr --- 写主存储器的起始地址
;返回参数: A --- 为0写成功
; A --- 表示无效卡或者卡损坏
;***********************************************
WriteProtect:
LCALL Anrst
JNZ WpExit
MOV R0,#WriteBuf
MOV R2,ByteNum
MOV R5,StartAdr ;给出各个入口参数
WpLoop:
MOV A,@R0
MOV R6,A
LCALL Wrpm ;写入一个字节
INC R0 ;缓冲区地址加1
INC R5 ;写入地址加1
DJNZ R2,WpLoop
MOV A,#00H ;写成功,返回0
WpExit:
RET
;**************************************************
;函数名称: CheckPassword
;功能描述: 校验密钥
;入口参数:PSWD --- 密钥值,3个字节
;返回参数: A --- 0: 核对密码成功
; A --- 1: 表示无效卡或者卡损坏
; A --- 2: 核对密码失败
; A --- 3: 卡已报废
; A --- 4: 只剩一定校验机会
;注 意: 该程序只允许两次重试,以避免卡损坏
;***************************************************
CheckPassword:
LCALL Anrst
JNZ CheckExit
LCALL Rescm ;读加密存储器,获取错误计数器值
MOV A,EC
ANL A,#07h
JZ IsBadCard ;EC=0,卡已报废
RRC A
JNC ChkPsw1
MOV A,EC
ANL A,#06h ;将EC的一位写"0"
JZ HaveOneChance ;该卡还有一次试验机会
SJMP ChkPsw2
ChkPsw1:
RRC A
JNC HaveOneChance ;该卡还有一次试验机会
MOV A,EC
ANL A,#05H
JZ HaveOneChance ;该卡还有一次试验机会
ChkPsw2:
MOV R5,#00H
MOV R6,A
LCALL Wrscm ;将EC写回卡
MOV R2,#3
MOV R5,#01H ;卡内密码首址
MOV R0,#PSWD ;参考数据首址
ChkPswLoop:
MOV A,@R0
MOV R6,A
LCALL Verda ;开始核对密码
INC R0
INC R5
DJNZ R2, ChkPswLoop
MOV R5,#00H
MOV R6,#0FFH
LCALL Wrscm ;擦除错误计数器
LCALL Rescm ;读错误计数器以检查核对是否成功
MOV A,EC
ANL A,#07H
CJNE A,#07H,IS_FAIL ;错误计数器不能擦除,核对密码失败
MOV A,#00H ;错误计数器正确擦除,核对密码成功
CheckExit:
RET
IS_FAIL: ;核对密码失败
MOV A,#02H
RET
IsBadCard:
MOV A,#03H ;卡已报废
RET
HaveOneChance:
MOV A,#04H ;只剩下一次校验机会
RET
;**************************************************
;函数名称: SendComm
;功能描述: 向卡发送命令,一个命令的长度为3个字节
;入口参数:R4 --- 控制字
; R5 --- 地址字
; R6 --- 数据字
;返回参数: 无
;***************************************************
SendComm:
SETB IO ;产生开始状态
LCALL Delay10uS
SETB CLK
LCALL Delay5uS
CLR IO
LCALL Delay5uS
CLR CLK
MOV A,R4
LCALL SendByte ;发送控制字
MOV A,R5
LCALL SendByte ;发送地址字
MOV A,R6
LCALL SendByte ;发送数据字
CLR IO ;产生停止状态
LCALL Delay5uS
SETB CLK
LCALL Delay5uS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -