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

📄 ticcard.asm

📁 绝对的RC500的PIC汇编程序,谨供参考
💻 ASM
📖 第 1 页 / 共 4 页
字号:
	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 + -