#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