📄 main.asm
字号:
-------------------------
;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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -