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

📄 pincard.a51

📁 我要做一个非接触ic卡的读卡器
💻 A51
📖 第 1 页 / 共 2 页
字号:
ICC1_IO   BIT   P1.0;
ICC1_CLK  BIT   P1.1;
ICC1_RST  BIT   P1.2;
MEMCLK    BIT   P1.3;
SPEAKER   BIT   P1.4;
ICC1_PWR  BIT   P1.5;
ICC2_IO   BIT   P1.6;
ICC3_IO   BIT   P1.7;
LCDA0     BIT   P2.0;
R_W       BIT   P2.1;
E2        BIT   P2.2;
E1        BIT   P2.3;
_8255     BIT   P2.4;
A0        BIT   P2.5;
A1        BIT   P2.6;
LCDB      BIT   P2.7;
ICC_INS   BIT   P3.2;
PORTA     EQU   00H
PORTB     EQU   01H
PORTC     EQU   02H
COMMD     EQU   03H
T_HLF     EQU 14H
T_WHL     EQU 26H ;T_HLF+T_HLF

EXTRN   IDATA(DATBUF)
;EXTRN   BIT(IC_PCB1)
PUBLIC  APRST1,T1_COM,APRST2,T2_COM,APRST3,T3_COM,T1_OUT,T1_IN,T2_OUT,T2_IN,T3_IN,T3_OUT,UNLOAD1,UNLOAD2,UNLOAD3

DT_P    SEGMENT DATA
YANS    SEGMENT CODE
IC_CARD SEGMENT CODE

ER_FLAG SEGMENT BIT

RSEG   DT_P
DT_P1: DS 1
DT_P2: DS 1
DT_P3: DS 1
;TM_DT: DS 1
;DT_BF: DS 32

RSEG   ER_FLAG
IC_ER_F: DBIT 1
;IC_PCB1: DBIT 1
;IC_PCB2: DBIT 1
;IC_PCB3: DBIT 1

RSEG    YANS
D500MS: MOV DT_P3,#32H
D500M0: LCALL D10MS
	DJNZ DT_P3,D500M0
	RET

D3MS:   MOV DT_P2,#03H
	SJMP D_1MS

D1MS:   MOV DT_P2,#01H
	SJMP D_1MS

D10MS:  MOV DT_P2, #0AH
D_1MS:  MOV DT_P1, #0C8H
DW7:    NOP
	NOP
	NOP
	DJNZ DT_P1, DW7
	DJNZ DT_P2,D_1MS
	RET

D500US: MOV DT_P1,#0E0H
D500U0: DJNZ DT_P1,D500U0
	RET


D12MS:  MOV DT_P2,#17H
D12MS0: LCALL D500US
	DJNZ DT_P2,D12MS0
	RET

D100MS: MOV DT_P2,#064H
	SJMP D_1MS

D50MS:  MOV DT_P2,#020H
	SJMP D_1MS

D60US:  MOV DT_P1,#1EH
D60U0:  DJNZ DT_P1,D60U0
	RET

D30US:  MOV DT_P1,#0FH
	SJMP D60U0

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;         0.052ms delay sub-routine         ;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


DHLF:   MOV DT_P2,#T_HLF
W0:     DJNZ DT_P2, W0
	RET

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;         0.104ms delay for one bit         ;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DWHL:   MOV DT_P2,#T_WHL        ;55H    ;T_HLF+T_HLF
	SJMP W0

DWHL2:  MOV DT_P2,#T_WHL+02H
	SJMP W0

DWHL3:  MOV DT_P2,#03H
	SJMP W0

DWHL4:  MOV DT_P2,#27H
	SJMP W0
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;          CWT delay sub-routine          ;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DCWT:   MOV     DT_P1, #10H
W2:     MOV     DT_P2, #10H
W3:     DJNZ    DT_P2, W3
	DJNZ    DT_P1, W2
	RET


RSEG  IC_CARD

UNLOAD1:
	 clr  ICC1_RST;        /*clear RST1*/
	 clr  ICC1_CLK;        /*clear CLK1*/
	 clr  ICC1_IO ;        /*clear IO1*/
	 setb ICC1_PWR;        /*ICC1  power off*/
	 RET
UNLOAD2:
	; SETB A0
	 CLR A0
	 SETB A1
	 CLR _8255
	 MOV R0,#COMMD
	 MOV A,#02H   ;    /*clear RST2*/
	 MOVX @R0,A
	 SETB _8255   ;

	 ;SETB A0
	 CLR A0
	 SETB A1
	 CLR _8255
	 MOV R0,#COMMD
	 MOV A,#04H
	 MOVX @R0,A   ;   /*clear  CLK2*/
	 SETB _8255

	 CLR ICC2_IO  ;      /*clear  IO2*/

	 ;SETB A0
	 CLR A0
	 SETB A1
	 CLR _8255
	 MOV R0,#COMMD
	 MOV A,#00H   ;   /*ICC2 power off*/
	 MOVX @R0,A
	 SETB _8255
	 RET

UNLOAD3:
	 ;SETB A0
	 CLR A0
	 SETB A1
	 CLR _8255
	 MOV R0,#COMMD
	 MOV A,#0AH   ;   /*clear RST3*/
	 MOVX @R0,A
	 SETB _8255

	 ;SETB A0
	 CLR A0
	 SETB A1
	 CLR _8255
	 MOV R0,#COMMD
	 MOV A,#0CH
	 MOVX @R0,A   ;   /*clear  CLK3*/
	 SETB _8255

	 CLR ICC3_IO  ;   /*clear  IO3*/

	 ;SETB A0
	 CLR A0
	 SETB A1
	 CLR _8255
	 MOV R0,#COMMD
	 MOV A,#08H   ;   /*ICC3 power off*/
	 MOVX @R0,A
	 SETB _8255
	 RET


    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;      Get One Byte From IC Card     ;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GET_FIRST_BYTE:
	MOV DT_P1,#0FFH
	MOV R6,#02H
	SJMP GTB00
GET_BYTE:
	MOV DT_P1,#0FFH
GTB00:
	MOV R3,#08H             ;8 bits
	SETB ICC1_IO
GTB08:
	MOV DT_P1,#0FFH
GTB02:
	MOV DT_P2, #0FFH
GTB03:
	JNB ICC1_IO,GTB05       ;detect start bit
GTB04:
	DJNZ DT_P2, GTB03
	DJNZ DT_P1, GTB02
    DJNZ R6,   GTB08
GTBER:
	SETB IC_ER_F            ;get byte error
	RET

GTB05:
	LCALL DHLF
GTB06:
	LCALL DWHL
	MOV C,ICC1_IO
GTB07:
	MOV A,@R0
	RRC A
	MOV @R0,A
	DJNZ R3,GTB06

	LCALL DWHL
	LCALL DWHL
	JNB ICC1_IO,GTBER               ;detect stop bit
	MOV ACC,A
GTB0A:
	LCALL DWHL
	INC R0
	CLR IC_ER_F
	RET

BGET_FIRST_BYTE:
	 MOV DT_P1,#0FFH
	 MOV R6,#02H
	 SJMP BGTB00
BGET_BYTE:
	 MOV DT_P1,#0FFH
BGTB00:
	 MOV R3,#08H             ; 8 bits
	 SETB ICC2_IO
BGTB08:  MOV DT_P1,#0FFH

BGTB02:  MOV DT_P2, #0FFH
BGTB03:  JNB ICC2_IO,BGTB05       ;detect start bit
BGTB04:  DJNZ DT_P2, BGTB03
	 DJNZ DT_P1, BGTB02
         DJNZ R6,  BGTB08


BGTBER:  SETB IC_ER_F    ;get byte error

	RET

BGTB05:  LCALL DHLF
BGTB06:  LCALL DWHL
	 MOV C,ICC2_IO
BGTB07:  MOV A,@R0
	 RRC A
	 MOV @R0,A
	 DJNZ R3,BGTB06

	 LCALL DWHL
	 LCALL DWHL
	 JNB ICC2_IO,BGTBER               ;detect stop bit
BGTB0A:  LCALL DWHL
	 INC R0
	 CLR IC_ER_F
	 RET


CGET_FIRST_BYTE:
	 MOV DT_P1,#0ffH
	 MOV R6,#02H
	 SJMP CGTB00
CGET_BYTE:
	 MOV DT_P1,#0ffH
CGTB00:
	 MOV R3,#08H             ; 8 bits
	 SETB ICC3_IO

CGTB08:	 MOV DT_P1,#0FFH

CGTB02:  MOV DT_P2, #0FFH
CGTB03:  JNB ICC3_IO,CGTB05       ;detect start bit
CGTB04:  DJNZ DT_P2, CGTB03
	 DJNZ DT_P1, CGTB02
         DJNZ R6,   CGTB08

CGTBER:  SETB IC_ER_F              ;get byte error
	 RET


CGTB05:  LCALL DHLF
CGTB06:  LCALL DWHL
	 MOV C,ICC3_IO
CGTB07:  MOV A,@R0
	 RRC A
	 MOV @R0,A
	 DJNZ R3,CGTB06

	LCALL DWHL
	LCALL DWHL
	JNB ICC3_IO,CGTBER               ;detect stop bit
CGTB0A: LCALL DWHL
	INC R0
	CLR IC_ER_F
	RET

APRST1:
	;LCALL D12MS
	ACALL UNLOAD1
A_RST1:
	CLR  ICC1_PWR	;ICC1 power on
	LCALL D30US
	SETB ICC1_IO    ;ICC1 recept state
	SETB ICC1_CLK   ;ICC1 clock on
	LCALL D12MS
	SETB ICC1_RST	;ICC1 reset on

RST_ANSWER:
	MOV R0,#DATBUF
	LCALL GET_FIRST_BYTE    ;get TS of ATR
	JB IC_ER_F,RST_A4

	LCALL GET_BYTE
	JB IC_ER_F,RST_A4       ;get T0 of ATR

	MOV R2,#03H             ;loop 3 times
RST_A1: DEC R0
	MOV A,@R0
	MOV B,A
	INC R0
	JNB B.4,TB1             ;TA exist?
	LCALL GET_BYTE          ;get TA
	JB IC_ER_F,RST_A4
TB1:    JNB B.5,TC1             ;TB exist?
	LCALL GET_BYTE          ;get TB
	JB IC_ER_F,RST_A4
TC1:    JNB B.6,TD1             ;TC exist?
	LCALL GET_BYTE          ;get TC
	JB IC_ER_F,RST_A4
TD1:    JNB B.7,RST_A2          ;TD exist?
	LCALL GET_BYTE          ;get TD
	JB IC_ER_F,RST_A4
	;DEC R0
	;MOV B,@R0
	;INC R0
	DJNZ R2,RST_A1

RST_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,RST_A3

	DEC R2
RST_A3: LCALL GET_BYTE          ;get historical data
	JB IC_ER_F,RST_A4
	DJNZ R2,RST_A3
	;CLR IC_PCB1            ;clear PCB of iccard 1
RST_A4: MOV C,IC_ER_F
	RET



APRST2:
	 ;LCALL D12MS
	 ACALL UNLOAD2
BA_RST1:
	 ;SETB ICC2_PWR	  ;ICC2 power on
	 ;SETB A0
	 ;SETB A1
	 CLR A0
	 SETB A1
	 CLR _8255
	 MOV R0,#COMMD
	 MOV A,#01H
	 MOVX @R0,A
	 SETB _8255
	 LCALL D30US
	 SETB ICC2_IO     ;ICC2 recept state
	 ;SETB ICC2_CLK   ;ICC2 clock on
	 ;SETB A0
	 ;SETB A1
	 CLR A0
	 SETB A1
	 CLR _8255
	 MOV R0,#COMMD
	 MOV A,#05H
	 MOVX @R0,A
	 SETB _8255
	 LCALL D12MS
	 ;SETB ICC1_RST	  ;ICC2 reset on
	 ;SETB A0
	 ;SETB A1
	 CLR A0
	 SETB A1
	 CLR _8255
	 MOV R0,#COMMD
	 MOV A,#03H
	 MOVX @R0,A
	 SETB _8255
BRST_ANSWER:
	 MOV R0,#DATBUF
	 LCALL BGET_FIRST_BYTE    ;get TS of ATR
	 JB IC_ER_F,BRST_A4

	 LCALL BGET_BYTE
	 JB IC_ER_F,BRST_A4       ;get T0 of ATR

	 MOV R2,#03H             ;loop 3 times
BRST_A1: DEC R0
	 MOV A,@R0
	 MOV B,A
	 INC R0
	 JNB B.4,BTB1             ;TA exist?
	 LCALL BGET_BYTE          ;get TA
	 JB IC_ER_F,BRST_A4
BTB1:    JNB B.5,BTC1             ;TB exist?
	 LCALL BGET_BYTE          ;get TB
	 JB IC_ER_F,BRST_A4
BTC1:    JNB B.6,BTD1             ;TC exist?
	 LCALL BGET_BYTE          ;get TC
	 JB IC_ER_F,BRST_A4
BTD1:    JNB B.7,BRST_A2          ;TD exist?
	 LCALL BGET_BYTE          ;get TD
	 JB IC_ER_F,BRST_A4
	 ;DEC R0
	 ;MOV B,@R0
	 ;INC R0
	 DJNZ R2,BRST_A1

BRST_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,BRST_A3


	 DEC R2


BRST_A3: LCALL BGET_BYTE          ;get historical data
	 JB IC_ER_F,BRST_A4
	 DJNZ R2,BRST_A3
	 ;CLR IC_PCB2             ;clear PCB of iccard 1
BRST_A4: MOV C,IC_ER_F
	 RET
APRST3:
	;LCALL D12MS
	ACALL UNLOAD3
CA_RST1:
	;SETB ICC3_PWR	 ;ICC3 power on
	;SETB A0
	;SETB A1
	CLR A0
	SETB A1
	CLR _8255
	MOV R0,#COMMD
	MOV A,#09H
	MOVX @R0,A
	SETB _8255
	LCALL D30US
	SETB ICC3_IO     ;ICC3 recept state
	;SETB ICC3_CLK   ;ICC3 clock on
	;SETB A0
	;SETB A1
	CLR A0
	SETB A1
	CLR _8255
	MOV R0,#COMMD
	MOV A,#0DH
	MOVX @R0,A

⌨️ 快捷键说明

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