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

📄 f200asm.asm

📁 IC卡底层操作接口,符合正向约定和反向约定.
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        SETB    SAM_IO;STOP                             ;2
	MOV     R0,BAND_DELAY_SAM                       ;2
        DJNZ    R0,$                                    ;3
	JB	SAM_IO,SENDSAM_BYTEOK			;4 11个ETU出判断接收方接收是否正确
	DJNZ	VER_TIME,SENDSAM_BYTEAGAIN		;重新发送数据最多4次
	RET
SENDSAM_BYTEAGAIN:
	MOV     R0,BAND_DELAY_SAM                       ;2 检测出错误后延迟3个ETU后重新发送数据
        DJNZ    R0,$                                    ;3
	MOV     R0,BAND_DELAY_SAM                       ;2
        DJNZ    R0,$                                    ;3
	MOV     R0,BAND_DELAY_SAM                       ;2
        DJNZ    R0,$                                    ;3
	LJMP	SENDSAM_BYTESTAR
SENDSAM_BYTEOK:
	RET
;****************************************************************************
POWER_ON_SAM:
        SETB    SAM_IO
        SETB    OFF_SAM
        MOV     A,ICCARD_BAK
        ORL     A,#(CARD_CV+SAM_CMDVCC+SAM_CS)
        MOV     B,A
        MOV     A,#SAM_RESET
        CPL     A
		ANL	A,B
        MOV     ICCARD_BAK,A
        MOV     DPTR,#ADDR_ICCARD_BAK
        MOVX    @DPTR,A
        MOV     B,A
        MOV     A,#SAM_CMDVCC
        CPL     A
        ANL     A,B
        MOV     ICCARD_BAK,A
        MOVX    @DPTR,A
        MOV     R0,#50
        DJNZ    R0,$
        JB      OFF_SAM,POWER_ON_SAM1
        MOV     A,#00H
        RET
POWER_ON_SAM1:
        MOV     A,#01H
        RET
;****************************************************************************
POWER_OFF_SAM:
        SETB    SAM_IO
        SETB    OFF_SAM
        MOV     A,ICCARD_BAK
        ORL     A,#SAM_CMDVCC
        MOV     B,A
        MOV     A,#(SAM_RESET+SAM_CS)
        CPL     A
	ANL	A,B
        MOV     ICCARD_BAK,A
        MOV     DPTR,#ADDR_ICCARD_BAK
        MOVX    @DPTR,A
        RET
;****************************************************************************
SAM_REST_IO:
        PUSH    DPH
        PUSH    DPL
        PUSH    ACC

        MOV     A,ICCARD_BAK			;8004
        MOV     B,A
        MOV     A,#SAM_RESET
        CPL     A
        ANL     A,B
        MOV     ICCARD_BAK,A
        MOV     DPTR,#ADDR_ICCARD_BAK
        MOVX    @DPTR,A

        MOV     R0,#80H
        DJNZ    R0,$

        MOV     A,ICCARD_BAK			
        ORL     A,#SAM_RESET
        MOV     ICCARD_BAK,A
        MOV     DPTR,#ADDR_ICCARD_BAK
        MOVX    @DPTR,A

;        MOV     A,ICCARD_BAK			;8002
;        ORL     A,#SAM_RESET
;        MOV     ICCARD_BAK,A
;        MOV     DPTR,#ADDR_ICCARD_BAK
;        MOVX    @DPTR,A

;        MOV     R0,#80H
;        DJNZ    R0,$

;        MOV     A,ICCARD_BAK
;        MOV     B,A
;        MOV     A,#SAM_RESET
;        CPL     A
;        ANL     A,B
;        MOV     ICCARD_BAK,A
;        MOV     DPTR,#ADDR_ICCARD_BAK
;        MOVX    @DPTR,A

        POP     ACC
        POP     DPL
        POP     DPH
        RET
;;****************************************************************************
;****************************************************************************

_RESET_SAM:               ;c=whether receive a byte returns by over time or in the right way
	CLR     EA
 	CLR	ERR_RESET_SAM
       CLR     RST_SAM
        MOV     BAND_DELAY_SAM,#74
	LCALL   POWER_ON_SAM
        JNZ     RESET_SAM0      ;whether card is in
	LCALL   POWER_OFF_SAM
        SETB    EA
        MOV     R7,#0
        RET
RESET_SAM_BAND:
	MOV	A,BAND_DELAY_SAM
        CJNE    A,#74,RESET_SAM_BAND1
        MOV     BAND_DELAY_SAM,#34
        CLR     PCB_SAM
        MOV     DPH,R5
        MOV     DPL,R6
        MOV     R4,#03H
	LJMP	RESET_SAM1
RESET_SAM_BAND1:
        CJNE    A,#34,RESET_SAM_BAND2
        MOV     BAND_DELAY_SAM,#14
        CLR     PCB_SAM
        MOV     DPH,R5
        MOV     DPL,R6
        MOV     R4,#03H
	LJMP	RESET_SAM1
RESET_SAM_BAND2:
        SETB    EA
        MOV     R7,#0
        RET
RESET_SAM0:
	MOV	R0,#240
	DJNZ	R0,$
        CLR     PCB_SAM
        MOV     DPH,R2
        MOV     DPL,R1
        MOV     R5,DPH
        MOV     R6,DPL
        MOV     R4,#03H
RESET_SAM1:
        MOV     R3,#08H         ;receiving over time
        MOV     R7,#0
        CLR     PROMISE_SAM
        LCALL   SAM_REST_IO
        LCALL   RECEIVESAM_BYTE
        JNC     RESET_SAM10		;if over time ,jump
        CJNE    A,#3BH,RESET_SAM2
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
        LJMP    RESET_SAM3
RESET_SAM10:
        LJMP    RESET_SAM9
RESET_SAM2:
        CJNE    A,#03H,RESET_SAM_BAND
        SETB    PROMISE_SAM
	LJMP	RESET_SAM_BAND2
RESET_SAM2ADD:
        CJNE    A,#03H,RESET_SAM_BAND
        SETB    PROMISE_SAM
        MOV     A,#3FH
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
RESET_SAM3:
        LCALL   RECEIVESAM_BYTE
        JNC     RESET_SAM10
        MOVX    @DPTR,A
        MOV     B,A
        INC     DPTR
        INC     R7
        ANL     A,#0FH		;retnum=history bytes
        MOV     RETNUM,A

        MOV	A,B;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        JNB     ACC.4,RESET_SAM4
        LCALL   RECEIVESAM_BYTE
        JNC     RESET_SAM10
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
RESET_SAM4:
        MOV     A,B
        JNB     ACC.5,RESET_SAM5
        LCALL   RECEIVESAM_BYTE
        JC	RESET_SAM4ADD
	LJMP	RESET_SAM9
RESET_SAM4ADD:
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
RESET_SAM5:
        MOV     A,B
        JNB     ACC.6,RESET_SAM6
        LCALL   RECEIVESAM_BYTE
        JC	RESET_SAM5ADD
	LJMP	RESET_SAM9
RESET_SAM5ADD:
        MOVX    @DPTR,A
	CJNE	A,#0FFH,JUDGE_SAMTC1	;if TC1==0xff TC1=0 change by ycl
	CLR	A
JUDGE_SAMTC1:
        MOV     PROTECT_TIME_SAM,A
        INC     DPTR
        INC     R7
RESET_SAM6:
        MOV     A,B
        JNB     ACC.7,RESET_SAM7
        LCALL   RECEIVESAM_BYTE
        JC	RESET_SAM6ADD
	LJMP	RESET_SAM9
RESET_SAM6ADD:
        MOVX    @DPTR,A
        MOV     B,A
        INC     DPTR
        INC     R7
        ANL     A,#0FH
	JZ	RESET_SAM6ADD1
        SETB    PROTOCOL_SAM
	LJMP	RESET_SAM6ADD2
RESET_SAM6ADD1:
        CLR    PROTOCOL_SAM
RESET_SAM6ADD2:
        MOV     A,B;;;;;;;;;;;;;;;;;;;;;
        JNB     ACC.4,RESET_SAM61
        LCALL   RECEIVESAM_BYTE
        JNC     RESET_SAM9
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
RESET_SAM61:
        JNB     ACC.5,RESET_SAM62
        LCALL   RECEIVESAM_BYTE
        JNC     RESET_SAM9
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
RESET_SAM62:
        JNB     ACC.6,RESET_SAM63
        LCALL   RECEIVESAM_BYTE
        JNC     RESET_SAM9
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
RESET_SAM63:
        JNB     ACC.7,RESET_SAM8;;;;;;;;;;;;;;;;;;
        LCALL   RECEIVESAM_BYTE
        JNC     RESET_SAM9
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
        ANL     A,#0FH
	JZ	RESET_SAM7
	SETB	PROTOCOL_SAM
        LJMP    RESET_SAM8
RESET_SAM7:
        CLR     PROTOCOL_SAM
RESET_SAM8:
	MOV	A,RETNUM
	CJNE	A,#00H,RESET_SAM8ADD	;判断是否有历史字节
	LJMP	RESET_SAM8ADD1		;无历史字节
RESET_SAM8ADD:
        LCALL   RECEIVESAM_BYTE
        JNC     RESET_SAM9
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
        DJNZ    RETNUM, RESET_SAM8
RESET_SAM8ADD1:
        JNB     PROTOCOL_SAM, RESET_SAM80
        LCALL   RECEIVESAM_BYTE           ;LRC jiao yan he
        JC	RESET_SAM8ADD2
	CLR	OK_RESET_SAM	;T=1的时候未传送TCK则表示复位失败	
        MOV     R0,#0FFH
	LJMP	RESET_SAM_DELAY
RESET_SAM8ADD2:	;成功接收了TCK		
        MOVX    @DPTR,A
        INC     DPTR
        INC     R7
	LJMP	RESET_SAMOK
RESET_SAM80:
        LCALL   RECEIVESAM_BYTE	;判断是否在T=0的时候传送TCK
	JNC	RESET_SAMOK
	CLR	OK_RESET_SAM	;T=0的时候传送了TCK则表示复位失败	
        MOV     R0,#0FFH
	LJMP	RESET_SAM_DELAY
RESET_SAMOK:
	SETB	RST_SAM
	SETB	OK_RESET_SAM	;T=0的时候不传送TCK则表示复位成功
        MOV     R0,#0FFH
RESET_SAM_DELAY:
        MOV     R1,#00H
        DJNZ    R1,$
        DJNZ    R0,RESET_SAM_DELAY

        SETB    EA
        RET		                   ;the right way return
RESET_SAM9:
        DJNZ    R4,RESET_SAM90
        SETB    EA
        RET		                   ;over time return
RESET_SAM90:
	MOV	BAND_DELAY_SAM,#74
        CLR     PCB_SAM
        MOV     DPH,R5
        MOV     DPL,R6
        LJMP    RESET_SAM1      	   ;there are three times to reset
;****************************************************************************
;uchar commandt0_SAM(uint buffer,uchar len,uchar *retbuff)
;                       R6,R7        R5         R3,R2,R1
;****************************************************************************
_COMMAND_T0_SAM:
        MOV     DPH,R2
        MOV     DPL,R1
        ;PUSH    DPH
        ;PUSH    DPL
        MOV     DPHBAK,DPH
        MOV     DPLBAK,DPL
        MOV     DPHBUBAK,DPH
        MOV     DPLBUBAK,DPL
COMMAND_T0_SAM:
	MOV	OFFSET,#00H		;P3中DATA偏移量
	CLR	INS_BUBIT
        MOV     DPH,R6
        MOV     DPL,R7
        INC     DPTR
        MOVX    A,@DPTR
        MOV     INS,A			;取出INS
	CPL	A
	;INC	A
        MOV     INSBU,A			;取出INS反码

        MOV     A,R5
        CLR     C
        SUBB    A,#06H
        JC      COMMAND_T0_SAM1     ;over means LC=0
        INC     DPTR
        INC     DPTR
        INC     DPTR
        MOVX    A,@DPTR
        MOV     LC,A		;取出LC
        ADD     A,#05H		;ler=(len=R5-05-LC)
        MOV     B,A
        CLR     C
        SUBB    A,R5
        JC      COMMAND_T0_SAM0		;c=1,ler=the fifth
        MOV     LER,#00H
        LJMP    COMMAND_T0_SAM2
COMMAND_T0_SAM0:		;计算LE
        MOV     A,B
        ADD     A,R7
        MOV     DPL,A
        MOV     A,#00H
        ADDC    A,R6
        MOV     DPH,A
        MOVX    A,@DPTR
        MOV     LER,A              ;calculate the position of len and take up
        LJMP    COMMAND_T0_SAM2
COMMAND_T0_SAM1:
        INC     DPTR
        INC     DPTR
        INC     DPTR
        MOVX    A,@DPTR
        MOV     LER,A
        MOV     LC,#00H

COMMAND_T0_SAM2:
        MOV     DPH,R6
        MOV     DPL,R7
        MOV     R3,#4		;CLA INS P1 P2 P3
        MOV     RETNUM,#00H
COMMAND_T0_SAM3:
        MOVX    A,@DPTR
        LCALL   SENDSAM_BYTE
        LCALL   DELAY_SAM
        INC     DPTR
        DJNZ    R3,COMMAND_T0_SAM3
        MOVX    A,@DPTR
        LCALL   SENDSAM_BYTE	;传送5个字节命令头

        MOV     A,INS
        CJNE    A,#46H,COMMAND_T0_SAM30		;????
        MOV     R3,#0FFH
        SJMP    COMMAND_T0_SAM4
COMMAND_T0_SAM30:
        MOV     R3,#040H;调试的时候用10正常用80
COMMAND_T0_SAM4:
        LCALL   RECEIVESAM_BYTE
        JC     COMMAND_T0_SAM4ADD	
	LJMP	COMMAND_T0_SAM14	;接收过程字节失败则跳转到COMMAND_T0_SAM14
COMMAND_T0_SAM4ADD:
        CJNE    A,#60H,COMMAND_T0_SAM5
        LJMP    COMMAND_T0_SAM4		;过程字节=0X60 提供额外的工作等待时间且等待接收另外的过程字节
COMMAND_T0_SAM5:
        CJNE    A,INS,COMMAND_T0_SAM10
        MOV     A,LC			;过程字节=INS 
        JZ      COMMAND_T0_SAM8         ;lc=0 or not dicide whether receive or send
COMMAND_T0_S

⌨️ 快捷键说明

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