⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pincard.a51

📁 我要做一个非接触ic卡的读卡器
💻 A51
📖 第 1 页 / 共 2 页
字号:
	SETB _8255
	LCALL D12MS
	;SETB ICC3_RST	 ;ICC3 reset on
	;SETB A0
	;SETB A1
	CLR A0
	SETB A1
	CLR _8255
	MOV R0,#COMMD
	MOV A,#0BH
	MOVX @R0,A
	SETB _8255
CRST_ANSWER:
	 MOV R0,#DATBUF
	 LCALL CGET_FIRST_BYTE    ;get TS of ATR
	 JB IC_ER_F,CRST_A4

	 LCALL CGET_BYTE
	 JB IC_ER_F,CRST_A4       ;get T0 of ATR

	 MOV R2,#03H              ;loop 3 times
CRST_A1: DEC R0
	 MOV A,@R0
	 MOV B,A
	 INC R0
	 JNB B.4,CTB1             ;TA exist?
	 LCALL CGET_BYTE          ;get TA
	 JB IC_ER_F,CRST_A4
CTB1:    JNB B.5,CTC1             ;TB exist?
	 LCALL CGET_BYTE          ;get TB
	 JB IC_ER_F,CRST_A4
CTC1:    JNB B.6,CTD1             ;TC exist?
	 LCALL CGET_BYTE          ;get TC
	 JB IC_ER_F,CRST_A4
CTD1:    JNB B.7,CRST_A2          ;TD exist?
	 LCALL CGET_BYTE          ;get TD
	 JB IC_ER_F,CRST_A4
	;DEC R0
	;MOV B,@R0
	;INC R0
	 DJNZ R2,CRST_A1

CRST_A2:
	 MOV R1,#DATBUF+01H
	 MOV A,@R1
	 ANL A,#0FH
	 INC A                   ; T=1 have  checksum byte
	 MOV R2,A

         MOV A,@R1
	 ANL A,#0F0H
	 JB  ACC.7,CRST_A3

         DEC R2



CRST_A3: LCALL CGET_BYTE         ;get historical data
	 JB IC_ER_F,CRST_A4
	 DJNZ R2,CRST_A3
	 ;CLR IC_PCB3             ;clear PCB of iccard 1
CRST_A4: MOV C,IC_ER_F
	 RET



T1_COM:	;ICC question and answer
	;------------------------------;
	; use A,B,R0,R1,R2,DT_P1,DT_P2 ;
	;------------------------------;
	;JB IC_FLAG,COM1
	;LJMP ICC0
COM1:   ;CPL IC_PCB1
	;MOV R0,#DATBUF+01H
	;MOV @R0,#40H
	;JNB IC_PCB1, G_EDC0
	;MOV @R0,#00H           ;get PCB

G_EDC0: ;MOV R0,#DATBUF
	;MOV @R0,#00H
	;MOV R0,#DATBUF+01H	; get EDC
	MOV R1,#DATBUF+02H
	MOV A, @R1
	ADD A,#03H
	MOV R2,A
	MOV A,#00H
	MOV R0,#DATBUF
G_EDC1:	XRL A,@R0
	INC R0
	DJNZ R2,G_EDC1
	MOV @R0,A		; save EDC

SNDIC0: MOV R0,#DATBUF+02H
	MOV A, @R0              ;read Data_Length
	ADD A, #04H
	MOV B, A		;data length save to B register

	MOV R0, #DATBUF
	SETB ICC1_IO
	LCALL DCWT		;time delay program
	LCALL DCWT

SNDIC2:	CLR ICC1_IO		;start bit
	LCALL DWHL		;time delay program
	MOV R2,#08H		;data bit = 8
SNDIC1:	MOV A,@R0
	RR A
	MOV @R0,A
	MOV C,ACC.7
	MOV ICC1_IO,C
	LCALL DWHL
	DJNZ R2,SNDIC1		;send word
	MOV A,@R0		;send parity bit
	MOV C,PSW.0
	MOV ICC1_IO,C
	LCALL DWHL
	SETB ICC1_IO
	LCALL DWHL
	INC R0			;next data
	LCALL DCWT		;Waiting Time Between Character
	DJNZ B,SNDIC2		;next data

	MOV R0, #DATBUF		;start register R30
REV00:	LCALL GET_FIRST_BYTE	;get one byte from IC card
	JB IC_ER_F,IC_ERR

	MOV B,#02H
REV01:	LCALL GET_BYTE
	JB IC_ER_F,IC_ERR
	DJNZ B,REV01

	MOV A,R0
	CJNE A,#DATBUF+03H,CKRSP
	MOV R1,#DATBUF+02H
	MOV B, @R1              ;data LEN save to B
	INC B
	SJMP REV01

CKRSP:  MOV A,R0
	CLR C
	SUBB A,#DATBUF
	MOV B,A

	MOV A,#00H
	MOV R0,#DATBUF
CK001:	XRL A,@R0
	INC R0
	DJNZ B,CK001

	JNZ IC_ERR

	DEC R0
	DEC R0
	MOV A,@R0
	JNZ IC_ERR		;00H
	DEC R0
	MOV A,@R0
	CJNE A,#90H,IC_ERR	;90H
	CLR IC_ER_F
	MOV C,IC_ER_F
	RET
IC_ERR:	SETB IC_ER_F
	MOV C,IC_ER_F
	RET


T2_COM:	;ICC question and answer
	;------------------------------;
	; use A,B,R0,R1,R2,DT_P1,DT_P2 ;
	;------------------------------;
	;JB IC_FLAG,COM1
	;LJMP ICC0
BCOM1:  ;CPL IC_PCB2
	;MOV R0,#DATBUF+01H
	;MOV @R0,#40H
	;JNB IC_PCB2, BG_EDC0
	;MOV @R0,#00H           ;get PCB

BG_EDC0:;MOV R0,#DATBUF
	;MOV @R0,#00H
	;MOV R0,#DATBUF+01H	; get EDC
	MOV R1,#DATBUF+02H
	MOV A, @R1
	ADD A,#03H
	MOV R2,A
	MOV A,#00H
	MOV R0,#DATBUF
BG_EDC1:XRL A,@R0
	INC R0
	DJNZ R2,BG_EDC1
	MOV @R0,A		; save EDC


BSNDIC0:MOV R0,#DATBUF+02H
	MOV A, @R0              ;read Data_Length
	ADD A, #04H
	MOV B, A		;data length save to B register

	MOV R0, #DATBUF
	SETB ICC2_IO
	LCALL DCWT		;time delay program
	LCALL DCWT

BSNDIC2:CLR ICC2_IO		;start bit
	LCALL DWHL		;time delay program
	MOV R2,#08H		;data bit = 8
BSNDIC1:MOV A,@R0
	RR A
	MOV @R0,A
	MOV C,ACC.7
	MOV ICC2_IO,C
	LCALL DWHL
	DJNZ R2,BSNDIC1		;send word
	MOV A,@R0		;send parity bit
	MOV C,PSW.0
	MOV ICC2_IO,C
	LCALL DWHL
	SETB ICC2_IO
	LCALL DWHL
	INC R0			;next data
	LCALL DCWT		;Waiting Time Between Character
	DJNZ B,BSNDIC2		;next data

	MOV R0, #DATBUF		;start register R30
BREV00:	LCALL BGET_FIRST_BYTE	;get one byte from IC card
	JB IC_ER_F,BIC_ERR

	MOV B,#02H
BREV01:	LCALL BGET_BYTE
	JB IC_ER_F,BIC_ERR
	DJNZ B,BREV01

	MOV A,R0
	CJNE A,#DATBUF+03H,BCKRSP
	MOV R1,#DATBUF+02H
	MOV B, @R1              ;data LEN save to B
	INC B
	SJMP BREV01

BCKRSP: MOV A,R0
	CLR C
	SUBB A,#DATBUF
	MOV B,A

	MOV A,#00H
	MOV R0,#DATBUF
BCK001:	XRL A,@R0
	INC R0
	DJNZ B,BCK001

	JNZ BIC_ERR

	DEC R0
	DEC R0
	MOV A,@R0
	JNZ BIC_ERR		;00H
	DEC R0
	MOV A,@R0
	CJNE A,#90H,BIC_ERR	;90H
	CLR IC_ER_F
	MOV C,IC_ER_F
	RET
BIC_ERR:SETB IC_ER_F
	MOV C,IC_ER_F
	RET



T3_COM:			;ICC question and answer
				;------------------------------;
				; use A,B,R0,R1,R2,DT_P1,DT_P2 ;
				;------------------------------;
				;JB IC_FLAG,COM1
				;LJMP ICC0
CCOM1:  		;CPL IC_PCB3
				;MOV R0,#DATBUF+01H
				;MOV @R0,#40H
				;JNB IC_PCB3, CG_EDC0
				;MOV @R0,#00H           ;get PCB

CG_EDC0:		;MOV R0,#DATBUF
				;MOV @R0,#00H
				;MOV R0,#DATBUF+01H		; get EDC

	MOV R1,#DATBUF+02H
	MOV A, @R1
	ADD A,#03H
	MOV R2,A
	MOV A,#00H
	MOV R0,#DATBUF
CG_EDC1:
	XRL A,@R0
	INC R0
	DJNZ R2,CG_EDC1
	MOV @R0,A							; save EDC


CSNDIC0:MOV R0,#DATBUF+02H
	MOV A, @R0              			;read Data_Length
	ADD A, #04H
	MOV B, A							;data length  save to B register

	MOV R0, #DATBUF
	SETB ICC3_IO
	LCALL DCWT							;time delay program
	LCALL DCWT

CSNDIC2:CLR ICC3_IO						;start bit
	LCALL DWHL							;time delay program
	MOV R2,#08H							;data bit = 8
CSNDIC1:MOV A,@R0
	RR A
	MOV @R0,A
	MOV C,ACC.7
	MOV ICC3_IO,C
	LCALL DWHL
	DJNZ R2,CSNDIC1						;send word
	MOV A,@R0							;send parity bit
	MOV C,PSW.0
	MOV ICC3_IO,C
	LCALL DWHL
	SETB ICC3_IO
	LCALL DWHL
	INC R0								;next data
	LCALL DCWT							;Waiting Time Between Character
	DJNZ B,CSNDIC2						;next data

	MOV R0, #DATBUF		;start register R30
CREV00:	LCALL CGET_FIRST_BYTE	;get one byte from IC card
	JB IC_ER_F,CIC_ERR

	MOV B,#02H
CREV01:	LCALL CGET_BYTE
	JB IC_ER_F,CIC_ERR
	DJNZ B,CREV01

	MOV A,R0
	CJNE A,#DATBUF+03H,CCKRSP
	MOV R1,#DATBUF+02H
	MOV B, @R1              ;data LEN save to B
	INC B
	SJMP CREV01

CCKRSP: MOV A,R0
	CLR C
	SUBB A,#DATBUF
	MOV B,A

	MOV A,#00H
	MOV R0,#DATBUF
CCK001:	XRL A,@R0
	INC R0
	DJNZ B,CCK001

	JNZ CIC_ERR

	DEC R0
	DEC R0
	MOV A,@R0
	JNZ CIC_ERR		;00H
	DEC R0
	MOV A,@R0
	CJNE A,#90H,CIC_ERR	;90H
	CLR IC_ER_F
	MOV C,IC_ER_F
	RET
CIC_ERR:SETB IC_ER_F
	MOV C,IC_ER_F
	RET

T1_OUT:
	;------------------------------;
	; use A,B,R0,R1,R2,DT_P1,DT_P2 ;
	;------------------------------;

CSNDIC01:
	;MOV B,#01H		;data length  save to B register
	MOV R0, #DATBUF
	SETB ICC1_IO
	LCALL DCWT		;time delay program
	LCALL DCWT

CSNDIC21:
        CLR ICC1_IO		;start bit
	LCALL DWHL		;time delay program
	MOV R2,#08H		;data bit = 8
CSNDIC11:
        MOV A,@R0
	RR A
	MOV @R0,A
	MOV C,ACC.7
	MOV ICC1_IO,C
	LCALL DWHL
	DJNZ R2,CSNDIC11	;send word
	MOV A,@R0		;send parity bit
	MOV C,PSW.0
	MOV ICC1_IO,C
	LCALL DWHL
	SETB ICC1_IO
	LCALL DWHL
	RET

T1_IN:
	MOV R0, #DATBUF			;start register R30
    LCALL GET_FIRST_BYTE	;get one byte from IC card
	JB IC_ER_F,CIC_ERR1

CIC_ERR1:
	SETB IC_ER_F
	MOV C,IC_ER_F
	RET


T2_OUT:
	;------------------------------;
	; use A,B,R0,R1,R2,DT_P1,DT_P2 ;
	;------------------------------;

CSNDIC02:
	;MOV B,#01H		;data length  save to B register
	MOV R0, #DATBUF
	SETB ICC2_IO
	LCALL DCWT		;time delay program
	LCALL DCWT

CSNDIC22:
        CLR ICC2_IO		;start bit
	LCALL DWHL		;time delay program
	MOV R2,#08H		;data bit = 8
CSNDIC12:
        MOV A,@R0
	RR A
	MOV @R0,A
	MOV C,ACC.7
	MOV ICC2_IO,C
	LCALL DWHL
	DJNZ R2,CSNDIC12	;send word
	MOV A,@R0		;send parity bit
	MOV C,PSW.0
	MOV ICC2_IO,C
	LCALL DWHL
	SETB ICC1_IO
	LCALL DWHL
	RET

T2_IN:   MOV R0, #DATBUF		;start register R30
         LCALL BGET_FIRST_BYTE	;get one byte from IC card
	 JB IC_ER_F,CIC_ERR2

CIC_ERR2:SETB IC_ER_F
	 MOV C,IC_ER_F
	 RET

T3_OUT:
	;------------------------------;
	; use A,B,R0,R1,R2,DT_P1,DT_P2 ;
	;------------------------------;

CSNDIC03:
	;MOV B,#01H		;data length  save to B register
	MOV R0, #DATBUF
	SETB ICC3_IO
	LCALL DCWT		;time delay program
	LCALL DCWT

CSNDIC23:
        CLR ICC3_IO		;start bit
	LCALL DWHL		;time delay program
	MOV R2,#08H		;data bit = 8
CSNDIC13:
        MOV A,@R0
	RR A
	MOV @R0,A
	MOV C,ACC.7
	MOV ICC3_IO,C
	LCALL DWHL
	DJNZ R2,CSNDIC13	;send word
	MOV A,@R0		;send parity bit
	MOV C,PSW.0
	MOV ICC3_IO,C
	LCALL DWHL
	SETB ICC3_IO
	LCALL DWHL
	RET

T3_IN:   MOV R0, #DATBUF		;start register R30
         LCALL CGET_FIRST_BYTE	;get one byte from IC card
	 JB IC_ER_F,CIC_ERR3

CIC_ERR3:SETB IC_ER_F
	 MOV C,IC_ER_F
	 RET

         END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -