CR       EQU     0DH         ;Код возврата каретки (ASCII) 
LF       EQU     0AH         ;Код перевода строки 
ESC      EQU     1BH         ;Код операции ESC

 
       
        ORG 0000h
	    JMP start
         
        ORG 0023h
        RETI      
	
	    ORG 0100h

; Инициализация UART тут:
start:	MOV P2,#255         ; Все выводы на высокий уровень
        MOV IE,#0	       ; Прерывания отключаем нафиг, чтобы не мешались (далеко не везде и не всегда надо так!!!)
	    CLR EA              ; До кучи вообще запрещаем все прерывания.
        SETB ES            ; Но оставляем прерывание от UART (на всякий, один фиг оно пока не работает - EA Сброшен)
            
        MOV PCON,#80h      ; Устанавливаем бит удвоенной скорости, он расположен в регистре PCON
        CLR TR1            ; Сбрасываем флаг таймера = таймер готов к работе
        MOV TMOD,#20h      ; Настраиваем таймер 1 в режим 2 (автоперезагрузка значеня. Регистр TMOD определяет параметры таймера)
        MOV TH1,#0F5h      ; 9600 @ 20MHz  Прескалер таймера, определяющий, что порт будет выдавать 9600 бод на 20мгцовом тактовом кварце
        SETB TR1           ; Установили бит TR1 = запустили таймер
        MOV SCON,#52h      ; Uart Init and UART Ready - инициализация параметров UART 

;	тут мы тупо крутимся обрабатывая кнопочки.

LOOP:   	JB	P1.0,nxt1	; Проверяем наличие бита на ноге 1.0. Если бита нет, значит эта нога кнопкой прижата к земле = 0
		MOV     A,#'1'	; Кидаем код 1ки в аккумулятор и    
        	CALL    UART	; вызываем процедуру выдачи в уарт, которая отрыгнет этот код по порту.
		JNB	P1.0,$	; а тут мы торчим до тех пор пока не отпустят кнопку. 
		
nxt1:		JB	P1.2,nxt2	; аналогично, но для другой ножки порта.
		MOV	A,#'2'
		CALL	UART
		JNB	P1.2,$

nxt2:		JB	P1.4,nxt3
		MOV	A,#'3'
		CALL	UART
		JNB	P1.4,$

nxt3:		JB	P1.6,LOOP
		MOV	A,#'4'
		CALL	UART
		JNB	P1.6,$


		JMP		LOOP
;======= Proc ========================================
; Out Byte in UART    

UART:    JNB     TI,$        ;Ожидание готовности
         CLR     TI		; сброс флага готовности
         MOV     SBUF,A      ;Выдача символа в буффер UART 
         CALL 	DELAY		; вызов задержки
         CALL 	DELAY		; вызов задержки
         RET
;======================================================       
; Stupid Delay   Тупая регистровая задержка на куче вложенных циклов пустых. Лень было таймер загружать такой ботвой.
DELAY:  MOV R7,#255
ZD0:	MOV R6,#255
	    MOV R5,#255
ZD1:	DJNZ R6,ZD1
ZD2:	DJNZ R5,ZD2
    	DJNZ R7,ZD0
        RET


	   
        END