📄 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 + -