DJNZ R4,WRITE0 ;未写完继续 RET
;************PSC校验子程序*************** COMP:
MOV R7,#31H ;设置读加密存储器命令控制字
MOV R6,#00H ;设置读加密存储器命令地址字(00H为错误计数器) MOV R5,#00H ;设置读加密存储器命令数据字(任意) LCALL COMMAND ;送读加密存储器命令 LCALL SHIN ;读错误计数器
MOV 22H,A ;错误计数器值暂存22H单元 LCALL SHIN ;继续读入加密存储器后3个字节 MOV 23H,A LCALL SHIN MOV 24H,A LCALL SHIN MOV 25H,A MOV A,22H
SETB IO ;附加一个脉冲,置数据线为高 LCALL DELAY_4μs SETB CLK
LCALL DELAY_4 μs CLR CLK
JB ACC.0,NEXT0 ;判断错误计数器中是否还有“1” JB ACC.1,NEXT1 ;如有“1”则减去一个“1” JB ACC.0,COMP2
LJMP EXIT ;错误计数器为全“0”退出 NEXT0:MOV R5,#06H MOV R4,#07H AJMP COMP0
NEXT1:MOV R5,#04H MOV R4,#06H AJMP COMP0
NEXT2: MOV R5,#00H MOV R4,#04H
COMP0: MOV R7,#39H ;设置修改加密存储器命令控制字
MOV R6,#00H ;设置修改加密存储器命令地址字(错误计数器) LCALL COMMAND ;送修改加密存储器命令(错误计数器减一个1) LCALL OPERA123 ;处理模式
MOV R7,#33H ;设置PSC校验命令控制字 MOV R6,#01H ;设置PSC校验命令地址字 MOV R5,#PSC1 ;取PSC第1个字节 LCALL COMMAND ;送PSC校验命令给卡 LCALL OPERA123 ;处理模式
MOV R7,#33H ;设置PSC校验命令控制字
MOV R6,#02H ;设置PSC校验命令地址字 MOV R5,#PSC2 ;取PSC第2个字节 LCALL COMMAND ;送PSC校验命令给卡 LCALL OPERA123 ;处理模式
MOV R7,#33H ;设置PSC校验命令控制字 MOV R6,#03H ;设置PSC校验命令地址字 MOV R5,#PSC3 ;取PSC第3个字节 LCALL COMMAND ;送PSC校验命令给卡 LCALL OPERA123 ;处理模式
MOV R7,#39H ;设置修改加密存储器命令控制字
MOV R6,#00H ;设置修改加密存储器命令地址字(错误计数器) MOV R5,R4 ;取修改加密存储器命令数据字(擦除错误计数器) LCALL COMMAND ;送修改加密存储器(擦除错误计数器)命令给卡 LCALL OPERA123 ;处理模式
MOV R7,#31H ;设置读加密存储器命令控制字
MOV R6,#00H ;设置读加密存储器命令地址字(错误计数器) MOV R5,#00H ;设置读加密存储器命令数据字(任意) LCALL COMMAND ;送读加密存储器命令给卡 LCALL SHIN ;读加密存储器的错误计数器 MOV 22H,A
LCALL SHIN ;读加密存储器的后3个字节 MOV 23H,A LCALL SHIN MOV 24H,A LCALL SHIN MOV 25H,A MOV A,22H
SETB IO ;附加一个脉冲,置数据线为高 LCALL DELAY_4μs SETB CLK
LCALL DELAY_4μs CLR CLK EXIT: RET
;************命令子程序*************** ;该子程序送出3字节的SLE4442命令
;入口参数:R7为控制字,R6为地址字,R5为数据字 ;调用时CLK为低,IO为高;返回时CLK为高,IO为高 COMMAND: SETB CLK
LCALL DELAY_12μs CLR IO
LCALL DELAY_4μs CLR CLK
LCALL DELAY_4μs
MOV A,R7 LCALL SHOUT MOV A,R6 LCALL SHOUT MOV A,R5 LCALL SHOUT LCALL DELAY_4μs
CLR IO
LCALL DELAY_4μs SETB CLK
LCALL DELAY_4 μs SETB IO RET
;*************串行输出一个字节子程序*********** SHOUT: PUSH B
MOV B,#08H X42: RRC A MOV IO,C NOP
SETB CLK
LCALL DELAY_4μs CLR CLK
LCALL DELAY_4μs DJNZ B,X42 POP B RET
;*************串行输入一个字节子程序***************** SHIN:
CLR CLK PUSH B
MOV B,#08H
X43: LCALL DELAY_4 μs SETB CLK MOV C,IO RRC A
LCALL DELAY_4 μs CLR CLK DJNZ B,X43 POP B RET
;*********处理模式1子程序************ OPERA123:
MOV R7,#123D
CLR CLK CLR IO
LCALL DELAY_4μs OPERA0:SETB CLK LCALL DELAY_4μs CLR CLK
LCALL DELAY_4μs OPERA0:SETB CLK
LCALL DELAY_4μs CLR CLK LCALL DELAY_4μs
DJNZ R7,OPERA0 SETB IO
LCALL DELAY_4 μs SETB CLK
LCALL DELAY_4 μs CLR CLK RET
;**************处理模式2子程序*********** OPERA254:
MOV R7,#254D CLR CLK CLR IO
LCALL DELAY_4 μs OPERA1:SETB CLK
LCALL DELAY_4 μs CLR CLK
LCALL DELAY_4 μs DJNZ R7,OPERA1 SETB IO
LCALL DELAY_4 μs SETB CLK
LCALL DELAY_4 μs CLR CLK RET
;*************复位子程序*************** RESET:
CLR RST CLR CLK CLR IO
LCALL DELAY_12 μs LCALL DELAY_12 μs SETB RST
LCALL DELAY_12 μs
SETB CLK
LCALL DELAY_12 μs CLR CLK
LCALL DELAY_12 μs CLR RST
LCALL DELAY_12 μs MOV B,#20H RESET0: SETB CLK
LCALL DELAY_12 μs CLR CLK
LCALL DELAY_12 μs DJNZ B,RESET0 SETB IO RET
;**************上电控制子程序*********** PWRON:
CLR RST CLR IO CLR CLK
LCALL RECOG CLR RST CLR CLK
LCALL DELAY_10 ms CLR PWR CLR IO RET
RECOG: JB ICSW,RECOG LCALL DELAY_10 ms JB ICSW,RECOG RET
;***********下电控制子程序************** PWROFF:
CLR RST CLR CLK CLR IO
LCALL DELAY_10 ms SETB PWR RET END
;***********键盘扫描程序**************** KEY: MOV P2,#0FH ;用反转法查键 MOV A,P2 ANL A,#0FH MOV B,A