📄 sle4442.asm
字号:
;*********************************************************************
; Module Name: Sle4442.asm
; Author: 涛行九天
; Version: 1.0
; CreateDate: 1998-04-12
; Description:
; Remark:
; Revision History:
;*********************************************************************
;---------- 管脚定义 --------------
RST EQU P3.3
CLK EQU P3.4
IO EQU P1.4
SW1 EQU P3.5 ;为0不到位
;************************************************************
; 以下是调用示例
;************************************************************
LCALL RSTAS ;--------------------------
MOV R0,#DATA1+4
MOV @R0,#0FFH
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0FFH
MOV R1,#DATA1+4
LCALL CMPVD ;校验PSC
MOV R0,#DATA2+8 ;-----------------
MOV R1,#DATA1+10
MOV R2,#3
LCALL FENJN ;将余额分解为6位
MOV R1,#DATA1+10
MOV R2,#6
MOV R3,#50
LCALL WR4442 ;收到上位机传来余额信息,写入IC相应位置
;************************************************************
; 以下是SLE 4442卡的读写子程序
;************************************************************
;----------------------------------------------------
; RSTAS: IC复位子程序
; 入口参数:
; 局部参数:R6,R7
; 出口参数:R0,地址0--3的数据
;----------------------------------------------------
RSTAS: CLR RST
CLR CLK
SETB RST ;POLL UP RST
NOP
NOP
NOP
NOP ;4uS
SETB CLK ;POLL UP CLK
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP ;9uS
CLR CLK ;POLL DOWN CLK
NOP
NOP
NOP
NOP ;4uS
CLR RST ;POLL DOWN RST
MOV R0,#DATA1
MOV R6,#4
RST1: MOV R7,#8 ;>2.5uS
RST2: MOV C,IO
RRC A
NOP
NOP
NOP
NOP
NOP
SETB CLK
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP ;9uS
CLR CLK
DJNZ R7,RST2
MOV @R0,A
INC R0
DJNZ R6,RST1 ;以上为RESET AND ANSWER TO RESET
RET
;----------------------------------------------------
; SDCOMD: 发送命令子程序
; 入口参数:R0,要发送的三字节命令
; 局部参数:R6,R7
;----------------------------------------------------
SDCOMD: NOP
NOP
NOP
NOP
NOP
SETB CLK
NOP
NOP
NOP
NOP
CLR IO ;开始发送命令
MOV R6,#3
COMD1: MOV R7,#8
MOV A,@R0
COMD2: NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR CLK ;>9uS
RRC A
MOV IO,C
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB CLK ;>9uS
DJNZ R7,COMD2
INC R0
DJNZ R6,COMD1
NOP
NOP
NOP
NOP
CLR CLK
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB CLK ;additional clock:0->1
NOP
NOP
NOP
NOP
SETB IO ;结束发送命令,>4uS
RET
;----------------------------------------------------
; RCDATA: 接收数据子程序
; 入口参数:R0,数据起址;R2,数据个数
; 局部参数:R6,R7
; 出口参数:R0,数据
;----------------------------------------------------
RCDATA: CLR CLK
MOV A,R2
MOV R6,A
READM1: MOV R7,#8
READM2: NOP
MOV C,IO ;>2.5uS
RRC A
NOP
NOP
NOP
NOP
SETB CLK
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP ;9uS
CLR CLK
DJNZ R7,READM2
MOV @R0,A
INC R0
DJNZ R6,READM1 ;以上为多字节读
RET
;----------------------------------------------------
; PROCESS: 开始写过程,提供足够的脉冲
; 入口参数:
; 局部参数:R7
; 出口参数:
;----------------------------------------------------
PROCESS:NOP
NOP
NOP
NOP
NOP
CLR CLK
NOP
NOP
NOP
CLR IO
MOV R7,#255
PROCES1:NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB CLK
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR CLK
DJNZ R7,PROCES1
NOP
SETB IO
RET
;----------------------------------------------------
; CMPVD: 校验PSC
; 入口参数:R1,输入PSC.
; 局部参数:R6,R7
; 出口参数:R3,1:校验失败,0:成功; R0, EC & PSC
;----------------------------------------------------
CMPVD: MOV R0,#DATA1 ;--------------------
MOV @R0,#31H
LCALL SDCOMD
MOV R0,#DATA1
MOV R2,#4
LCALL RCDATA ;READ EC NOTE:READ 4
MOV R0,#DATA1
MOV A,@R0
ANL A,#07H
JNZ PERMIT ;EC=0,RET
MOV R3,#1
RET
PERMIT: JNB ACC.0,WR0A
CLR ACC.0
SJMP WR0C
WR0A: JNB ACC.1,WR0B
CLR ACC.1
SJMP WR0C
WR0B: CLR ACC.2
WR0C: MOV R0,#DATA1 ;---------------------
MOV @R0,#39H
INC R0
MOV @R0,#0
INC R0
MOV @R0,A
MOV R0,#DATA1
LCALL SDCOMD
LCALL PROCESS ;UPDATA EC
MOV R0,#DATA1 ;--------------------------
MOV @R0,#33H
INC R0
MOV @R0,#1
INC R0
MOV A,@R1
MOV @R0,A
MOV R0,#DATA1
LCALL SDCOMD
LCALL PROCESS ;COMPARE FIRST
MOV R0,#DATA1 ;-------------
MOV @R0,#33H
INC R0
MOV @R0,#2
INC R0
INC R1
MOV A,@R1
MOV @R0,A
MOV R0,#DATA1
LCALL SDCOMD
LCALL PROCESS ;COMPARE SECOND
MOV R0,#DATA1 ;--------------
MOV @R0,#33H
INC R0
MOV @R0,#3
INC R0
INC R1
MOV A,@R1
MOV @R0,A
MOV R0,#DATA1
LCALL SDCOMD ;COMPARE THIRD
LCALL PROCESS ;---------------------------
MOV R0,#DATA1
MOV @R0,#39H
INC R0
MOV @R0,#0
INC R0
MOV @R0,#07H
MOV R0,#DATA1
LCALL SDCOMD
LCALL PROCESS ;UPDATA EC
;MOV R0,#DATA1 ;------------------
;MOV @R0,#39H
;INC R0
;MOV @R0,#1
;INC R0
;MOV @R0,#0FFH
;MOV R0,#DATA1
;LCALL SDCOMD
;LCALL PROCESS ;UPDATA THE FIRST BYTE OF PSC
MOV R0,#DATA1 ;------------------
MOV @R0,#31H
LCALL SDCOMD
MOV R0,#DATA1
MOV R2,#4
LCALL RCDATA ;READ EC
MOV R0,#DATA1
MOV A,@R0
ANL A,#7
CJNE A,#7,CMPFAIL
MOV R3,#0
RET
CMPFAIL:MOV R3,#1
RET
;----------------------------------------------------
; WR4442: 多字节写
; 入口参数:R1,写入数据起址; R2,写入个数; R3,数据写入地址
; 局部参数:R0,R6,R7
; 出口参数:R3,1:校验失败,0:成功; R0, EC & PSC
;----------------------------------------------------
WR4442: MOV R0,#DATA1
MOV @R0,#38H
INC R0
MOV A,R3
MOV @R0,A
INC R0
MOV A,@R1
MOV @R0,A
MOV R0,#DATA1
LCALL SDCOMD
LCALL PROCESS ;UPDATA MAIN MEM
INC R1
INC R3
DJNZ R2,WR4442
RET
;*********************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -