;********CONSTANTS******
;
RST BIT P1.4
CLK BIT P1.6
IO BIT P1.5
RMM EQU 30H
RPM EQU 34H
RSM EQU 31H
CVD EQU 33H
WMM EQU 38H
WPM EQU 3CH
WSM EQU 39H
;
;***********************
ORG 0000H
LJMP main
ORG 0100H
main:
MOV SP,#0D0H
CLR P2.7
CLR RST
CLR CLK
MOV R0,#30H ;RESET DATA STORE
IN ADDRESS:30 31 32 33
MOV 30H,#0FFH
LCALL reset ;RESET
MOV R0,#50H ;FIRST ADDRESS TO
STORE PROTECTION MEMORY
LCALL rdpm
MOV R0,#40H ;FIRST ADDRESS TO
STORE MAIN MEMORY
MOV R1,#1AH ;FIRST ADDRESS TO
READ IN IC CARD
MOV R2,#07H ;LENTH TO READ
LCALL rdmm
MOV R0,#58H ;ADDRESS TO STORE ERROR
COUNTER
LCALL rdsm
MOV R0,#06H ;WRITE 00000110B TO ERROR
COUNTER
LCALL wtec
MOV R0,#60H ;FIRST ADDRESS TO STORE
REFERENCE DATA
MOV @R0,#0FFH ;1ST REFERENCE DATA : FFH
INC R0
MOV @R0,#0FFH ;2ND REFERENCE DATA : FFH
INC R0
MOV @R0,#0FFH ;3RD REFERENCE DATA : FFH
MOV R0,#60H
LCALL cpvd
MOV R0,#07H ;WRITE 00000111B TO
ERROR COUNTER
LCALL wtec
MOV R0,#58H ;ADDRESS(58H) TO
STORE ERROR COUNTER
LCALL rdsm ;ADDRESS(59H) TO
STORE 1ST REFERENCE DATA
;ADDRESS(5AH) TO STORE 2ND
REFERENCE DATA
;ADDRESS(5BH) TO STORE 3RD
REFERENCE DATA
MOV A,58H
CJNE A,#07H,stop ;COMPARE ERROR GOTO
STOP
MOV R0,#4AH ;DATA TO BE WRITEN
MOV R1,#1BH ;ADDRESS TO BE
WRITEN IN IC CARD
LCALL wtmm
MOV R0,#48H ;FIRST ADDRESS TO STORE MAIN
MEMORY
MOV R1,#1FH ;FIRST ADDRESS TO
READ IN IC CARD
MOV R2,#01H ;LENTH TO READ
LCALL rdmm
; MOV R0,#68H ;ADDRESS(68H) TO
STORE NEW 1ST REFERENCE DATA
; MOV @R0,#12H ;NEW 1ST REFERENCE DATA : 12H
; INC R0 ;ADDRESS(69H) TO
STORE NEW 2ND REFERENCE DATA
; MOV @R0,#34H ;NEW 2ND REFERENCE DATA : 34H
; INC R0 ;ADDRESS(6AH) TO
STORE NEW 3RD REFERENCE DATA
; MOV @R0,#56H ;NEW 3RD REFERENCE DATA : 56H
; MOV R0,#68H
; LCALL cgrd
;examine change
; MOV R0,#38H ;ADDRESS(58H) TO STORE ERROR
COUNTER
; LCALL rdsm ;ADDRESS(59H) TO
STORE 1ST REFERENCE DATA
;ADDRESS(5AH) TO STORE 2ND
REFERENCE DATA
;ADDRESS(5BH) TO STORE 3RD
REFERENCE DATA
MOV R0,#4BH ;DATA TO BE WRITEN
AND TO BE PROTECTED
MOV R1,#1FH ;ADDRESS TO BE
WRITEN IN IC CARD
LCALL wtpm
SETB P2.7
stop:
SJMP $
;***********************
;
;NAME: reset
;DESCRIPTION: RESET SLE4442
;CALL: delay
;INPUT: R0=START ADDRESS OF OUTGOING DATA
;OUTPUT:
;REGISTER USAGE:A,R1,R2
;
;***********************
reset:
CLR RST
CLR CLK
LCALL delay
SETB RST
SETB CLK
LCALL delay
CLR CLK
CLR RST
MOV R2,#04H
inbyte:
MOV R1,#08H
inbit:
LCALL delay
SETB CLK
MOV C,IO
RRC A
LCALL delay
CLR CLK
DJNZ R1,inbit
MOV @R0,A
INC R0
DJNZ R2,inbyte
RET
;***********************
;
;NAME: rdmm
;DESCRIPTION: READ IC MAIN MEMORY
;CALL:
;INPUT: R0=START ADDRESS OF STORE OUTGOING DATA
; R1=START ADDRESS (IC)TO READ
; R2=LENTH OF OUTGOING DATA
;OUTPUT:
;REGISTER USAGE:R1,R2,R3,R4,R5
;
;***********************
rdmm:
MOV A,R0
MOV R3,A
MOV A,R1
MOV R4,A
MOV A,R2
MOV R5,A
MOV R0,#20H
MOV @R0,#RMM
INC R0
MOV A,R4
MOV @R0,A
INC R0
MOV @R0,#00H
MOV R0,#20H
LCALL command
MOV A,R3
MOV R0,A
MOV A,R5
MOV R1,A
LCALL readdata
MOV R0,#30H
LCALL reset
RET
;***********************
;
;NAME: rdsm
;DESCRIPTION: READ SECURITY MEMORY
;CALL:command,readdata
;INPUT: R0=ADDRESS OF STORE ERROR COUNTER
; @(R0+1)=REFERENCE DATA BYTE1
; @(R0+2)=REFERENCE DATA BYTE2
; @(R0+3)=REFERENCE DATA BYTE3
;OUTPUT:
;REGISTER USAGE:R0,R1
;
;***********************
rdsm:
MOV ACC,R0
PUSH ACC
MOV R0,#20H
MOV @R0,#RSM
INC R0
MOV @R0,#00H
INC R0
MOV @R0,#00H
MOV R0,#20H
LCALL command
POP ACC
MOV R0,ACC
MOV R1,#04H
LCALL readdata
RET
;***********************
;
;NAME: cpvd
;DESCRIPTION: COMPARE VERIFICATION DATA
;CALL:command,delay
;INPUT: @R0=REFERENCE DATA BYTE1
; @(R0+1)=REFERENCE DATA BYTE2
; @(R0+2)=REFERENCE DATA BYTE3
;OUTPUT:
;REGISTER USAGE:R3,R4,R5,R6
;
;***********************
cpvd:
MOV R4,#03H
MOV R5,#01H
MOV A,R0
MOV R3,A
cploop:
MOV R0,#20H
MOV @R0,#CVD
INC R0
MOV A,R5
MOV @R0,A
INC R0
MOV A,R3
MOV R1,A
MOV A,@R1
MOV @R0,A
MOV R0,#20H
LCALL command
CLR CLK
LCALL delay
SETB CLK
LCALL delay
CLR CLK
LCALL delay
SETB CLK
LCALL delay
CLR CLK
LCALL delay
SETB CLK
LCALL delay
CLR CLK
LCALL delay
INC R5
INC R3
DJNZ R4,cploop
RET
;***********************
;
;NAME: wtec
;DESCRIPTION: WRITE ERROR COUNTER
;CALL:command,delay
;INPUT: R0=NEW ERROR COUNTER
;OUTPUT:
;REGISTER USAGE:R1
;
;***********************
wtec:
MOV ACC,R0
PUSH ACC
MOV R0,#20H
MOV @R0,#WSM
INC R0
MOV @R0,#00H
INC R0
POP ACC
MOV @R0,ACC
MOV R0,#20H
LCALL command
CLR CLK
LCALL delay
MOV R1,#0FEH
wtloop:
SETB CLK
LCALL delay
CLR CLK
LCALL delay
DJNZ R1,wtloop
RET
;******************************
;
;NAME: cgrd
;DESCRIPTION: CHANGE REFERENCE DATA
;CALL:command,delay
;INPUT: R0=ADDRESS OF 1st REFERENCE BYTE
; @(R0+1)=2nd REFERENCE BYTE
; @(R0+2)=3rd REFERENCE BYTE
;OUTPUT:NONE
;REGISTER USAGE:A,R1,R3,R4,R5
;
;******************************
cgrd:
MOV A,R0
MOV R1,A
MOV R3,#03H
MOV R4,#01H
cgbyte:
MOV R0,#20H
MOV @R0,#WSM
INC R0
MOV A,R4
MOV @R0,A
INC R0
MOV A,@R1
MOV @R0,A
MOV R0,#20H
MOV ACC,R1
PUSH ACC
LCALL command
POP ACC
MOV R1,ACC
CLR CLK
LCALL delay
MOV R5,#0FEH
cgloop:
SETB CLK
LCALL delay
CLR CLK
LCALL delay
DJNZ R5,cgloop
INC R4
INC R1
DJNZ R3,cgbyte
RET
;******************************
;
;NAME: wtmm
;DESCRIPTION: WRITE MAIN MEMORY
;CALL:command,delay
;INPUT: R0=DATA TO BE WRITTEN
; R1=ADDRESS TO WRITE IN IC CARD
;OUTPUT:NONE
;REGISTER USAGE:R5
;
;******************************
wtmm:
MOV ACC,R0
PUSH ACC
MOV R0,#20H
MOV @R0,#WMM
INC R0
MOV A,R1
MOV @R0,A
INC R0
POP ACC
MOV @R0,A
MOV R0,#20H
LCALL command
CLR CLK
LCALL delay
CLR IO
LCALL delay
MOV R5,#0FFH
wmmloop:
SETB CLK
LCALL delay
CLR CLK
LCALL delay
DJNZ R5,wmmloop
RET
;******************************
;
;NAME: wtpm
;DESCRIPTION: WRITE MAIN MEMORY
;CALL:command,delay,wtmm
;INPUT: R0=DATA TO BE WRITTEN
; R1=ADDRESS TO WRITE IN IC CARD
;OUTPUT:NONE
;REGISTER USAGE:R5
;
;******************************
wtpm:
MOV ACC,R0
PUSH ACC
MOV ACC,R1
PUSH ACC
LCALL wtmm
POP ACC
MOV R1,ACC
POP ACC
MOV R0,ACC
MOV ACC,R0
PUSH ACC
MOV R0,#20H
MOV @R0,#WPM
INC R0
MOV A,R1
MOV @R0,A
INC R0
POP ACC
MOV @R0,A
MOV R0,#20H
LCALL command
CLR CLK
LCALL delay
CLR IO
LCALL delay
MOV R5,#0FFH
wpmloop:
SETB CLK
LCALL delay
CLR CLK
LCALL delay
DJNZ R5,wpmloop
RET
;******************************
;
;NAME: command
;DESCRIPTION: SEND A COMMAND TO IC
;CALL:delay
;INPUT: R0=ADDRESS OF CONTROL BYTE
; @(R0+1)=ADDRESS BYTE
; @(R0+2)=DATA BYTE
;OUTPUT:NONE
;REGISTER USAGE:A,R1,R2
;
;******************************
command:
SETB IO
SETB CLK
LCALL delay
CLR IO
LCALL delay
CLR CLK
MOV R1,#03H
outbyte:
MOV A,@R0
MOV R2,#08H
outbit:
RRC A
MOV IO,C
LCALL delay
SETB CLK
LCALL delay
CLR CLK
DJNZ R2,outbit
INC R0
DJNZ R1,outbyte
LCALL delay
CLR IO
LCALL delay
SETB CLK
LCALL delay
SETB IO
LCALL delay
RET
;******************************
;
;NAME: readdata
;DESCRIPTION: READ DATA FROM IC
;CALL:delay
;INPUT: R0=ADDRESS OF STORE DATA
; R1=LENTH OF OUTPUT DATA
;OUTPUT:NONE
;REGISTER USAGE:A,R2
;
;******************************
readdata:
inputbyte:
MOV R2,#08H
inputbit:
CLR CLK
LCALL delay
SETB CLK
MOV C,IO
RRC A
LCALL delay
DJNZ R2,inputbit
MOV @R0,A
INC R0
DJNZ R1,inputbyte
CLR CLK
LCALL delay
SETB CLK
LCALL delay
CLR CLK
LCALL delay
RET
;******************************
;NAME: delay
;DESCRIPTION: DELAY 10uS
;CALL:NONE
;INPUT: NONE
;OUTPUT:NONE
;REGISTER USAGE:R7
;*****************************
delay:
MOV R7,#04H
DJNZ R7,$
RET
;*****************************
END
我找了一個,看看
讀 I/0 口時,,該這樣
SETB CLK
SETB IO
NOP
NOP
MOV C,IO
RRC A
DELAY5us
CLR CLK