?? 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 + -