⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.asm

📁 RFID功能中阅读器源代码,实现汽车的无钥匙进入功能
💻 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 + -