📄 ic_a.asm
字号:
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
SETB IO
LCALL Delay5us
RET
;************************************************
;函数名称: SendByte
;功能描述: 向卡发送一个字节
;入口参数:A -- 要发送的字节
;返回参数: 无
;************************************************
SendByte: ;发送一个字节数据
MOV R3,#8 ;一个字节有8 bit
SendLoop:
RRC A
MOV IO,C ;每个循环发送1 bit
LCALL Delay10us
SETB CLK
LCALL Delay10us
CLR CLK
DJNZ R3,SendLoop
RET
;************************************************
;函数名称: Repm 和 Remm
;功能描述: 从保护存储器 或 从主存储器中读数据块
;入口参数:R2 -- 要求读的字节数
; R5 -- 保护存储器的起始地址(0-3)
; 或主存储器的起始地址(0-255)
;返回数据: 从R0所指的数据缓冲区中输出
;************************************************
Repm: MOV R4,#34H ;设置读保护存储器命令
SJMP RmStart
Remm: MOV R4,#30H ;设置读主存储器命令
RmStart:LCALL SendComm ;发送命令
RmLoop: CLR A
MOV R3,#8
RmByte: CLR CLK
NOP
NOP
NOP
NOP
SETB IO
NOP
MOV C,IO ;接收1 bit
RRC A
NOP
NOP
SETB CLK
LCALL Delay10us
DJNZ R3,RmByte ;判断是否接收完8 bit
MOV @R0,A ;接收的数据存入缓冲区中
INC R0
DJNZ R2,RmLoop ;判断是否接收完指定的字节
LCALL Break ;中止操作
RET
Break: CLR CLK ;中止操作
LCALL Delay5us
SETB RST
LCALL Delay5us
CLR RST
RET
;************************************************
;函数名称: Verda
;功能描述: 输出数据模式的各种命令:
; Verda : 比较校验数据命令
; Wrscm : 修改加密存储器命令
; Wrpm : 修改保护存储器命令
; Wrmm : 修改主存储器命令
;入口参数:无
;返回数据: 无
;************************************************
Verda: MOV R4,#33H ;设置比较校验数据命令
SJMP WrStart
Wrscm: MOV R4,#39H ;设置修改加密存储器命令
SJMP WrStart
Wrpm: MOV R4,#3CH ;设置修改保护存储器命令
SJMP WrStart
Wrmm: MOV R4,#38H ;设置修改主存储器命令
WrStart:LCALL SendComm
WrmOption: ;下面为一个处理过程
CLR CLK
NOP
NOP
NOP
NOP
SETB IO
NOP
MOV C,IO
JC WrmOK ;如果I/O返回高状态,中止处理过程
NOP
NOP
NOP
NOP
SETB CLK
LCALL Delay10us
SJMP WrmOption
WrmOK: RET
;************************************************
;函数名称: Rescm
;功能描述: 读加密存储器的四个字节
;入口参数:无
;返回数据: 加密存储器中的内容输出到EC所指的4字节缓冲区中
;************************************************
Rescm: MOV R4,#31H ;设置读加密存储器命令
LCALL SendComm ;发送读加密存储器命令
MOV R2,#4 ;读4个字节
MOV R0,#EC ;接收缓冲区
rescm2: MOV R3,#8 ;一个字节有8 bit,要接收8次
rescm1: CLR CLK
NOP
NOP
NOP
NOP
SETB IO
NOP
MOV C,IO ;接收1 bit
RRC A
NOP
NOP
SETB CLK
LCALL Delay10us
DJNZ R3,rescm1
MOV @R0,A ;把接收到的一个字节保存起来
INC R0 ;接收缓冲区地址加1
DJNZ R2,rescm2
CLR CLK
LCALL Delay5us
RET
;************************************************
;函数名称: Anrst
;功能描述: 复位IC存储卡
;入口参数:无
;返回数据: A -- 0 复位成功
; A -- 1 复位失败
; 复位信号的内容输出到EC所指的4字节缓冲区中
;************************************************
Anrst: MOV R0,#EC
SETB RST ;产生复位响应时序
LCALL Delay5us
SETB CLK
LCALL Delay10us
CLR CLK
LCALL Delay5us
CLR RST ;接受复位响应值
MOV R2,#4
anrst1: MOV R3,#8
anrst2: LCALL Delay10us
SETB CLK
SETB IO
NOP
NOP
MOV C,IO
RRC A
LCALL Delay5us
CLR CLK
DJNZ R3,anrst2 ;判断是否接收了一个字节
MOV @R0,A
INC R0
DJNZ R2,anrst1 ;判断是否接收了4个字节
;以下代码根据复位响应返回值判断卡的合法性及有效性
MOV R0,#EC
MOV A,@R0
CJNE A,#Idetify1,CardErr
INC R0
MOV A,@R0
CJNE A,#Idetify2,CardErr
INC R0
MOV A,@R0
CJNE A,#Idetify3,CardErr
INC R0
MOV A,@R0
CJNE A,#Idetify4,CardErr
MOV A,#00H ;复位成功
RET
CardErr:MOV A,#01H ;复位失败,为坏卡
RET
;************************************************
;函数名称: Delay10us
;功能描述: 延时10us子程序
;入口参数:无
;返回数据: 无
;************************************************
Delay10us: ;延时10us
MOV R7,#06H
DJNZ R7,$
RET
;************************************************
;函数名称: Delay5us
;功能描述: 延时5us子程序
;入口参数:无
;返回数据: 无
;************************************************
Delay5us: ;延时5us
MOV R7,#02H
DJNZ R7,$
RET
;------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -