📄 51写的sle4442程序.txt
字号:
;实验用的SLE4442卡初始密码PSC1、PSC2、PSC3均为0FFH。读加密存储器的内容暂存于22H单元——错误计数器;、;23H单元——密码字节1、24H单元——密码字节2、25H单元——密码字节3。
;本程序对应晶振12 MHz的情况,DELAY_12 μs、DELAY_4 μs和DELAY_10 ms分别为延时12 μs、延时4 ;μs和延时10 ms子程序,请读者自行编写。
IO BIT P1.0
CLK BIT P1.1
RST BIT P1.2
ICSW BIT P1.6
PWR BIT P1.7
PSC1 EQU 0FFH
PSC2 EQU 0FFH
PSC3 EQU 0FFH
ORG 0000H
LJMP MAIN
;*************主程序**************
ORG 0030H
MAIN:
CLR EA ;关中断
MOV SP,#60H ;设置堆栈
LCALL PWRON ;上电控制
LCALL RESET ;复位
MOV R0,#30H ;设置读数据缓冲区1首地址
LCALL READ ;读主存储器
NOP ;断点①
LCALL COMP ;PSC校验
XRL A,R4 ;断点②,检查PSC校验是否正确
JNZ EXIT ;PSC校验失败退出
MOV R0,#50H ;设置写数据缓冲区首地址
LCALL WRITE ;修改主存储器
MOV R0,#40H ;设置读数据缓冲区2首地址
LCALL READ ;读主存储器
EXIT: NOP ;断点③
LCALL PWROFF ;下电控制
SJMP $
;**********读主存储器子程序**************
READ:
MOV R7,#30H ;设置读主存储器命令控制字
MOV R6,20H ;取读主存储器命令地址字
MOV R5,#00H ;设置读主存储器命令数据字(任意)
MOV R4,21H ;取要读的字节数
MOV R3,21H ;要读的字节数暂存R3
MOV R2,#00H
LCALL COMMAND ;送命令给卡
READ0: LCALL SHIN ;读数据(输出数据模式)
MO @R0,A ;送数据入数据缓冲区
INC R0
DJNZ R4,READ0 ;未读完继续
CLR C ;计算剩余的主存储器字节数
MOV A,#0FFH
SUBB A,R6
SUBB A,R3
INC A
MOV R2,A
READ1: LCALL SHIN ;读入剩余的主存储器字节
DJNZ R2,READ1
SETB CLK ;发送一个附加脉冲
LCALL DELAY_4 μs
CLR CLK
LCALL DELAY_4μs
SETB IO ;置位数据线
LCALL DELAY_4 μs
RET
WRITE:
MOV R4,21H ;取要写的字节数
WRITE0:MOV R7,#38H ;设置修改主存储器命令控制字
MOV R6,20H ;取修改主存储器命令地址字
MOV A,@R0
MOV R5,A ;取修改主存储器命令数据字
LCALL COMMAND ;送修改主存储器命令给卡
LCALL OPERA254 ;处理模式
INC 32H ;地址字指向主存储器下一个单元
INC R0 ;指向下一个数据
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
;*********处理模式1子程序************
OPERA123:
MOV R7,#123D
CLR CLK
CLR IO
LCALL DELAY_4μs
OPERA0: SETB CLK
LCALL DELAY_4μs
CLR dCLK
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -