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

📄 sle4442ic.asm

📁 sle4442IC卡的读写
💻 ASM
字号:
;;;接触式IC卡读写程序---------------------------------------------------------------------
;;;把加一数字写入卡中,然后再读出并显示发光二极管上
;;;---------------------------------------------------------------------------------------
SLE4442READMAINMEMORY           EQU     30H   ;读主存储区
SLE4442READPROTECTIONMEMORY     EQU     34H   ;读保护存储区
SLE4442UPDATEMAINMEMORY         EQU     38H   ;写主存储区
SLE4442WRITEPROTECTIONMEMORY    EQU     3CH   ;写保护存储区
SLE4442READSECURITYMEMORY       EQU     31H   ;读保密存储区
SLE4442COMPAREVERIFICATIONDATA  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字节读写数据
;;;******************************************************************
;;;接线说明
;;;J10(25x2双排插针)第14脚(RT1)和第42脚(CPU的P3.5)连
;;;J10(25x2双排插针)第10脚(SD1)和第28脚(CPU的P1.6)连
;;;J10(25x2双排插针)第12脚(SC1)和第30脚(CPU的P1.7)连
;;;锁紧插座的右上角JP短接
;;;******************************************************************
RST     EQU     P3.5;;P1.3
SDA     EQU     P1.6;;P1.4
SCL     EQU     P1.7;;P1.2


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_VERIFI    ; 校验密码
        LCALL   SLE4442_RDSM_EC   ;读错误计数器
MAINLOOP:
        MOV     ICADDRESS,#20H    ;送起始地址
        MOV     ICLENGTH,#20H     ;送长度
        LCALL   SLE4442_RDMM      ;读主存储区

        MOV     R4,#20H
        MOV     R0,#ICDATA
        CLR     A
       ; mov    dptr,#porta
        ;movx   a,@dptr
;	MOV	A,#00H
icLOOP1:
        MOV     @R0,A
        INC     A
        INC     R0
        DJNZ    R4,icLOOP1
        MOV     ICADDRESS,#20H
        MOV     ICLENGTH,#20H
        LCALL   SLE4442_WRMM	;写主存储区
        MOV     ICADDRESS,#20H
        MOV     ICLENGTH,#20H
        LCALL   SLE4442_RDMM	;读主存储区
        LJMP    MAINLOOP



;=====================================================================
;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 erset
;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
        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
        ;MOV DPTR,#PortB
        ;MOVX @DPTR,A
        MOV P2,A
        mov r6,#00h
        call delay
        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,#SLE4442COMPAREVERIFICATIONDATA
        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_VERIFI 校验密码
;Function: verify the card
;Input   : (ICDATA),(ICDATA+1),(ICDATA+2)
;OutPut  : A (error counter)
;---------------------------------------------------------------------
SLE4442_VERIFI:
        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
Delay:               ; 延时子程序0
       mov   r7, #0
DelayLoop:
       djnz  r7, DelayLoop
       djnz  r6, DelayLoop
       ret

⌨️ 快捷键说明

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