📄 iccard.asm
字号:
CJNE A, 1EH, CMPERR
MOV A, R1
MOV R0, A
MOV A, R2
MOV R4, A
MOV A, #0FFH
COMOP2: XRL A, @R0
INC R0
DJNZ R4, COMOP2
CLR C
DA A
INC R0
MOV 1EH, @R0
CJNE A, 1EH, CMPERR
CLR A ;校验正确
RET
CMPERR: MOV A, #0FFH ;校验出错
RET
;获取校验字节子程序
;入口参数: R0, 存计算校验的起始地址; R4, 存计算个数
;出口参数: 校验区的后两个字节
GETOP: MOV A, R0
MOV R1, A
MOV A, R4
MOV R2, A
MOV A, #00H
GETOP1: ADD A, @R0
INC R0
DJNZ R4, GETOP1
CLR C
DA A
MOV @R0, A
MOV A, R1
MOV R0, A
MOV A, R2
MOV R4, A
MOV A, #0FFH
GETOP2: XRL A, @R0
INC R0
DJNZ R4, GETOP2
CLR C
DA A
INC R0
MOV @R0, A
RET
;检验IC 卡的正确性
;入口参数: 无 ; 出口参数: A=0 则正确
TEST: MOV R2, #00H ;检测SDV, CLK, RST线
MOV R3, #00H
MOV R4, #06H
MOV R0, #24H
LCALL POSITION
LCALL READ
MOV R0, #24H
MOV R4, #06H
TEST1: MOV A, @R0
CPL A
JNZ TESTNEXT
INC R0
DJNZ R4, TEST1
TESTNEXT:MOV R2, #00H
MOV R3, #00H
MOV R4, #02H
MOV R0, #26H
LCALL POSITION
LCALL READ
MOV A, 24H
XRL A, 26H
JNZ TESTERR
MOV A, 25H
XRL A, 27H
JNZ TESTERR
TESTE: CLR A
RET
TESTERR:LCALL POWOFF
ANL SCON, #0FCH
SETB EA
MOV A, #0FFH
RET
; CPU从串口缓冲区读取操作命令子程序
; 入口参数: 无 ; 出口参数: 无
; 所用寄存器: R0, R1, R2
LOADORD: CLR EA ;前导码
LCALL TCL
SETB EA
JNZ LOADORD
MOV A, R3
CJNE A, #7FH, LOADORD
MOV DELERR, #0FFH
MOV TH0, #00H
MOV TL0, #00H
SETB TR0
MOV R0, #20H ;长度
MOV @R0, A
SDIC1: MOV A, DELERR
JZ NOOPR
CLR EA
LCALL TCL
SETB EA
JNZ SDIC1
MOV A, R3
XRL A, #7FH
JZ SDIC1
MOV A, R3 ;接收命令内容
MOV 21H, A
MOV R0, #22H
MOV R4, A
LOADOP: MOV A, DELERR
JZ NOOPR
CLR EA
LCALL TCL
SETB EA
JNZ LOADOP
MOV A, R3
MOV @R0, A
INC R0
DJNZ R4, LOADOP
CLR TR0
MOV R0, #21H ;校验
MOV R4, 21H
MOV A, #00H
ADDOP: ADD A, @R0
INC R0
DJNZ R4, ADDOP
XRL A, @R0
JNZ NOOPR
MOV A, 22H
CJNE A, #01H, OPRT3
MOV A, 23H
OPRT1: CJNE A, #01H, OPRT2
MOV OPR, #02H
RET
OPRT2: CJNE A, #02H, NOOPR
MOV OPR, #01H
RET
OPRT3: CJNE A, #02H, NOOPR
MOV A, 23H
CJNE A, #01H, NOOPR
MOV OPR, #03H
RET
NOOPR: MOV OPR, #00H
RET
;CPU向串口发送信息子程序
;入口参数: 无 ;出口参数: 无
;所用寄存器: R0, R1, R2, R5
SEND: MOV DTT, #00H
MOV A, 21H
ADD A, #03H
MOV DHT, A
MOV R0, #21H
MOV R4, 21H
MOV A, #00H
SEND1: ADD A, @R0
INC R0
DJNZ R4, SEND1
MOV @R0, A
INC R0
MOV @R0, #0FFH
SEND3: MOV R0, #DHT
MOV 1FH, @R0
SETB TI
SEND4: MOV R1, #DTT
MOV A, @R1
CJNE A, 1FH, SEND4
RET
;发送一字节操作子程序
;入口参数: 无 ;出口参数: 无
;所用寄存器: R0, R1
TCL: PUSH 0 ;向CPU芯片发送一字节
MOV R0, #RXD
MOV A, DTR
XRL A, DHR
JZ TCL1
MOV A, DTR
ADD A, R0
MOV R0, A
MOV A, @R0
MOV R3, A
INC DTR
MOV A, DTR
XRL A, #18H
JNZ TCL0
MOV DTR, #00H
TCL0: CLR A
POP 0
RET
TCL1: MOV A, #0FFH
POP 0
RET
STL: PUSH 0 ;通讯发送一字节
MOV R0, #TXD
MOV A, DTT
XRL A, DHT
JZ STL1
MOV A, DTT
ADD A, R0
MOV R0, A
MOV A, @R0
MOV R3, A
INC DTT
MOV A, #00H
POP 0
RET
STL1: MOV A, #0FFH
POP 0
RET
;接收一字节操作子程序
;入口参数: 无 ;出口参数: 无
;所用寄存器: R0, R1
SRL: PUSH 0 ;通讯接收一字节
MOV R0, #RXD
MOV A, DHR
INC A
XRL A, DTR
JZ SRL1
MOV A, DHR
ADD A, R0
MOV R0, A
MOV A, R3
MOV @R0, A
INC DHR
MOV A, DHR
XRL A, #18H
JNZ SRL0
MOV DHR, #00H
SRL0: CLR A
POP 0
RET
SRL1: MOV A, #0FFH
POP 0
RET
RCL: PUSH 0 ;从CPU芯片接收一字节
MOV R0, #TXD
MOV A, #37H
CLR C
SUBB A, DHT
JC RCL1
MOV A, DHT
ADD A, R0
MOV R0, A
MOV A, R3
MOV @R0, A
INC DHT
CLR A
POP 0
RET
RCL1: MOV A, #0FFH
POP 0
RET
INT2: MOV DELERR, #00H
RETI
INT5: PUSH ACC ;串行口通讯中断(第5号中断)程序
PUSH PSW
PUSH 0
PUSH 1
PUSH 2
PUSH 3
INT50: JB TI, INT51
JB RI, INT52
SJMP INT5E
INT51: CLR TI
LCALL STL
JNZ INT53
MOV A,R3
MOV SBUF, A
SJMP INT5E
INT52: CLR RI
MOV A, SBUF
MOV R3, A
LCALL SRL
CLR SM2
SJMP INT5E
INT53: SETB REN
INT5E: POP 3
POP 2
POP 1
POP 0
POP PSW
POP ACC
RETI
ICIN: JB P3.3, ICINERR ; IC卡是否插入
LCALL DELAY5M
JB P3.3, ICINERR
ICINE: RET
ICINERR:MOV A, #0FFH
SJMP ICINE
POWON: MOV A, #00H ;IC卡的上电子程序
LCALL ICIN
JNZ POWONE
CLR P1.6
CLR P1.5
LCALL DELAY05M
CLR P1.7
LCALL DELAY50M
CLR P1.2
POWONE: RET
POWOFF:CLR P1.2 ;IC卡的掉电子程序
CLR P1.3
CLR P1.4
CLR P1.5
CLR P1.6
LCALL DELAY05M
SETB P1.7
RET
;IC 卡的复位子程序
;入口参数: 无 出口参数: 无
RESET: SETB P1.6
SETB P1.5
LCALL DELAY
CLR P1.5
LCALL DELAY
CLR P1.6
LCALL DELAY
RET
;定位子程序
;入口参数: R2,R3
;出口时CLK为低
POSITION: LCALL RESET
POS0: CJNE R3, #00H, POS2
CJNE R2, #00H, POS1
RET
POS1: DEC R2
POS2: DEC R3
SETB P1.5
LCALL DELAY
CLR P1.5
LCALL DELAY
SJMP POS0
;再次定位子程序
;入口参数: R2, R3
;出口参数: CLK为低
REPOSI: NOP
POSI: CJNE R3, #00H, POSI2
CJNE R2, #00H, POSI1
RET
POSI1: DEC R2
POSI2: DEC R3
SETB P1.5
LCALL DELAY
CLR P1.5
LCALL DELAY
SJMP POSI
;读子程序
;入口参数:R0,R2,R3,R4 读若干字节放于R0所指单元中去
;出口时CLK为低
READ: CLR P1.6
CLR P1.3
SETB P1.4
CLR P1.5
LCALL DELAY
RD1: MOV R5, #08H
RD2: SETB P1.2
LCALL DELAY
MOV C, P1.2
RLC A
SETB P1.5
LCALL DELAY
CLR P1.5
DJNZ R5, RD2
MOV @R0, A
INC R0
DJNZ R4, READ
LCALL DELAY
RET
;写子程序
;入口参数: R0,R2,R3,R4 ;出口时CLK 为低
;所用寄存器: R6, R7
WRITE: CLR P1.6
SETB P1.4
MOV A, @R0
MOV R5, #08H
WD1: RLC A
JNC WD2
SJMP WD4
WD2: SETB P1.2
LCALL DELAY
MOV C, P1.2
JNC WD4
WD3: SETB P1.3
CLR P1.2
LCALL DELAY
SETB P1.5
LCALL DELAY2M
CLR P1.3
LCALL DELAY3M
CLR P1.5
CLR P1.3
LCALL DELAY
MOV C, P1.2
JC WD3
WD4: SETB P1.5
LCALL DELAY
CLR P1.5
DJNZ R5, WD1
INC R0
DJNZ R4, WRITE
LCALL DELAY
RET
;擦除公共区子程序
;入口参数: R2, R3, R4
;出口时CLK 为低
ERASE: CLR P1.6
SETB P1.4
ER: SETB P1.3
SETB P1.2
LCALL DELAY
SETB P1.5
LCALL DELAY2M
CLR P1.3
LCALL DELAY3M
CLR P1.5
LCALL DELAY
MOV R1, #08H
ER1: SETB P1.5
LCALL DELAY
CLR P1.5
LCALL DELAY
DJNZ R1, ER1
DJNZ R4, ER
LCALL DELAY
RET
;密码位比较子程序
;入口参数: R0, R2, R3, R4 ;出口时CLK 为高
;所用寄存器: R0, R2, R3, R4, R5
COMP: MOV R5, #08H
COM1: SETB P1.5
LCALL DELAY
MOV A, @R0
RLC A
MOV @R0, A
MOV P1.2, C
LCALL DELAY
CLR P1.5
LCALL DELAY
DJNZ R5, COM1
MOV A, @R0
RLC A
MOV @R0, A
INC R0
DJNZ R4, COMP
RET
;密码校验子程序
;入口参数: R0, R2, R3, R4 ;出口参数: PSW.CY, CLK 为低
;所用寄存器: R5
COMPARE: CLR P1.6
CLR P1.3
LCALL POSITION
LCALL COMP
MOV R5, #08H
COMPA1: SETB P1.5
LCALL DELAY
CLR P1.5
LCALL DELAY
SETB P1.2 ;读出SCAC或ECAC中的第一位
LCALL DELAY
MOV C, P1.2
JC COMPA2 ;为'1'则密码正确
DJNZ R5, COMPA1
LJMP ERR
COMPA2: SETB P1.3 ;写该位为'0'
CLR P1.2
LCALL DELAY
SETB P1.5
LCALL DELAY2M
CLR P1.3
LCALL DELAY3M
CLR P1.5
CLR P1.3
SETB P1.2 ;校验是否写正确
LCALL DELAY
MOV C, P1.2
JC ERR
SETB P1.3 ;擦除SCAC或ECAC
SETB P1.2
LCALL DELAY
SETB P1.5
LCALL DELAY2M
CLR P1.3
LCALL DELAY3M
CLR P1.5
LCALL DELAY
MOV C, P1.2
RET
ERR: CLR C ;IC卡密码比较出错
RET
;所有的延时子程序
;延时8 US
DELAY: MOV R6, #06H
DJNZ R6, $
RET
;延时0.5MS
DELAY05M: MOV R6, #0FAH
DJNZ R6, $
RET
;延时2MS
DELAY2M: MOV R6, #04H
D2: MOV R7, #0FAH
DJNZ R7, $
DJNZ R6, D2
RET
;延时3MS
DELAY3M: MOV R6, #6H
D3: MOV R7, #0FAH
DJNZ R7, $
DJNZ R6, D3
RET
;延时5MS
DELAY5M: MOV R6, #0AH
D4: MOV R7, #0FAH
DJNZ R7, $
DJNZ R6, D4
RET
;延时50MS
DELAY50M: MOV R6, #64H
D5: MOV R7, #0FAH
DJNZ R7, $
DJNZ R6, D5
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -