;=======================================================
; Проект 40. Приём ИК-пульта в коде RC5
; PIC16F84A, 4 МГц. Приёмник TSOP1736 -> RB0 (выход активен низким)
; Принятый номер команды выводится на RB1..RB7
;=======================================================
        LIST    p=16F84A
        #include <p16f84a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

#define IR      PORTB,0

        cblock  0x0C
        d1, bitcnt, cmd, addr, tmp
        endc

        ORG     0x000
        goto    Start

Start
        bsf     STATUS,RP0
        movlw   b'00000001'     ; RB0 — вход приёмника
        movwf   TRISB
        bcf     STATUS,RP0
        clrf    PORTB

Main
        call    RcRead
        movf    cmd,w
        rlf     cmd,w           ; сдвигаем, RB0 занят приёмником
        andlw   0xFE
        movwf   PORTB
        goto    Main

;--- приём посылки RC5: 14 бит, манчестер, бит 1,778 мс ---
RcRead
        ;--- ждём паузы между посылками ---
WaitIdle
        btfss   IR
        goto    WaitIdle

        ;--- ждём стартового фронта ---
WaitStart
        btfsc   IR
        goto    WaitStart

        call    Delay1200us     ; смещаемся в середину второй половины бита
        movlw   .13             ; после старт-бита осталось 13 бит
        movwf   bitcnt
        clrf    cmd
        clrf    addr
RcBit
        call    Delay1778us     ; шаг ровно на один бит
        bcf     STATUS,C
        btfss   IR              ; уровень в середине бита
        bsf     STATUS,C        ; низкий уровень = логическая единица
        rlf     addr,f          ; сдвигаем 14-битный кадр
        rlf     cmd,f
        decfsz  bitcnt,f
        goto    RcBit
        movlw   0x3F            ; оставляем 6 бит команды
        andwf   cmd,f
        return

Delay1200us
        movlw   .240
        movwf   d1
X12     nop
        nop
        nop
        decfsz  d1,f
        goto    X12
        return

Delay1778us
        movlw   .148
        movwf   d1
X17     nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        decfsz  d1,f
        goto    X17
        return

        END
