?? ticcard.asm
字號:
;##############################################
;this programme si for ICCARD
;version :v1.0
;modify by :Hosea
;modify data : 2008.5.8
;modify reason :
;osc :12MHz
;##############################################
;****************************************************************************
include "P16F72.INC"
;****************************************************************************
;******************** io 口定義 ******************
#define rc500_wr porta,0
#define rc500_rd porta,1
#define rc500_ale porta,2 ; lhl 鎖定地址
#define rc500_cs porta,3
#define rc500_rst PORTB,4
#define rc500_irq PORTB,0
#define WD0 PORTB,1
#define WD1 PORTB,2
#define HOLD PORTB,3
;***************IO口常數設置定義***********
#define trisa_ini 0x00
#define porta_ini 0x3b
#define data_port PORTC ;數據口
#define tris_data_port TRISC ;數據口方向寄存器
#define tris_input 0xff ;輸入
#define tris_output 0x0 ;輸出
#define trisb_ini 0x01
#define portb_ini 0xEF
#define TRISC_ini 0x00
#define portc_ini 0x00
;******************** 常量定義 *******************
#define option_ini 0x07 ; 1:256 預分頻用于 timer0
#define timer0_ini 255-50 ; 1/216 秒定時
#define t1con_ini 0x30 ; 1:8 預分頻, 啟動定時器
#define timer1h_ini 0xf6 ; 20ms 定時
#define timer1l_ini 0x3c
#define t2con_ini 0x4d ; 1:40 預分頻, 啟動定時器
#define timer2_ini 255-250 ; 10ms 定時
#define adcon0_ini 0x0
#define adcon1_ini 0x7 ;關閉 ADC
#define INTCON_INI 0X0C0
#define JSQ_LOCAL_LOOP 0XFF
#define MFIFOLength D'64'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;************************標志位定義*******************
FLAG0 EQU 20H
#define FLAG_T2OUT FLAG0,0 ;定時器2溢出標志
#define FLAG_RCV FLAG0,1
#define FLAG_T0OUT FLAG0,2
#define FLAG_HAVECARD FLAG0,3
#define FLAG_CARDSN FLAG0,4
#define FLAG_PARALLEL FLAG0,5
FLAG1 EQU 21H
#define CERR FLAG1,0
#define RC500_OK FLAG1,1
#define FFC FLAG1,2
#define F2 FLAG1,3
#define FPASS FLAG1,4
#define FCARDKEY FLAG1,5
;===============================
IBFF EQU 22H ;堆棧
IBFS EQU 23H ;堆棧
IBFW EQU 24H ;堆棧
Send_Count EQU 25H
COUNT0 EQU 25H
COUNT1 EQU 26H
DELAYVAR1 EQU 25H
DELAYVAR2 EQU 26H
TEMP_DATA EQU 27H
ADDR EQU 27H
DAT3 EQU 28H
VALUE EQU 29H
ADDRESS EQU 2AH
ADDRESS1 EQU 2BH
CLRBUF EQU 2CH
SETBUF EQU 2CH
irqBits equ 2Dh
FSR1 EQU 2eH
FSR2 EQU 2fH
;;;;
irqEn EQU 5BH
waitFor EQU 5CH
RF0 EQU 58H
RF1 EQU 59H
RF2 EQU 5AH
RF3 EQU 5BH
RF4 EQU 5CH
RF5 EQU 5DH
RF6 EQU 5EH
RF7 EQU 5FH
RF_S0 EQU 56H
RF_S1 EQU 57H
RF_S2 EQU 60H
RF_S3 EQU 61H
CARD1 EQU 3CH
CARD2 EQU 3DH
CARD3 EQU 3EH
CARD4 EQU 3FH
SEND1 EQU 40H
SEND2 EQU 41H
SEND3 EQU 42H
SEND4 EQU 43H
PARITY EQU 44H
;;;;;
MLastSelectedSnr EQU 30h ;30h--33h(4Byres)
MfCmdInfo EQU 34h ;34h--3bh(8Bytes)
MfCmd EQU 34h
MfStatus EQU 35h
MfBytesSend EQU 36h
MfBytesToSend EQU 37h
MfBytesReceived EQU 38h
MfBitsReceived EQU 39h
MfIrqSource EQU 3ah
MfCollPos EQU 3bh
RC500_SNR EQU 3ch ;3ch--3fh(4Bytes)
SNR_BUF EQU 40h ;40h--4fh(16Bytes)
UID_BUF EQU 50h ;50h--59h(10Bytes)
ATQ_BUF EQU 6Dh ;5ah--5bh(2Bytes)
SAK_BUF EQU 6Fh ;5ch(1Byte)
TMR1_CNT EQU 62H
SR_LEN EQU 63h
SR_MODE EQU 64h
AUTH_MODE EQU 65h
BLOCK EQU 66h
SECTOR EQU 67h
STATUS_REG EQU 68H
CHK_CNT EQU 69h
INT_REG1 EQU 6AH
INT_REG2 EQU 6BH
INT_REG3 EQU 6CH
RF_SBUF EQU 4AH ;數據緩沖區
oldPageSelect EQU 7FH ;原頁面保存
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RCV_QUEUE EQU 70h ;70h--7fh(16Bytes)
KEYS_BUF EQU 0A0h ;0A0h--0Abh(12Bytes)
SND_QUEUE EQU 50h ;50h--61h(18Bytes)
SR_BUF EQU 0C0h ;0C0h--0Efh(48Bytes)
MAX_CHECK equ 20
TMR0_10MS EQU 8AH
T1_9600 equ 0fdh
COMM_HEAD equ 0ffh
COMM_SHIFT equ 0feh
SHIFT_SHIFT equ 0eh
SHIFT_HEAD equ 0fh
CMD_SEEK equ 10h
CMD_IDLE equ 01h
CMD_CARDSN equ 02h
CMD_KEY equ 03h
CMD_KEYEE equ 04h
CMD_READBLOCK equ 05h
CMD_READBLOCKEE equ 06h
CMD_WRITEBLOCK equ 07h
CMD_WRITEBLOCKEE equ 08h
CMD_READAUTH equ 09h
CMD_READAUTHEE equ 0ah
CMD_WRITEAUTH equ 0bh
CMD_WRITEAUTHEE equ 0ch
RNUM_CMD_SEEK equ 1
RNUM_CMD_IDLE equ 1
RNUM_CMD_CARDSN equ 1
RNUM_CMD_KEY equ 7
RNUM_CMD_KEYEE equ 9
RNUM_CMD_READBLOCK equ 4
RNUM_CMD_READBLOCKEE equ 4
RNUM_CMD_WRITEBLOCK equ 20
RNUM_CMD_WRITEBLOCKEE equ 20
RNUM_CMD_READAUTH equ 3
RNUM_CMD_READAUTHEE equ 3
RNUM_CMD_WRITEAUTH equ 19
RNUM_CMD_WRITEAUTHEE equ 19
SNUM_CMD_SEEK equ 5
SNUM_CMD_IDLE equ 1
SNUM_CMD_CARDSN equ 5
SNUM_CMD_KEY equ 1
SNUM_CMD_KEYEE equ 2
SNUM_CMD_READBLOCK_OK equ 17
SNUM_CMD_READBLOCK_FALSE equ 2
SNUM_CMD_READBLOCKEE_OK equ 17
SNUM_CMD_READBLOCKEE_FALSE equ 2
SNUM_CMD_WRITEBLOCK equ 2
SNUM_CMD_WRITEBLOCKEE equ 2
SNUM_CMD_READAUTH_OK equ 17
SNUM_CMD_READAUTH_FALSE equ 2
SNUM_CMD_READAUTHEE_OK equ 17
SNUM_CMD_READAUTHEE_FALSE equ 2
SNUM_CMD_WRITEAUTH equ 2
SNUM_CMD_WRITEAUTHEE equ 2
KEY_A equ 00
KEY_B equ 01
SR_IDLE equ 00h
SR_SEND equ 01h
SR_RECEIVE equ 02h
;======================================================
;******************** RC500 寄存器定義 ******************
;RC500寄存器定義
; PAGE 0 Command and Status
#define RegPage 0x00 ;選擇寄存器頁
#define RegCommand 0x01 ;啟動(和停止)命令的執行
#define RegFIFOData 0x02 ;64字節FIFO緩沖區輸入和輸出
#define RegPrimaryStatus 0x03 ;接收器和發送器以及FIFO緩沖區狀態標志
#define RegFIFOLength 0x04 ;FIFO中緩沖的字節數
#define RegSecondaryStatus 0x05 ;不同的狀態標志
#define RegInterruptEn 0x06 ;使能和禁止中斷請求通過的控制位
#define RegInterruptRq 0x07 ;中斷請求標志
; PAGE 1 Control and Status
#define RegControl 0x09 ;不同的控制標志:例如:定時器,節電
#define RegErrorFlag 0x0A ;顯示上次命令執行錯誤狀態的錯誤標志
#define RegCollPos 0x0B ;RF接口檢測到的第一個沖突位的位置
#define RegTimerValue 0x0C ;定時器的實際值
#define RegCRCResultLSB 0x0D ;CRC協處理器寄存器的最低位
#define RegCRCResultMSB 0x0E ;CRC協處理器寄存器的最高位
#define RegBitFraming 0x0F ;位方式幀的調節
; PAGE 2 Transmitter and Coder Control
#define RegTxControl 0x11 ;天線驅動腳TX1和TX2的邏輯狀態控制
#define RegCwConductance 0x12 ;選擇天線驅動腳TX1和TX2的電導率
#define RFU13 0x13 ;該值不會改變
#define RegCoderControl 0x14 ;該值不會改變
#define RegModWidth 0x15 ;選擇調整脈沖的寬度
#define RFU16 0x16 ;該值不會改變
#define RFU17 0x17 ;該值不會改變
; PAGE 3 Receiver and Decoder Control
#define RegRxControl1 0x19 ;控制接收器狀態
#define RegDecoderControl 0x1A ;控制解碼器狀態
#define RegBitPhase 0x1B ;選擇發送器和接收器時鐘之間的位相位
#define RegRxThreshold 0x1C ;選擇位解碼器的閥值
#define RFU1D 0x1D ;該值不會改變
#define RegRxControl2 0x1E ;控制解碼器狀態和定義接收器的輸入源
#define RegClockQControl 0x1F ;控制時鐘產生用于90度相移的Q信道時鐘
; PAGE 4 RF-Timing and Channel Redundancy
#define RegRxWait 0x21 ;選擇發送后,接收器啟動前的時間間隔
#define RegChannelRedundancy 0x22 ;選擇RF信道上數據完整性檢測的類型和模式
#define RegCRCPresetLSB 0x23 ;CRC寄存器預設值的低字節
#define RegCRCPresetMSB 0x24 ;CRC寄存器預設值的高字節
#define RFU25 0x25 ;該值不會改變
#define RegMfOutSelect 0x26 ;選擇輸出到管腳MfOut的內部信號
#define RFU27 0x27 ;該值不會改變
; PAGE 5 FIFO, Timer and IRQ-Pin Configuration
#define RegFIFOLevel 0x29 ;定義FIFO上溢和下溢警告界限
#define RegTimerClock 0x2A ;選擇定時器時鐘的分頻器
#define RegTimerControl 0x2B ;選擇定時器的起始和停止條件
#define RegTimerReload 0x2C ;定義定時器的預裝值
#define RegIRqPinConfig 0x2D ;配置IRq腳的輸出狀態
#define RFU2E 0x2E ;該值不會改變
#define RFU2F 0x2F ;該值不會改變
;PAGE 6 RFU
#define RFU31 0x31 ;保留將來之用
#define RFU32 0x32 ;保留將來之用
#define RFU33 0x33 ;保留將來之用
#define RFU34 0x34 ;保留將來之用
#define RFU35 0x35 ;保留將來之用
#define RFU36 0x36 ;保留將來之用
#define RFU37 0x37 ;保留將來之用
; PAGE 7 Test Control
#define RFU39 0x39 ;保留將來之用
#define RegTestAnaSelect 0x3A ;選擇模擬測試模式
#define RFU3B 0x3B ;該值不會改變
#define RFU3C 0x3C ;該值不會改變
#define RegTestDigiSelect 0x3D ;選擇數字測試模式
#define RFU3E 0x3E ;保留將來之用
#define RegTestDigiAccess 0x3F ;保留將來之用
;======================================================
; P C D - C O M M A N D S
;********************* RC500 命令定義 *******************
;RC500命令字
#define PCD_IDLE 0x00 ;無動作 取消當前執行的命令
#define PCD_WRITEE2 0x01 ;從FIFO緩沖區獲得數據并寫入內部E2PROM
#define PCD_READE2 0x03 ;從內部E2PROM讀出數據并將其放入FIFO緩沖區,注密匙不能被讀出
#define PCD_LOADCONFIG 0x07 ;從E2PROM讀取數據并初始化MF RC500寄存器
#define PCD_LOADKEYE2 0x0B ;將一個密匙從E2PROM復制到密匙緩沖區
#define PCD_AUTHENT1 0x0C ;執行Crypto1卡驗證的第一部分
#define PCD_CALCCRC 0x12 ;啟動CRC協處理器,注:CRC計算結果可從寄存器CRCResultLSB和CRCResultMSB中讀出
#define PCD_AUTHENT2 0x14 ;使用Crypto1算法執行卡驗證的第二部分
#define PCD_RECEIVE 0x16 ;啟動接收器電路,注:在接收器實際啟動之前,狀態機經過寄存器RxWait配置的時間后才結束等待
;注:由于該命令與Transmit命令無時序的關系因此可以只用于測試
#define PCD_LOADKEY 0x19 ;從FIFO緩沖區讀出密匙字節并將其放入密匙緩沖區,注:密匙必須以指定的格式準備
#define PCD_TRANSMIT 0x1A ;將數據從FIFO緩沖區發送到卡
#define PCD_TRANSCEIVE 0x1E ;將數據從FIFO發送到卡并在發送后自動啟動接收器.
;注:在接收器實際啟動之前,狀態機經過寄存器RxWait配置的時間后才結束等待
;注:該命令是發送和接收的組合
#define PCD_RESETPHASE 0x3F ;運行復位和初始化階段;該命令不能通過軟件 只能通過上電或硬件復位啟動
;========================================================
;MIFARE卡命令字
#define PICC_REQSTD 0x26 ; request idle
#define PICC_REQALL 0x52 ; request all
#define PICC_ANTICOLL1 0x93 ; anticollision level 1
#define PICC_ANTICOLL2 0x95 ; anticollision level 2
#define PICC_ANTICOLL3 0x97 ; anticollision level 3
#define PICC_AUTHENT1A 0x60 ; authentication step 1
#define PICC_AUTHENT1B 0x61 ; authentication step 2
#define PICC_READ 0x30 ; read block
#define PICC_WRITE 0xA0 ; write block
#define PICC_DECREMENT 0xC0 ; decrement value
#define PICC_INCREMENT 0xC1 ; increment value
#define PICC_RESTORE 0xC2 ; restore command code
#define PICC_TRANSFER 0xB0 ; transfer command code
#define PICC_HALT 0x50 ; halt
;===========================================================
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Reader Error Codes Base Address Start: 0000
; Base Address End: -999
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RC500通訊返回代碼定義
#define MI_OK 0
#define MI_CHK_OK 0
#define MI_CRC_ZERO 0
#define MI_CRC_NOTZERO 1
#define MI_NOTAGERR (-1)
#define MI_CHK_FAILED (-1)
#define MI_CRCERR (-2)
#define MI_CHK_COMPERR (-2)
#define MI_EMPTY (-3)
#define MI_AUTHERR (-4)
#define MI_PARITYERR (-5)
#define MI_CODEERR (-6)
#define MI_SERNRERR (-8)
#define MI_KEYERR (-9)
#define MI_NOTAUTHERR (-10)
#define MI_BITCOUNTERR (-11)
#define MI_BYTECOUNTERR (-12)
#define MI_IDLE (-13)
#define MI_TRANSERR (-14)
#define MI_WRITEERR (-15)
#define MI_INCRERR (-16)
#define MI_DECRERR (-17)
#define MI_READERR (-18)
#define MI_OVFLERR (-19)
#define MI_POLLING (-20)
#define MI_FRAMINGERR (-21)
#define MI_ACCESSERR (-22)
#define MI_UNKNOWN_COMMAND (-23)
#define MI_COLLERR (-24)
#define MI_RESETERR (-25)
#define MI_INITERR (-25)
#define MI_INTERFACEERR (-26)
#define MI_ACCESSTIMEOUT (-27)
#define MI_NOBITWISEANTICOLL (-28)
#define MI_QUIT (-30)
#define MI_RECBUF_OVERFLOW (-50)
#define MI_SENDBYTENR (-51)
#define MI_SENDBUF_OVERFLOW (-53)
#define MI_BAUDRATE_NOT_SUPPORTED (-54)
#define MI_SAME_BAUDRATE_REQUIRED (-55)
#define MI_WRONG_PARAMETER_VALUE (-60)
#define MI_BREAK (-99)
#define MI_NY_IMPLEMENTED (-100)
#define MI_NO_MFRC (-101)
#define MI_MFRC_NOTAUTH (-102)
#define MI_WRONG_DES_MODE (-103)
#define MI_HOST_AUTH_FAILED (-104)
#define MI_WRONG_LOAD_MODE (-106)
#define MI_WRONG_DESKEY (-107)
#define MI_MKLOAD_FAILED (-108)
#define MI_FIFOERR (-109)
#define MI_WRONG_ADDR (-110)
#define MI_DESKEYLOAD_FAILED (-111)
#define MI_WRONG_SEL_CNT (-114)
#define MI_WRONG_TEST_MODE (-117)
#define MI_TEST_FAILED (-118)
#define MI_TOC_ERROR (-119)
#define MI_COMM_ABORT (-120)
#define MI_INVALID_BASE (-121)
#define MI_MFRC_RESET (-122)
#define MI_WRONG_VALUE (-123)
#define MI_VALERR (-124)
#define MI_RW_ERROR (-125)
;=============================================
;***********************************************************
;++++++++++++++++++++++++++++++++++++++++++++
;***************************************************************
ORG 0000H
NOP
GOTO SYSTEM_INIT
;***********************中斷處理程序****************************************
;功能說明:
;輸入函數:
;輸出函數:
;修改功能:
;***************************************************************************
ORG 0004H
INT_IN:
MOVWF IBFW ;saving current status
SWAPF IBFW,F
SWAPF STATUS,W
MOVWF IBFS
MOVF FSR,W
MOVWF IBFF
BTFSC INTCON,T0IF
GOTO Timer0Out
BTFSC PIR1,TMR1IF ;判斷是否為TMR1中斷
GOTO Timer2Out
btfsc intcon,intf
GOTO SingleResponseIsr
INTERRUPT_RET
MOVF IBFF,W ;resume the saving status
MOVWF FSR
SWAPF IBFS,W
MOVWF STATUS
SWAPF IBFW,W
RETFIE
;****************************************************************************
;function: Tmr0 interrupt subroutine
;input :
;output :
;occupy :
;****************************************************************************
Timer0Out:
BCF INTCON,T0IF
BTFSS INTCON,T0IE
GOTO INTERRUPT_RET
MOVLW TMR0_10MS
MOVWF TMR0
BSF FLAG_T0OUT
BCF INTCON,T0IE
MOVLW SR_IDLE
MOVWF SR_MODE
CLRF SR_LEN
GOTO INTERRUPT_RET
;****************************************************************************
;function: Tmr1 interrupt subroutine
;input :
;output :
;occupy:
;****************************************************************************
Timer2Out:
BCF PIR1,TMR1IF
BTFSS T1CON,TMR1ON
GOTO INTERRUPT_RET
MOVLW 83H
MOVWF TMR1L
MOVLW 6DH
MOVWF TMR1H
DECFSZ TMR1_CNT
GOTO INTERRUPT_RET
BSF FLAG_T2OUT
BCF T1CON,TMR1ON ;定時器停止工作
BSF STATUS,RP0 ;bank1
CLRF PIE1
BCF STATUS,RP0 ;bank1
GOTO INTERRUPT_RET
;///////////////////////////////////////////////////////////////////////////////
; Interrupt Handler RIC
;///////////////////////////////////////////////////////////////////////////////
;**********************************************************
; 外部引腳中斷
;*********************************************************
SingleResponseIsr:
BTFSS INTCON,INTE
GOTO INTERRUPT_RET
BCF INTCON,INTF
BSF rc500_wr
BSF rc500_rd
BSF rc500_cs
MOVLW REGPAGE
MOVWF ADDRESS
CALL GETRC500
MOVF TEMP_DATA,W
MOVWF oldPageSelect ;保存原來頁面地址
SRI_0:
MOVLW RegPrimaryStatus;PAGE0
MOVWF ADDRESS
; MOVLW REGPAGE
; MOVWF VALUE
CALL GETRC500
; CALL ReadRC
MOVLW 08H
ANDWF TEMP_DATA,W
BTFSC STATUS,Z
GOTO SRI_EX
SRI_00:
MOVLW RegInterruptEn ;PAGE0
MOVWF ADDRESS
CALL GetRC500
MOVF TEMP_DATA,W
MOVWF irqBits
MOVLW RegInterruptRq
MOVWF ADDRESS
CALL GetRC500
MOVF TEMP_DATA,W
ANDWF irqBits,F
MOVF irqBits,W
IORWF MfIrqSource,F
;//************ LoAlertIRQ ******************
MOVF irqBits,W
ANDLW 0X01
BTFSC STATUS,Z
GOTO SRI_2
MOVLW RegFIFOLength
MOVWF ADDRESS
CALL GETRC500
MOVLW MFIFOLength
MOVWF INT_REG1
MOVF TEMP_DATA,W
SUBWF INT_REG1,F ;nbytes = MFIFOLength - ReadRawIO(RegFIFOLength)--INT_REG1 ;注意
MOVF MfBytesSend,W
SUBWF MfBytesToSend,W ;MfBytesToSend-MfBytesSend-->INT_REG2
MOVWF INT_REG2
MOVF INT_REG2,W
SUBWF INT_REG1,W ;MfBytesToSend-MfBytesSend<=nbytes
BTFSS STATUS,C
GOTO SRI1_1
SRI1_00:
MOVF INT_REG2,W ;MfBytesToSend-MfBytesSend<=nbytes
MOVWF INT_REG1 ;nbytes = MpIsrInfo->nBytesToSend - MpIsrInfo->nBytesSent
MOVLW RegInterruptEn
MOVWF ADDRESS
MOVLW 01H
MOVWF DAT3
CALL PUTRC500 ;disable LoAlertIRQ中斷請求
SRI1_1:
MOVF INT_REG1,W
MOVWF COUNT1
MOVLW SND_QUEUE ;發送的數據
; addWF MfBytesSend,W
MOVWF FSR
SRI11_0:
MOVF INDF,W
MOVWF DAT3
MOVLW RegFIFOData
MOVWF ADDRESS
CALL PUTRC500 ;發送數據到FIFODATA
incF FSR
incF MfBytesSend
DECFSZ COUNT1,F
GOTO SRI11_0
MOVLW 01H
MOVWF DAT3
MOVLW RegInterruptRQ
MOVWF ADDRESS
CALL PUTRC500
; //************* TxIRQ Handling **************
SRI_2:
MOVF irqBits,W
ANDLW 0X10
BTFSC STATUS,Z
GOTO SRI_3
MOVLW 10H
MOVWF DAT3
MOVLW RegInterruptRq
MOVWF ADDRESS
CALL PUTRC500
MOVLW 82H
MOVWF DAT3
MOVLW RegInterruptEN ;允許HiAlertIRQ中斷
MOVWF ADDRESS
CALL PUTRC500
MOVF MFCMD,W
XORLW PICC_ANTICOLL1
BTFSS STATUS,Z
GOTO SRI_3
MOVLW 02H
MOVWF VALUE
MOVLW RegChannelRedundancy ;PAGE4
MOVWF ADDRESS1
CALL WRITERC
MOVF 00H
IORLW 0X80
MOVWF DAT3
MOVLW REGPAGE
MOVF ADDRESS
CALL PUTRC500 ;還原為0頁面
; //************* HiAlertIRQ or RxIRQ Handling ******************
SRI_3:
MOVF irqBits,W
ANDLW 0X0E
BTFSC STATUS,Z
GOTO SRI_4
MOVLW RegFIFOLength
MOVWF ADDRESS
CALL GETRC500
MOVF TEMP_DATA,W
MOVWF COUNT1
MOVLW RCV_QUEUE ;接收數據
; addWF MfBytesReceived,W
MOVWF FSR
SRI3_0:
MOVLW RegFIFOData
MOVWF ADDRESS
CALL GETRC500 ;接收數據到FIFODATA
MOVF TEMP_DATA,W
MOVWF INDF
incF FSR
incF MfBytesReceived
DECFSZ COUNT1,F
GOTO SRI3_0
SRI30_1:
MOVLW 0AH
ANDWF irqBits,W
MOVWF DAT3
MOVLW RegInterruptRq
MOVWF ADDRESS
CALL PUTRC500
;//************** IdleIRQ Handling ***********
SRI_4:
MOVF irqBits,W
ANDLW 0X04
BTFSC STATUS,Z
GOTO SRI_5
MOVLW RegInterruptEN ;允許指定定時器中斷
MOVWF ADDRESS
MOVLW 20H
MOVWF DAT3
CALL PUTRC500
MOVLW RegInterruptRq
MOVWF ADDRESS
MOVLW 20H
MOVWF DAT3
CALL PUTRC500
MOVLW 0DFH
ANDWF irqBits,F
MOVLW 0dfh
ANDWF MfIrqSource,f
MOVLW RegInterruptRq
MOVWF ADDRESS
MOVLW 04H
MOVWF DAT3
CALL PUTRC500
; //************* TimerIRQ Handling ***********
SRI_5:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -