;Program: Monitor událostí v čase
;*******************************************************************************
        LIST P = 16F84, R = DEC
        #INCLUDE <P16F84.INC>
;-------------------------------------------------------------------------------
       ORG       H'2100'
 DE 4,10,10,4,0,0,0,0 
;------------------------------------------------------------------------------- 
 __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;*******************************************************************************
RAM     EQU     H'0C'
RBF     EQU     RAM
RBF1    EQU     RAM+1
NUM     EQU     RAM+2
NUM1    EQU     RAM+3
TMP     EQU     RAM+4
TM1     EQU     RAM+5
TM2     EQU     RAM+6

JEDN    EQU     RAM+7
DES     EQU     RAM+8
HOD     EQU     RAM+9
MIN     EQU     RAM+10
SEC     EQU     RAM+11
POM     EQU     RAM+12
ADRDD   EQU     RAM+13
HEX     EQU     RAM+14
TMR     EQU     RAM+15
MEM_W   EQU     RAM+16
MEM_S   EQU     RAM+17

ADRTX   EQU     RAM+18
TM0     EQU     RAM+19                             
ADRES   EQU     RAM+20

TPL     EQU     RAM+21
b_A1    EQU     RAM+22
b_A2    EQU     RAM+23
b_A3    EQU     RAM+24
b_A4    EQU     RAM+25
b_B1    EQU     RAM+26
b_B2    EQU     RAM+27
b_B3    EQU     RAM+28
b_C1    EQU     RAM+29
b_C2    EQU     RAM+30
b_C3    EQU     RAM+31
b_C4    EQU     RAM+32
b_X1    EQU     RAM+33
b_X2    EQU     RAM+34
b_X3    EQU     RAM+35
T_H     EQU     RAM+36
T_L     EQU     RAM+37
T_H1    EQU     RAM+38
T_H2    EQU     RAM+39
T_L1    EQU     RAM+40
T_L2    EQU     RAM+41
T_HL1   EQU     RAM+42
T_HL2   EQU     RAM+43

T_BIT   EQU     RAM+44


#define Q       PORTB,0
#define RS      PORTB,1 
#define RW      PORTB,2
#define E       PORTB,3
#define BF      RBF,3
#define ZVUK    PORTB,4
#define A4      PORTA,4
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        ORG     0
        GOTO    START
        ORG     4
;*******************************************************************************
;PODPROGRAMY
;*******************************************************************************
INTR    MOVWF   MEM_W           ;úschova registru W
        SWAPF   STATUS,W
        MOVWF   MEM_S           ;úschova registru STATUS

        BCF     STATUS,RP0      ;banka 0
        NOP                     ;vyrovnání času
        NOP
        NOP
        NOP
        NOP
        MOVLW   100
        MOVWF   TMR0            ;časový registr TMR0 = 100

        INCF    TMR,F           ;registr TMR + 1
        MOVFW   TMR
        XORLW   100
        BTFSS   STATUS,Z        ;je registr TMR=100 nebo-li uplynula 1 sekunda?
        GOTO    CAS_1           ;ne,proveď skok na návěští CAS_1

        CLRF    TMR             ;ano,vynuluj registr TMR

        INCF    SEC,F           ;registr sekund (SEC) + 1
        MOVFW   SEC
        XORLW   60
        BTFSS   STATUS,Z        ;je SEC = 60?
        GOTO    CAS             ;ne,proveď skok na návěští CAS

        BSF     T_BIT,0         ;nastavení bitu uplynulé minuty
        CLRF    SEC             ;ano,vynuluj sekundy
        INCF    MIN,F           ;registr minut (MIN) + 1
        MOVFW   MIN
        XORLW   60
        BTFSS   STATUS,Z        ;je MIN = 60?
        GOTO    CAS             ;ne,proveď skok na návěští CAS
        
        CLRF    MIN             ;ano,vynuluj minuty
        INCF    HOD,F           ;registr hodin (HOD) + 1
        MOVFW   HOD
        XORLW   24
        BTFSC   STATUS,Z        ;je HOD = 24?
        CLRF    HOD             ;ano,vynuluj hodiny
        
        MOVFW   HOD
        MOVWF   EEDATA
        CALL    SAVE            ;úschova aktuální hodiny
        INCF    EEADR,F         ;adresa paměti EEPROM + 1
        MOVFW   TPL
        MOVWF   EEDATA
        CALL    SAVE            ;úschova aktuálního času
        INCF    EEADR,F         ;adresa paměti EEPROM + 1


CAS     MOVLW   132             ;nastavení adresy displeje DDRAM
        CALL    Z_CAS           ;zobrazení času
        
        MOVLW   197             ;nastavení adresy DDRAM
        CALL    Z_TPL           ;zobrazení teploty
        
        BTFSC   EEADR,6         ;je paměť EEPROM již plná?
        GOTO    $-0             ;ano,tak dělej věčnou smyčku
        
CAS_1   BCF     INTCON,T0IF     ;vynulování bitu přerušení

        SWAPF   MEM_S,W
        MOVWF   STATUS          ;obnova registru STATUS
        SWAPF   MEM_W,F
        SWAPF   MEM_W,W         ;obnova registru W

        RETFIE

;*******************************************************************************
INILCD  CALL    t15mS           ;doba 15 milisekund
        BCF     RS
        BCF     RW
        CALL    A_OUT           ;port A výstup
        BSF     E
        MOVLW   B'00000011'
        MOVWF   PORTA
        BCF     E
        CALL    t4mS            ;doba 4 milisekund
        BSF     E
        MOVLW   B'00000011'
        MOVWF   PORTA
        BCF     E
        CALL    t100uS          ;doba 100 mikrosekund
        BSF     E
        MOVLW   B'00000011'
        MOVWF   PORTA
        BCF     E
        CALL    t100uS          ;doba 100 mikrosekund
        MOVLW   B'00101000'
        CALL    WRPRI           ;4.bitová komunikace a dva řádky
        MOVLW   B'00001000'
        CALL    WRPRI           ;displej OFF
        MOVLW   B'00001100'
        CALL    WRPRI           ;displej ON, kurzor OFF, blikání OFF
        MOVLW   B'00000110'
        CALL    WRPRI           ;inkrementace, normální operace
        MOVLW   1
        CALL    WRPRI           ;reset displeje
        RETURN
;-------------------------------------------------------------------------------
WRDATA  BSF     RS              ;nastavení bitu RS pro zápis dat
        GOTO    $+2
WRPRI   BCF     RS              ;nastavení bitů RS a RW pro zápis příkazu
        BCF     RW
        MOVWF   TMP             ;číslo příkazu nebo data do registru TMP
        CALL    A_OUT           ;portA jako výstup
        SWAPF   TMP,W           ;horní 4 bity do registru W
        BSF     E
        MOVWF   PORTA           ;zápis 4 horních bitů do displeje
        BCF     E
        MOVFW   TMP             ;obsah registru TMP do registru W
        BSF     E
        MOVWF   PORTA           ;zápis dolních 4 bitů do displeje
        BCF     E
        CALL    T_BF            ;testování bitu BF
        RETURN
;------------------------------------------------------------------------------- 
RDDATA  CALL    WRPRI           ;nastavení čtené adresy
        CALL    A_IN            ;port A vstup 
        BSF     RS
        BSF     RW
        BSF     E
        MOVFW   PORTA
        MOVWF   NUM             ;jedna půlka dat do registru NUM
        SWAPF   NUM,F
        BCF     E
        MOVLW   B'11110000'
        ANDWF   NUM,F           ;úprava registru NUM
        BSF     E
        MOVFW   PORTA
        MOVWF   NUM1
        BCF     E
        MOVLW   B'00001111'
        ANDWF   NUM1,W
        IORWF   NUM,F           ;druhá půlka dat do registru NUM
        CALL    T_BF            ;čeká konec operace
        RETURN
;-------------------------------------------------------------------------------
T_BF    BCF     RS              ;podprogram testuje konec operace (bit BF)
        BSF     RW
        CALL    A_IN            ;portA vstup (po ukončení zase výstup)
        BSF     E
        MOVFW   PORTA
        MOVWF   RBF
        BCF     E
        NOP
        BSF     E
        MOVFW   PORTA
        MOVWF   RBF1
        BCF     E
        BTFSC   BF              ;je bit BF=0 ? (0 = konec operace)
        GOTO    $-10            ;ne - testuj znova
;-------------------------------------------------------------------------------
A_OUT   MOVLW   B'11110000'     ;pin A0/A3 výstup, pin A4 vstup
        GOTO    $+2
A_IN    MOVLW   B'11111111'     ;pin A0/A7 vstup
        BSF     STATUS,RP0      ;banka 1
        MOVWF   TRISA           ;nastavení portu A
        BCF     STATUS,RP0      ;banka 0
        RETURN
;*******************************************************************************

t15mS   MOVLW   246             ;doba 15 milisekund
        GOTO    $+2
t4mS    MOVLW   66              ;doba 4 milisekund
        MOVWF   TM1
        MOVLW   19
        MOVWF   TM2
        DECFSZ  TM2,F
        GOTO    $-1
        DECFSZ  TM1,F
        GOTO    $-5
        RETURN
;-------------------------------------------------------------------------------
t100uS  MOVLW   33              ;doba 100 mikrosekund
        MOVWF   TM1
        DECFSZ  TM1,F
        GOTO    $-1
        RETURN

;*******************************************************************************
t500mS  CLRF    TM2             ;doba 500 milisekund
        CLRF    TM1
        NOP
        DECFSZ  TM1,F
        GOTO    $-2
        NOP
        DECFSZ  TM1,F
        GOTO    $-2
        DECFSZ  TM2,F
        GOTO    $-7
        RETURN
        
;*******************************************************************************
PIP     MOVLW   30              ;pípnutí při stisku klávesy
        MOVWF   TM2
        BSF     ZVUK
        CALL    PIP1
        BCF     ZVUK
        CALL    PIP1
        DECFSZ  TM2,F
        GOTO    $-5
        RETURN
;-------------------------------------------------------------------------------
PIP1    MOVLW   100
        MOVWF   TM0
        MOVLW   150
        MOVWF   TM1
        DECFSZ  TM1,F
        GOTO    $-1
        DECFSZ  TM0,F
        GOTO    $-1
        RETURN
        
;*******************************************************************************
TEXT    MOVWF   ADRTX           ;zápis začátku adresy textu
        CALL    KOD
        MOVWF   POM             ;úschova registru W
        MOVF    POM,F
        BTFSC   STATUS,Z        ;je registr W=0?
        RETURN                  ;ano,konec podprogramu
        CALL    WRDATA          ;ne,tiskni znak
        INCF    ADRTX,F         ;adresa textu + 1
        MOVFW   ADRTX
        GOTO    $-8             ;proveď skok

;*******************************************************************************
CZ      CLRF    EEADR           ;zápis češtiny do CG RAM
        MOVLW   B'01000000'
        CALL    WRPRI
        BSF     STATUS,RP0
        BSF     EECON1,RD
        BCF     STATUS,RP0
        MOVFW   EEDATA
        CALL    WRDATA
        INCF    EEADR,F
        BTFSS   EEADR,4
        GOTO    $-7
        RETURN        
;*******************************************************************************        
PREVOD  MOVLW   48
        MOVWF   DES             ;registr DES=48
        MOVWF   JEDN            ;registr JEDN=48
        MOVLW   10
        SUBWF   NUM,W           ;W=NUM-10
        BTFSS   STATUS,C        ;došlo k podtečení?
        GOTO    $+4             ;ano,proveď skok
        MOVWF   NUM             ;obsah W do NUM
        INCF    DES,F           ;registr DES + 1
        GOTO    $-6             ;odečítej znova
        MOVFW   NUM
        ADDWF   JEDN,F          ;zbytek přičíst do registru JEDN
        RETURN

;*******************************************************************************
PREV_X  MOVWF   POM             ;úschova adresy DDRAM
        CALL    RDDATA          ;načtení čísla z adresy DDRAM do NUM
        CLRF    HEX             ;vynulování registru HEX
        MOVLW   47
        SUBWF   NUM,F           ;registr NUM=NUM-47

        DECF    NUM,F           ;registr NUM-1
        BTFSC   STATUS,Z        ;je NUM=0?
        GOTO    $+4             ;ano,proveď skok
        MOVLW   10              ;ne
        ADDWF   HEX,F           ;registr HEX=HEX+10
        GOTO    $-5             ;a znova dokola

        INCF    POM,W           ;uschovaná adresa DDRAM+1
        CALL    RDDATA          ;načtení čísla z adresy DDRAM do NUM
        MOVLW   47
        SUBWF   NUM,F           ;registr NUM=NUM-47

        DECF    NUM,F           ;registr NUM-1
        BTFSC   STATUS,Z        ;je NUM=0?
        GOTO    $+3             ;ano,proveď skok
        INCF    HEX,F           ;ne,registr HEX=HEX-1
        GOTO    $-4             ;a znova dokola

        MOVFW   HEX             ;obsah HEX do W
        RETURN

;*******************************************************************************
Z_CAS   CALL    WRPRI           ;dle obsahu registru W nastaví adresu displeje DDRAM
        MOVFW   HOD
        MOVWF   NUM             ;obsah registru hodin do NUM
        CALL    PREVOD          ;převod na dekadické číslo
        CALL    ZOBR

        MOVFW   MIN
        MOVWF   NUM             ;obsah registru minut do NUM
        CALL    PREVOD          ;převod na dekadické číslo
        CALL    ZOBR_1

        MOVFW   SEC
        MOVWF   NUM             ;obsah registru sekund do NUM
        CALL    PREVOD          ;převod na dekadické číslo
        CALL    ZOBR_1

        RETURN

;-------------------------------------------------------------------------------
        
Z_TPL   CALL    WRPRI           ;dle obsahu registru W nastaví adresu displeje DDRAM
Z_TPL1  BTFSS   TPL,7           ;je teplota pod bodem mrazu?
        GOTO    $+7             ;ne,jdi o sedm instrukcí dolu
        MOVLW   45
        CALL    WRDATA          ;tiskni znak "-"
        MOVFW   TPL
        MOVWF   NUM
        BCF     NUM,7           ;přenos do registru NUM a vynulování záporného bitu
        GOTO    $+5             ;jdi na převod
        MOVLW   43
        CALL    WRDATA          ;tisk znaku "+"
        MOVFW   TPL
        MOVWF   NUM             ;přenos z registru TPL do registru NUM
        CALL    PREVOD          ;převod do dekadické soustavy
        CALL    ZOBR            ;zobrazení dvojčíslí
        MOVLW   8
        CALL    WRDATA          ;tisk uživatelského znaku "°"
        MOVLW   67
        CALL    WRDATA          ;tisk písmene "C"
        RETURN                
;-------------------------------------------------------------------------------                        

ZOBR_1  MOVLW   58
        CALL    WRDATA          ;tisk dvojtečky

ZOBR    MOVFW   DES
        CALL    WRDATA          ;tisk desítek
        MOVFW   JEDN
        CALL    WRDATA          ;tisk jednotek

        RETURN

;*******************************************************************************
TISK    MOVFW   ADRDD
        CALL    WRPRI           ;nastavení adresy displeje DDRAM
        MOVFW   NUM
        CALL    WRDATA          ;tisk znaku z registru NUM
        RETURN
;*******************************************************************************

ZOBR_R  MOVFW   ADRES      
        MOVWF   NUM             ;obsah registru ADRES do registru NUM
        CALL    PREVOD          ;převod NUM na dekadické číslo
        CALL    ZOBR            ;zobrazí dvojčíslí

        MOVLW   32
        CALL    WRDATA          ;tisk mezery
        MOVLW   42
        CALL    WRDATA          ;tisk hvězdičky
        MOVLW   32
        CALL    WRDATA          ;tisk mezery
        
        MOVFW   ADRES           ;EEADR = (ADRES+ADRES) + 6
        ADDWF   ADRES,W
        MOVWF   POM
        MOVLW   6
        ADDWF   POM,W
        MOVWF   EEADR
        
        CALL    LOAD            ;číslo z adresy EEPROM do registru NUM
        CALL    PREVOD          ;obsah NUM se převede na jednotky a desítky hodin
        CALL    ZOBR            ;zobrazíme jednotky a desítky hodin
        
        MOVLW   104
        CALL    WRDATA          ;tisk znaku "h"
        MOVLW   111
        CALL    WRDATA          ;tisk znaku "o"
        MOVLW   100
        CALL    WRDATA          ;tisk znaku "d"
        MOVLW   32
        CALL    WRDATA          ;tisk mezery
        
        INCF    EEADR,F         ;adresa EEPROM + 1
        CALL    LOAD            ;číslo z adresy EEPROM do registru NUM
        MOVFW   NUM
        MOVWF   TPL             ;přenos z registru NUM do registru TPL
        CALL    Z_TPL1          ;zobraz teplotu
        
        RETURN       

;*******************************************************************************
SAVE    BSF     STATUS,RP0      ;banka 1
        BSF     EECON1,WREN     ;zápis do EEPROM povolen
        MOVLW   H'55'
        MOVWF   EECON2          ;první zápis bezpečnostního kódu
        MOVLW   H'AA'
        MOVWF   EECON2          ;druhý zápis bezpečnostního kódu
        BSF     EECON1,WR
        BTFSS   EECON1,EEIF     ;je zápis ukončen?
        GOTO    $-1             ;ne,čekej
        BCF     EECON1,EEIF     ;bit EEIF vynulován
        BCF     EECON1,WREN     ;zápis do EEPROM zakázán
        BCF     STATUS,RP0      ;banka 0
        RETURN   
        
;-------------------------------------------------------------------------------

LOAD    BSF     STATUS,RP0      ;banka 1
        BSF     EECON1,RD       ;přečti data
        BCF     STATUS,RP0      ;banka 0
        MOVFW   EEDATA
        MOVWF   NUM             ;zapiš data do registru NUM
        RETURN     
;*******************************************************************************

SOUCET  CALL    NUL_C           ;provede součet (b_A1/3 + b_B1/3 = b_C1/4)
SCET    MOVFW   b_A1
        ADDWF   b_B1,W
        BTFSC   STATUS,C
        INCF    b_C2,F
        MOVWF   b_C1
        MOVFW   b_A2
        ADDWF   b_B2,W
        BTFSC   STATUS,C
        INCF    b_C3,F
        ADDWF   b_C2,F
        BTFSC   STATUS,C
        INCF    b_C3,F
        MOVFW   b_A3
        ADDWF   b_B3,W
        BTFSC   STATUS,C
        INCF    b_C4,F
        ADDWF   b_C3,F
        BTFSC   STATUS,C
        INCF    b_C4,F
        MOVFW   b_A4
        ADDWF   b_C4,F
        RETURN
;*******************************************************************************
ROZDIL  CALL    D_DOPL          ;provede rozdíl (b_A1/3 - b_B1/3 = b_C1/3)
        CALL    SOUCET
        RETURN
;-------------------------------------------------------------------------------
D_DOPL  COMF    b_B1,F
        COMF    b_B2,F
        COMF    b_B3,F
        INCF    b_B1,F
        BTFSC   STATUS,Z
        INCF    b_B2,F
        BTFSC   STATUS,Z
        INCF    b_B3,F
        RETURN
;*******************************************************************************
SOUCIN  CALL    NUL_C           ;provede součin (b_A1/2 . b_B1/2 = b_C1/4)
        MOVF    b_B1,F
        BTFSC   STATUS,Z
        MOVF    b_B2,F
        BTFSC   STATUS,Z
        RETURN
        CALL    AdoX
        CALL    NUL_A
SCIN    MOVLW   1
        SUBWF   b_X1,F
        BTFSC   STATUS,C
        GOTO    $+4
        SUBWF   b_X2,F
        BTFSS   STATUS,C
        RETURN
        CALL    SOUCET
        CALL    CdoA
        GOTO    SCIN
;*******************************************************************************
PODIL   CALL    NUL_C           ;provede dělení (b_A1/3 : b_B1/3 =b_C1/3)
        CALL    NUL_X
        MOVF    b_B1,F
        BTFSC   STATUS,Z
        MOVF    b_B2,F
        BTFSC   STATUS,Z
        MOVF    b_B3,F
        BTFSC   STATUS,Z
        GOTO    CHYBA
        MOVF    b_A1,F
        BTFSC   STATUS,Z
        MOVF    b_A2,F
        BTFSC   STATUS,Z
        MOVF    b_A3,F
        BTFSC   STATUS,Z
        MOVF    b_A4,F
        BTFSC   STATUS,Z
        RETURN
        CALL    D_DOPL
PODL    CALL    SOUCET
        MOVF    b_C4,F
        BTFSC   STATUS,Z
        GOTO    XdoC
        INCF    b_X1,F
        BTFSC   STATUS,Z
        INCF    b_X2,F
        BTFSC   STATUS,Z
        INCF    b_X3,F
        CALL    CdoA
        CLRF    b_A4
        GOTO    PODL
;*******************************************************************************
NUL_A   CLRF    b_A1            ;vynuluje operand b_A1/4
        CLRF    b_A2
        CLRF    b_A3
        CLRF    b_A4
        RETURN
;-------------------------------------------------------------------------------
NUL_C   CLRF    b_C1            ;vynuluje registry výsledku b_C1/4
        CLRF    b_C2
        CLRF    b_C3
        CLRF    b_C4
        RETURN
;-------------------------------------------------------------------------------
NUL_X   CLRF    b_X1            ;vynuluje pomocné registry b_X1/3
        CLRF    b_X2
        CLRF    b_X3
        RETURN
;*******************************************************************************
AdoX    MOVFW   b_A1            ;kopírování registrů b_A1/2 do b_X1/2
        MOVWF   b_X1
        MOVFW   b_A2
        MOVWF   b_X2
        RETURN
;-------------------------------------------------------------------------------
CdoA    MOVFW   b_C1            ;kopírování registrů b_C1/4 do b_A1/4
        MOVWF   b_A1
        MOVFW   b_C2
        MOVWF   b_A2
        MOVFW   b_C3
        MOVWF   b_A3
        MOVFW   b_C4
        MOVWF   b_A4
        RETURN
;-------------------------------------------------------------------------------
XdoC    MOVFW   b_X1            ;kopírování registrů b_X1/3 do b_C1/3
        MOVWF   b_C1
        MOVFW   b_X2
        MOVWF   b_C2
        MOVFW   b_X3
        MOVWF   b_C3
        RETURN    
;-------------------------------------------------------------------------------
CHYBA   MOVLW   42
        CALL    WRDATA
        GOTO    $-0             ;bylo děleno nulou
;*******************************************************************************
NUL_ABC CALL    NUL_A
        CALL    NUL_C
NUL_B   CLRF    b_B1
        CLRF    b_B2
        CLRF    b_B3
        RETURN
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;PROGRAM
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
START   BSF     STATUS,RP0      ;banka1
        MOVLW   B'11100001'
        MOVWF   TRISB           ;nastavení portu B
        MOVLW   B'11000101'
        MOVWF   OPTION_REG      ;registr TMR0 načítán vnitřními hodinami s dělícím poměrem 1:64
        BCF     STATUS,RP0      ;banka 0

        CALL    INILCD          ;inicializace a reset displeje
        CALL    CZ

        MOVLW   129
        CALL    WRPRI           ;nastavit adresu displeje (1)
        CLRW
        CALL    TEXT            ;zápis textu "Vymazat data?"

ZDE     MOVLW   198
        CALL    WRPRI           ;nastavit adresu displeje
        MOVLW   14
        CALL    TEXT            ;zápis textu "ano"

        CALL    PIP             ;pípnutí
        CALL    t500mS          ;doba 0,5 sekundy
        
        CLRF    PORTA
        BTFSC   Q               ;je stisknuto tlačítko ENTER?
        GOTO    VYMAZ           ;ano,jdi na návěští VYMAZ
        MOVLW   1
        MOVWF   PORTA
        BTFSS   Q               ;je stisknuto tlačítko SET?
        GOTO    $-6             ;ne,tak testuj znova
          
        MOVLW   198
        CALL    WRPRI           ;natavení adresy displeje
        MOVLW   18
        CALL    TEXT            ;zápis textu "ne "
        
        CALL    PIP             ;pípnutí
        CALL    t500mS          ;doba 0,5 sekundy
        
        CLRF    PORTA
        BTFSC   Q               ;je stisknuto tlačítko ENTER?
        GOTO    VYPIS           ;ano,jdi na návěští VYPIS
        MOVLW   1
        MOVWF   PORTA
        BTFSS   Q               ;je stisknuto tlačítko SET?
        GOTO    $-6             ;ne,tak testuj znovu
        GOTO    ZDE             ;ano,jdi na návěští ZDE
        
;*******************************************************************************
VYMAZ   MOVLW   8
        MOVWF   EEADR           ;nastavit adresu paměti EEPROM na 8
        MOVLW   99
        MOVWF   EEDATA          ;ukládaná data = 99
        CALL    SAVE            ;uložení do paměti EEPROM
        INCF    EEADR,F         ;adresa paměti + 1
        BTFSS   EEADR,6         ;je zaplněná celá paměť čísly 99
        GOTO    $-3             ;ne,tak zapisuj znova
        MOVLW   1               ;ano
        CALL    WRPRI           ;proveď reset displeje
        GOTO    HODINY          ;jdi na návěští HODINY
        
;*******************************************************************************
VYPIS   CLRF    INTCON          ;přerušení zakázáno
        MOVLW   1
        MOVWF   ADRES           ;pořadové číslo 1 do registru ADRES
        CALL    WRPRI           ;reset displeje
        
VYPS_1  MOVLW   128
        CALL    WRPRI           ;nastavení adresy displeje
        CALL    ZOBR_R          ;zobraz řádek
        INCF    ADRES,F         ;pořadové číslo + 1
        MOVLW   192
        CALL    WRPRI           ;nastavení adresy displeje
        CALL    ZOBR_R          ;zobraz řádek
        DECF    ADRES,F         ;pořadové číslo - 1
        
        CALL    t500mS          ;doba 0,5 sekundy
        
        MOVLW   1
        MOVWF   PORTA
        BTFSC   Q               ;je stisknuto tlačítko TL2?
        GOTO    TL_2            ;ano,jdi na návěští TL_2
        
        MOVLW   3
        MOVWF   PORTA
        BTFSC   Q               ;je stisknuto tlačítko TL_4?
        GOTO    TL_4            ;ano,jdi nanávěští TL_4
        GOTO    $-8             ;jinak testuj tlačítka znova
            
TL_2    INCF    ADRES,F         ;pořadové číslo + 1
        MOVFW   ADRES
        XORLW   28
        BTFSC   STATUS,Z        ;je pořadové číslo = 28?
        DECF    ADRES,F         ;ano,odečti od něj jednu
        GOTO    VYPS_1          ;jdi na návěští VYPS_1         

TL_4    DECF    ADRES,F         ;pořadové číslo - 1
        MOVF    ADRES,F
        BTFSC   STATUS,Z        ;je pořadové číslo = 0?
        INCF    ADRES,F         ;ano,tak přičti jednu
        GOTO    VYPS_1          ;jdi na návěští VYPS_1
                     
;*******************************************************************************

HODINY  CLRF    HOD             ;registr hodin vynulován
        CLRF    MIN             ;registr minut vynulován
        CLRF    SEC             ;registr sekund vynulován
        CLRF    TMR             ;časový registr TMR vynulován
                                                           
        MOVLW   132
        CALL    Z_CAS           ;na adresu 132 DDRAM se vytiskne čas 00:00:00

        MOVLW   B'00001110'
        CALL    WRPRI           ;kurzor povolen

        MOVLW   132
        MOVWF   ADRDD           ;výchozí adresa DDRAM (132)

KLAVES  MOVFW   ADRDD
        CALL    WRPRI           ;nastav adresu DDRAM displeje

        CALL    t500mS          ;doba 0,5 sekundy

KLAV    CLRF    POM             ;0 do registru POM
        MOVFW   POM
        MOVWF   PORTA           ;obsah registru POM na port A
        BTFSC   Q               ;je stisknuto příslušné tlačítko?
        GOTO    SKOK            ;ano,proveď jdi na návěští SKOK
        INCF    POM,F           ;registr POM + 1
        BTFSS   POM,3           ;je POM = 8?
        GOTO    $-6             ;ne,udělej skok
        GOTO    KLAV            ;ano,jdi na KLAV

;*******************************************************************************

DOLU    MOVFW   ADRDD           ;adresa DDRAM do registru W
        CALL    RDDATA          ;přečti data
        DECF    NUM,F           ;registr NUM - 1
        MOVFW   NUM
        XORLW   47
        BTFSC   STATUS,Z        ;je NUM = 47?
        INCF    NUM,F           ;ano,odečti jednu
        CALL    TISK            ;proveď tisk na displej
        GOTO    KLAVES          ;jdi na návěští KLAVES

PRAVO   INCF    ADRDD,F         ;adresa DDRAM + 1
        MOVFW   ADRDD
        XORLW   134
        BTFSC   STATUS,Z        ;je adresa displeje DDRAM rovna 134?
        INCF    ADRDD,F         ;ano,tak ji zvyš o jednu
        MOVFW   ADRDD 
        XORLW   137
        BTFSC   STATUS,Z        ;je adresa displeje DDRAM rovna 137?
        INCF    ADRDD,F         ;ano,tak ji zvyš o jednu
        MOVFW   ADRDD
        XORLW   140
        BTFSC   STATUS,Z        ;je adresa displeje DDRAM rovna 140?
        DECF    ADRDD,F         ;ano,tak ji sniž o jednu
        GOTO    KLAVES          ;jdi na návěští KLAVES

NAHR    MOVFW   ADRDD           ;adresa DDRAM do registru W
        CALL    RDDATA          ;přečti data
        INCF    NUM,F           ;registr NUM + 1
        MOVFW   NUM
        XORLW   58
        BTFSC   STATUS,Z        ;je NUM = 58?
        DECF    NUM,F           ;ano,odečti jednu
        CALL    TISK            ;proveď tisk na displej
        GOTO    KLAVES          ;jdi na návěští KLAVES

VLEVO   DECF    ADRDD,F         ;adresa DDRAM - 1
        MOVFW   ADRDD
        XORLW   137
        BTFSC   STATUS,Z        ;je adresa displeje DDRAM rovna 137?
        DECF    ADRDD,F         ;ano,tak ji sniž o jednu
        MOVFW   ADRDD
        XORLW   134
        BTFSC   STATUS,Z        ;je adresa displeje DDRAM rovna 134?
        DECF    ADRDD,F         ;ano,tak ji sniž o jednu
        MOVFW   ADRDD
        XORLW   131
        BTFSC   STATUS,Z        ;je adresa displeje DDRAM rovna 131?
        INCF    ADRDD,F         ;ano,tak ji zvyš o jednu
        GOTO    KLAVES          ;jdi na návěští KLAVES

;*******************************************************************************
ENTER   MOVLW   B'00001100' 
        CALL    WRPRI           ;kurzor vypnut

        MOVLW   132             ;adresa displeje DDRAM do registru W
        CALL    PREV_X          ;proveď převod
        MOVWF   HOD             ;výsledek převodu zapiš do registru hodin

        MOVLW   135             ;adresa displeje DDRAM do registru W
        CALL    PREV_X          ;proveď převod
        MOVWF   MIN             ;výsledek převodu zapiš do registru minut

        MOVLW   138             ;adresa displeje DDRAM do registru W
        CALL    PREV_X          ;proveď převod
        MOVWF   SEC             ;výsledek převodu zapiš do registru sekund


BOD     CLRF    TMR0            ;časový speciální registr TMR0 vynulován
        MOVLW   B'10100000'
        MOVWF   INTCON          ;přerušení od přetečení registru TMR0 povoleno

        MOVLW   8
        MOVWF   EEADR           ;nastav adresu paměti EEPROM na 8


BOD_1   MOVLW   7
        MOVWF   PORTA
        BTFSC   Q               ;je stisknuto tlačítko MOD?
        GOTO    VYPIS           ;ano,jdi na návěští VYPIS
        
        BTFSS   T_BIT,0         ;uplynula již doba 1 minuty?
        GOTO    $-BOD_1         ;ne,tak dělej smyčku znovu
        
        BCF     INTCON,7        ;přerušení zakázáno 
                        
        MOVLW   100
        MOVWF   TM1             ;registr TM1 = 100
        
        CLRF    T_H1            ;vynulování potřebných registrů
        CLRF    T_H2
        CLRF    T_L1
        CLRF    T_L2
        
        CALL    NUL_ABC         ;vynulování matematických registrů

SEM     CLRF    T_H
        CLRF    T_L

       
        BTFSC   A4              ;je signál v dolní fázi?
        GOTO    $-1             ;ne,tak testuj znovu
        BTFSS   A4              ;je signál v horní fázi?
        GOTO    $-1             ;ne,tak testuj znovu

        INCF    T_H,F           ;zde začíná horní fáze impulsu, načteme registr T_H o jednu
        BTFSC   A4              ;je horní fáze u konce?
        GOTO    $-2             ;ne,tak načítej a testuj znovu

        BTFSS   A4              ;je signál v horní fázi?
        GOTO    $-1             ;ne,tak testuj znovu
        BTFSC   A4              ;je signál v dolní fázi?
        GOTO    $-1             ;ne,tak testuj znovu

        INCF    T_L,F           ;zde začíná dolní fáze impulsu, načteme registr T_L o jednu
        BTFSS   A4              ;je dolní fáze u konce?
        GOTO    $-2             ;ne,tak načítej a testuj znovu


;-------------------------------------------------------------------------------
        CALL    NUL_ABC
        MOVFW   T_H1
        MOVWF   b_A1
        MOVFW   T_H2
        MOVWF   b_A2
        MOVFW   T_H
        MOVWF   b_B1
        CALL    SOUCET          ;dvojregistr T_Hx = T_Hx + T_H
        MOVFW   b_C1
        MOVWF   T_H1
        MOVFW   b_C2
        MOVWF   T_H2
;-------------------------------------------------------------------------------
        CALL    NUL_ABC
        MOVFW   T_L1
        MOVWF   b_A1
        MOVFW   T_L2
        MOVWF   b_A2
        MOVFW   T_L
        MOVWF   b_B1
        CALL    SOUCET          ;dvojregistr T_Lx = T_Lx + T_L
        MOVFW   b_C1
        MOVWF   T_L1
        MOVFW   b_C2
        MOVWF   T_L2

        DECFSZ  TM1,F
        GOTO    SEM
;-------------------------------------------------------------------------------
        CALL    NUL_ABC
        MOVFW   T_H1
        MOVWF   b_A1
        MOVFW   T_H2
        MOVWF   b_A2
        CALL    NUL_B
        MOVLW   100
        MOVWF   b_B1
        CALL    PODIL           ;registr T_H = T_Hx : 100
        MOVFW   b_C1
        MOVWF   T_H
;-------------------------------------------------------------------------------
        CALL    NUL_ABC
        MOVFW   T_L1
        MOVWF   b_A1
        MOVFW   T_L2
        MOVWF   b_A2
        CALL    NUL_B
        MOVLW   100
        MOVWF   b_B1
        CALL    PODIL           ;registr T_L = T_Lx : 100
        MOVFW   b_C1
        MOVWF   T_L
;-------------------------------------------------------------------------------
        CALL    NUL_ABC
        MOVFW   T_L
        MOVWF   b_A1
        MOVFW   T_H
        MOVWF   b_B1
        CALL    SOUCET          ;dvojregistr T_HLx = T_H + T_L
        MOVFW   b_C1
        MOVWF   T_HL1
        MOVFW   b_C2
        MOVWF   T_HL2

;-------------------------------------------------------------------------------
        CALL    NUL_ABC
        MOVLW   211
        MOVWF   b_A1
        MOVFW   T_H
        MOVWF   b_B1
        CALL    SOUCIN          ;211 x T_H = výsledek
        CALL    CdoA
        MOVFW   T_HL1
        MOVWF   b_B1
        MOVFW   T_HL2
        MOVWF   b_B2
        CALL    PODIL           ;výsledek : T_HLx = druhý výsledek
  
        CALL    CdoA
        CALL    NUL_B
        MOVLW   68
        MOVWF   b_B1
        CALL    ROZDIL          ;druhý výsledek - 68 = b_Cx 
        
        BTFSC   b_C4,0          ;je výsledek záporný?
        GOTO    $+4             ;ne,tak jdi o čtyři instrukce dolu
        DECF    b_C1,F
        COMF    b_C1,F          ;upravme výsledné záporné číslo na kladné
        BSF     b_C1,7
        MOVFW   b_C1
        MOVWF   TPL             ;výsledek uložit do registru TPL
        BCF     T_BIT,0         ;vynulování bitu uplynulé minuty
        BSF     INTCON,7        ;přerušení povoleno                        
        
        GOTO    BOD_1           ;jdi na návěští BOD_1



;*******************************************************************************
        ORG     900             ;nastavení adresy programové paměti
SKOK    MOVLW   3
        MOVWF   PCLATH          ;nastavení stránky PCLATH
        MOVFW   POM
        ADDWF   PCL,F           ;skok podle velikosti POM
        GOTO    ENTER           ;jdi na návěští ENTER
        GOTO    DOLU            ;jdi na návěští DOLU
        GOTO    PRAVO           ;jdi na návěští PRAVO
        GOTO    NAHR            ;jdi na návěští NAHR
        GOTO    VLEVO           ;jdi na návěští VLEVO
        GOTO    KLAV            ;jdi na návěští KLAV
        GOTO    KLAV            ;jdi na návěští KLAV
        GOTO    KLAV            ;jdi na návěští KLAV
;*******************************************************************************

KOD     MOVLW   3
        MOVWF   PCLATH          ;nastavení stránky PCLATH
        MOVFW   ADRTX           ;adresa textu doregistru W
        ADDWF   PCL,F           ;proveď skok dle adresy textu
        RETLW   'V'
        RETLW   'y'
        RETLW   'm'
        RETLW   'a'
        RETLW   'z'
        RETLW   'a'        
        RETLW   't'
        RETLW   ' '
        RETLW   'd'
        RETLW   'a'                
        RETLW   't'
        RETLW   'a'
        RETLW   '?'
        RETLW   0
        RETLW   'a'  
        RETLW   'n'
        RETLW   'o'
        RETLW   0
        RETLW   'n'                
        RETLW   'e'
        RETLW   ' '
        RETLW   0               

;*******************************************************************************              
        END                                                                    
