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

📄 55ic卡.asm

📁 IC卡读卡器程序.是一个非常好的程序
💻 ASM
字号:
   ; SLE4442  IC卡读、写程序
;文件名称:ICARD.ASM
;---------------------------------------------------------------------
;命令字
SLE4442READMAINMEMORY           EQU     30H   ;读主存储区
SLE4442READPROTECTIONMEMORY     EQU     34H   ;读保护存储区
SLE4442UPDATEMAINMEMORY         EQU     38H   ;写主存储区
SLE4442WRITEPROTECTIONMEMORY    EQU     3CH   ;写保护存储区
SLE4442READSECURITYMEMORY       EQU     31H   ;读保密存储区
SLE4442COMPAREVERIFYCATIONDATA  EQU     33H   ;比较验证资料
SLE4442UPDATESECURITYMEMORY     EQU     39H   ;更新保密存储区
;---------------------------------------------------------------------
;缓冲区
ATRDATA     EQU   30H         ; 4字节复位应答
ICCOMMAND   EQU   34H         ; 3字节命令
ICADDRESS   EQU   35H         ; 1字节地址
ICDATAIN    EQU   36H         ; 1字节数据
ICLENGTH    EQU   37H         ; 1字节读写长度
ICCODE      EQU   38H         ; 3字节密码
ICDATA      EQU   3BH         ; 32字节读写数据
;---------------------------------------------------------------------
SDA     EQU     P1.0
SCL     EQU     P1.1
RST     EQU     P1.2
;---------------------------------------------------------------------
        ORG     000H
        SJMP    MAIN1
        ORG     0020H
MAIN1:  MOV     SP,#10H
        MOV     R0,#ICCODE        ;送密码
        MOV     @R0,#0FFH
        INC     R0
        MOV     @R0,#0FFH
        INC     R0
        MOV     @R0,#0FFH
        LCALL   SLE4442_RDSM_EC   ;读错误计数器
        LCALL   SLE4442_VERIFY    ;校验密码
        LCALL   SLE4442_RDSM_EC   ;读错误计数器
;************************
;    * 写主存储区 *
;************************
MAIN:
        MOV     ICADDRESS,#20H    ;送起始地址
        MOV     ICLENGTH,#20H     ;送长度
        LCALL   SLE4442_RDMM      ;读主存储区
        ;SJMP    $
        MOV     R4,#20H
        MOV     R0,#ICDATA
        CLR     A
        MOV     A,#01H
LOOP1:  MOV     @R0,A             ;待写数据
        INC     A
        INC     R0
        DJNZ    R4,LOOP1
        ;SJMP    $
        MOV     ICADDRESS,#20H
        MOV     ICLENGTH,#20H
        LCALL   SLE4442_WRMM      ;写主存储区
        ;SJMP    $
        MOV     ICADDRESS,#20H
        MOV     ICLENGTH,#20H
        LCALL   SLE4442_RDMM      ;读主存储区
        SJMP    $
;************************
;    * 读主存储区 *
;************************
DUZQ:   LCALL   SLE4442_RST_ATR   ;
        MOV     ICADDRESS,#30H    ;
        MOV     ICLENGTH,#20H     ;
        LCALL   SLE4442_RDMM      ;
        RET
;=====================================================================
;SubName : ICDelay 延时程序
;Function: make a delay period (about 10us)
;Input   :
;OutPut  :
;---------------------------------------------------------------------
ICDelay:
        NOP
        NOP
        NOP
        NOP
        RET
;=====================================================================
;SubName : CardPulse 时钟脉冲
;Function: make a pulse on SCL pin
;Input   :
;OutPut  :
;---------------------------------------------------------------------
CardPulse:
        SETB    SCL
        LCALL   ICDelay ; 延时程序
        CLR     SCL
        LCALL   ICDelay ; 延时程序
        RET
;=====================================================================
;SubName : CardRdByte 读字节
;Function: read one byte from the card on SDA pin
;Input   :
;OutPut  : A
;---------------------------------------------------------------------
CardRdByte:
        MOV     R3,#8
        SETB    SDA
        CLR     A
Rdbyte:
        MOV     C,SDA
        RRC     A
        LCALL   CardPulse ;时钟脉冲
        DJNZ    R3,RdByte
        RET
;=====================================================================
;SubName : CardWrByte 写字节
;Function: write one byte to the card on SDA pin
;Input   : A
;OutPut  :
;---------------------------------------------------------------------
CardWrByte:
        MOV     R3,#8
WrByte:
        RRC     A
        MOV     SDA,C
        LCALL   CardPulse
        DJNZ    R3,WrByte
        RET
;=====================================================================
;SubName : SLE4442_RST_ATR 复位与应答
;Function: reset the card and the answer to reset
;Input   :
;OutPut  : (ATRDATA),(ATRDATA+1),(ATRDATA+2),(ATRDATA+3)
;        : 0xA2,0x13,0x10,0x91
;---------------------------------------------------------------------
SLE4442_RST_ATR:
        CLR     RST
        CLR     SCL
        LCALL   ICDelay
        SETB    RST
        LCALL   ICDelay
        SETB    SCL
        LCALL   ICDelay
        CLR     SCL
        LCALL   ICDelay
        CLR     RST
        LCALL   ICDelay
        MOV     R0,#ATRDATA      ;#30H
        MOV     R4,#4
ATR:
        LCALL   CardRdByte
        MOV     @R0,A
        INC     R0
        DJNZ    R4,ATR
        RET
;=====================================================================
;SubName : SLE4442_SendCommand 发送命令 3字节
;Function: send a 3-byte command to the card
;Input   : ICCOMMAND,ICADDRESS,ICDATAIN
;        : (ICCOMMAND),(ICCOMMAND+1),(ICCOMMAND+2)
;OutPut  :
;---------------------------------------------------------------------
SLE4442_SendCommand:
;Start condition
        SETB    SCL
        LCALL   ICDelay
        CLR     SDA
        LCALL   ICDelay
        CLR     SCL
;3-byte command
        MOV     R0,#ICCOMMAND
        MOV     R4,#3
SendCommand:
        MOV     A,@R0
        LCALL   CardWrByte
        INC     R0
        DJNZ    R4,SendCommand

;Stop condition
        CLR     SCL
        CLR     SDA
        LCALL   ICDelay
        SETB    SCL
        LCALL   ICDelay
        SETB    SDA
        LCALL   ICDelay

        CLR     SCL
        LCALL   ICDelay
        RET
;=====================================================================
;SubName : SLE4442_RDMM 读主存储区
;Function: read main memory from the card
;Input   : ICADDRESS,ICLENGTH
;        : (ICCOMMAND),(ICCOMMAND+1),(ICCOMMAND+2)
;OutPut  : (ICDATA),(ICDATA+1) ...
;---------------------------------------------------------------------
SLE4442_RDMM:
        LCALL   SLE4442_RST_ATR
        MOV     ICCOMMAND,#SLE4442READMAINMEMORY
        LCALL   SLE4442_SendCommand
        MOV     R0,#ICDATA
        MOV     R4,ICLENGTH
RDMM:
        LCALL   CardRdByte
        MOV     @R0,A
        INC     R0
        DJNZ    R4,RDMM
        RET
;=====================================================================
;SubName : SLE4442_RDPM 读保护存储区
;Function: read protect memory from the card
;Input   :
;OutPut  : (ICDATA),(ICDATA+1),(ICDATA+2),(ICDATA+3)
;---------------------------------------------------------------------
SLE4442_RDPM:
        LCALL   SLE4442_RST_ATR
        MOV     ICCOMMAND,#SLE4442READPROTECTIONMEMORY
        LCALL   SLE4442_SendCommand
        MOV     R0,#ICDATA
        MOV     R4,#4
RDPM:
        LCALL   CardRdByte
        MOV     @R0,A
        INC     R0
        DJNZ    R4,RDPM
        RET
;=====================================================================
;SubName : SLE4442_WRMM 写主存储区
;Function: write main memory to the card
;Input   : ICADDRESS,ICLENGTH
;        : (ICDATA),(ICDATA+1) ...
;OutPut  :
;---------------------------------------------------------------------
SLE4442_WRMM:
        LCALL   SLE4442_RST_ATR
        MOV     R5,ICLENGTH
        MOV     ICCOMMAND,#SLE4442UPDATEMAINMEMORY
        MOV     R1,#ICDATA
WRMM1:
        MOV     ICDATAIN,@R1
        LCALL   SLE4442_SendCommand
        MOV     R4,#0FFH
WRMM2:
        LCALL   CardPulse
        DJNZ    R4,WRMM2
        INC     ICADDRESS
        INC     R1
        DJNZ    R5,WRMM1
        RET
;=====================================================================
;SubName : SLE4442_WRPM 写保护存储区
;Function: write protect memory to the card
;Input   : ICADDRESS,ICLENGTH
;        : (ICDATA),(ICDATA+1) ...
;OutPut  :
;---------------------------------------------------------------------
SLE4442_WRPM:
        LCALL   SLE4442_RST_ATR
        MOV     R5,ICLENGTH
        MOV     ICCOMMAND,#SLE4442WRITEPROTECTIONMEMORY
        MOV     R1,#ICDATA
WRPM1:
        MOV     ICDATAIN,@R1
        LCALL   SLE4442_SendCommand
        MOV     R4,#0FFH
WRPM2:
        LCALL   CardPulse
        DJNZ    R4,WRPM2
        INC     ICADDRESS
        INC     R1
        DJNZ    R5,WRPM1
        RET
  ;=====================================================================
;SubName : SLE4442_RDSM 读保密存储区
;Function: read secret memory from the card
;Input   :
;OutPut  : (ICDATA),(ICDATA+1),(ICDATA+2),(ICDATA+3)
;---------------------------------------------------------------------
SLE4442_RDSM:
        LCALL   SLE4442_RST_ATR
        MOV     ICCOMMAND,#SLE4442READSECURITYMEMORY
        LCALL   SLE4442_SendCommand
        MOV     R0,#ICDATA
        MOV     R4,#4
RDSM:
        LCALL   CardRdByte
        MOV     @R0,A
        INC     R0
        DJNZ    R4,RDSM
        RET
;=====================================================================
;SubName : SLE4442_RDSM_EC 读错误计数器
;Function: read error counter from the card
;Input   :
;OutPut  : A
;---------------------------------------------------------------------
SLE4442_RDSM_EC:
        LCALL   SLE4442_RST_ATR
        MOV     ICCOMMAND,#SLE4442READSECURITYMEMORY
        LCALL   SLE4442_SendCommand
        LCALL   CardRdByte
        RET


;=====================================================================
;SubName : SLE4442_WRSM 更新保密存储区
;Function: write secret memory to the card
;Input   : ICADDRESS
;        : (ICDATA)
;OutPut  :
;---------------------------------------------------------------------
SLE4442_WRSM:
        LCALL   SLE4442_RST_ATR
        MOV     R5,#1
        MOV     ICCOMMAND,#SLE4442UPDATESECURITYMEMORY
        MOV     R1,#ICDATA
WRSM1:
        MOV     ICDATAIN,@R1
        LCALL   SLE4442_SendCommand
        MOV     R4,#0FFH
WRSM2:
        LCALL   CardPulse
        DJNZ    R4,WRSM2
        INC     ICADDRESS
        INC     R1
        DJNZ    R5,WRSM1
        RET
;=====================================================================
;SubName : SLE4442_UPDATEPSC 更新密码
;Function: update PSC to the card
;Input   : (ICDATA),(ICDATA+1),(ICDATA+2)
;OutPut  :
;---------------------------------------------------------------------
SLE4442_UPDATEPSC:
        LCALL   SLE4442_RST_ATR
        MOV     R5,#3
        MOV     ICCOMMAND,#SLE4442UPDATESECURITYMEMORY
        MOV     ICADDRESS,#01H
        MOV     R1,#ICCODE
PSC1:
        MOV     ICDATAIN,@R1
        LCALL   SLE4442_SendCommand
        MOV     R4,#0FFH
PSC2:
        LCALL   CardPulse
        DJNZ    R4,PSC2
        INC     ICADDRESS
        INC     R1
        DJNZ    R5,PSC1
        RET
;=====================================================================
;SubName : SLE4442_SENDPSC 比较验证资料
;Function: compare PSC to the card
;Input   : (ICDATA),(ICDATA+1),(ICDATA+2)
;OutPut  :
;---------------------------------------------------------------------
SLE4442_SENDPSC:
        MOV     R5,#3
        MOV     ICCOMMAND,#SLE4442COMPAREVERIFYCATIONDATA
        MOV     ICADDRESS,#01H
        MOV     R1,#ICCODE
PSC21:
        MOV     ICDATAIN,@R1
        LCALL   SLE4442_SendCommand
        MOV     R4,#123
PSC22:
        LCALL   CardPulse
        DJNZ    R4,PSC22
        INC     ICADDRESS
        INC     R1
        DJNZ    R5,PSC21
        RET
;=====================================================================
;SubName : SLE4442_VERIFY 校验密码
;Function: verify the card
;Input   : (ICDATA),(ICDATA+1),(ICDATA+2)
;OutPut  : A (error counter)
;---------------------------------------------------------------------
SLE4442_VERIFY:
        LCALL   SLE4442_RDSM_EC
        ANL     A,#07H
        CJNE    A,#00H,VERI1
        RET
VERI1:
        CJNE    A,#07H,VERI21
        MOV     A,#03H
        SJMP    VERI2
VERI21:
        CJNE    A,#06H,VERI22
        MOV     A,#02H
        SJMP    VERI2
VERI22:
        CJNE    A,#05H,VERI23
        MOV     A,#01H
        SJMP    VERI2
VERI23:
        CJNE    A,#04H,VERI24
        MOV     A,#00H
        SJMP    VERI2
VERI24:
        CJNE    A,#03H,VERI25
        MOV     A,#01H
        SJMP    VERI2
VERI25:
        MOV     A,#00H
VERI2:
        MOV     ICDATA,A
        MOV     ICADDRESS,#00H
        LCALL   SLE4442_WRSM
        LCALL   SLE4442_SENDPSC
        MOV     ICDATA,#07H
        MOV     ICADDRESS,#00H
        LCALL   SLE4442_WRSM
        LCALL   SLE4442_RDSM_EC
        ANL     A,#07H
        RET
;-------------------------------------------------------------------
        END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -