📄 tic4.asm
字号:
;========得到W1,W2,Wn=========
GETWI: MOV A,DATALONG
GETWI1: ADD A,S2
XRL A,#34H
INC A
MOV @R0,A
INC R0
INC R1
MOV A,R1
CJNE A,R,GETWI1
RET
;=======得到随机数=============
GETRANDOM:
MOV S1,TH0
MOV S2,TL0
MOV A,S2
ANL A,#03H
INC A
MOV R,A
RET
;=====传送数据效验和===========
SEDATAADD:
CLR C
MOV A,#00H
MOV R1,DATALONG
MOV R0,#DATAF
SE1: ADD A,@R0
INC R0
DJNZ R1,SE1
MOV DATACHE,A
RET
;======定时中断处理程序(10ms)===
EINT:
PUSH PSW
PUSH ACC
JB RFLAG.0,EINT_OUT ;是否正在接收上位发下来的数据
MOV TH0,#0DBH ;10mS
MOV TL0,#0FFH
LCALL SEDOG
INC TEMP11 ;用于拔卡
INC DCOUNT ;用于传送数据
JNB FLAG1.4,EINT_0 ;是否发出拔卡消息
JNB ICINT,NO_OUTIC
MOV A,TEMP11
CJNE A,#64H,EINT_0 ;判断是否拔卡到了一秒
LCALL OUTCARD
SETB RFLAG.1
CLR FLAG1.4
AJMP EINT_OUT
NO_outIC: CLR FLAG1.4
EINT_0:
INC TEMP10
MOV A,TEMP10
CJNE A,#64H,EINT_OUT ;判断是否到了一秒
MOV TEMP10,#00H
INC STIME
MOV A,STIME
CJNE A,#60,EINT_OUT ;判断是否到了一分钟
MOV STIME,#00H
INC STIME1
MOV A,STIME1
CJNE A,#03H,EINT_OUT ;判断是否到最小计时单位
MOV STIME1,#00H
JB FLAG1.1,EINT_1
LCALL CLOSESTORE
LCALL DELAY_PC
SJMP EINT_OUT
EINT_1: CLR FLAG1.1
LCALL RESTORE
EINT_OUT:
POP ACC
POP PSW
RETI
;========测试卡是否插入===============
ICTEST: JB ICINT,NO_IC
JB FLAG1.0,ICYE
CLR RFLAG.6
ICYE: SETB FLAG1.0
LCALL OPEN_IC
SJMP END_IC
NO_IC: JNB FLAG1.0,ENDIC1
LCALL OUTCARD
SETB RFLAG.1
SETB FLAG1.4
MOV TEMP11,#00H
endic1:
CLR FLAG1.0
CLR FLAG1.3
CLR TEMP1.1
LCALL CLOSE_IC
END_IC: RET
;========关IC卡电源=======
CLOSE_IC:
SETB ICPWR
NOP
NOP
RET
;========开IC卡电源=======
OPEN_IC:
CLR ICPWR
NOP
NOP
NOP
RET
;=========READ SOME BYTES IN CARD===
READ_CARD:
lcall reset_42
MOV R0,#CBUF
MOV @R0,#30H
INC R0
MOV A,R5
inc r5
MOV @R0,A
INC R0
MOV @R0,#0FFH
LCALL COM_42
MOV A,R6
MOV R0,A
SRD_44:
LCALL BRD_42
MOV @R0,A
INC R0
DJNZ R7,SRD_44
LCALL INTERR42
RET
;=======WRITE SOME BYTE TO CARD======
WRITE_CARD:
LCALL RESET_42
MOV R0,#CBUF
MOV @R0,#38H
INC R0
mov a,r5
inc r5
MOV @R0,A
INC R0
MOV A,R6
INC R6
MOV R1,A
MOV A,@R1
MOV @R0,A
INC R0
LCALL COM_42
LCALL BWR_42
DJNZ R7,WRITE_CARD
lcall interr42
RET
;========写IC卡密码========================
WRITEICKEY:MOV R5, #0B6h ; (H)
MOV R6, #23h ; (M)
MOV R7, #07h ; (L)
LCALL WRITE_KEY
RET
;========check sect of 4442===========
CARDCHECK:
MOV R5, #0B6h ; (H)
MOV R6, #23h ; (M)
MOV R7, #07h ; (L)
LCALL SCHK_42_SC
RET
;========check sect of 4442===========
CARDCHECK1:
MOV R5, #0FFh ; (H)
MOV R6, #0FFh ; (M)
MOV R7, #0FFh ; (L)
LCALL SCHK_42_SC
RET
;=========4442卡效验密码=======
SCHK_42_SC:
LCALL RESET_42
LCALL CHK_42CN
MOV R0,#MBUF
MOV A,@R0
INC R0
CJNE A,#0FCH,SCHK_42_SC1 ;校验次数=0FD?
LJMP SCHK_42_SC6
SCHK_42_SC1:
JBC ACC.0,SCHK_42_SC2
JBC ACC.1,SCHK_42_SC2
LJMP SCHK_42_SC6
SCHK_42_SC2:
LCALL CHK_42WC
LCALL CHK_42CH
LCALL CHK_42CM
LCALL CHK_42CL
MOV A,#0FFH
LCALL CHK_42WC
LCALL CHK_42CN
MOV R0,#MBUF
MOV A,@R0
INC R0
CJNE A,#07H, SCHK_42_SC6
ANL FLAG1,#0F7H
AJMP SCHK_42_SC9
SCHK_42_SC6:
ORL FLAG1,#08H
LCALL CLOSE_IC
SCHK_42_SC9:
LCALL INTERR42
RET
;==========读4442 的密码(READ SC IN IC CARD)==========
CHK_42CN:
MOV R0,#CBUF
MOV @R0,#31H
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0FFH
LCALL COM_42
PUSH 05H
MOV R5,#04H
MOV R0,#MBUF
CHK_42CN1:
LCALL BRD_42
MOV @R0,A
INC R0
DJNZ R5,CHK_42CN1
POP 05H
RET
;=======效验各字节(高中低)密码===========
CHK_42CH:
MOV R0,#CBUF
MOV @R0,#33H
INC R0
MOV @R0,#01H
INC R0
MOV A,R5
MOV @R0,A
INC R0
LJMP CHK_42CS
CHK_42CM:
MOV R0,#CBUF
MOV @R0,#33H
INC R0
MOV @R0,#02H
INC R0
MOV A,R6
MOV @R0,A
INC R0
LJMP CHK_42CS
CHK_42CL:
MOV R0,#CBUF
MOV @R0,#33H
INC R0
MOV @R0,#03H
INC R0
MOV A,R7
MOV @R0,A
INC R0
CHK_42CS:
LCALL COM_42
LCALL BWR_42
RET
;======写可效验次数========
CHK_42WC:
MOV R0,#CBUF
MOV @R0,#39H
INC R0
MOV @R0,#00H
INC R0
MOV @R0,A
INC R0
LCALL COM_42
LCALL BWR_42
RET
;------------------------------------------------
;写SLE/4442 IC卡密码操作软件清单
;R5: security(high byte)
;R6: security(medium byte)
;R7: security(low byte)
;------------------------------------------------
WRITE_KEY:
LCALL RESET_42 ;reset smart card
MOV R0, #CBUF
MOV @R0, #39H ;First Byte 写密码命令
INC R0
MOV @R0, #01H ;second byte 地址
INC R0
MOV A, R5
MOV @R0, A ;third byte security(high byte)
INC R0
LCALL COM_42
;--------------------------------------
LCALL BWR_42 ;write process
MOV R0, #CBUF
MOV @R0, #39H ;First Byte 写密码命令
INC R0
MOV @R0, #02H ;second byte 地址
INC R0
MOV A, R6
MOV @R0, A ;third byte security(medium byte)
INC R0
LCALL COM_42
;--------------------------------------
LCALL BWR_42 ;write process
MOV R0, #CBUF
MOV @R0, #39H ;First Byte 写密码命令
INC R0
MOV @R0, #03H ;second byte 地址
INC R0
MOV A, R7
MOV @R0, A ;third byte security(low byte)
INC R0
LCALL COM_42
LCALL BWR_42 ;write process
LCALL INTERR42
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
reset_42:
clr ICSCL
nop
nop
CLR ICRST
LCALL DELAY_20
SETB ICRST
LCALL DELAY_20
SETB ICSCL
LCALL DELAY_20
CLR ICSCL
LCALL DELAY_20
CLR ICRST
PUSH 05H
MOV R5,#04H
MOV A,#CBUF
CLR C
ADDC A,#03H
MOV R0,A
RESET_421:
LCALL BRD_42
MOV @R0,A
INC R0
DJNZ R5,RESET_421
POP 05H
CLR ICSCL
LCALL DELAY_20
SETB ICSCL
JB ICSDA,RESET_422
LCALL BWR_42
RESET_422:RET
;************************************************************;
COM_42:
LCALL BEGIN42
MOV R0,#CBUF
MOV R1,#03H
CLR C
COM_421:
MOV R2,#08H
MOV A,@R0
INC R0
COM_422:
CLR ICSCL
RRC A
MOV ICSDA,C
LCALL DELAY_20
SETB ICSCL
LCALL DELAY_20
DJNZ R2,COM_422
DJNZ R1,COM_421
LCALL END_42
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -