📄 4442.asm
字号:
LCALL PAUSE
WRITE_CARD_1:
MOV R0,#COM_BUFF ;
MOV @R0,#38H ;写主存储区
INC R0
MOV A,R1
MOV @R0,A
INC R0
MOVX A,@DPTR
MOV @R0,A
LCALL CARD_COM_MODE
LCALL CARD_PRO_MODE
CJNE A,#0FFH,WRITE_CARD_CON
RET
WRITE_CARD_CON:
INC R1
INC DPTR
DJNZ COUNT0,WRITE_CARD_1
RET
;/////////////////////////////////////////
;修改4442卡的PSC(3 BYTE); //
;UPDATE PSC //
;INPUT:IC_PWD //
;OUTPUT: A=00H:OK A=0FFH:ERROR //
;/////////////////////////////////////////
UPDATE_PSC:
MOV R1,#IC_PWD
MOV R2,#03H
MOV R3,#01H
UPDATE_PSC_LOOP:
SETB IC_IO
SETB IC_CLK
LCALL PAUSE
LCALL PAUSE
LCALL PAUSE
CLR IC_IO
MOV R0,#COM_BUFF
MOV A,#39H;.........CONTROL=39H
MOV @R0,A
INC R0
MOV A,R3
INC R3
MOV @R0,A;..........ADDRESS=01H
INC R0
MOV A,@R1
INC R1
MOV @R0,A;..........BYTE(FORM IC_PWD)
LCALL CARD_COM_MODE
LCALL CARD_PRO_MODE
CJNE A,#00H,UPDATE_PSC_ERR
DJNZ R2,UPDATE_PSC_LOOP
SJMP UPDATE_PSC_QUIT
UPDATE_PSC_ERR:
MOV A,#0FFH
UPDATE_PSC_QUIT:
RET
;/////////////////////////////////////////////////////////////////
;核对4442卡之PSC //
;CHECK IC CARD PASSWORD //
;INPUT: IC_PWD[3] //
;OUTPUT: A 0:PASSWORD OK; FF:LINE RESPONSE WRONG //
; FE:CARD LOCK; FD:CARD ILLEGAL; FC:PASSWORD WRONG //
;/////////////////////////////////////////////////////////////////
CHK_IC_PWD:
SETB IC_IO
LCALL PAUSE
LCALL PAUSE
LCALL PAUSE
MOV R1,#IC_PWD
MOV R0,#COM_BUFF ;READ SECURITY 4 BYTES
MOV @R0,#31H ;CONTROL
INC R0
MOV @R0,#0FFH ;ADDRESS(NO EFFACT)
INC R0
MOV @R0,#0FFH ;BYTE(NO EFFACT)
MOV BYTE_COUNT,#4 ;
LCALL CARD_COM_MODE
LCALL CARD_OUT_MODE ;INPUT:BYTE_COUNT
CJNE A,#0FFH,CHECK_EC
LJMP CHECK_QUIT ;IF DEAD LINE,RETURN FF
CHECK_EC:
MOV DPTR,#IC_VALUE ;CHECK EC
MOVX A,@DPTR
ANL A,#00000111B
CJNE A,#0,CHECK_EC1
CARD_LOCK:
MOV A,#0FEH ;IF EC=0,CARD LOCK,RETURN FE
LJMP CHECK_QUIT
CARD_ILL:
MOV A,#0FDH
LJMP CHECK_QUIT
CHECK_EC1:
CJNE A,#07H,CHECK_EC2 ;CHECK EC= 07,03,01
MOV A,#03H
LJMP UPDATE_EC
CHECK_EC2:
CJNE A,#03H,CHECK_EC3
MOV A,#01H
LJMP UPDATE_EC
CHECK_EC3:
CJNE A,#01H,CARD_ILL ;CARD ILLEGAL,RETURN FD
MOV A,#00H
UPDATE_EC:
MOV R0,#COM_BUFF ;change one bit of EC from '1' to '0'
MOV @R0,#39H
INC R0
MOV @R0,#00H
INC R0
MOV @R0,A
LCALL CARD_COM_MODE
LCALL CARD_PRO_MODE
CJNE A,#0FFH,COMP_PWD1
LJMP CHECK_QUIT ;if dead line,return ff
COMP_PWD1:
MOV R0,#COM_BUFF ;compare first byte password
MOV @R0,#33H
INC R0
MOV @R0,#01H
INC R0
MOV A,@R1
MOV @R0,A
INC R1
LCALL CARD_COM_MODE
LCALL CARD_PRO_MODE
CJNE A,#0FFH,COMP_PWD2
LJMP CHECK_QUIT ;if dead line,return ff
COMP_PWD2:
MOV R0,#COM_BUFF ;compare second byte password
MOV @R0,#33H
INC R0
MOV @R0,#02H
INC R0
MOV A,@R1
MOV @R0,A
INC R1
LCALL CARD_COM_MODE
LCALL CARD_PRO_MODE
CJNE A,#0FFH,COMP_PWD3
LJMP CHECK_QUIT ;if dead line,return ff
COMP_PWD3:
MOV R0,#COM_BUFF ;compare third byte password
MOV @R0,#33H
INC R0
MOV @R0,#03H
INC R0
MOV A,@R1
MOV @R0,A
LCALL CARD_COM_MODE
LCALL CARD_PRO_MODE
CJNE A,#0FFH,ERASE_EC
LJMP CHECK_QUIT ;if dead line,return ff
ERASE_EC:
MOV R0,#COM_BUFF ;erase ec
MOV @R0,#39H
INC R0
MOV @R0,#00H
INC R0
MOV @R0,#0FFH
LCALL CARD_COM_MODE
LCALL CARD_PRO_MODE
CJNE A,#0FFH,ERASE_EC_END
LJMP CHECK_QUIT ;if dead line,return ff
ERASE_EC_END:
MOV R0,#COM_BUFF ;read security 4 bytes
MOV @R0,#31H
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0FFH
MOV BYTE_COUNT,#4
LCALL CARD_COM_MODE
LCALL CARD_OUT_MODE
CJNE A,#0FFH,CHK_RESULT
LJMP CHECK_QUIT ;if dead line,return ff
CHK_RESULT:
MOV DPTR,#IC_VALUE
MOVX A,@DPTR
ANL A,#00000111B
CJNE A,#07H,CHK_PWD_FAIL ;check if ec change to 07
CHK_PWD_OK:
MOV A,#0 ;if yes,check password ok
LJMP CHECK_QUIT
CHK_PWD_FAIL:
MOV A,#0FCH ;if no,check password fail
CHECK_QUIT:
RET
;**********************************************
;FUNCTION BEEP_N BEEP N TIMES
;INPUT: A
;OUTPUT: NONE
;**********************************************
BEEP_N:
MOV B,R7
PUSH B
MOV R7,A
MOV A,#0FFH
BEEP_N_LOOP:
CLR PIN_BEEPER
MOV A,#0FFH
LCALL DL_MS
SETB PIN_BEEPER
MOV A,#0FFH
LCALL DL_MS
DJNZ R7,BEEP_N_LOOP
POP ACC
MOV R7,A
RET
;***********************************************
;FUNCTION DL_MS
;INPUT A
;OUTPUT NONE
;***********************************************
DL_MS:
MOV B,R7
PUSH B
MOV B,R6
PUSH B
MOV R7,A ;DELAY A MS
DL_MS_LP_DL1:
MOV R6,#250
DL_MS_LP_DL2: NOP
NOP
DJNZ R6,DL_MS_LP_DL2
DJNZ R7,DL_MS_LP_DL1
POP ACC
MOV R6,A
POP ACC
MOV R7,A
RET
;----------------------------------
;DELAY 5US
;----------------------------------
PAUSE: NOP
NOP
NOP
NOP
NOP
RET
;-----------------------------------------------------------
DISPLAY: MOV R1,#06H ;数码管显示的位数4
MOV R2,#00H ;字型码首地址偏移量
display3: MOV DPTR,#TAB_1 ;表头地址
MOV A,R2
MOVC A,@A+DPTR ;取段码
ACALL display1 ;调显示子程序
INC R2 ;指向下一字型
DJNZ R1,display3
ret
display1: MOV R3,#8 ;移位次数
CLR C
display2: RRC A ;左移
CLR P1.1 ;发送一个移位脉冲
NOP
MOV P1.0,C ;送出一位段码
NOP
SETB P1.1
DJNZ R3,display2
RET
;-----------------------------------------------------------
;初始化显示程序
disp11: MOV SCON,#00H
start11:
MOV R0,#00H
MOV R1,#06h;#06H
LOOP11: MOV A,#0
MOV SBUF,A
WAIT1: JNB Ti,WAIT1
CLR Ti
INC R0
DJNZ R1,loop11
ret
;-----------------------------------------------------------
;显示子程序
disp1: MOV SCON,#00H
start1:
MOV R0,#00H
MOV R1,#06h;#06H
LOOP: ;setb p3.1
MOV DPTR,#TAB
MOV A,R0
MOVC A,@A+DPTR
MOV SBUF,A
WAIT: JNB Ti,WAIT
CLR Ti
;ACALL DELAY
;clr ti
INC R0
DJNZ R1,loop
ret
;tab: DB 02h,0cEH,6eH,60H,1cH,02h
TBL_PSC:DB 12H,34H,56H
TBL_WT: DB 00H,11H,22H,33H,44H,55H,66H,77H
TAB_1: DB 02h,0ceH,6eH,60H,1ch,02h ;;(显示字型为:PHIL)
TAB: DB 0FCH,60H,0DAH,0F2H,66h,0B6h ;;(显示字型为:012345)
DL1MS: MOV R7,#7FH
DL1MS_LOOP1:MOV R6,#7FH
DL1MS_LOOP: NOP
NOP
DJNZ R6,DL1MS_LOOP
DJNZ R7,DL1MS_LOOP1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -