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

📄 sle4442.asm

📁 基于89s51的一通用平台
💻 ASM
字号:
;1。卡片复位 RETC
;   入口参数:无
;   出口参数:ATR值存放在;20H。21H。22H。23H
;                         A2   13   10   91
;2。读卡 Rcard
;   入口参数:起始地址30----
;   出口参数:长度----
;            读出内容起始地址:R0
;            从第0X00开始读256字节
;                          30H----4FH,32字节
;3。读错误记数器 RER0
;   记数器 :50H
;   密码:   51H。52H。53H
;4。写记数器 :WER
;5。效验 CKEY
;---------------------------------------------------------------------

SLE4442READMAINMEMORY           EQU     30H   ;读主存储区
SLE4442READPROTECTIONMEMORY     EQU     34H   ;读保护存储区
SLE4442UPDATEMAINMEMORY         EQU     38H   ;写主存储区
SLE4442WRITEPROTECTIONMEMORY    EQU     3CH   ;写保护存储区

SLE4442READSECURITYMEMORY       EQU     31H   ;读保密存储区
SLE4442COMPAREVERIFICATIONDATA  EQU     33H   ;比较验证数据
SLE4442UPDATESECURITYMEMORY     EQU     39H   ;更新保密存储区

RST     EQU     P3.2
SDA     EQU     P3.3
SCL     EQU     P3.1

;---------------------------------------------------------------------

ATRDATA         EQU     30H   ; 4  byte  复位应答

ICCOMMAND       EQU     34H   ; 3  byte  命令
ICADDRESS       EQU     35H   ; 1  byte  地址
ICDATAIN        EQU     36H   ; 1  byte  数据

ICLENGTH        EQU     37H   ; 1  byte  读写长度

ICCODE          EQU     38H   ; 3  byte  密码

ICDATA          EQU     3BH   ; 32 byte  读写数据

;---------------------------------------------------------------------

;%RESET
                ORG     0000H
                SJMP    MAIN1


;%START
                ORG     0020H
MAIN1:
        MOV     SP,#10H

        MOV     R0,#ICCODE          ;送密码
        MOV     @R0,#0B6H
        INC     R0
        MOV     @R0,#023H
        INC     R0
        MOV     @R0,#007H

        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
LOOP1:
        MOV     @R0,A
        INC     A
        INC     R0
        DJNZ    R4,LOOP1  
        
        MOV     ICADDRESS,#20H  
        MOV     ICLENGTH,#20H
        LCALL   SLE4442_WRMM	;写主存储区

        MOV     ICADDRESS,#20H
        MOV     ICLENGTH,#20H
        LCALL   SLE4442_RDMM	;读主存储区
        LJMP    MAINLOOP
              
;******************************
;*	读主存储区	      *
;******************************
DUZQ:	LCALL	SLE4442_RST_ATR	;
	MOV	ICADDRESS,#30H	;
	MOV	ICLENGTH,#20H	;
	LCALL	SLE4442_RDMM	;
	RET
;******************************
;*	写主存储区	      *		
;******************************
XZCQ:	lcall	sle4442_rst_atr	;
	MOV	ICCODE,#0FFH	;
	MOV	ICCODE+1,#0FFH	;
	MOV	ICCODE+2,#0FFH	;

;	MOV	A,ICCODE
;	MOV	69H,A		;
;	MOV	6AH,A

	LCALL	SLE4442_VERIFI	;
	CJNE	A,#07H,ICDelay

	MOV	R3,#20H
	MOV	R0,#70H
	MOV	R1,#50H
	MOV	A,50H
XHYU:	MOV	@R0,A
	INC	R0
	INC	R1
	XCH	A,@R1
	DJNZ	R3,XHYU

	MOV	ICADDRESS,#30H	;
	MOV	ICLENGTH,#20H	;
	LCALL	SLE4442_WRMM	;
	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 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
        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
        

;---------------------------------------------------------------------

        END

⌨️ 快捷键说明

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