📄 sle4442.inc
字号:
SETB IO
LCALL Delay5uS
RET
;**************************************************
;函数名称: SendByte
;功能描述: 向卡发送一个字节
;入口参数:A --- 要发送的字节
;返回参数: 无
;***************************************************
SendByte: ;发送一个字节数据
MOV R3,#8 ;一个字节有8 bits
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 bits
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 bits,要接收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
;功能描述: 读加密存储器的四个字节
;入口参数:无
;返回数据: 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -