; 7/20/2006 BBang51.ASM: 8051 Firmware UART, 9600 bps @ 12 MHz; PC=HyperTerminal


RX      bit     P1.7
TX      bit     P1.6
LED     bit     P3.7

XMTREG  equ     R2
RCVREG  equ     R3
COUNT   equ     R4

   ORG     00H
;------------------------------------------------
        MOV     SP, #30H        ; setup STACK
        SETB    RX              ; \ initialize
        SETB    TX              ; /
        CLR     LED             ; LED=ON
        CALL    DLY52us

        MOV     A, #58H         ; 'X'
        MOV     XMTREG, A
AGAIN:
        CALL    XMT_CHR
        CALL    DLY52us
        CALL    RCV_CHR
        MOV     A, RCVREG
        MOV     XMTREG, A
        JMP     AGAIN
;-------------------------------------------------------------------
XMT_CHR:
        CLR     TX              ; STARTBIT='0'
        CALL    DLY52us
        CALL    DLY52us
        MOV     A, #8
        MOV     COUNT, A
NEXT2:
        MOV     A, XMTREG
        RRC     A               ; --> carry
        JNC     NEXT1
        SETB    TX              ; CARRY = '1'
        JMP     THERE
NEXT1:
        CLR     TX              ; CARRY = '0'
THERE:
        MOV     XMTREG, A       ; SAVE
        CALL    DLY52us
        CALL    DLY52us
        DJNZ    COUNT, NEXT2
STOPBIT:
        SETB    TX
        CALL    DLY52us
        CALL    DLY52us
        RET
;-----------------------------------------------------------------
RCV_CHR:

wait:   JB      RX, wait         ; if RX='1', wait for StartBit
        call    DLY52us
        MOV     A, #8            ; 7/21/2006  can't be 9!
        MOV     COUNT, A
NXR2:
        call    DLY52us          ; StartBit is over...

        call    DLY52us          ; in Mid of another new Bit time
        JB      RX, NXR1         ; if RX='1', goto NXR1
        CLR     C
        MOV     A, RCVREG
        RRC     A                ; store '0' in RCVREG
        JMP     THERE1
NXR1:
        SETB    C
        MOV     A, RCVREG
        RRC     A                ; store '1' in RCVREG
THERE1:
        MOV     RCVREG, A        ; save
        DJNZ    COUNT, NXR2
        RET
;-------------------------------------------------------
; 7/21/2006 Actually 49us

DLY52us:
        MOV     A, #22          ; 1
LOOP:
        DJNZ    ACC, LOOP       ; 2 * 22 = 44
        RET                     ; 2 + 2 = 4  (Call=2)
;------------------------------------------------------
   END
