; ============================================================================
; Иннициализация последовательного порта
serial_init:       ;01010010b
    mov      SCON, #01010010b ; #11011010b
;                   X   X
; 7, 6:  режим работы последовательного порта
; 5: управление режимом UART, устанавливается для запрета приёма сообщения, в котором девятый бит равен 0
; 4: разрешение приёма, 1, если прием разрешен
; 3: девятый бит передаваемых данных в режимах 2, 3
; 2: девятый бит принятых данных в режимах 2, 3 (устанавливается аппаратно)
; 1: флаг прерывания передатчика, устанавливается аппаратно при окончании передачи байта. Сбрасывается программно после обслуживания прерывания
; 0: флаг прерывания приемника, устанавливается аппаратно при приёме байта. Сбрасывается программно после обслуживания прерывания
;  режимы:
; 00 - сдвиговый регистр, частота приема/передачи f/12
; 01 - 8 bit UART, частота приема/передачи определяется частотй переполнения TC1
; 10 - 9 bit UART, частота приема/передачи f/64 или, f/32
; 11 - 9 bit UART, частота приема/передачи определяется частотй переполнения TC1
    mov      TMOD, #00100001b    ; режима автозагрузки таймера T/C1 (!!! тут же устанавливаем режим таймера для T/C0)
; 7:     разрешает управлять таймером-счетчиком-1 (TC1) от внешнего ввода INT1, если 1
; 6:     если 1, то TC1 работает в режиме счетчика внешних событий. иначе - таймером
; 5, 4:  режим работы TC1
; 3:     разрешает управлять таймером-счетчиком-0 (TC0) от внешнего ввода INT0, если 1
; 2:     если 1, то TC0 работает в режиме счетчика внешних событий. иначе - таймером
; 1, 0:  режим работы TC0
    mov      TH1, #11110011b   ; 2400 bod
    setb     TR1               ; пуск таймера
    ret

; ============================================================================
; выдача символа в последовательный порт из регистра A
serial_send:
    mov      C, P                     ; пересылка контрольного бита из флага
    mov      TB8, C                   ; паритета в SCON.3
serial_send_wait:
    jnb      TI, serial_send_wait     ; ожидание окончания передачи
    clr      TI                       ; очистка флага передачи
    mov      SBUF, A                  ; выдача символа
    lcall    count_and_inverse_hl
    ret

; ============================================================================
; чтение символа из последовательный порта в регистр A
serial_read:
    jnb      RI, serial_read          ; ожидание завершения приёма
    clr      RI                       ; очистка флага приёма
    mov      A, SBUF                  ; загрузка принятого байта данных в A
    mov      C, RB8                   ; загрузка контрольного бита в C
    lcall    count_and_inverse_hl
    ret

