;=======================================================
; Проект 36. Приём по UART с эхо-ответом
; PIC16F628A, 4 МГц, 9600 бод
; RX — RB1, TX — RB2. Принятый байт возвращается обратно
; и его код показывается на светодиодах PORTA
;=======================================================
        LIST    p=16F628A
        #include <p16f628a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF & _MCLRE_ON & _CP_OFF

        cblock  0x20
        rxbyte
        endc

        ORG     0x000
        goto    Start

Start
        movlw   0x07
        movwf   CMCON
        bsf     STATUS,RP0
        movlw   .25
        movwf   SPBRG
        movlw   b'00100100'     ; TXEN, BRGH
        movwf   TXSTA
        clrf    TRISA           ; светодиоды
        bsf     TRISB,1
        bsf     TRISB,2
        bcf     STATUS,RP0
        movlw   b'10010000'     ; SPEN + CREN (приём разрешён)
        movwf   RCSTA
        clrf    PORTA

Main
        call    RxByte
        movwf   rxbyte
        movwf   PORTA           ; показываем код принятого символа
        movf    rxbyte,w
        call    TxByte          ; отправляем обратно
        goto    Main

;--- приём байта в W ---
RxByte
        btfsc   RCSTA,OERR      ; переполнение приёмника?
        goto    ClrErr
        btfss   PIR1,RCIF       ; байт принят?
        goto    RxByte
        movf    RCREG,w
        return
ClrErr
        bcf     RCSTA,CREN      ; сброс ошибки перезапуском приёмника
        bsf     RCSTA,CREN
        goto    RxByte

TxByte
        bsf     STATUS,RP0
TW      btfss   TXSTA,TRMT
        goto    TW
        bcf     STATUS,RP0
        movwf   TXREG
        return

        END
