📄 sle4442.a51_1
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;SLE 4442 IC卡读写程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$INCLUDE (REG52.H)
CCRST EQU P1.3;
CCCLK EQU P1.4;
CCIO EQU P1.5;
SCL EQU P1.6
SDA EQU P1.7
; RdMainMem EQU 30H ; outgoing data
; UpdMainMem EQU 38H ; processing
; RdPrtMem EQU 34H ; outgoing data
; WrPrtMem EQU 3CH ; processing
; RdSecMem EQU 31H ; outgoint data
; UpdSecMem EQU 39H ; processing
; CmpVerDat EQU 33H ; processing
SEC_BIT BIT 22H.6
ACK BIT 22H.7
SUBA DATA 5EH
NUMBYTE DATA 5FH
IC_WADDR DATA 6AH ;IC卡待写地址
IC_WDATA DATA 6BH ;IC卡待写数据
IC_NLEN DATA 6CH ;IC卡读取字节个数
IC_ADDRFROM DATA 6DH ;IC卡EEPROM 起址地址
IC_CMD1 DATA 6EH ;IC卡命令字节1
IC_CMD2 DATA 6FH ;IC卡命令字节2
IC_CMD3 DATA 70H ;IC卡命令字节3
IC_BUFFER EQU 71H ;IC卡缓冲区
IC_RDPROTEBUF EQU 76H ;IC卡读保护区缓冲
IC_RDSCEBUF EQU 7BH ;IC卡读密码区缓冲
IC_WBUFFER DATA 80H ;IC卡写缓冲区
; IC_WBUFFER2 DATA 81H
; IC_WBUFFER3 DATA 82H
PUBLIC IC_ADDRFROM,IC_NLEN,IC_BUFFER,IC_WADDR,IC_WDATA
PUBLIC SEC_BIT
PUBLIC IC_RESET,IC_READMAINMEMORY
PUBLIC UPDATAMAINMEMORY
PUBLIC COMPAREVERIDATA
CSEG AT 2200H ;;;定位
;;短延時
;;入口函數:ACC
;;占用函数:ACC R7
IC_DELAY:
MOV R7,A
IC_DELAY_LOOP:
NOP
NOP
DJNZ R7,IC_DELAY_LOOP
RET
;IC卡時鍾信號
;调用函数:IC_DELAY(ACC,R7)
;
IC_ONEPLUS:
SETB CCCLK
MOV A,#14H
LCALL IC_DELAY
CLR CCCLK
LCALL IC_DELAY
RET
;*reads 8 bits from the sle4442 & stores value in 'rd_data' *
;IC卡讀8位
;读取字节子程序
;读出的值在ACC R2暂存8BIT R6计数
;;调用函数:IC_DELAY(ACC,R7)
IC_READBYTE:
MOV R6,#08H
IC_RLP:
; SETB CCIO
; NOP
SETB CCCLK
MOV C,CCIO
MOV A,#0AH
LCALL IC_DELAY
CLR CCCLK
LCALL IC_DELAY
MOV A,R2
RRC A ;低位在前
MOV R2,A
;NOP
NOP
NOP
DJNZ R6,IC_RLP
RET
;*6. sends 8 bit 'byte' to the sle4442 */
;;发送字节子程序
;;字节数据放入ACC R6计数
IC_SENDBYTE:
MOV R6,#08H
IC_WLP:
RRC A ;低位在前
JC IC_WR_1
SJMP IC_WR_0
IC_WLP1:
DJNZ R6,IC_WLP
NOP
RET
IC_WR_1:
SETB CCIO ;发送1
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB CCCLK
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR CCCLK
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SJMP IC_WLP1
IC_WR_0:
CLR CCIO ;发送0
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB CCCLK
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR CCCLK
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SJMP IC_WLP1
;;;sle4442 Reset reset and answer-to-reset read*/
;;RST后读EEPORM 前4个字节
;;调用函数:IC_DELAY(ACC,R7) R3计字节数 R1地址累加
;;出口函数:IC_BUFFER 四字节
IC_RESET:
CLR CCCLK
CLR CCRST
SETB CCIO
MOV A,#0FFH
LCALL IC_DELAY
LCALL IC_DELAY
LCALL IC_DELAY
SETB CCRST
MOV A,#0AH
LCALL IC_DELAY
SETB CCCLK
LCALL IC_DELAY
CLR CCCLK
MOV A, #32H
LCALL IC_DELAY
CLR CCRST
MOV A,#0AH
LCALL IC_DELAY
MOV R3,#04H
MOV R1,#IC_BUFFER
IC_RESET_READBYTE:
LCALL IC_READBYTE
MOV @R1,A
INC R1
DJNZ R3,IC_RESET_READBYTE
RET
/* 发送命令至SLE442 3字节 */
;;调用函数:IC_DELAY(ACC,R7) IC_SENDBYT(ACC,R6)
;;入口函数:IC_CMD1 IC_CMD2 IC_CMD3
IC_SENDCOMMAND:
;;start condition 当时钟线为高的时候,IO线从1到0
CLR CCCLK
SETB CCIO
MOV A,#04H
LCALL IC_DELAY
SETB CCCLK
MOV A,#08H
LCALL IC_DELAY
CLR CCIO
LCALL IC_DELAY
CLR CCCLK
MOV A,#05H
LCALL IC_DELAY
;;start condition
;IC卡在时钟的上升沿读取数据
MOV A,IC_CMD1
LCALL IC_SENDBYTE
MOV A,IC_CMD2
LCALL IC_SENDBYTE
MOV A,IC_CMD3
LCALL IC_SENDBYTE
;;stop condition
;;当时钟线为高的时候, IO从0到1
CLR CCIO
MOV A,#0AH
LCALL IC_DELAY
SETB CCCLK
LCALL IC_DELAY
SETB CCIO ;命令发送结束
LCALL IC_DELAY
RET
;;读主存储器
;;调用函数:IC_DELAY(ACC,R7) IC_SENDCOMMAND(ACC,R7,R6) IC_READBYTE(R2,R6) IC_ONEPLUS
;; R1地址累加 R3计数
;;入口函数: IC_ADDRFROM IC_NLEN
;;出口函数: IC_BUFFER
IC_READMAINMEMORY:
MOV IC_CMD1,#30H ;RdMainMem 0x30
MOV IC_CMD2,IC_ADDRFROM ; 主存储器待读部分的起始地址
MOV IC_CMD3,#00H
LCALL IC_SENDCOMMAND ;发送命令至SLE442 3字节
;开始读取数据
CLR CCCLK
MOV A,#0AH
LCALL IC_DELAY
MOV A,#0FFH
CLR C
SUBB A,IC_ADDRFROM
MOV R4,A ;LEN 从ADDRFROM 到256
MOV R3,IC_NLEN ;NLEN 实际要读的个数
MOV R1,#IC_BUFFER ;R1地址累加
IC_READMAINMEMORY_READBYTE: ;读主存从ADDRFROM 读到256
CJNE R3,#00H,TURE_MIANMEMROYREADBYTE ;判断有没有读完有用的数
SJMP FLUSE_MIANMEMROYREADBYTE ;不想读的数
TURE_MIANMEMROYREADBYTE :
LCALL IC_READBYTE
MOV @R1,A
INC R1
DJNZ R3,IC_READMAINMEMORY_READBYTE
SJMP FLUSE_MIANMEMROYREADBYTE
FLUSE_MIANMEMROYREADBYTE :
LCALL IC_READBYTE ;要给脉冲,但丢弃数据
DJNZ R4,IC_READMAINMEMORY_READBYTE
LCALL IC_ONEPLUS ;给个结束标志
RET
;;读取保护存储器(32字节)内容,一共32位,4个字节
;调用函数:IC_DELAY(ACC,R7) IC_SENDCOMMAND(ACC,R7,R6) IC_ONEPLUS R3计数 R1地址累加
;;;入口函数:无
;;出口函数: IC_RDPROTEBUF 四字节
IC_READPROTECTEDMEM:
MOV IC_CMD1,#34H ;//RdPrtMem 0x34
MOV IC_CMD2,#00H
MOV IC_CMD3,#00H
LCALL IC_SENDCOMMAND ;* 发送命令至SLE442 3字节
;;开始读取数据
CLR CCCLK
MOV A,#0AH
LCALL IC_DELAY
MOV R3,#04H ;4字节
MOV R0,#IC_RDPROTEBUF
IC_READPROTECTBYTE:
LCALL IC_READBYTE
MOV @R0,A
INC R0
DJNZ R3, IC_READPROTECTBYTE
LCALL IC_ONEPLUS ;// 给个结束标志
RET
;//更新主存储器的内容
;调用函数:IC_DELAY(ACC,R7) IC_SENDCOMMAND(ACC,R7,R6) IC_ONEPLUS R3计数
;;;入口函数:IC_WADDR IC_WDATA
;出口函数:无
UPDATAMAINMEMORY:
MOV IC_CMD1,#38H ;//UpdMainMem 0x38
MOV IC_CMD2,IC_WADDR
MOV IC_CMD3,IC_WDATA
LCALL IC_SENDCOMMAND ;* 发送命令至SLE442 3字节
;给脉冲
CLR CCCLK
MOV A,#0AH
LCALL IC_DELAY
CLR CCIO
LCALL IC_DELAY
MOV R3,#0FEH
ERASEMAINMEMORY:
LCALL IC_ONEPLUS
DJNZ R3,ERASEMAINMEMORY
SETB CCIO
MOV A,#0AH
LCALL IC_DELAY
LCALL IC_ONEPLUS
RET
;更新保护存储器(32字节)中的内容
;调用函数:IC_DELAY(ACC,R7) IC_SENDCOMMAND(ACC,R7,R6) IC_ONEPLUS R3计数
;;;入口函数:IC_WADDR IC_WDATA
;出口函数:无
WRITEPROTECTEMEM:
MOV IC_CMD1,#3CH ;//WrPrtMem 0x3C
MOV IC_CMD2,IC_WADDR
MOV IC_CMD3,IC_WDATA
LCALL IC_SENDCOMMAND ;* 发送命令至SLE4442
;给脉冲
CLR CCCLK
MOV A,#03H
LCALL IC_DELAY
CLR CCIO
MOV A,#0AH
LCALL IC_DELAY
MOV R3,#0FEH ;;;;;????????????????????
ERASEPROTECTMEMORY:
LCALL IC_ONEPLUS
DJNZ R3,ERASEPROTECTMEMORY
SETB CCIO
MOV A,#0AH
LCALL IC_DELAY
LCALL IC_ONEPLUS
RET
;;读取安全区的内容
;调用函数:IC_DELAY(ACC,R7) IC_SENDCOMMAND(ACC,R7,R6) IC_READBYTE(R2,R6)IC_ONEPLUS
;; R3计数 R1 地址累加
;;;入口函数:IC_WADDR IC_WDATA
;出口函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -