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

📄 lf_rx.asm

📁 RFID功能中阅读器源代码,实现汽车的无钥匙进入功能
💻 ASM
字号:
#include Project.inc
;#include Delay.inc
;#include SPI.inc
;#include AFE_639.inc

#define LF.PORT PORTC
#define LF.PIN .3
#define LFDATA LF.PORT,LF.PIN
udata
LF.Buffer res 1
LF.Counter res 1
LF.Parity res 1
Time res 1
   code
    global LF.ReceiveByte
------------------------------------
;从AFE上读取一个字节的数据,该数据采用的是脉冲位置调制。存放进w,Z=0表示成功,反之失败
;  --------------           ---            ------------|                    |-- 
;  |            |           |              |           |                    |
;  |  250us     |   250us   |    表示"1"   |    250us  |      500us         |    表示 "0"
;  |            |------------              |           |--------------------|
------------------------------------
LF.ReceiveByte
   banksel OPTION_REG
   movlw 0x02;分频1/8
   movwf OPTION_REG
   banksel TMR0
   clrf TMR0
   banksel LF.Buffer
   clrf LF.Buffer
   clrf LF.Parity
   banksel INTCON
   bcf INTCON,T0IF
   movlw .8
   movwf LF.Counter
ReceiveNext
	call	LF.DetectFalling
	btfsc	STATUS,Z
	retlw	0x00;Z=1,在允许时间内没有检测到下降边沿
ReceiveNext2
	call	LF.DetectRising
	btfsc	STATUS,Z
	goto	Return.Fail
	btfsc	INTCON,T0IF
	goto	Return.Fail
	movlw	0x9C			; 在156us*4=625uS处是判断'0'还是'1'最好的点
	subwf	Time,w
	banksel LF.Buffer	
	movf	LF.COUNTER,w
	btfsc	STATUS,Z
	goto	ParityCheck;LF.Counter=0,进行奇校验
	btfss	STATUS,C
	incf	LF.Parity,f;C=0,time<625us,收到"1"
	rrf		LF.Buffer,f		; Rotate bit received bit, now in carry, into receive buffer
;	banksel LF.COUNTER
	decf	LF.COUNTER, f		; Decrement receive count register by one
	goto	ReceiveNext		; ... no, then receive next bit
ParityCheck
	btfss	STATUS,C
	goto	Receive.ParityOne
	goto	Receive.ParityZero
Receive.ParityOne ;奇校验
	btfss	LF.Parity,0
	goto	Receive.Success
	goto	Return.Fail
Receive.ParityZero
	btfsc	LF.Parity,0
	goto	Receive.Success
	goto	Return.Fail
;	banksel LF.Buffer
Receive.Success
	movf 	LF.Buffer,w		; Move received data byte into WREG
	bcf		STATUS,Z
	return    
------------------------------------
;检测LF信号的上升沿
;Z=0表示成功检测到,z=1表示失败
------------------------------------
LF.DetectRising 
    banksel Counter;消去抖动计数器
    movlw .5
    movwf Counter
    movlw .200
	banksel TMR0
	subwf	TMR0,w							
	btfsc	STATUS,C
	goto	Return.Fail	 ;超过了一个位时间电平最大允许持续的时间800us					
	btfsc	INTCON,T0IF						
	goto	Return.Fail ;TMR0不允许发生溢出
LF.DetectRising.Debounce
    banksel LF.PORT
    btfss LFDATA
    goto LF.DetectRising
    banksel Counter
    decfsz Counter,f
    goto LF.DetectRising.Debounce
    banksel TMR0
    movf TMR0,w
    clrf TMR0
    banksel Time
    movwf Time
    bcf STATUS,Z
    return
Return.Fail    
    bsf STATUS,Z
    return
------------------------------------
;检测LF信号的下降沿
;Z=0表示成功检测到,z=1表示失败
------------------------------------
LF.DetectFalling 
    banksel Counter;消去抖动计数器
    movlw .5
    movwf Counter
    movlw .75
	banksel TMR0
	subwf	TMR0,w							
	btfsc	STATUS,C
	goto	Return.Fail	 ;超过了高低电平最大允许持续的时间300us					
	btfsc	INTCON,T0IF						
	goto	Return.Fail ;TMR0不允许发生溢出
LF.DetectFalling.Debounce
    banksel LF.PORT
    btfsc LFDATA
    goto LF.DetectFalling
    banksel Counter
    decfsz Counter,f
    goto LF.DetectFalling.Debounce
    banksel TMR0
    movf TMR0,w
    ;clrf TMR0
    banksel Time
    movwf Time
    bcf STATUS,Z
    return
     END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -