------------------------- ;A2:LFDATA ;A3 ;A4:UNLOCK ;A5:LOCK ------------------------- #include Project.inc #include Delay.inc #include RF_TX.inc #include EEPROM.inc #include SPI.inc #include LF_ChargeHandler.inc #include Button_Handler.inc ;#define Button_Change .0 #define LF_Signal .2 #define UNLOCK .4 #define LOCK .5 #define IDLE .6 #define RF_Start .7;用于在一次射频信号发射后再次发射该信号的许可,两次之间有了合适的延时,此位就会被置为1 #define TIMEOUT 0x30 u_3 udata PORTA_LAST res .1 PORTA_NOW res .1 Button_Counter res .1 Button_Old res .1 Button_New res .1 u_1 udata_shr;开始目标文件中共享的未初始化的数据段 W_TEMP res .1 STATUS_TEMP res .1 PCLATH_TEMP res .1 FSR_TEMP res .1 7 6 5 4 3 2 1 0 EVENT_REG res .1 ;事件标志寄存器 RF_Start IDLE LOCK UNLOCK NU LF_Signal NU NU IDEL_COUNTER res .1; BUTTON_DELAY res .1 flag_ovr udata_ovr flag res .1;用于标志处于按键去抖动中 ------------------------------------- ;RESET ------------------------------------- RESET code 0x00 goto MAIN ------------------------------------- ;INTERRUPT ------------------------------------- INT code 0x04 movwf W_TEMP movf STATUS,w clrf STATUS movwf STATUS_TEMP movf PCLATH,w movwf PCLATH_TEMP movf FSR,w movwf FSR_TEMP goto INTERRUPT_SERVE_ROUTINE INTERRUPT_SERVE_ROUTINE TIMER0_INT btfss INTCON,T0IE goto TIMER1_INT btfss INTCON,T0IF goto TIMER1_INT ;isr bcf INTCON,T0IF goto EndIsr TIMER1_INT;用来做空闲状态倒计时的延时/按键消抖动的延时 banksel PIE1 btfss PIE1,TMR1IE goto PORTA_INT banksel PIR1 btfss PIR1,TMR1IF goto PORTA_INT decf IDLE_COUNTER,f btfsc STATUS,Z bsf EVENT_REG,IDLE;空闲状态倒计时延时时间到,置位空闲标志,空闲任务会在主循环得到处理 banksel flag btfss flag,.4 ;按键消抖动标志是否置位 goto Button_Timer1;一次按键会有连续多次相同的信号发出,以提高可靠性,这些多次传送的信号之间也要有时间间隔 banksel Button_Counter decfsz Button_Counter,f goto Button_Timer1 banksel PORTA ;消抖动时间到,再次读取(在中断中已经初步读取过一次)按键口PORTA的状态,此时按键的变化在能真正置位事件标志 movf PORTA,w banksel Button_New movwf Button_New xorwf Button_Old,w ;按键变化位为1,按键不变位0 andwf Button_Old,w andlw 0x30;只要检测RA4(UNLOCK),RA5两个口(LOCK) iorwf EVENT_REG ;设置事件标志 btfsc STATUS,Z goto $+.3 ;没有任何事件发生,不复位TIMEOUT movlw TIMEOUT movwf IDLE_COUNTER movf Button_New,w movwf Button_Old banksel flag bcf flag,.4 Button_Timer1 decfsz Button_Delay,f goto End_Timer1 bsf EVENT_REG,RF_Start End_Timer1 banksel PIR1 bcf PIR1,TMRIF goto PORTA_INT PORTA_INT btfss INTCON,RAIE goto EndIsr btfss INTCON,RAIF goto EndIsr banksel PORTA movf PORTA,w andlw 0x34;检测 A2(LF_Signal),A4(UNLOCK),A5(LOCK)口的变 ,banksel PORTA_NOW movwf PORTA_NOW xorwf PORTA_LAST,w andlw 0xFB;检测除了LF_Signal外,是否有普通RKE按键 btfss STATUS,Z;没有普通RKE按键则间跳 goto Is_Button btfss PORTA_NOW,LF_Signal ;检测是否有低频信号进来 goto END_PORTA bsf EVENT_REG,LF_Signal goto END_PORTA Is_Button movlw 0x02 banksel Button_Counter movwf Button_Counter banksel flag banksel flag,.4 ;置位消抖动的标志 END_PORTA banksel PORTA_NOW movf PORTA_NOW,w movwf PORTA_LAST movlw TIMEOUT movwf IDLE_COUNTER bcf INTCON,RAIF goto EndIsr EndIsr clrf STATUS movf FSR_Temp,w movwf FSR movf PCLATH_TEMP,w movwf PCLATH ;Restore PCLATH movf STATUS_TEMP,w movwf STATUS ;Restore STATUS swapf W_TEMP,f swapf W_TEMP,w ;Restore W without corrupting STATUS bits RETFIE