;Program: Časový spínač
;*******************************************************************************
        LIST P = 16F84, R = DEC
        #INCLUDE <P16F84.INC>
;-------------------------------------------------------------------------------
 ERRORLEVEL -302        ;vypne poznámku
 __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
HOD_Z   EQU     RAM+21
HOD_V   EQU     RAM+22
MIN_Z   EQU     RAM+23
MIN_V   EQU     RAM+24

#define Q       PORTB,0
#define RS      PORTB,1 
#define RW      PORTB,2
#define E       PORTB,3
#define BF      RBF,3
#define ZVUK    PORTB,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

        CLRF    SEC             ;ano,vynuluj sekundy
        INCF    MIN,F           ;registr minut (MIN) + 1
        
        CALL    TEST
        
        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

CAS     MOVLW   132             ;nastavení adresy displeje DDRAM
        CALL    Z_CAS           ;zobrazení času

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

;*******************************************************************************
t60S    MOVLW   120             ;doba 60 sekund                                                             
        MOVWF   TM0
        CALL    t500mS
        DECFSZ  TM0,F
        GOTO    $-2
        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
        
;*******************************************************************************        
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            ;zobrazení hodin

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

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

        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

;*******************************************************************************
ZOBR_A  MOVLW   135 
        CALL    WRPRI           ;nastavení adresy displeje
        MOVFW   ADRES
        MOVWF   NUM
        CALL    PREVOD          ;převod registru ADRES na dekadické číslo
        CALL    ZOBR            ;zobrazení tohoto čísla
        RETURN
;*******************************************************************************
TISK    MOVFW   ADRDD
        CALL    WRPRI           ;nastavení adresy displeje DDRAM
        MOVFW   NUM
        CALL    WRDATA          ;tisk znaku z registru NUM
        RETURN
;*******************************************************************************
TEST    CLRF    EEADR           ;adresa paměti EEPROM vynulována

TEST_1  CALL    LOAD
        MOVFW   NUM
        MOVWF   HOD_Z           ;zapiš údaj z paměti EEPROM do registru HOD_Z
        
        INCF    EEADR,F         ;zvyš adresu paměťi EEPROM o jednu
        CALL    LOAD
        MOVFW   NUM
        MOVWF   MIN_Z           ;zapiš údaj z paměti EEPROM do registru MIN_Z
        
        INCF    EEADR,F         ;zvyš adresu paměťi EEPROM o jednu
        CALL    LOAD
        MOVFW   NUM
        MOVWF   HOD_V           ;zapiš údaj z paměti EEPROM do registru HOD_V
        
        INCF    EEADR,F         ;zvyš adresu paměti EEPROM o jednu
        CALL    LOAD
        MOVFW   NUM
        MOVWF   MIN_V           ;zapiš údaj z paměti EEPROM do registru MIN_V
        
        MOVFW   HOD
        XORWF   HOD_Z,W
        BTFSS   STATUS,Z        ;je shoda registrů HOD a HOD_Z?
        GOTO    TEST_2          ;ne,jdi na návěští TEST_2
        MOVFW   MIN             ;ano,udělej ještě test MIN s MIN_Z
        XORWF   MIN_Z,W
        BTFSC   STATUS,Z        ;je shoda i minut?
        CALL    ZAP             ;ano,tak "zapni" pin B7                                     
        
TEST_2  MOVFW   HOD
        XORWF   HOD_V,W
        BTFSS   STATUS,Z        ;je shoda registrů HOD a HOD_V?
        GOTO    TEST_3          ;ne,jdi na návěští TEST_3
        MOVFW   MIN             ;ano,udělej ještě test MIN a MIN_V
        XORWF   MIN_V,W
        BTFSC   STATUS,Z        ;je shoda i minut?
        CALL    VYP             ;ano,tak "vypni" pin B7
        
TEST_3  INCF    EEADR,F         ;zvyš adresu paměti EEPROM o jednu
        MOVFW   EEADR
        XORLW   40
        BTFSS   STATUS,Z        ;je adresa = 40?
        GOTO    TEST_1          ;ne,jdi na návěští TEST_1
        
        RETURN
;*******************************************************************************
ZAP     BSF     PORTB,7         ;pin B7 = 1
        MOVLW   35
        GOTO    $+3
VYP     BCF     PORTB,7         ;pin B7 = 0
        MOVLW   43
        MOVWF   POM             
        BCF     INTCON,7        ;přerušení zakázáno
        MOVLW   196
        CALL    WRPRI
        MOVFW   POM
        CALL    TEXT            ;tisk příslušného textu (zapnuto/vypnuto)
        BSF     INTCON,7        ;přerušení povoleno
        RETURN

;*******************************************************************************
SAVE    MOVWF   EEDATA
SAVE_1  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   
;-------------------------------------------------------------------------------
SAVE_R  CALL    VZOREC          ;výpočet adresy EEPROM dle pořadového čísla  
        MOVLW   193
        CALL    PREV_X
        CALL    SAVE            ;uložení zapnutí hodin
        
        INCF    EEADR,F         ;zvyš adresu EEPROM o jednu
        MOVLW   196
        CALL    PREV_X
        CALL    SAVE            ;uložení zapnutí minut
        
        INCF    EEADR,F         ;zvyš adresu EEPROM o jednu
        MOVLW   202
        CALL    PREV_X
        CALL    SAVE            ;uložení vypnutí hodin
        
        INCF    EEADR,F         ;zvyš adresu EEPROM o jednu
        MOVLW   205
        CALL    PREV_X
        CALL    SAVE            ;uložení vypnutí minut
         
        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     
;*******************************************************************************
LOAD_R  MOVLW   193
        CALL    WRPRI           ;nastavení adresy displeje

        CALL    VZOREC          ;výpočet adresy paměti EEPROM
        CALL    LOAD
        CALL    PREVOD
        CALL    ZOBR            ;zobrazení zapnutí hodin
        
        INCF    EEADR,F         ;zvyš adresu EEPROM o jednu
        CALL    LOAD
        CALL    PREVOD
        CALL    ZOBR_1          ;zobrazení zapnutí minut
        
        MOVLW   202
        CALL    WRPRI           ;nastavení adresy displeje
        
        INCF    EEADR,F         ;zvyš adresu EEPROM o jednu
        CALL    LOAD
        CALL    PREVOD
        CALL    ZOBR            ;zobrazení vypnutí hodin
        
        INCF    EEADR,F         ;zvyš adresu EEPROM o jednu
        CALL    LOAD
        CALL    PREVOD
        CALL    ZOBR_1          ;zobrazení vypnutí minut
        
        RETURN
;*******************************************************************************
VZOREC  MOVFW   ADRES           ;výpočet EEADR=(4xADRES)-4
        ADDWF   ADRES,W
        ADDWF   ADRES,W
        ADDWF   ADRES,W
        MOVWF   POM
        MOVLW   4
        SUBWF   POM,W
        MOVWF   EEADR
        RETURN
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;PROGRAM
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
START   BSF     STATUS,RP0      ;banka1
        MOVLW   B'01100001'
        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
        BCF     PORTB,7

        CALL    INILCD          ;inicializace a reset displeje

        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    EDIT            ;ano,jdi na návěští EDIT
        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   CLRF    EEADR           ;adresa paměti EEPROM = 0
        MOVLW   33
        MOVWF   EEDATA          ;ukládaná data = 99
        CALL    SAVE_1          ;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
        GOTO    EDIT            ;jdi na návěští EDIT
        
;*******************************************************************************
EDIT    MOVLW   1               ;ano
        CALL    WRPRI           ;proveď reset displeje
        MOVLW   1
        MOVWF   ADRES           ;registr ADRES = 1
        
        MOVLW   130
        CALL    WRPRI           ;nastavení adresy displeje
        MOVLW   22
        CALL    TEXT            ;tisk "ZAP  >  <  VYP"
        
        CALL    ZOBR_A          ;zobrazí pořadové číslo
        
        CALL    LOAD_R          ;vytiskne údaje časů z paměti EEPROM
        
        MOVLW   193
        MOVWF   ADRDD           ;adresa paměti displeje = 193
        
        MOVLW   B'00001110'
        CALL    WRPRI           ;kurzor povolen
        
KLAVS   MOVFW   ADRDD
        CALL    WRPRI           ;nastavená nová adresa displeje
        CALL    t500mS          ;doba 0,5 sekundy
KLA     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_1          ;ano,proveď jdi na návěští SKOK_1
        INCF    POM,F           ;registr POM + 1
        BTFSS   POM,3           ;je POM = 8?
        GOTO    $-6             ;ne,udělej skok
        GOTO    KLA             ;ano,jdi na KLA
;*******************************************************************************        
ENTER_1 CALL    SAVE_R          ;ulož údaje časů
        MOVLW   1
        CALL    WRPRI           ;reset displeje
        CALL    PIP             ;pípnutí
        GOTO    HODINY          ;jdi,na návěští HODINY

DOLU_1  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    KLAVS           ;jdi na návěští KLAVS

PRAVO_1 INCF    ADRDD,F         ;adresa DDRAM + 1
        MOVFW   ADRDD
        XORLW   195
        BTFSC   STATUS,Z        ;je adresa displeje DDRAM rovna 195?
        INCF    ADRDD,F         ;ano,tak ji zvyš o jednu
        MOVFW   ADRDD 
        XORLW   198
        BTFSS   STATUS,Z        ;je adresa displeje DDRAM rovna 198?
        GOTO    $+3
        MOVLW   4               ;ano,tak ji zvyš o čtyři
        ADDWF   ADRDD,F
        MOVFW   ADRDD
        XORLW   204
        BTFSC   STATUS,Z        ;je adresa displeje DDRAM rovna 204?
        INCF    ADRDD,F         ;ano,tak ji zvyš o jednu
        MOVFW   ADRDD
        XORLW   207
        BTFSC   STATUS,Z        ;je adresa displeje rovna 207?
        DECF    ADRDD,F         ;ano,tak sniž ji o jednu
        GOTO    KLAVS           ;jdi na návěští KLAVS

NAHR_1  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    KLAVS           ;jdi na návěští KLAVS

VLEVO_1 DECF    ADRDD,F         ;adresa DDRAM - 1
        MOVFW   ADRDD
        XORLW   204
        BTFSC   STATUS,Z        ;je adresa displeje DDRAM rovna 204?
        DECF    ADRDD,F         ;ano,tak ji sniž o jednu
        MOVFW   ADRDD 
        XORLW   201
        BTFSS   STATUS,Z        ;je adresa displeje DDRAM rovna 201?
        GOTO    $+3
        MOVLW   4               ;ano,tak ji sniž o čtyři
        SUBWF   ADRDD,F
        MOVFW   ADRDD
        XORLW   195
        BTFSC   STATUS,Z        ;je adresa displeje DDRAM rovna 195?
        DECF    ADRDD,F         ;ano,tak ji sniž o jednu
        MOVFW   ADRDD
        XORLW   192
        BTFSC   STATUS,Z
        INCF    ADRDD,F
        GOTO    KLAVS           ;jdi na návěští KLAVS
        
MOD     CALL    SAVE_R          ;ulož údaje časů
        
        INCF    ADRES,F         ;zvyš pořadové číslo o jednu
        MOVFW   ADRES
        XORLW   11
        BTFSS   STATUS,Z        ;je pořadové číslo = 11?
        GOTO    $+3             ;ne,tak přeskoč tři instrukce
        MOVLW   1
        MOVWF   ADRES           ;nastav pořadové číslo na jednu
        
        CALL    ZOBR_A          ;zobraz pořadové číslo
        CALL    LOAD_R          ;zobraz nové údaje z paměti EEPROM
        CALL    PIP             ;pípnutí
   
        MOVLW   193             ;nová pizice kurzoru
        
        GOTO    KLAVS           ;jdi na návěští KLAVS
;*******************************************************************************

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
        
        CALL    VYP             ;pin B7 = 0

SMYCKA  MOVLW   6
        MOVWF   PORTA
        BTFSC   Q               ;je stisknuto tlačítko TL7?
        CALL    ZAP             ;ano,tak zapni pin B7
        
        MOVLW   7
        MOVWF   PORTA
        BTFSC   Q               ;je stisknuto tlačítko TL8?
        CALL    VYP             ;ano,tak vypni pin B7
              
        GOTO    SMYCKA          ;jdi na návěští SMYCKA
;*******************************************************************************
        ORG     768             ;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
;*******************************************************************************
SKOK_1  MOVLW   3
        MOVWF   PCLATH          ;nastavení stránky PCLATH
        MOVFW   POM
        ADDWF   PCL,F           ;skok podle velikosti POM
        GOTO    ENTER_1         ;jdi na návěští ENTER_1
        GOTO    DOLU_1          ;jdi na návěští DOLU_1
        GOTO    PRAVO_1         ;jdi na návěští PRAVO_1
        GOTO    NAHR_1          ;jdi na návěští NAHR_1
        GOTO    VLEVO_1         ;jdi na návěští VLEVO_1
        GOTO    KLA             ;jdi na návěští KLA
        GOTO    KLA             ;jdi na návěští KLA
        GOTO    MOD             ;jdi na návěští MOD
;*******************************************************************************

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'             ;0
        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'             ;14
        RETLW   'n'
        RETLW   'o'
        RETLW   0
        RETLW   'n'             ;18                       
        RETLW   'e'
        RETLW   ' '
        RETLW   0               
        RETLW   'Z'             ;22
        RETLW   'A'
        RETLW   'P'
        RETLW   ' '
        RETLW   '>'
        RETLW   ' '
        RETLW   ' '
        RETLW   '<'
        RETLW   ' '
        RETLW   'V'
        RETLW   'Y'
        RETLW   'P'
        RETLW   0
        RETLW   'z'             ;35
        RETLW   'a'
        RETLW   'p'
        RETLW   'n'
        RETLW   'u'
        RETLW   't'
        RETLW   'o'
        RETLW   0
        RETLW   'v'             ;43
        RETLW   'y'
        RETLW   'p'
        RETLW   'n'
        RETLW   'u'
        RETLW   't'
        RETLW   'o'
        RETLW   0        
;*******************************************************************************              
        END                                                                    
