📄 ic_a.asm
字号:
;==========================================
; 程序名称:SLE4442 逻辑加密存储卡读写程序
;
; 程序功能:首先对IC卡20~2Fh应用数据区16个
; 单元写数据,再将其读到片外数据
; 区2000h为起始地址的单元。
; 运行结果:2000 = 80,81,82...8F
;==========================================
;------------------------------------------------
;8255并行口控制
CS8255 EQU 0FFFFH
OUTSEG EQU 0FFFCH ;字形控制口
OUTBIT EQU 0FFFDH ;字位/键扫控制口
LedBuf equ 7eh ;显示缓冲
;IC卡状态(插入、写、读)
IC_INS bit p1.3
IC_WRS bit p1.4
IC_RDS bit p1.5
;IC卡引脚位定义
IO BIT P1.0 ;数据
CLK BIT P1.1 ;脉冲
RST BIT P1.2 ;复位
;变量定义
ReadBuf EQU 30H ;读缓冲区,16个字节
WriteBuf EQU 40H ;写缓冲区,16个字节
EC EQU 50H ;4字节临时单元
PSWD EQU 54H ;3字节密码单元
ByteNum EQU 57H ;读写的字节数
StartAdr EQU 58H ;读写时的起始地址
;IC卡常数,在IC卡保护区00~03单元的值,用于识别卡
Idetify1 EQU 0A2H
Idetify2 EQU 13H
Idetify3 EQU 10H
Idetify4 EQU 91H
;------------------------------------------------
IC segment code
RSEG IC
public IC_Main
org 4000h
IC_Main:
jb IC_INS,$ ;IC卡插入错误,等待
call Delay ;程序延时
mov ByteNum,#08h
mov StartAdr,#00h
call ReadCard ;读IC卡状态
MOV R0,#PSWD ;密码缓冲区首址
MOV @R0,#0ffh ;IC卡初始密码: FF FF FF
INC R0
MOV @R0,#0ffh
INC R0
MOV @R0,#0ffh ;输入密码:填充密码缓冲区
call CheckPassword ;警告:此函数只允许两次重试,以免IC卡损坏
jnz IC_Error
clr IC_WRS
call WR_IC
call delay
setb IC_WRS
clr IC_RDS
call RD_IC
call delay
setb IC_RDS
sjmp IC_Good
IC_Error:
call MsgIcError
sjmp DispLoop
IC_Good:
call MsgIcGood
DispLoop:
mov r7,#0ffh
disploop1:
call DispLed
djnz r7,disploop1
ret ;sjmp DispLoop
;程序延时子程序
DELAY: MOV R7,#5
DL1: MOV R6,#0
DL2: MOV R5,#0
DJNZ R5,$
DJNZ R6,DL2
DJNZ R7,DL1
RET
;---------------------------------------------
;将16个数字写入IC卡20h开始的应用数据区
WR_IC: mov r0,#WriteBuf ;写40以后的16个字节
mov r1,#80h
mov a,r1
wriclp: mov @r0,a
inc r0
inc r1
mov a,r1
cjne r0,#50h,wriclp
mov ByteNum,#16
mov StartAdr,#20h
call WriteCard
ret
;----------------------------------------------
;将IC卡20h开始的16个应用数据区内容读到片内0080单元
RD_IC: mov ByteNum,#16
mov StartAdr,#20h
call ReadCard
mov r0,#ReadBuf
mov r1,#80h
rdiclp: mov a,@r0
mov @r1,a
inc r0
inc r1
cjne r0,#40h,rdiclp
ret
;显示 "IC Error"
MsgIcError:
MOV LedBuf-0,#0f9h
MOV LedBuf-1,#0c6h
MOV LedBuf-2,#0ffh
MOV LedBuf-3,#086h
MOV LedBuf-4,#0afh
MOV LedBuf-5,#0afh
mov LedBuf-6,#0a3h
mov LedBuf-7,#0afh
ret
;显示 "IC Good"
MsgIcGood:
MOV LedBuf-0,#0ffh
MOV LedBuf-1,#0f9h
MOV LedBuf-2,#0c6h
MOV LedBuf-3,#0ffh
MOV LedBuf-4,#0c2h
MOV LedBuf-5,#0a3h
mov LedBuf-6,#0a3h
mov LedBuf-7,#0a1h
ret
;显示子程序
DispLed:push dpl
push dph
setb rs1
mov r0,#ledbuf
mov r2,#80h
disp2: mov a,@r0
mov dptr,#outseg
movx @dptr,a
mov a,r2
mov dptr,#outbit
movx @dptr,a
mov r3,#0
djnz r3,$ ;闪动延迟
clr c
rrc a ;右移显示
mov r2,a
dec r0
jnz disp2
clr rs1
pop dph
pop dpl
ret
;************************************************
;函数名称: ReadCard
;功能描述: 从主存储器中读出数据块
;入口参数:ReadBuf -- 接收缓冲区地址
; 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -