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

📄 ticcard.asm

📁 绝对的RC500的PIC汇编程序,谨供参考
💻 ASM
📖 第 1 页 / 共 4 页
字号:
	MOVF	COUNT0,W
	MOVWF	INDF
	INCF	FSR1
	INCF	FSR2
        DECFSZ	RF7,F
        GOTO	PWE_1
	MOVF	RF1,W
	MOVWF	SND_QUEUE
	MOVF	RF2,W
	MOVWF	SND_QUEUE+1
  	MOVLW	PCD_WRITEE2
	call	PcdSingleResponseCmd
        RETURN


	
;=================================================
;          启动RC500天线发射
;每次启动或关闭天险发射之间应至少有1ms
;的间隔,执行完初始化RC500后天线已启动
;入   口:无
;出   口:无
;占用资源:
;=================================================
PCD_RFON:
;	BCF	RC500_CS
	MOVLW	RegTxControl	;天线驱动脚TX1和TX2的逻辑状态控制
	MOVWF	ADDRESS1
	MOVLW	03H
	MOVWF	SETBUF
	CALL	SETBIT
;	BSF	RC500_CS
	RETURN
;=================================================
;          关闭RC500天线发射
;每次启动或关闭天险发射之间应至少有1ms
;的间隔
;入   口:无
;出   口:无
;占用资源:
;=================================================
PCD_RFOFF:
;	BCF	RC500_CS
	MOVLW	RegTxControl	;天线驱动脚TX1和TX2的逻辑状态控制
	MOVWF	ADDRESS1
	MOVLW	03H
	MOVWF	CLRBUF
	CALL	CLEARBIT
;	BSF	RC500_CS
	RETURN

;++++++++++++++++++++++++++++
DELAY20US
	MOVLW	D'60'
	MOVWF	Delayvar1
	DECFSZ	Delayvar1,F
	GOTO	$-1
	RETURN
;*********************************
;功   能:写数据到RC500指定寄存器
;入口参数:address1	写入的地址
;	VALUE		写入的数据
;**********************************

WriteRC
	MOVLW	REGPAGE
	MOVWF	address
	MOVF	address1,W
	MOVWF	addr
	CLRC
	RRF	addr
	CLRC
	RRF	addr
	CLRC
	RRF	addr
	MOVLW	0x80
	IORWF	addr,F		;获取页面
	MOVF	ADDR,W
	MOVWF	DAT3
	CALL	PutRC500
	MOVF	address1,W
	MOVWF	address
	MOVF	VALUE,W
	MOVWF	DAT3
	CALL	PutRC500	;写数据
	RETURN
;****************************************
;功   能:从RC500指定寄存器读数据
;入口参数:address1	写入的地址
;	VALUE		写入的数据
;*********************************

ReadRC
	MOVLW	REGPAGE
	MOVWF	address
	MOVF	address1,W
	MOVWF	addr
	CLRC
	RRF	addr
	CLRC
	RRF	addr
	CLRC
	RRF	addr
	MOVLW	0x80
	IORWF	addr,F		;获取页面
	MOVF	ADDR,W
	MOVWF	DAT3
	CALL	PUTRC500
	MOVF	address1,W
	MOVWF	address
	CALL	GETRC500	;读数据
	RETURN
;***************************************
;功   能:在一个页内向RC500寄存器送数据
;       因为地址线只有3条,此操作可寻址8个地址
;入口参数:address,dat3
;****************************************
PutRC500:
	BSF     STATUS,RP0   	;bank1
	MOVLW	tris_output
	MOVWF	tris_data_port
	BCF     STATUS,RP0   	;bank1
;CALL	DELAY20US
	MOVF	address,W
	MOVWF	data_port	;写入写地址
	BSF	rc500_ale
;CALL	DELAY20US
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP	
	BCF	rc500_ale
;CALL	DELAY20US
	BCF	rc500_cs
	MOVF	dat3,W
	MOVWF	data_port	;写入数据
	BCF	rc500_wr
;CALL	DELAY20US
;	CALL	DELAY100US
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	BSF	rc500_wr
	BSF	rc500_cs
	RETURN
;****************************************
;功   能:在一个页内从RC500寄存器读数据
;        因为地址线只有3条,此操作可寻址8个地址
;入口参数:address
;出口参数:temp_data
;***************************************
GETRC500:

	BSF     STATUS,RP0   	;bank1
	MOVLW	tris_output
	MOVWF	tris_data_port
	BCF     STATUS,RP0   	;bank1
;CALL	DELAY20US
	MOVF	address,W	;写入读地址
	MOVWF	data_port
	BSF	rc500_ale
;CALL	DELAY20US
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	BCF	rc500_ale
;CALL	DELAY20US
	BCF	rc500_cs
	BSF     STATUS,RP0   	;bank1
	MOVLW	tris_input
	MOVWF	tris_data_port	
	BCF     STATUS,RP0   	;bank1
;CALL	DELAY20US
	BCF	rc500_rd
;CALL	DELAY20US
	NOP
	NOP
	NOP
	NOP
	NOP
	MOVF	data_port,W
	MOVWF	temp_data	;读出数据
	BSF	rc500_rd
	BSF	rc500_cs
	RETURN
;**********************************
;----------------------------------
CLEARBIT:
	CALL	READRC
	COMF	CLRBUF,W
	ANDWF	temp_data,W
	MOVWF	DAT3
	MOVF	ADDRESS1,W
	MOVWF	ADDRESS
	CALL	PUTRC500
	RETURN
;----------------------------------
SETBIT:
	CALL	READRC
	MOVF	SETBUF,W
	IORLW	temp_data
	MOVWF	DAT3
	CALL	PUTRC500
	RETURN
;----------------------------------
WAIT_RC500:
	MOVLW	01H
	SUBWF	COUNT0,F
	BTFSC	STATUS,C
	DECF	COUNT1
	RETURN
;/////////////////////////////////////////////////////////////////////
;                  F L U S H    F I F O
;/////////////////////////////////////////////////////////////////////
FlushFIFO:
	MOVLW	RegControl		;清除FIFO 缓冲区的读 写指针和FOOVFI 标志
	MOVWF	ADDRESS1
	MOVLW	03H
	MOVWF	SETBUF
	CALL	SetBit
	RETURN
;----------------------------------------------------------------------------
; FUNCTION:     时间溢出中断
; IN:	         _50us
; OUT:	       	 -
; COMMENT:	 Using Timer2 to generate timeout with a resolution of 50 us.
;		 Timeout is calculated in the interrupt routine.
;		 Max Timeout = 65535 x 50us = 3.277s
;----------------------------------------------------------------------------
StartT0Timeout:
	BCF	INTCON,T0IE
	BCF	INTCON,T0IF
	MOVLW	TMR0_10MS
	MOVWF	TMR0
        BCF	FLAG_T0OUT
	BSF	INTCON,T0IE
	BSF	INTCON,T0IF
        RETURN


;----------------------------------------------------------------------------
; FUNCTION:     stop_timeout 停止时间溢出中断
;	IN:	-
;      OUT:	-
;COMMENT:  	Stop Timer2 and clear timeout state
;----------------------------------------------------------------------------
StopT0Timeout:
	BCF	INTCON,T0IE
	BCF	INTCON,T0IF
        BCF	FLAG_T0OUT
        RETURN


;==============================
ResetInfo:
	CLRF	MfCmd
	MOVLW	MI_OK
	MOVWF	MfStatus
	CLRF	MfIrqSource
	CLRF	MfBytesSend
	CLRF	MfBytesToSend
	CLRF	MfBytesReceived
	CLRF	MfBitsReceived
	CLRF	MfCollPos
	RETURN


;----------------------------------------------------------------------------
;
; FUNCTION:     start_timeout
;
; IN:	         _50us
; OUT:	       	 -
;
; COMMENT:	 Using Timer2 to generate timeout with a resolution of 50 us.
;		 Timeout is calculated in the interrupt routine.
;		 Max Timeout = 65535 x 50us = 3.277s
;
;----------------------------------------------------------------------------
StartT2Timeout:
	BSF	T1CON,TMR1ON
	BSF     STATUS,RP0   	;bank1
	BSF	PIE1,0
	BCF     STATUS,RP0   	;bank1
	RETURN
;----------------------------------------------------------------------------
;
; FUNCTION:     stop_timeout
;
; IN:        	-
; OUT:       	-
;
; COMMENT:  	Stop Timer2 and clear timeout state
;
;----------------------------------------------------------------------------
StopT2Timeout:
	BSF     STATUS,RP0   	;bank1
	BCF	PIE1,0
	BCF     STATUS,RP0   	;bank1
	BCF	T1CON,TMR1ON
	RETURN
;=====================================================================
;====================以上为RC500库函数=================================
;=====================================================================
;=======================================
;            延时子程序
;=======================================
DELAY100US:
	MOVLW	4BH
	MOVWF	DELAYVAR1
	NOP
	DECFSZ	DELAYVAR1,F
	GOTO	$-2
	RETURN
;***************************************
DELAY100MS:
	MOVLW	0ECH
	MOVWF	DELAYVAR1

DELAY100MSL1:
	CLRWDT
	MOVLW	0FFH
	MOVWF	DELAYVAR2
DELAY100MSL2:
	NOP
	NOP
	DECFSZ	DELAYVAR2,F
	GOTO	DELAY100MSL2
	DECFSZ	DELAYVAR1,F
	GOTO	DELAY100MSL1
	RETURN

;*******************************************
;function   :Delay 400us subroutine
;input       :
;output     :
;occupt    : Delayvar
;******************************************
Delay400us
	Movlw	D'200'
	Movwf	Delayvar1
	Clrwdt
	GOTO	$+1
	Decfsz	Delayvar1,F
	Goto	$-3
	Return
;*******************************************
;function   :Delay 2Ms subroutine
;input       :
;output     :
;occupt    : Delayvar
;*******************************************
Delay1ms
	MOVLW	D'10'
	MOVWF	DELAYVAR2
	Call	Delay100Us
	DECFSZ	DELAYVAR2,F
	GOTO	$-2
	Return
;*******************************************
;function   :Delay 2Ms subroutine
;input       :
;output     :
;occupt    : Delayvar
;*******************************************
Delay2ms
	Call	Delay400us
	Call	Delay400us
	Call	Delay400us
	Call	Delay400us
	Call	Delay400us
	Return
;*******************************************
;function :Delay 2.5Ms subroutine
;input    :
;output   :
;occupt   : Delayvar
;*******************************************
Delay2.5ms
	MOVLW	D'6'
	MOVWF	DELAYVAR2
	Call	Delay400Us
	DECFSZ	DELAYVAR2,F
	GOTO	$-2
	Call	Delay100us
	Return
;*******************************************
;function   :Delay 2.5Ms subroutine
;input       :
;output     :
;occupt    : Delayvar
;*******************************************
Delay10ms
	MOVLW	D'5'
	MOVWF	DELAYVAR2
	Call	Delay2Ms
	DECFSZ	DELAYVAR2,F
	GOTO	$-2
	Call	Delay100us	
	Return	
;*******************************************
;function   :Delay 25Ms subroutine
;input       :
;output     :
;occupt    : Delayvar
;*******************************************
Delay25ms
	MOVLW	D'63'
	MOVWF	DELAYVAR2
	Call	Delay400Us
	DECFSZ	DELAYVAR2,F
	GOTO	$-2
	Return
;==============================================


;**************************************************************************
;function   :calculate the parity bit and move the data to send register
;input       :Card1,Card2,Card3,Card4
;output     :Parity
;occupt    : C,W,Send_Count,Parity_Check
;data form:1Parity+24bit+1Parity ,totale 26 bits
;***************************************************************************
DATA_SWAP
	CLRF	Parity
	Movlw	D'12'
	Movwf	Send_Count
	Clrc	
Calculate_Even_Parity
	Rlf	Card4
	Rlf	Card3
	Rlf	Card2
	Btfsc	status,C
	Incf	Parity
	Decfsz	Send_Count,F
	Goto	Calculate_Even_Parity
	Bcf	Parity,7
	Btfsc	Parity,0
	Bsf	Parity,7
	Movlw	D'12'
	Movwf	Send_Count
	BCF	Parity,0
	Clrc	
Calculate_Odd_Parity
	Rlf	Card4
	Rlf	Card3
	Rlf	Card2
	Btfsc	status,C
	Incf	Parity
	Decfsz	Send_Count,F
	Goto	Calculate_Odd_Parity
	Bcf	Parity,6
	Btfss	Parity,0
	Bsf	Parity,6
	RLF	Parity
	Rlf	Send2
	Rlf	Send3
	Rlf	Send4
	RRF	Parity
	Retlw	0
;**************************************************************************	
DATA_SWAP0
	Movf	Send1,W
	Movwf	Card1
	Movf	Send2,W
	Movwf	Card2
	Movf	Send3,W
	Movwf	Card3
	Movf	Send4,W
	Movwf	Card4
	Retlw	0
;**************************************************************************	
DATA_SWAP1
	Movf	CARD1,W
	Movwf	Send1
	Movf	CARD2,W
	Movwf	Send2
	Movf	CARD3,W
	Movwf	Send3
	Movf	CARD4,W
	Movwf	Send4
	Retlw	0
;==========================
;防冲撞
;---------------------------------------------------
Mf500PiccCascAnticoll_1	
	MOVLW	MI_BITCOUNTERR
	MOVWF	STATUS_REG
MPCA_00:
	MOVLW	D'106'
	CALL	PcdSetTmo
	MOVLW	RegDecoderControl
	MOVWF	ADDRESS1
	MOVLW	28H
	MOVWF	VALUE
	CALL	WRITERC 
	MOVLW	REGCONTROL		;不同的控制标志:例如:定时器,节电
	MOVWF	ADDRESS1
	MOVLW	08H		;清除与卡的所有数据通信加密
	MOVWF	CLRBUF
	CALL	CLEARBIT
;************** Anticollision Loop ***************************
MPCA_0:
	call	ResetInfo
	MOVLW	RegChannelRedundancy
	MOVWF	ADDRESS1
	MOVLW	03H
	MOVWF	VALUE
	CALL	WRITERC
	MOVF	RF6,W
	MOVWF	COUNT0
	MOVLW	07H
	ANDWF	COUNT0,F	;count0=nbits
	BTFSC	STATUS,Z
	GOTO	MPCA0_1
	SWAPF	COUNT0,W
	ANDLW	0F0H
	IORWF	COUNT0,W
	MOVWF	VALUE
	MOVLW	RegBitFraming		;PAGE1
	MOVWF	ADDRESS1
	CALL	WRITERC
	MOVF	RF6,W
	MOVWF	RF5
	CLRC
	RRF	RF5
	CLRC
	RRF	RF5
	CLRC
	RRF	RF5
	INCF	RF5		;RF5=NBYTES

	MOVLW	07H
	XORWF	COUNT0,W
	BTFSS	STATUS,Z
	GOTO	MPCA_1
	MOVLW	PICC_ANTICOLL1
	MOVWF	MfCmd
	MOVF	COUNT0,W
	MOVWF	VALUE
	MOVLW	RegBitFraming
	MOVWF	ADDRESS1
	CALL	WRITERC
	GOTO	MPCA_1
MPCA0_1:
	MOVF	RF6,W
	MOVWF	RF5
	CLRC
	RRF	RF5
	CLRC
	RRF	RF5
	CLRC
	RRF	RF5
MPCA_1:
	MOVF	RF7,W
	MOVWF	SND_QUEUE
	MOVF	RF6,W
	MOVWF	COUNT1
	CLRC
	RRF	COUNT1
	CLRC
	RRF	COUNT1
	CLRC
	RRF	COUNT1
	SWAPF	COUNT1,W
	ANDLW	0F0H
	ADDWF	COUNT0,W
	ADDLW	20H
	MOVWF	SND_QUEUE+1
	MOVF	RF0,W
	MOVWF	RF_S0		;P2
	MOVF	RF5,F
	BTFSC	STATUS,Z
	GOTO	MPCA10_0
	MOVF	RF5,W
	MOVWF	COUNT1
	MOVF	RF0,W
	MOVWF	FSR1
	MOVLW	SND_QUEUE+2
	MOVWF	FSR2
MPCA1_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	MPCA1_0
MPCA10_0:
	MOVF	RF5,W
	MOVWF	COUNT1
	INCF	COUNT1
	INCF	COUNT1
	MOVF	COUNT1,W
	MOVWF	MfBytesToSend
	MOVLW	PCD_TRANSCEIVE
	call	PcdSingleResponseCmd
	MOVF	RF4,W
	MOVWF	RF_S1		;P3
	MOVLW	07H
	XORWF	RF2,W
	BTFSS	STATUS,Z
	GOTO	MPCA1_2
	MOVF	MfBytesReceived,W
	MOVWF	RF5
	MOVLW	RCV_QUEUE
	MOVWF	FSR
	CLRF	RF4
	CLRF	RF1
MPCA11_0:
	MOVLW	07H
	MOVWF	COUNT0
	MOVF	RF1,W
	SUBWF	COUNT0,F
	MOVF	INDF,W
	MOVWF	RF_S2		;P4
	MOVWF	COUNT1
MPCA11_1:
	CLRC
	RLF	COUNT1
	DECFSZ	COUNT0,F
	GOTO	MPCA11_1
	MOVF	COUNT1,W
	MOVWF	RF_S3		;P5
	MOVF	RF1,W
	MOVWF	COUNT0
	INCF	COUNT0
	MOVF	RF4,W
	MOVWF	COUNT1
MPCA11_2:
	CLRC
	RRF	COUNT1
	DECFSZ	COUNT0,F
	GOTO	MPCA11_2

	MOVF	RF_S3,W		;POP5
	IORWF	COUNT1,W
	MOVWF	INDF

	
	MOVF	RF_S2,W		;POP4
	MOVWF	RF4
	INCF	FSR
	INCF	RF1
	DECFSZ	RF5,W
	GOTO	MPCA11_0

	MOVF	MfBytesReceived,W
	SUBWF	MfBitsReceived,F
	MOVF	MfCollPos,F
	BTFSC	STATUS,Z

⌨️ 快捷键说明

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