📄 qqsle4442.txt
字号:
用【 小 | 中 | 大 】字体浏览
C51编程:哪一位高手用过SLE4442 [单片机之友] [37次] 01-12-28 下午 05:25:00
最好能给出读写一个字节的源代码!
谢谢!
很久以前做好。好象是没问题。 [方塘] [37次] 01-12-28 下午 06:27:22
;------------以下 IC 卡子程序--------------------
;------------------------------------------------
;读SLE/4442 IC卡操作软件清单
;入口: R3: date address (32 --255)
; R6: date length (223)
;出口: MBUF: date buffer
;------------------------------------------------
RDA_42: LCALL RESET_42 ;reset smart card
MOV R0, #CBUF
MOV @R0, #30H ;First Byte 读命令
INC R0
MOV A, R3 ;
INC R3
MOV @R0, A ;second byte 地址
INC R0
MOV @R0, #0FFH ;third byte 无影响
LCALL COM_42 ;send command
;--------------------------------------
MOV R0, #MBUF ;出口
RDA_421: LCALL BR_42
MOV @R0, A
INC R0
DJNZ R6, RDA_421;counter is zero ?
CLR IC_CLK
LCALL Delay5uS
SETB IC_IO
NOP
SETB IC_CLK
LCALL Delay5uS
LCALL INTERR_42 ;reset smart card
RET
;------------------------------------------------
;读SLE/4442 IC卡保护位操作软件清单
;MBUF: data buffer ( 4 byte)
;------------------------------------------------
RPB_42: LCALL RESET_42 ;reset smart card
MOV R0, #CBUF
MOV @R0, #34H ;First Byte 读保护区命令
INC R0
MOV @R0, #0FFH ;second byte 无影响
INC R0
MOV @R0, #0FFH ;third byte 无影响
LCALL COM_42 ;send command
;--------------------------------------
MOV R0, #MBUF
MOV R6, #04H ;receive data length
RPB_421: LCALL BR_42
MOV @R0, A
INC R0
DJNZ R6, RPB_421;counter is zero ?
CLR IC_CLK
LCALL Delay5uS
SETB IC_IO
NOP
SETB IC_CLK
LCALL Delay5uS
LCALL INTERR_42 ;reset smart card
RET
;------------------------------------------------
;写SLE/4442 IC卡操作软件清单
;R3: date address (32 -- 255)
;R6: date length (223byte)
;MBUF: date buffer
;------------------------------------------------
WDA_42: LCALL RESET_42 ;reset smart card
MOV R1, #MBUF ;data pointer
WDA_421: MOV R0, #CBUF
MOV @R0, #38H ;First Byte 写命令
INC R0
MOV A, R3
INC R3
MOV @R0, A ;second byte 地址
INC R0
MOV A, @R1
INC R1
MOV @R0, A ;third byte 输入数据
INC R0
LCALL COM_42 ;Send command
;--------------------------------------
LCALL BW_42 ;write process
DJNZ R6, WDA_421;counter is zero ?
LCALL INTERR_42
RET
;------------------------(1)-------------
(2) [方塘] [39次] 01-12-28 下午 06:29:18
;------------------------------------------------
;写SLE/4442 IC卡保护字节操作软件清单
;R3: date address (0 -- 31)
;R6: date length (32)
;MBUF: date buffer
;------------------------------------------------
WPB_42: LCALL RESET_42 ;reset smart card
MOV R1, #MBUF ;data pointer
WPB_421: MOV R0, #CBUF
MOV @R0, #3CH ;First Byte 写保护区命令
INC R0
MOV A, R3
INC R3
MOV @R0, A ;second byte 地址
INC R0
MOV A, @R1
INC R1
MOV @R0, A ;third byte 输入数据
INC R0
LCALL COM_42 ;Send command
;--------------------------------------
LCALL BW_42 ;write process
DJNZ R6, WPB_421;counter is zero ?
LCALL INTERR_42 ;reset smart card
RET
;------------------------------------------------
;核对SLE/4442 IC卡密码操作软件清单
;入口:R1: security(high byte)
; R2: security(medium byte)
; R3: security(low byte)
;出口:SFG=0FFH DFG=0FFH Card damage
; SFG=0FFH DFG=00H Check error
; SFG=00H DFG=00H Check ok
;------------------------------------------------
CHKSC_42: CLR 2FH.0
CLR 2FH.1
LCALL RESET_42 ;reset smart card
LCALL RSC_42 ;read SLE4442 SCEC 出口 #MBUF
MOV R0, #MBUF ;EC pointer
MOV A, @R0 ;get security error counter EC
JNZ CHKSC_421 ;card damage ?
LJMP CHKSC_426
CHKSC_421:JBC ACC.2,CHKSC_422 ;Acc.2
JBC ACC.1,CHKSC_422 ;Acc.1
CLR A ;Acc.0
CHKSC_422:LCALL WESCC_42 ;write SC counter
LCALL CMPSC_42H ;comp SC (high byte)
LCALL CMPSC_42M ;comp SC (midium byte)
LCALL CMPSC_42L ;comp SC (low byte)
MOV A, #07H
LCALL WESCC_42 ;Erase SC counter
LCALL RSC_42 ;read 4442 SC counter
MOV R0, #MBUF ;get security error counter EC
MOV A, @R0
INC R0
ANL A, #07H ;00000111
JNZ CHKSC_427 ;Card damage ?
CHKSC_426:SETB 2FH.0 ;Card damage
SETB 2FH.1
LJMP CHKSC_429
CHKSC_427:ORL A, #0F8H ;Check ok ? 11111000
INC A
JZ CHKSC_428
SETB 2FH.0 ;Check error
CLR 2FH.1
LJMP CHKSC_429
CHKSC_428:CLR 2FH.0
CLR 2FH.1
CHKSC_429:LCALL INTERR_42
RET
;------------------------------------------------
;读SLE/4442 IC卡密码操作软件清单
;MBUF: data buffer
;读SLE/4442 IC卡误码计数器 Acc:误码计数器值
;出口:读出密码计数器在 MBUF ( 4Byte )
;------------------------------------------------
RSC_42: LCALL RESET_42 ;reset smart card
MOV R0, #CBUF
MOV @R0, #31H ;first byte Read security memory command
INC R0
MOV @R0, #0FFH ;second byte invalid
INC R0
MOV @R0, #0FFH ;third byte invalid
LCALL COM_42
;--------------------------------------
MOV R0, #MBUF
MOV R7, #4
RSC_421: LCALL BR_42
MOV @R0, A
INC R0
DJNZ R7, RSC_421
CLR IC_CLK
LCALL Delay5uS
SETB IC_IO
NOP
SETB IC_CLK
LCALL Delay5uS
LCALL INTERR_42
RET
;-------------------------(2)
(3) [方塘] [24次] 01-12-28 下午 06:32:18
;------------------------------------------------
;写SLE/4442 IC卡密码操作软件清单
;R1: security(high byte)
;R2: security(medium byte)
;R3: security(low byte)
;------------------------------------------------
WSC_42: LCALL RESET_42 ;reset smart card
MOV R0, #CBUF
MOV @R0, #39H ;First Byte 写密码命令
INC R0
MOV @R0, #01H ;second byte 地址
INC R0
MOV A, R1
MOV @R0, A ;third byte security(high byte)
INC R0
LCALL COM_42
;--------------------------------------
LCALL BW_42 ;write process
MOV R0, #CBUF
MOV @R0, #39H ;First Byte 写密码命令
INC R0
MOV @R0, #02H ;second byte 地址
INC R0
MOV A, R2
MOV @R0, A ;third byte security(medium byte)
INC R0
LCALL COM_42
;--------------------------------------
LCALL BW_42 ;write process
MOV R0, #CBUF
MOV @R0, #39H ;First Byte 写密码命令
INC R0
MOV @R0, #03H ;second byte 地址
INC R0
MOV A, R3
MOV @R0, A ;third byte security(low byte)
INC R0
LCALL COM_42
LCALL BW_42 ;write process
LCALL INTERR_42
RET
;------------------------------------------------
;写/擦SLE/4442 IC卡误码计数器 Acc:待写/擦误码计数器值
;------------------------------------------------
WESCC_42: MOV R0, #CBUF
MOV @R0, #39H ;First Byte 写密码命令
INC R0
MOV @R0, #00H ;second byte 地址(SC counter)
INC R0
MOV @R0, A ;third byte 数据
LCALL COM_42
LCALL BW_42
RET
;------------------------------------------------
;核对比较SLE/4442 IC卡高/中/低字节密码
;R1: security(high byte)
;R2: security(medium byte)
;R3: security(low byte)
;------------------------------------------------
CMPSC_42H:MOV R0, #CBUF
MOV @R0, #33H ;first byte 比较校验密码命令
INC R0
MOV @R0, #01H ;second byte 地址
INC R0
MOV A, R1 ;external parameter
MOV @R0, A ;third byte security(high byte)
LJMP CMPSC_42S
CMPSC_42M:MOV R0, #CBUF
MOV @R0, #33H ;first byte 比较校验密码命令
INC R0
MOV @R0, #02H ;second byte 地址
INC R0
MOV A, R2 ;external parameter
MOV @R0, A ;third byte security(medium byte)
LJMP CMPSC_42S
CMPSC_42L:MOV R0, #CBUF
MOV @R0, #33H ;first byte 比较校验密码命令
INC R0
MOV @R0, #03H ;second byte 地址
INC R0
MOV A, R3 ;external parameter
MOV @R0, A ;third byte security(low byte)
CMPSC_42S:LCALL COM_42
LCALL BW_42
RET
;------------------------------------------------
;发送SLE/4442 IC卡命令字节
;R0: Data buffer pointer
;R7: Command byte counter
;R4: bit counter
;------------------------------------------------
COM_42: LCALL BEGIN_42 ;start flag
MOV R0, #CBUF ;write command 24 pulses
MOV R7, #3
CLR C
COM_421: MOV R4, #8
MOV A, @R0
COM_422: CLR IC_CLK
RRC A
MOV IC_IO,C
LCALL Delay5uS
SETB IC_CLK
LCALL Delay5uS
LCALL Delay5uS
DJNZ R4, COM_422
INC R0
DJNZ R7, COM_421
LCALL END_42 ;end flag
RET
;------------------------------(3)--------------
(4) [方塘] [22次] 01-12-28 下午 06:34:00
;------------------------------------------------
;SLE/4442 IC卡操作中止
;------------------------------------------------
INTERR_42:;SETB IC_FUS ;clear unused pins
CLR IC_PGM
CLR IC_CLK ;reset pulse Tw=50uS
CLR IC_RST
CLR IC_IO
LCALL Delay5uS
SETB IC_RST
LCALL Delay5uS
SETB IC_IO
LCALL Delay5uS
CLR IC_RST
LCALL Delay5uS
RET
;------------------------------------------------
;SLE/4442 IC卡操作开始
;------------------------------------------------
BEGIN_42: CLR IC_CLK ;start flag one pulse Tw=50uS
SETB IC_IO
LCALL Delay5uS
SETB IC_CLK
LCALL Delay5uS
CLR IC_IO
LCALL Delay5uS
RET
;------------------------------------------------
;SLE/4442 IC卡操作结束
;------------------------------------------------
END_42: CLR IC_CLK ;end flag one pulse Tw=50uS
CLR IC_IO
LCALL Delay5uS
SETB IC_CLK
LCALL Delay5uS
SETB IC_IO
LCALL Delay5uS
RET
;------------------------------------------------
;复位SLE/4442 IC卡
;------------------------------------------------
RESET_42: LCALL Delay5uS
;SETB IC_FUS
CLR IC_PGM ;复位和复位应答时序
CLR IC_RST
CLR IC_CLK ; ___
SETB IC_IO ;RST _| |_______________________
LCALL Delay5uS ; _ _ __ __
SETB IC_RST ;CLK __|0|_|1|_ ..._|31|_|32|_____
LCALL Delay5uS ; _ __ __ ___ _____
SETB IC_CLK ; \/ \/D0\ ... \/D31\/
LCALL Delay5uS ;I/O _/\__/\__/ /\___/
LCALL Delay5uS
LCALL Delay5uS
LCALL Delay5uS
LCALL Delay5uS
LCALL Delay5uS
LCALL Delay5uS
LCALL Delay5uS
LCALL Delay5uS
CLR IC_CLK
LCALL Delay5uS
CLR IC_RST
LCALL Delay5uS
MOV R0, #CBUF
MOV R7, #4
;------------------
RESET_421:LCALL BR_42
MOV @R0, A
INC R0
DJNZ R7, RESET_421
CLR IC_CLK
LCALL Delay5uS
SETB IC_IO
NOP
SETB IC_CLK
LCALL Delay5uS
RET
;------------------------------------------------
;读SLE/4442 IC卡 读 1Byte 到 Acc
;------------------------------------------------
BR_42: MOV R4, #8
BR_421: CLR IC_CLK
LCALL Delay5uS
MOV C, IC_IO
SETB IC_CLK
LCALL Delay5uS
RRC A
DJNZ R4, BR_421
Ret
;------------------------------------------------
;写SLE/4442 IC卡 Acc: 待写数据
;------------------------------------------------
BW_42: MOV R4, #255
BW_421: CLR IC_CLK
LCALL Delay5uS
CLR IC_IO
LCALL Delay5uS
SETB IC_CLK
LCALL Delay5uS
DJNZ R4, BW_421
LCALL Delay5uS
CLR IC_CLK
LCALL Delay5uS
SETB IC_IO
LCALL Delay5uS
Ret
;------------------------------------------------
;为SLE/4442 IC卡操作延时5uS
;------------------------------------------------
Delay5uS: NOP
NOP
NOP
Ret
;----------------------------(4)end----------------
方塘呀,汇编看起来很累呀!谁有C的? [潞潞] [4次] 01-12-29 上午 08:55:09
用C做uS延时比较麻烦。有注释,汇编也不会难看呀。 [方塘] [5次] 01-12-29 上午 09:11:34
C 是哪位老兄编的我不知道了 [SanDragon] [19次] 01-12-29 上午 09:21:43
//4442卡的底层操作程序
#include <stdio.h>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -