⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ic_a.asm

📁 51系列单片机的汇编程序包
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;==========================================
; 程序名称: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 + -