📄 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 + -