📄 ticcard.asm
字号:
GOTO MPCA1_2
MOVF MfCollPos,W
MOVWF RF1
CLRF COUNT0
MOVLW 06H
ADDWF RF1,F
MOVLW 09H ;除以9
SUBWF RF1,F
BTFSC STATUS,C
GOTO $+3
INCF COUNT0
GOTO $-5
MOVLW 07H
MOVWF RF1
MOVF COUNT0,W
SUBWF RF1,W
ADDWF MfCollPos,F
MPCA1_2:
MOVLW MI_OK
XORWF RF_S1,W ;POP3
BTFSC STATUS,Z
GOTO MPCA12_0
MPCA12_00:
MOVLW MI_COLLERR
XORWF RF_S1,W
BTFSS STATUS,Z
GOTO MPCA_ex
MPCA12_0:
MOVF RF_S1,W
MOVWF RF4
MOVF RF6,W
SUBLW 40H
XORWF MfBitsReceived,W
BTFSS STATUS,Z
GOTO MPCA12_2
MOVF RF_S0,W
MOVWF COUNT0
MOVLW RCV_QUEUE
MOVWF FSR1
MOVF RF3,W
ADDWF COUNT0,F
MOVF RF2,F
BTFSC STATUS,Z
GOTO MPCA12_1
DECF COUNT0
MOVF COUNT0,W
MOVWF FSR2
MOVF FSR1,W
MOVWF FSR
MOVF INDF,W
MOVWF COUNT1
MOVF FSR2,W
MOVWF FSR
MOVF INDF,W
IORWF COUNT1,W
MOVWF INDF
INCF FSR1
INCF FSR2
MPCA12_1:
MOVLW 04H
SUBWF RF3,W
MOVWF COUNT1
MPCA121_0:
MOVF FSR1,W
MOVWF FSR
MOVF INDF,W
MOVWF COUNT0
MOVF FSR2,W
MOVWF FSR
MOVF COUNT0,W
MOVWF INDF
INCF FSR1
INCF FSR2
DECFSZ COUNT1,F
GOTO MPCA121_0
MOVF RF_S0,W ;POP6
MOVWF RF0
MOVLW MI_COLLERR
XORWF RF4,W
BTFSS STATUS,Z
GOTO MPCA121_1
MOVF RF6,W
ADDWF MfCollPos,W
MOVWF COUNT0
MOVF RF2,W
SUBWF COUNT0,W
MOVWF RF6
GOTO MPCA1_3
MPCA121_1:
MOVF RF0,W
MOVWF FSR
MOVF INDF,W
INCF FSR
XORWF INDF,W
INCF FSR
XORWF INDF,W
INCF FSR
XORWF INDF,W
MOVWF COUNT0
DECF MfBytesReceived,W
ADDLW RCV_QUEUE
MOVF FSR
MOVF INDF,W
XORWF COUNT0,W
BTFSS STATUS,Z
GOTO MPCA1211_1
MOVLW MI_SERNRERR
MOVWF STATUS_REG
GOTO MPCA_err
MPCA1211_1:
MOVLW MI_OK
MOVWF STATUS_REG
GOTO MPCA_ex
MPCA12_2:
MOVLW MI_BITCOUNTERR
MOVWF STATUS_REG
GOTO MPCA_err
MPCA1_3:
GOTO MPCA_0
MPCA_err:
MOVLW 04H
MOVWF RF7
MOVF RF0,W
MOVWF FSR
MPCAE_1:
CLRF INDF
INCF FSR
DECFSZ RF7,F
GOTO MPCAE_1
MPCA_ex:
MOVLW RegDecoderControl
MOVWF ADDRESS1
MOVLW 20H
MOVWF SETBUF
call ClearBit
RETURN
;======================================================
;发送数据
;====================================================================
PcdSingleResponseCmd_1
MOVWF MfCmd ;待发送的命令
; MOVLW 03H
; MOVWF VALUE
; MOVLW RegIRqPinConfig
; MOVWF ADDRESS1
; CALL WriteRC
MOVLW 7FH
MOVWF VALUE
MOVLW RegInterruptEn ;允许所有中断
MOVWF ADDRESS1
CALL WriteRC
MOVLW 7FH
MOVWF VALUE
MOVLW RegInterruptRq
MOVWF ADDRESS1
CALL WriteRC
MOVLW PCD_IDLE
MOVWF VALUE
MOVLW RegCommand
MOVWF ADDRESS1
CALL WriteRC
call FlushFIFO ;清除FIFO 缓冲区的读 写指针和FOOVFI 标志
; MOVLW 01H
; MOVWF VALUE
; MOVLW RegControl
; MOVWF ADDRESS1
; CALL WriteRC
; call SetBit
CLRF MfIrqSource
MOVF MfCmd,W
XORLW PCD_IDLE ;00无动作 取消当前执行的命令
BTFSS STATUS,Z
GOTO PSRC0_1
CLRF irqEn
CLRF waitFor
GOTO PSRC_1
PSRC0_1:
MOVF MfCmd,W
XORLW PCD_WRITEE2 ;01从FIFO缓冲区获得数据并写入内部E2PROM
BTFSS STATUS,Z
GOTO PSRC0_2
MOVLW 11H
MOVWF irqEn
MOVLW 10H
MOVWF waitFor
GOTO PSRC_1
PSRC0_2:
MOVF MfCmd,W
XORLW PCD_READE2 ;03从内部E2PROM读出数据并将其放入FIFO缓冲区,注密匙不能被读出
BTFSS STATUS,Z
GOTO PSRC0_3
MOVLW 07H
MOVWF irqEn
MOVLW 04H
MOVWF waitFor
GOTO PSRC_1
PSRC0_3:
MOVF MfCmd,W
XORLW PCD_LOADCONFIG ;从E2PROM读取数据并初始化MF RC500寄存器
BTFSC STATUS,Z
GOTO PSRC05_1
PSRC0_4:
MOVF MfCmd,W
XORLW PCD_LOADKEYE2 ;将一个密匙从E2PROM复制到密匙缓冲区
BTFSS STATUS,Z
GOTO PSRC0_5
GOTO PSRC05_1
MOVLW 07H
MOVWF irqEn
MOVLW 04H
MOVWF waitFor
GOTO PSRC_1
PSRC0_5:
MOVF MfCmd,W
XORLW PCD_AUTHENT1 ;执行Crypto1卡验证的第一部分
BTFSS STATUS,Z
GOTO PSRC0_6
PSRC05_1:
MOVLW 05H
MOVWF irqEn
MOVLW 04H
MOVWF waitFor
GOTO PSRC_1
PSRC0_6:
MOVF MfCmd,W
XORLW PCD_CALCCRC ;12启动CRC协处理器,注:CRC计算结果可从寄存器CRCResultLSB和CRCResultMSB中读出
BTFSS STATUS,Z
GOTO PSRC0_7
MOVLW 11H
MOVWF irqEn
MOVLW 10H
MOVWF waitFor
GOTO PSRC_1
PSRC0_7:
MOVF MfCmd,W
XORLW PCD_AUTHENT2 ;14使用Crypto1算法执行卡验证的第二部分
BTFSS STATUS,Z
GOTO PSRC0_8
MOVLW 4H
MOVWF irqEn
MOVLW 4H
MOVWF waitFor
GOTO PSRC_1
PSRC0_8:
MOVF MfCmd,W
XORLW PCD_RECEIVE ;16启动接收器电路,注:在接收器实际启动之前,状态机经过寄存器RxWait配置的时间后才结束等待
BTFSS STATUS,Z
GOTO PSRC0_9
MOVLW RegBitFraming
MOVWF ADDRESS1
CALL READRC
SWAPF TEMP_DATA,F
MOVLW 0FH
ANDWF TEMP_DATA,F
COMF TEMP_DATA,F
INCF TEMP_DATA,W
MOVWF MfBitsReceived
MOVLW 6H
MOVWF irqEn
MOVLW 4H
MOVWF waitFor
GOTO PSRC_1
PSRC0_9:
MOVF MfCmd,W
XORLW PCD_LOADKEY ;从FIFO缓冲区读出密匙字节并将其放入密匙缓冲区,注:密匙必须以指定的格式准备
BTFSS STATUS,Z
GOTO PSRC0_A
MOVLW 5H
MOVWF irqEn
MOVLW 4H
MOVWF waitFor
GOTO PSRC_1
PSRC0_A:
MOVF MfCmd,W
XORLW PCD_TRANSMIT ;从FIFO缓冲区读出密匙字节并将其放入密匙缓冲区,注:密匙必须以指定的格式准备
BTFSS STATUS,Z
GOTO PSRC0_B
MOVLW 5H
MOVWF irqEn
MOVLW 4H
MOVWF waitFor
GOTO PSRC_1
PSRC0_B:
MOVF MfCmd,W
XORLW PCD_TRANSCEIVE ;1E将数据从FIFO发送到卡并在发送后自动启动接收器.
BTFSS STATUS,Z
GOTO PSRC0_C
MOVLW RegBitFraming
MOVWF ADDRESS1
CALL READRC
SWAPF TEMP_DATA,F
MOVLW 0FH
ANDWF TEMP_DATA,F
COMF TEMP_DATA,F
INCF TEMP_DATA,W
MOVWF MfBitsReceived
MOVLW 3DH
MOVWF irqEn
MOVLW 04H
MOVWF waitFor
GOTO PSRC_1
PSRC0_C:
MOVLW MI_UNKNOWN_COMMAND
MOVWF COUNT0
GOTO PSRC_EX
;----------------------
PSRC_1:
MOVLW 20H
IORWF irqEn,F
IORWF waitFor,F
MOVLW 83H
MOVWF TMR1L
MOVLW 6DH
MOVWF TMR1H
MOVLW 02H ;02H
MOVWF TMR1_CNT
CALL StartT2Timeout ;200MS
MOVLW 80H
IORWF irqEn,W
MOVWF VALUE
MOVLW RegInterruptEn ;禁止所有中断
MOVWF ADDRESS1
CALL WRITERC
MOVF MfCmd,W ;写入命令
MOVWF dat3
MOVLW RegCommand
MOVWF ADDRESS
CALL putrc500
BSF INTCON,INTE ;外部中断允许
PSRC1_0:
MOVF MfIrqSource,W
ANDWF waitFor,W
BTFSS STATUS,Z
GOTO PSRC_2
BTFSC FLAG_T2OUT
GOTO PSRC_2
GOTO PSRC1_0
PSRC_2:
MOVLW regPrimaryStatus
MOVWF ADDRESS
CALL GETRC500
loo
MOVLW RegFIFOLength
MOVWF ADDRESS
CALL GETRC500
MOVLW RegFIFOData
MOVWF ADDRESS
CALL GETRC500 ;接收数据到FIFODATA
MOVLW 52H
XORWF TEMP_DATA,W
BTFSS STATUS,Z
NOP
;goto loo
MOVLW REGINTERRUPTEN ;允许所有中断
MOVWF ADDRESS
MOVLW 7fh ;7FH
MOVWF DAT3
CALL PUTRC500
MOVLW REGINTERRUPTRQ ;中断请求标志
MOVWF ADDRESS
MOVLW 7FH
MOVWF DAT3
CALL PUTRC500
MOVLW RegControl ;使能和禁止中断请求通过的控制位
MOVWF ADDRESS1
MOVLW 04H
MOVWF SETBUF
CALL SETBIT
call StopT2Timeout
MOVLW RegCommand ;使能和禁止中断请求通过的控制位
MOVWF ADDRESS1
MOVLW PCD_IDLE ;7FH
MOVWF VALUE
CALL WRITERC
MOVF MfIrqSource,W
ANDWF waitFor,W
BTFSS STATUS,Z
GOTO PSRC2_1
MOVLW MI_ACCESSTIMEOUT
MOVWF STATUS_REG
GOTO PSRC_EX
PSRC2_1:
MOVF MfStatus,F
BTFSC STATUS,Z
GOTO PSRC_3
PSRC2_2:
CLRF MfCollPos
GOTO PSRC_EX
PSRC_3:
MOVLW RegErrorFlag
MOVWF ADDRESS1
CALL READRC
MOVLW 17H
ANDWF TEMP_DATA,W
MOVWF COUNT0
MOVF COUNT0,F
BTFSC STATUS,Z
GOTO PSRC_4
MOVF COUNT0,W
ANDLW 01H
BTFSC STATUS,Z
GOTO PSRC30_1
MOVLW RegCollPos
MOVWF ADDRESS1
CALL READRC
MOVF TEMP_DATA,W
MOVWF MfCollPos
MOVLW MI_COLLERR
MOVWF MFSTATUS
GOTO PSRC3_1
PSRC30_1:
CLRF MfCollPos
MOVLW 02H
ANDWF COUNT0,W
BTFSC STATUS,Z
GOTO PSRC3_1
MOVLW MI_PARITYERR
MOVWF MFSTATUS
PSRC3_1:
MOVLW 04H
ANDWF COUNT0,W
BTFSC STATUS,Z
GOTO PSRC3_2
MOVLW MI_FRAMINGERR
MOVWF MFSTATUS
PSRC3_2:
MOVLW 10H
ANDWF COUNT0,W
BTFSC STATUS,Z
GOTO PSRC3_3
CALL FlushFIFO ;清除FIFO 缓冲区的读 写指针和FOOVFI 标志
MOVLW MI_OVFLERR
MOVWF MFSTATUS
PSRC3_3:
MOVLW 08H
ANDWF COUNT0,W
BTFSC STATUS,Z
GOTO PSRC3_4
MOVLW MI_CRCERR
MOVWF MFSTATUS
PSRC3_4:
MOVLW MI_OK
XORWF MFSTATUS,W
BTFSS STATUS,Z
GOTO PSRC_4
MOVLW MI_NY_IMPLEMENTED
MOVWF MFSTATUS
PSRC_4:
MOVLW PCD_TRANSCEIVE
XORWF MFCMD,W
BTFSC STATUS,Z
GOTO PSRC4_1
PSRC4_00:
MOVLW PCD_RECEIVE
XORWF MFCMD,W
BTFSS STATUS,Z
GOTO PSRC_5
PSRC4_1:
MOVLW RegSecondaryStatus
MOVWF ADDRESS1
CALL READRC
MOVLW 07H
ANDWF TEMP_DATA,W
BTFSC STATUS,Z
GOTO PSRC41_1
MOVWF COUNT0
MOVF MfBytesReceived,W
MOVWF COUNT1
DECF COUNT1
CLRC
RLF COUNT1
CLRC
RLF COUNT1
CLRC
RLF COUNT1
MOVF COUNT1,W
ADDWF COUNT0,W
ADDWF MfBitsReceived,F
GOTO PSRC_5
PSRC41_1:
MOVF MfBytesReceived,W
MOVWF COUNT1
CLRC
RLF COUNT1
CLRC
RLF COUNT1
CLRC
RLF COUNT1
MOVF COUNT1,W
ADDWF MfBytesReceived,F
PSRC_5:
MOVF MFSTATUS,W
MOVWF STATUS_REG
PSRC_EX:
BCF INTCON,INTE
RETURN
;&&&&&&&&&&
;***********************初始化程序*********************************
;功能说明:
;输入函数:
;输出函数:
;修改功能:
;*******************************************************************
SYSTEM_INIT:
CLRF STATUS
MOVLW 20H
MOVWF FSR
SYSTEM_INIT0
CLRF INDF
INCF FSR,1
BTFSS FSR,7
GOTO SYSTEM_INIT0
BSF STATUS,RP0 ;bank1
MOVLW option_ini
MOVWF OPTION_REG
MOVLW adcon1_ini
MOVWF ADCON1
CLRF PIE1
MOVLW trisa_ini
MOVWF TRISA
MOVLW trisb_ini
MOVWF TRISB
MOVLW TRISC_INI
MOVWF TRISC
BCF PIE1,TMR1IE
BCF STATUS,RP0 ;bank0
MOVLW porta_ini
MOVWF PORTA
MOVLW portb_ini
MOVWF PORTB
MOVLW portC_ini
MOVWF PORTC
MOVLW t1con_ini
MOVWF T1CON
CLRF PIR1
CLRF INTCON
MOVLW INTCON_INI ;********中断参数初始化*****
MOVWF INTCON ;GIE,PEIE,T0IE,INTE,RBIE,T0IF,INTF,RBIF
BSF RC500_CS
CALL Delay100ms
CALL Delay100ms
CALL Delay100ms
CALL Delay100ms
CALL Delay100ms
call Mf500PcdConfig
MOVLW 00H
MOVWF VALUE
MOVLW RegTestDigiSelect
MOVWF ADDRESS1
CALL WRITERC
MOVLW 02H
MOVWF VALUE
MOVLW RegMfOutSelect ;选择输出到管脚MfOut的内部信号
MOVWF ADDRESS1
CALL WRITERC
;===========================================================
PcdGetSnr:
; movlw 08h ;要读的E2PROM的地址
; movwf RF_SBUF
; MOVLW 00H
; MOVWF RF_SBUF+1
; movlw 04h ;读取的字节数
; movwf RF_SBUF+2
; movlw RC500_SNR ;读出序列号存放地址
; movwf RF_SBUF+3
; call PcdReadE2
TEST
; NOP
; GOTO TEST
;***********************主循环程序*******************************
;功能说明:
;输入函数:
;输出函数:
;修改功能:
;*********************************************************************
MAIN:
CLRWDT
CALL Delay100ms
;=============读卡===========
CheckCard:
MOVLW PICC_REQALL
MOVWF SND_QUEUE
call Mf500PiccCommonRequest ;请求卡
MOVLW MI_OK
XORWF STATUS_REG,W
BTFSS STATUS,Z
GOTO cc_ex
MOVLW PICC_ANTICOLL1
MOVWF RF7
MOVLW 00H
MOVWF RF6
MOVLW SNR_BUF
MOVWF RF0
call Mf500PiccCascAnticoll ;防冲撞
BTFSC CERR
GOTO cc_ex
MOVLW PICC_ANTICOLL1
MOVWF RF2
MOVLW SNR_BUF
MOVWF RF0
call Mf500PiccCascSelect ;选择一张卡
CALL Mf500PiccHalt ;命令卡进入休眠状态
cc_ex:
GOTO MAIN
;----发送数据-------------
Movlw D'26'
Movwf Send_Count ;Send bits counter
CALL DATA_SWAP1
Send_Data_Loop
Rlf Send4
Rlf Send3
Rlf Send2
RLF PARITY
Btfsc Status,C
Bcf WD1
Btfss Status,C
Bcf WD0
Call Delay400us
Bsf WD0
Bsf WD1
Call Delay2ms
Decfsz Send_Count,F
Goto Send_Data_Loop
Bsf Hold
Call DATA_SWAP1 ;Load the old number
Goto MAIN ;when send data over continue check card
;======================================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -