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