?? ticcard.asm
字號:
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 + -