📄 f200asm.asm
字号:
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 + -