; PROGRAM BUDE VYUZIVAT PRERUSENIA int0 A int1 a od seriovej linky
; na zaklade prerusenia bude zvysovat a znizovat index v reg. B v tabulke
; "tabulka" v ktorej su nastavene konstatnty ktore sa budu vysielat 
; na port P1
; nim sa da riadit napriklad zobrazovanie sedem segmentoveho cisla
; zaroven so zmenou indexu sa tento odosle do druheho pocitaca
; v ktorom sa pouzije na nastavenie indexu v susednom pocitaci
$mod2051
org 00H
ljmp program
org 0003H
push A
ljmp zvysuj   
; odpamataj A register 
; obsluha zvysovania indexu v tabulke
org 000BH
;cpl P3.7 
push A
ljmp zobraz 
; generuj zvuk na tomto bite
; odpamataj A register
; ZOBRAZENIE DISPLEJA ovlada casovac T0
org 0013H  
push A    
ljmp znizuj
; odpamataj A register 
; obsluha znizovania indexu v tabulke
org 0023H
push A
ljmp serlinka  
; odpamataj A register 
; obsluzenie prerusenia seriovej linky
org 100H
monitor: mov   A,#0FH    
anl     A,B 
mov   R4,A  
mov   A,#F0H    
anl     A,B 
swap A         
mov    R5,A 
ajmp monitor
; Znak v registri B menime tlacitkami.
; potom vsak nible separujeme do registrov
; do F4 ide spodny nible
;
;

; do F5 ide horny nible
org 200H  ; na zaciatku inicializacia seriovej linky
program:  mov scon,  #01010000b


                  
                  ;mod2 inicializacia seriovej linky
                   mov tmod, #00100010b             ;gate=0, C/~T -timer T1 mod 2, T0 mod 2
                   anl PCON, #7FH                       ;SCON=0 - zakladna frekvencia
                   mov TH1, #F3H                         ;baudrate 2400
                   mov TH0, #DFH                        ;casovac pre display max
                   mov tcon, #01010000b             ;start casovaca T1 a T0

                  ; nastavenie prerusovacieho systemu na citanie tlacitiek
                  mov IE,#10010111b                 ; povolime prerusenie serial,int1 a ti0 int0
                  SETB IT0                                 ; dovod prerusenia prechod 1 na 0 na int0
                  SETB IT1                                 ; prechod 1 na 0 na int1

                 mov B,#07H                              ; inicializacia hodnoty indexu v tabulke
                 mov DPTR,#tabulka                   ; adresa bazy tabulky

                setb P3.5                                     ; zhasni lavy displej
                setb P3.4                                     ; zhasni pravy displej
                ajmp monitor                               ; nekonecny cyklus

                                                      ; sedemsegmentovka riadena inverznymi bitmi
                                                      ; x g f e d c b a
tabulka:    db 0C0H ;      R4=0         1 1 0 0 0 0 0 0                a
                db 0F9H ;      R4=1         1 1 1 1 1 0 0 1            f       b
                db 0A4H ;      R4=2         1 0 1 0 0 1 0 0              g
                db 0B0H ;      R4=3         1 0 1 1 0 0 0 0         e       c
                db 099H ;      R4=4          1 0 0 1 1 0 0 1            d
                db 092H ;      R4=5          1 0 0 1 0 0 1 0
                db 082H ;      R4=6          1 0 0 0 0 0 1 0
                db 0F8H ;      R4=7          1 1 1 1 1 0 0 0
                db 080H ;      R4=8          1 0 0 0 0 0 0 0
                db 090H ;      R4=9          1 0 0 1 0 0 0 0
                db 088H ;      R4=10   A  1 0 0 0 1 0 0 0
                db 083H ;      R4=11   b   1 0 0 0 0 0 1 1
                db 0C6H ;     R4=12   C   1 1 0 0 0 1 1 0
                db 0A1H ;     R4=13   d    1 0 1 0 0 0 0 1
                db 086H ;      R4=14   E   1 0 0 0 0 1 1 0
                db 08EH ;      R4=15   F   1 0 0 0 1 1 1 0
                db 0B6H ;      R4=16        1 0 1 1 0 1 1 0 spec znak
                                    ; R5 respektive

zobraz:      cpl 01H                                       ; bit bitoveho pola bude prepinacom displeja
                 jnb 01H,doR5                             ; priznak 1 TRUE zobraz R5
                setb P3.5                                     ; inak zobraz R4 => zhasneme R5
                mov A,#10H                                 ; spec znak /// na pozicii 16dek
                jnb P3.7,fin1                                 ; pri stlaceni P3.7 zhasni - TEST
                mov A,R4                                     ; inak ries zobrazenie R4
     fin1:     movc A,@A+DPTR                     ; vyber font
                mov P1,A                                     ; odosli font na display
                clr P3.4                                         ; rozsviet pravy display
                mov TH0, #7FH                           ;casovac pre display max
                pop A
                reti
  doR5:    setb P3.4 ; zhasni R4
                mov A,#10H                                 ; spec znak /// na pozicii 16dek
                jnb P3.7,fin2                                 ; pri stlaceni P3.7 zhasni -TEST
                mov A,R5                                     ; pozicia v tabulke
    fin2:     movc A,@A+DPTR                     ; vyber font
                mov P1,A                                     ; odosli font na display
                clr P3.5                                         ; rozsviet lavy display
                mov TH0, #7FH                             ;casovac pre display max - teraz autoload rezim
                pop A
                reti

serlinka:    jnb TI, doRI                                 ; riesime prijatie dat
                clr TI
                pop A                                           ; odoslanie dat ignoruj
                reti
doRI:        mov A, SBUF                             ; vyzdvihni dosly znak
                clr RI                                           ; zrus priznak
                mov B, A                                     ; zmen vypisovane znaky
                pop A
                reti

odosli:       mov B,SBUF                              ; pozor vynimka ! B>>SBUF Hodnotu posli do susedneho pocitaca
                jnb TI,$                                       ; cakaj na riadku a testuj priznak odoslania
                clr TI                                           ; data boli odoslane - vynulujeme priznak
                ret

zvysuj:      inc B                                             ; zvys o 1 obsah pocitadla v B registri
                call odosli                                     ; odosli stav seriovou linkou
                pop A                                           ; obnov register A 
                reti                                                ; ukonci obsluhu prerusenia

znizuj:       dec B                                           ; zvys o 1 obsah pocitadla v B registri
                call odosli                                     ; odosli stav seriovou linkou
                pop A                                          ; obnov register A 
                reti                                               ; 

                 ; pauza vytvorena vytvorenim  R1 * R2 * R3 cyklov tohto podprogramu
pauza:       mov r1, #001h                             ; Nastav 1. parameter
 cykl3:       mov r2, #0Afh                             ; Nastav 2. parameter
 cykl2:       mov r3, #0ffh                               ; Nastav 3. parameter
 cykl1:      djnz r3, cykl1                                ; Zopakuj cykl1 pokial R3<>0
                djnz r2, cykl2                                ; Zopakuj cykl2 pokial R2<>0
                djnz r1, cykl3                                ; Zopakuj cykl3 pokial R1<>0
                ret                                                 ; Skonci po R1*R2*R3 cykloch

END