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

📄 ic_a.asm

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