;-------------------------------; ; INFO PANEL + Termostat v2 ; ;-------------------------------; ;slovak@post.cz )S(06.2007; ;-------------------------------; ;Displej: LED 4 místný ;---společná katoda----(0=ZAP) )S(10.2009 ; ;Tlačítka: ;set,nastavit(levé);mínus(prostřední);

plus(pravé) ; ;Časová smyčka, dostupné údaje: ;Teplota -19.9 - 99.9°C (index n=0) ;Hodiny 24 (index n=1) ;Den pond. - nede. (index n=2) ;Datum den, měsíc (index n=3) ;Rok do 2099 (index n=4) ; ;Výběr a seřazení údajů v časové smyčce: ;[cX.nX.] pro každý údaj se nastaví časovač a n.index ;časovač c=1-9s. -doba zobrazení (určuje jak dlouho se má údaj zobrazovat) ;index n=0-4 -následující údaj (určuje co se bude zobrazovat potom) ; ;Prohlížení/nastavování: ;

=další nadpis; =minulý nadpis (dokud se tlačítko drží, zobrazuje se nadpis, až po uvolnění se zobrazí hodnota) ;=nadpis; >=nastavit (držet 3s.), potom

=plus; =mínus; =uložit a další nastavování nebo konec nastavování ;[°C ] [XX.X°]>[cX.nX.]

;[Hod. ] [XX.XX]>[XX.XX]

[SE.XX]

[cX.nX.]

;[dEn. ] [XXXX.]>[XXXX.]

[cX.nX.]

;[dAt. ] [XX.XX]>[XX.XX.]

[cX.nX.]

;[rok ] [XXXX]>[XXXX]

[cX.nX.]

;[L. °C] [XX.X°](MIN teplota)>nulování (vloží aktuální teplotu, čas, datum, rok) ;[L.Hod.] [XX.XX](čas při MIN teplotě) ;[L.dAt.] [XX.XX.](datum při MIN teplotě) ;[L.rok] [XXXX](rok při MIN teplotě) ;[H. °C] [XX.X°](MAX teplota)>nulování (vloží aktuální teplotu, čas, datum, rok) ;[H.Hod.] [XX.XX](čas při MAX teplotě) ;[H.dAt.] [XX.XX.](datum při MAX teplotě) ;[H.rok] [XXXX](rok při MAX teplotě) ;[M. °C] [XX.X°](mez pro termostat -19.9 - 99.9)>[XX.X°]

; ;Přechod z časové smyčky do prohlížení: ;

přechod na nadpis[Hod. ] nebo nadpis[L. °C] ;Přechod z prohlížení do časové smyčky: ; pouze z nadpisu[°C ], na displeji se zobrazí nadpis pro časovou smyčku - obdélník ; ;-------------------------------- ;RB0 katoda Znak0 (vpravo) *--1Kohm--

--GND ;RB1 katoda Znak1 *--1Kohm----GND ;RB2 katoda Znak2 *--1Kohm----GND ;RB4 katoda Znak3 (vlevo) ;(0=ZAP) ; ;RA0 anody f ;RA1 anody a ;RA2 anody c ;RA3 anody d ;RA4 anody e (ot.kolektor - jiné zapojení segmentu) ;RB5 anody g ;RB6 anody b ;RB7 anody tečky ;(1=ZAP) ; ;RB3 Re výstup termostat (1= teplota =< Mez) ;RA5 TC vstup pro teplotní čidlo SMT160-30 ;-------------------------------- ;Xtal 19.6608MHz ;-------------------------------- LIST P=16F628A, R=DEC, MM=ON ;Direktivy překladače include ;Definice názvů registrů __CONFIG 0x3F46 ;Nastaví následující konfiguraci ; CP:OFF, CPD:OFF, LVP:OFF, BOREN:ON, ; MCLRE:I/O, PWRTEN:Enable, WDTE:ON, OSC:HS cblock 0x20 MemStat A1 ;matematické A2 ; proměnné A3 ; a jiné funkce B1 ; B2 ; B3 ; C1 ; C2 ; C3 ; D1 ; D2 ; D3 ; X1 ; X2 ; R1 ;řád jedniček pro převod času HEX/DEC R10 ;řád desítek pro převod času HEX/DEC FL ;flag,příznaky Znak0 ;číslo znaku v DIS4 pozice 0 Znak1 ;číslo znaku v DIS3 pozice 1 Znak2 ;číslo znaku v DIS2 pozice 2 Znak3 ;číslo znaku v DIS1 pozice 3 PZnak ;pro převod číslo/znak Pozice ;číslo zapnutého displeje BLIK ;dělič pro blikání displeje KLVP ;číslo stisknutého tlačítka KLVD ;dělič pro čtení tlačítek KLVO ;dělič pro opakování tlačítka De3 ;dělič /3 SEKD ;dělič pro 1Hz PV ;počet vzorků SH1 ;součet úrovně H SH2 ; SH3 ; SP1 ;součet periody P SP2 ; SP3 ; T1 ;teplota [°C*10] T2 ; Sek ;sekundy Min ;minuty Hod ;hodiny MAXden ;max den podle měsíce CZ ;časovač zobrazení NZ ;následuje zobrazení DeSR ;dělič pro Stop Regulace po startu ;EEPROM CZ0 ;00 ;časovač zobrazení pro Teplotu CZ1 ;01 ;časovač zobrazení pro Hodiny CZ2 ;02 ;časovač zobrazení pro Den CZ3 ;03 ;časovač zobrazení pro Datum CZ4 ;04 ;časovač zobrazení pro Rok NZ0 ;05 ;následné zobrazení po Teplotě NZ1 ;06 ;následné zobrazení po Hodinách NZ2 ;07 ;následné zobrazení po Dnu NZ3 ;08 ;následné zobrazení po Datumu NZ4 ;09 ;následné zobrazení po Roku LT1 ;0A ;MIN teplota LT2 ;0B ; LHod ;0C ;hodiny při MIN teplotě LMin ;0D ;minuty při MIN teplotě LDen ;0E ;den při MIN teplotě LMes ;0F ;měsíc při MIN teplotě LRok ;10 ;rok při MMI teplotě HT1 ;11 ;MAX teplota HT2 ;12 ; HHod ;13 ;hodiny při MAX teplotě HMin ;14 ;minuty při MAX teplotě HDen ;15 ;den při MAX teplotě HMes ;16 ;měsíc při MAX teplotě HRok ;17 ;rok při MAX teplotě PoNe ;18 ;den v týdnu Pondělí_0 až Neděle_6 Den ;19 ;Den 1 až 31 Mes ;1A ;Měsíc 1 až 12 Rok ;1B ;Rok 0 až 99 M1 ;1C ;Mez pro termostat M2 ;1D ; endc EEADRp EQU 0x7F ;pomocná EE adresa MemW EQU 0x7E #define Stisk FL,0 ;minule stisknuto #define Znova FL,1 ;znova stisknuto #define PS FL,2 ;1=porucha snímače #define NM FL,3 ;1=neplatné měření #define Znam FL,4 ;znaménko, 1=záporná teplota #define MINT FL,5 ;1=kontrolka nová MIN teplota #define MAXT FL,6 ;1=kontrolka nová MAX teplota #define TlS KLVP,2 ;levé tlačítko SET #define TlM KLVP,1 ;prostřední tlačítko MÍNUS #define TlP KLVP,0 ;pravé tlačítko PLUS #define TC PORTA,5 ;vstup pro teplotní čidlo SMT160-30 #define Re PORTB,3 ;výstup relé ;************************************************* ORG 0x2100 ;tabulka dat v EEPROM de 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x03 de 0x04, 0x00, 0xE7, 0x03, 0x17, 0x2F, 0x18, 0x07 de 0x07, 0xED, 0xFF, 0x17, 0x2F, 0x18, 0x07, 0x07 de 0x01, 0x18, 0x07, 0x07, 0x00, 0x00, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0x29, 0x53, 0x28, 0x30, 0x36, 0x2E, 0x32, 0x30 de 0x30, 0x37, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ;************************************************* ;reset ORG 0 GOTO Init CALL 41 CALL 83 CALL 40 ;přerušení GOTO INT ;-------------------------------- Znak MOVWF PZnak SUBLW 0x28 ;27-PZnak MOVF PZnak,W ;původní znak BTFSS STATUS,C ;kladné? MOVLW 0x28 ;NE, nahradit znak ADDWF PCL,F ;k PC se přičte číslo znaku ; Tbgedcaf ;Segment (0=svítí) RETLW B'01011111' ;0x00/0 RETLW B'01000100' ;0x01/1 RETLW B'01111010' ;0x02/2 RETLW B'01101110' ;0x03/3 RETLW B'01100101' ;0x04/4 RETLW B'00101111' ;0x05/5 RETLW B'00111111' ;0x06/6 RETLW B'01000110' ;0x07/7 RETLW B'01111111' ;0x08/8 RETLW B'01101111' ;0x09/9 RETLW B'01110111' ;0x0A/A RETLW B'00111101' ;0x0B/b RETLW B'00011011' ;0x0C/C RETLW B'01111100' ;0x0D/d RETLW B'00111011' ;0x0E/E RETLW B'00110011' ;0x0F/F RETLW B'01110101' ;0x10/H RETLW B'00010000' ;0x11/i RETLW B'01011100' ;0x12/J RETLW B'00110001' ;0x13/k RETLW B'00011001' ;0x14/L RETLW B'01010111' ;0x15/M RETLW B'00110100' ;0x16/n RETLW B'00111100' ;0x17/o RETLW B'01110011' ;0x18/P RETLW B'00110000' ;0x19/r RETLW B'00100111' ;0x1A/S RETLW B'00111001' ;0x1B/t RETLW B'00011100' ;0x1C/u RETLW B'01011101' ;0x1D/V RETLW B'01101101' ;0x1E/Y RETLW B'00100000' ;0x1F/- RETLW B'00000000' ;0x20/ (zhasnuto) RETLW B'00101000' ;0x21/= RETLW B'01010101' ;0x22/II RETLW B'00111000' ;0x23/c RETLW B'01001110' ;0x24/) RETLW B'01100100' ;0x25/-1 RETLW B'01100011' ;0x26/° RETLW B'00101010' ;0x27/ 3x- RETLW B'00001010' ;0x28/ 2x-(nahoře,dole) ;-------------------------------- ;převede záporné číslo na kód znaku ZZnak MOVWF D1 ; SUBLW 0x04 ;4-D1 MOVF D1,W ;původní znak BTFSS STATUS,C ;kladné? MOVLW 0x04 ;NE, nahradit znak ADDWF PCL,F ;ANO RETLW 0x1F ;- RETLW 0x25 ;-1 RETLW 0x21 ;-2 RETLW 0x27 ;-3 RETLW 0x24 ;-4 ;-------------------------------- ;vybere anodu Anoda MOVF Pozice,W ANDLW 0x03 ADDWF PCL,F RETLW B'11111110' ;Znak0 (vpravo) RETLW B'11111101' ;Znak1 RETLW B'11111011' ;Znak2 RETLW B'11101111' ;Znak3 (vlevo) ;-------------------------------- ;rozcestí pro časovou smyčku ROZ MOVF NZ,W ;následující zobrazení ADDWF PCL,F GOTO STEP ;teplota GOTO SHOD ;hodiny GOTO SDEN ;den v týdnu GOTO SDAT ;datum GOTO SROK ;rok ;-------------------------------- ;den v týdnu (0=pondělí, 6=neděle) ;písmeno pro Znak3 PoNe3 MOVF PoNe,W ADDWF PCL,F RETLW 0x18 ;P RETLW 0x1D ;U RETLW 0x05 ;S RETLW 0x0C ;C RETLW 0x18 ;P RETLW 0x05 ;S RETLW 0x16 ;n ;písmeno pro Znak2 PoNe2 MOVF PoNe,W ADDWF PCL,F RETLW 0x17 ;o RETLW 0x1B ;t RETLW 0x1B ;t RETLW 0x1B ;t RETLW 0x0A ;A RETLW 0x17 ;o RETLW 0x0E ;E ;písmeno pro Znak1 PoNe1 MOVF PoNe,W ADDWF PCL,F RETLW 0x16 ;n RETLW 0x0E ;E RETLW 0x19 ;r RETLW 0x1C ;u RETLW 0x1B ;t RETLW 0x0B ;b RETLW 0x0D ;d ;písmeno pro Znak0 PoNe0 MOVF PoNe,W ADDWF PCL,F RETLW 0x8D ;d. RETLW 0x99 ;r. RETLW 0x8E ;E. RETLW 0x99 ;r. RETLW 0x8E ;E. RETLW 0x97 ;o. RETLW 0x8E ;E. ;-------------------------------- ;délka měsíce MaxDen MOVF Mes,W ADDWF PCL,F NOP RETLW 31 ;leden RETLW 28 ;únor RETLW 31 ;březen RETLW 30 ;duben RETLW 31 ;květen RETLW 30 ;červen RETLW 31 ;červenec RETLW 31 ;srpen RETLW 30 ;září RETLW 31 ;říjen RETLW 30 ;listopad RETLW 31 ;prosinec ;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM ;měření teploty MT MOVF PV,F BTFSS STATUS,Z ;PV=0? GOTO $+7 ;NE CLRF SH1 ;vynulovat SH CLRF SH2 ; CLRF SH3 ; CLRF SP1 ;vynulovat SP CLRF SP2 ; CLRF SP3 ; BCF PS ;VYP porucha snímače BCF NM ;VYP nové měření CLRF TMR1L ;vynulovat CLRF TMR1H ; časovač TMR1 BSF T1CON,TMR1ON ;start časovač TMR1 ;................................ ;měření signálu z SMT160-30 ;čekat na nulu MOVLW 3 CLRWDT BTFSC TC ;vstup=0? SUBWF PCL,F ;dva kroky zpět BTFSC PS ;porucha snímače? RETURN ;ANO ;čekat na jedničku CLRWDT BTFSS TC ;vstup=1? SUBWF PCL,F ;dva kroky zpět ;start měření CLRF TMR1L ;vynulovat CLRF TMR1H ; časovač TMR1 BTFSC PS ;porucha snímače? RETURN ;ANO ;čekat na nulu CLRWDT BTFSC TC ;vstup=0? SUBWF PCL,F ;dva kroky zpět ;uložit délku úrovně H MOVF TMR1H,W MOVWF A2 MOVF TMR1L,W MOVWF A1 MOVF TMR1H,W XORWF A2,W ;(st.=0),sZ=1 BTFSC STATUS,Z ;jiné? GOTO $+5 ;NE MOVF TMR1L,W MOVWF A1 MOVF TMR1H,W MOVWF A2 BTFSC PS ;porucha snímače? RETURN ;ANO ;čekat na jedničku MOVLW 3 CLRWDT BTFSS TC ;vstup=1? SUBWF PCL,F ;dva kroky zpět ;uložit délku periody, konec měření BCF T1CON,TMR1ON ;stop časovač TMR1 MOVF TMR1L,W MOVWF D1 MOVF TMR1H,W MOVWF D2 BTFSC PS ;porucha snímače? RETURN ;ANO ;test neplatné měření BTFSC NM ;neplatné měření? GOTO MT ;ANO, znova měřit teplotu ;A1,2 = H délka úrovně H ;D1,2 = P délka periody ; ______ _____ ; ___| |________| ; ; |--H---| ; |--------P------| ;................................ ;součet vzorků/256 ;délka H; (A1,2+SH3,1,2)/256=SH1,2 MOVF A1,W ADDWF SH3,F ;A1+SH3=SH3 BTFSC STATUS,C ;nepřeteklo? INCF A2,F ;+1 MOVF A2,W ADDWF SH1,F ;A2+SH1=SH1 BTFSC STATUS,C ;nepřeteklo? INCF SH2,F ;+1 ;délka P; (D1,2+SP3,1,2)/256=SP1,2 MOVF D1,W ADDWF SP3,F ;D1+SP3=SP3 BTFSC STATUS,C ;nepřeteklo? INCF D2,F ;+1 MOVF D2,W ADDWF SP1,F ;D2+SP1=SP1 BTFSC STATUS,C ;nepřeteklo? INCF SP2,F ;+1 ;počet vzorků +1 INCFSZ PV,F ;+1=0? RETURN ;NE, další vzorky příště ;SH1,2 = průměr H ;SP1,2 = průměr P ;-------------------------------- ;výpočet teploty ;příprava MOVF SH1,W ;SH1,2 do C1,2 MOVWF C1 ; MOVF SH2,W ; MOVWF C2 ; MOVF SP1,W ;SP1,2 do B1,2 MOVWF B1 ; MOVF SP2,W ; MOVWF B2 ; ;C1,2 = H ;B1,2 = P ;................................ ;vzorec H*2128/P-681 = A1,2 [°C*10] ;H * 2128 = A1,2,3 CALL x2128 ;C1,2 * 2128 = A1,2,3 ;A1,2,3 / P = C1,2 CLRF B3 CALL LOMENO ;A1,2,3 / B1,2,3 = C1,2 ;C1,2 - 681 = A1,2 MOVLW 0xB3 ;(691=0x02B3) SUBWF C1,W ;C1-B8 MOVWF A1 ; =A1 BTFSS STATUS,C ;kladné? DECF C2,F ;-1 MOVLW 0x02 SUBWF C2,W ;C2-02 MOVWF A2 ; =A2 ;A1,2 = teplota *10 ;................................ ;Diference, odstraní chvění na nejnižších bitech ;minulá teplota do B1,2 MOVF T1,W ;T1,2 do B1,2 MOVWF B1 MOVF T2,W MOVWF B2 ;A1,2=nová teplota; B1,2=stará; T1,2=výsledek CLRF A3 CALL MINUS ;A-B=C MOVF C2,F BTFSS STATUS,Z ;C2=0? GOTO $+17 ;NE, nová < stará MOVF C1,W SUBLW 20 ;20-C1 BTFSS STATUS,C ;kladné? GOTO $+13 ;NE, nová >= stará+20 MOVF C1,W SUBLW 4 ;4-C1 BTFSC STATUS,C ;záporné? GOTO $+4 ;NE, nová <= stará+4 INCFSZ B1,F ;stará teplota+1 GOTO $+2 ; INCF B2,F ; MOVF B1,W ;stará teplota B1,2 do T1,2 MOVWF T1 ; MOVF B2,W ; MOVWF T2 ; GOTO PR MOVF A1,W ;nová teplota A1,2 do T1,2 MOVWF T1 ; MOVF A2,W ; MOVWF T2 ; ;******************************** PR; PROGRAM REGULACE ;-------------------------------- ;Stop Regulace MOVF DeSR,F ;dělič pro Stop Regulace po startu BTFSS STATUS,Z ;DeSR=0? RETURN ;NE BTFSC PS ;porucha snímače? RETURN ;ANO ;-------------------------------- ;teplota =< Mez CALL TdA ;teplota T1,2 do A1,2 MOVF M1,W ;Mez M1,2 do B1,2 MOVWF B1 ; MOVF M2,W ; MOVWF B2 ; CALL TAB ;Test A <= B ; SC=0=ANO, 1=NE BTFSS STATUS,C BSF Re ;ANO, ZAP BTFSC STATUS,C BCF Re ;NE, VYP ;-------------------------------- ;teplota < MIN teplota MOVF T1,W MOVWF B1 MOVF T2,W MOVWF B2 MOVF LT1,W MOVWF A1 MOVF LT2,W MOVWF A2 CALL TAB ;Test A <= B ; SC=0=ANO, 1=NE BTFSS STATUS,C ;NE? GOTO PR1 ;zápis MIN teplota BSF MINT ;ZAP nová MIN teplota ZMINT MOVLW 0x0A ;adresa MOVWF EEADRp ; MOVF T1,W MOVWF LT1 ;data CALL EWrite ;zápis do EEPROM INCF EEADRp,F ;adresa+1 MOVF T2,W MOVWF LT2 ;data CALL EWrite ;zápis do EEPROM ;zápis MIN hodina INCF EEADRp,F ;adresa+1 MOVF Hod,W MOVWF LHod ;data CALL EWrite ;zápis do EEPROM ;zápis MIN minuta INCF EEADRp,F ;adresa+1 MOVF Min,W MOVWF LMin CALL EWrite ;zápis do EEPROM ;zápis MIN den INCF EEADRp,F ;adresa+1 MOVF Den,W MOVWF LDen CALL EWrite ;zápis do EEPROM ;zápis MIN měsíc INCF EEADRp,F ;adresa+1 MOVF Mes,W MOVWF LMes CALL EWrite ;zápis do EEPROM ;zápis MIN rok INCF EEADRp,F ;adresa+1 MOVF Rok,W MOVWF LRok CALL EWrite ;zápis do EEPROM RETURN ;-------------------------------- ;teplota > MAX teplota PR1 CALL TdA MOVF HT1,W MOVWF B1 MOVF HT2,W MOVWF B2 CALL TAB ;Test A <= B ; SC=0=ANO, 1=NE BTFSS STATUS,C ;NE? RETURN ;zápis MAX teplota BSF MAXT ;ZAP nová MAX teplota ZMAXT MOVLW 0x11 ;adresa MOVWF EEADRp ; MOVF T1,W MOVWF HT1 ;data CALL EWrite ;zápis do EEPROM INCF EEADRp,F ;adresa+1 MOVF T2,W MOVWF HT2 ;data CALL EWrite ;zápis do EEPROM ;zápis MAX hodina INCF EEADRp,F ;adresa+1 MOVF Hod,W MOVWF HHod ;data CALL EWrite ;zápis do EEPROM ;zápis MAX minuta INCF EEADRp,F ;adresa+1 MOVF Min,W MOVWF HMin CALL EWrite ;zápis do EEPROM ;zápis MAX den INCF EEADRp,F ;adresa+1 MOVF Den,W MOVWF HDen CALL EWrite ;zápis do EEPROM ;zápis MAX měsíc INCF EEADRp,F ;adresa+1 MOVF Mes,W MOVWF HMes CALL EWrite ;zápis do EEPROM ;zápis MAX rok INCF EEADRp,F ;adresa+1 MOVF Rok,W MOVWF HRok CALL EWrite ;zápis do EEPROM RETURN ;-------------------------------- ;Test, porovnat hodnoty A,B ;výsledek ovlivní STATUS,C ;A =< B SC=0 ;B >= A SC=0 ;A > B SC=1 ;B < A SC=1 TAB ;porovnat znaménka MOVF A2,W XORWF B2,W ;(stejné=0) ANDLW B'10000000' ;(1a1=1) RLF B2,W ;vlevo(SC=MSB) BTFSS STATUS,Z ;stejné znaménka? (SZ=1) RETURN ;NE ;A-B ;ANO CLRF A3 CLRF B3 CALL MINUS ;A-B=C; SC=0=záporný výsledek CALL TC0 ;test C=0, SZ=1=ANO 0=NE BTFSC STATUS,Z ;nenulové? BCF STATUS,C ;SC=0 (A=B) jako záporné RETURN ;------------------------------- ;teplota do A TdA MOVF T1,W MOVWF A1 MOVF T2,W MOVWF A2 RETURN ;-------------------------------; ; Matematicke podprogramy ; ;-------------------------------; ;slovak@post.cz )S(03.2004; ;-------------------------------; ; A1,2,3 / B1,2,3 = C1,2,3 ;24bit ;sZ=1=deleni nulou (B=0) ;B se nemeni, v A je zbytek ;pouziva D1,2,3; X1 LOMENO ;test B na nulu; sZ=1=ANO ; MOVF B1,F ; BTFSC STATUS,Z ;nenulove ; MOVF B2,F ; BTFSC STATUS,Z ;nenulove ; MOVF B3,F ; BTFSC STATUS,Z ;nenulove ; RETURN ;B=0 ;priprava pro deleni MOVF A1,W ;AdoD MOVWF D1 ; MOVF A2,W ; MOVWF D2 ; MOVF A3,W ; MOVWF D3 ; CLRF A1 ;nulovat CLRF A2 ; CLRF A3 ; MOVLW 24 ;pocet bitu MOVWF X1 ; BCF STATUS,C ;sC=0 LDalsi CALL x2M BTFSS STATUS,C ;kladné? GOTO LZapor ;LKlad ;jen pri sC=1 MOVWF A3 ;CdoA MOVF C2,W ; MOVWF A2 ; MOVF C1,W ; MOVWF A1 ; LZapor DECFSZ X1,F ;-1=0? GOTO LDalsi ;vysledek RLF D1,W ;posledni x2 MOVWF C1 ; a WdoC RLF D2,W ; MOVWF C2 ; RLF D3,W ; MOVWF C3 ; ;konec BCF STATUS,Z ;sZ=0 RETURN ;-------------------------------- ; D1,2,3 A1,2,3 * 2 a Minus x2M RLF D1,F ;posuv vlevo RLF D2,F ; RLF D3,F ; RLF A1,F ; RLF A2,F ; RLF A3,F ; ;-------------------------------- ; A1,2,3 - B1,2,3 = C1,2,3 ;sC=0=zaporny vysledek ;A,B se nemeni MINUS MOVF B1,W ;W=B1 SUBWF A1,W ;A1-B1=W MOVWF C1 ;C1=W=vysledek1 CLRW ;W=0 BTFSS STATUS,C ;SUB kladné? MOVLW 1 ;W=1 ADDWF B2,W ;B2+W=W CLRF C3 ;C3=0 BTFSC STATUS,C ;ADD nepreteklo? BSF C3,0 ;C3=1 SUBWF A2,W ;A2-W=W MOVWF C2 ;C2=w=vysledek2 MOVF C3,W ;W=C3 BTFSS STATUS,C ;SUB kladné? MOVLW 1 ;W=1 ADDWF B3,W ;B3+W=W CLRF C3 ;C3=0 BTFSC STATUS,C ;ADD nepreteklo? BSF C3,0 ;C3=1 SUBWF A3,W ;A3-W=W BTFSC C3,0 ;C3=0? BCF STATUS,C ;sC=0 MOVWF C3 ;C3=W=vysledek3 RETURN ;:::::::::::::::::::::::::::::::: ;test C=0; sZ=1=ANO TC0 MOVF C3,F BTFSC STATUS,Z ;nenulove? MOVF C2,F BTFSC STATUS,Z ;nenulove? MOVF C1,F RETURN ;-------------------------------- ; C1,2 * 2128 = A1,2,3 x2128 CLRF C3 CLRF A1 ;A=0 CLRF A2 ; CLRF A3 ; ;16+64+2048=2128 MOVLW 4 ;4x CALL x2W ; posuv vlevo C =A MOVLW 2 ;2x CALL x2W ; posuv vlevo C =A MOVLW 5 ;5x ;CALL x2W ; posuv vlevo C =A ;RETURN ;C1,2,3 * 2^W = C1,2,3 + A1,2,3 = A1,2,3 x2W MOVWF X2 ;kolikrat BCF STATUS,C ;C=0 RLF C1,F ;posuv vlevo RLF C2,F ; RLF C3,F ; DECFSZ X2,F ;-1=0? GOTO $-5 ;znova MOVF C1,W ADDWF A1,F ;C1+A1=A1 BTFSS STATUS,C ;preteklo? GOTO $+4 INCFSZ A2,F ;+1=0? GOTO $+2 INCF A3,F ;+1 MOVF C2,W ADDWF A2,F ;C2+A2=A2 BTFSC STATUS,C ;nepreteklo? INCF A3,F ;+1 MOVF C3,W ADDWF A3,F ;C3+A3=A3 RETURN ;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ;převod HEX/DEC, vstup W, výstup R1=jedničky, R10=desítky=W CHD MOVWF R1 ; CLRF R10 ;=0 CRad10 MOVLW 10 ;výpočet rádu desítek SUBWF R1,W ;-10 BTFSS STATUS,C ;kladné? GOTO CEnd10 ;NE, hotovo MOVWF R1 ;uložit řád jedniček INCF R10,F ;+1 GOTO CRad10 ;zpět CEnd10 MOVF R10,W ;řád desítek RETURN ;-------------------------------- ;převod HEX/DEC, vstup A1,2, výstup Znak3,2,1 HEXDEC ;upravit záporné číslo BCF Znam ;=0 BTFSS A2,7 ;=1? GOTO $+7 BSF Znam ;=1, záporné COMF A2,F COMF A1,F INCFSZ A1,F ;+1=0? GOTO $+2 INCF A2,F ;+1 ;příprava pro převod CLRF D2 CLRF D3 ;převod Rad100 MOVLW 100 SUBWF A1,W ;A1-100 MOVWF D1 BTFSC STATUS,C ;záporné? GOTO Uloz ;NE MOVLW 1 SUBWF A2,W ;A2-1 BTFSS STATUS,C ;kladné? GOTO Rad10 ;NE MOVWF A2 MOVF D1,W Uloz MOVWF A1 INCF D3,F ;+1 GOTO Rad100 Rad10 MOVLW 10 SUBWF A1,W ;A1-10 BTFSS STATUS,C ;kladné? GOTO End10 ;NE MOVWF A1 ;zbytek do A INCF D2,F ;+1, zvětšit řád 10 GOTO Rad10 End10 MOVF A1,W ;řád 1 MOVWF Znak1 ; zobrazit desetiny BSF D2,7 ;ZAP tečku MOVF D2,W ;řád 10 MOVWF Znak2 ; zobrazit jedničky MOVF D3,W ;řád 100 ;znak pro záporné číslo BTFSC Znam ;=0?, kladný znak? CALL ZZnak ;NE, záporný znak ;nezobrazovat nulu BTFSC STATUS,Z ;D3=0? MOVLW 0x20 ;ANO, prázdný znak MOVWF Znak3 ; zobrazit desítky RETURN ;-------------------------------- ;zobrazit Teplotu ZTEP BTFSS PS ;porucha snímače? GOTO $+7 ;NE MOVLW 0x1F ;zobrazit [----] MOVWF Znak3 ; MOVWF Znak2 ; MOVWF Znak1 ; MOVWF Znak0 ; RETURN MOVF T1,W MOVWF A1 MOVF T2,W MOVWF A2 ;zobrazit desetinou tečku při nové MIN/MAX teplotě BTFSC MINT ;=1?, nová MIN teplota GOTO $+3 ;ANO BTFSS MAXT ;=1?, nová MAX teplota GOTO $+6 ;NE ;blikat, desetiná tečka MOVF SEKD,W ANDLW B'01100000' MOVLW 0xA6 ;znak°. BTFSC STATUS,Z ;nulové? GOTO WZ0 MOVLW 0x26 ;znak° WZ0 MOVWF Znak0 GOTO HEXDEC ;-------------------------------- ;zobrazit MIN Teplotu ZLTEP MOVF LT1,W MOVWF A1 MOVF LT2,W MOVWF A2 MOVLW 0x26 ;znak° BTFSC MINT ;=1?, nová MIN teplota IORLW B'10000000' ;ANO, ZAP tečku GOTO WZ0 ;-------------------------------- ;zobrazit MAX Teplotu ZHTEP MOVF HT1,W MOVWF A1 MOVF HT2,W MOVWF A2 MOVLW 0x26 ;znak° BTFSC MAXT ;=1?, nová MAX teplota IORLW B'10000000' ;ANO, ZAP tečku GOTO WZ0 ;-------------------------------- ;zobrazit Mez ZMEZ MOVF M1,W MOVWF A1 MOVF M2,W MOVWF A2 MOVLW 0x26 ;znak° GOTO WZ0 ;-------------------------------- ;zobrazit Hodiny ZHOD MOVF Hod,W ;hodiny CALL CHD ;vrátí R1,R10=W BTFSC STATUS,Z ;C=0? nenulové MOVLW 0x20 ;nezobrazovat nulu MOVWF Znak3 ;Hod desítky ;blikat, desetiná tečka MOVF SEKD,W ANDLW B'01100000' BTFSS STATUS,Z ;nenulové? BSF R1,7 ;ANO, ZAP tečku MOVF R1,W ;řád jedniček MOVWF Znak2 ;Hod jedničky ;zobrazit Min MOVF Min,W ;minuty CALL CHD MOVWF Znak1 ;Min desítky MOVF R1,W ;řád jedniček WZ1 MOVWF Znak0 RETURN ;-------------------------------- ;zobrazit MIN Hodiny ZLHOD MOVF LHod,W ;hodiny CALL CHD ;vrátí R1,R10=W BTFSC STATUS,Z ;C=0? nenulové MOVLW 0x20 ;nezobrazovat nulu MOVWF Znak3 ;Hod desítky BSF R1,7 ;ZAP tečku MOVF R1,W ;řád jedniček MOVWF Znak2 ;Hod jedničky ;zobrazit MIN Minuty MOVF LMin,W ;minuty CALL CHD MOVWF Znak1 ;Min desítky MOVF R1,W ;řád jedniček GOTO WZ1 ;-------------------------------- ;zobrazit MAX Hodiny ZHHOD MOVF HHod,W ;hodiny CALL CHD ;vrátí R1,R10=W BTFSC STATUS,Z ;C=0? nenulové MOVLW 0x20 ;nezobrazovat nulu MOVWF Znak3 ;Hod desítky BSF R1,7 ;ZAP tečku MOVF R1,W ;řád jedniček MOVWF Znak2 ;Hod jedničky ;zobrazit MAX Minuty MOVF HMin,W ;minuty CALL CHD MOVWF Znak1 ;Min desítky MOVF R1,W ;řád jedniček GOTO WZ1 ;-------------------------------- ;zobrazit Den ZDEN CALL PoNe3 MOVWF Znak3 CALL PoNe2 MOVWF Znak2 CALL PoNe1 MOVWF Znak1 CALL PoNe0 GOTO WZ1 ;-------------------------------- ;zobrazit Datum ZDAT MOVF Den,W CALL CHD ;vrátí R1,R10=W BTFSC STATUS,Z ;C=0? nenulové MOVLW 0x20 ;nezobrazovat nulu MOVWF Znak3 ;desítky BSF R1,7 ;ZAP tečku MOVF R1,W ;řád jedniček MOVWF Znak2 ;jedničky MOVF Mes,W CALL CHD ;vrátí R1,R10=W BTFSC STATUS,Z ;C=0? nenulové MOVLW 0x20 ;nezobrazovat nulu MOVWF Znak1 ;desítky BSF R1,7 ;ZAP tečku MOVF R1,W ;řád jedniček GOTO WZ1 ;-------------------------------- ;zobrazit MIN Datum ZLDAT MOVF LDen,W CALL CHD ;vrátí R1,R10=W BTFSC STATUS,Z ;C=0? nenulové MOVLW 0x20 ;nezobrazovat nulu MOVWF Znak3 ;desítky BSF R1,7 ;ZAP tečku MOVF R1,W ;řád jedniček MOVWF Znak2 ;jedničky MOVF LMes,W CALL CHD ;vrátí R1,R10=W BTFSC STATUS,Z ;C=0? nenulové MOVLW 0x20 ;nezobrazovat nulu MOVWF Znak1 ;desítky BSF R1,7 ;ZAP tečku MOVF R1,W ;řád jedniček GOTO WZ1 ;-------------------------------- ;zobrazit MAX Datum ZHDAT MOVF HDen,W CALL CHD ;vrátí R1,R10=W BTFSC STATUS,Z ;C=0? nenulové MOVLW 0x20 ;nezobrazovat nulu MOVWF Znak3 ;desítky BSF R1,7 ;ZAP tečku MOVF R1,W ;řád jedniček MOVWF Znak2 ;jedničky MOVF HMes,W CALL CHD ;vrátí R1,R10=W BTFSC STATUS,Z ;C=0? nenulové MOVLW 0x20 ;nezobrazovat nulu MOVWF Znak1 ;desítky BSF R1,7 ;ZAP tečku MOVF R1,W ;řád jedniček GOTO WZ1 ;-------------------------------- ;zobrazit Rok ZROK MOVF Rok,W CALL CHD ;vrátí R1,R10=W MOVWF Znak1 ;desítky ZROK1 MOVLW 0x02 ;2 MOVWF Znak3 MOVLW 0x00 ;0 MOVWF Znak2 MOVF R1,W ;řád jedniček GOTO WZ1 ;-------------------------------- ;zobrazit MIN Rok ZLROK MOVF LRok,W CALL CHD ;vrátí R1,R10=W MOVWF Znak1 ;desítky GOTO ZROK1 ;-------------------------------- ;zobrazit MAX Rok ZHROK MOVF HRok,W CALL CHD ;vrátí R1,R10=W MOVWF Znak1 ;desítky GOTO ZROK1 ;================================ ;zobrazit nadpis [°C ] teplota ZNTEP MOVLW 0x26 ;° MOVWF Znak3 MOVLW 0x0C ;C MOVWF Znak2 MOVLW 0x20 ; MOVWF Znak1 GOTO WZ1 ;-------------------------------- ;zobrazit nadpis [L. °C] MIN teplota ZNLTEP MOVLW 0x94 ;L. MOVWF Znak3 ZNTEP1 MOVLW 0x20 ; MOVWF Znak2 MOVLW 0x26 ;° MOVWF Znak1 MOVLW 0x0C ;C GOTO WZ1 ;-------------------------------- ;zobrazit nadpis [M. °C] Mez ZNMEZ MOVLW 0x95 ;M. MOVWF Znak3 GOTO ZNTEP1 ;-------------------------------- ;zobrazit nadpis [H. °C] MAX teplota ZNHTEP MOVLW 0x90 ;H. MOVWF Znak3 GOTO ZNTEP1 ;-------------------------------- ;zobrazit nadpis [Hod. ] hodiny ZNHOD MOVLW 0x10 ;H MOVWF Znak3 MOVLW 0x17 ;o MOVWF Znak2 MOVLW 0x8D ;d. MOVWF Znak1 MOVLW 0x20 GOTO WZ1 ;-------------------------------- ;zobrazit nadpis [L.Hod. ] MIN hodiny ZNLHOD MOVLW 0x94 ;L. MOVWF Znak3 ZNHOD1 MOVLW 0x10 ;H MOVWF Znak2 MOVLW 0x17 ;o MOVWF Znak1 MOVLW 0x8D ;d. GOTO WZ1 ;-------------------------------- ;zobrazit nadpis [H.Hod. ] MAX hodiny ZNHHOD MOVLW 0x90 ;H. MOVWF Znak3 GOTO ZNHOD1 ;-------------------------------- ;zobrazit nadpis [dEn ] den v týdnu ZNDEN MOVLW 0x0D ;d MOVWF Znak3 MOVLW 0x0E ;E MOVWF Znak2 MOVLW 0x16 ;n MOVWF Znak1 MOVLW 0x20 GOTO WZ1 ;-------------------------------- ;zobrazit nadpis [dAt. ] datum ZNDAT MOVLW 0x0D ;d MOVWF Znak3 MOVLW 0x0A ;A MOVWF Znak2 MOVLW 0x9B ;t. MOVWF Znak1 MOVLW 0x20 GOTO WZ1 ;-------------------------------- ;zobrazit nadpis [L.dAt.] MIN datum ZNLDAT MOVLW 0x94 ;L. MOVWF Znak3 ZNDAT1 MOVLW 0x0D ;d MOVWF Znak2 MOVLW 0x0A ;A MOVWF Znak1 MOVLW 0x9B ;t. GOTO WZ1 ;-------------------------------- ;zobrazit nadpis [H.dAt.] MAX datum ZNHDAT MOVLW 0x90 ;H. MOVWF Znak3 GOTO ZNDAT1 ;-------------------------------- ;zobrazit nadpis [rok ] ZNROK MOVLW 0x19 ;r MOVWF Znak3 MOVLW 0x17 ;o MOVWF Znak2 MOVLW 0x13 ;k MOVWF Znak1 MOVLW 0x20 GOTO WZ1 ;-------------------------------- ;zobrazit nadpis [L.rok] MIN rok ZNLROK MOVLW 0x94 ;L. MOVWF Znak3 ZNROK1 MOVLW 0x19 ;r MOVWF Znak2 MOVLW 0x17 ;o MOVWF Znak1 MOVLW 0x13 ;k GOTO WZ1 ;-------------------------------- ;zobrazit nadpis [H.rok] MAX rok ZNHROK MOVLW 0x90 ;H. MOVWF Znak3 GOTO ZNROK1 ;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ;test něco stisknuto? TNS CLRWDT MOVF KLVP,W ANDLW B'00000111' XORLW B'00000111' ;(st.=0) BTFSS STATUS,Z ;nic? GOTO TNS ;něco RETURN ;-------------------------------- KLVM CLRWDT CALL MT ;měření teploty ;test KLV + opakovaní, sZ=0=něco stisknuto, 1=žádné tlačítko KLV CLRWDT MOVF KLVP,W ANDLW B'00000111' XORLW B'00000111' ;(st.=0) BTFSS STATUS,Z ;=1?, nenulové? (žádné tlačítko) GOTO Neco ;něco stisknuto BCF Stisk ;=0 BSF Znova ;=1 RETURN Neco BTFSC TlS ;stisknuto TlS? CLRF BLIK ;NE, nulovat BSF STATUS,Z ;=1 BTFSS Znova ;=1? odčasováno? RETURN ;NE, jako žádné tl. MOVLW 10 ;kratší čas (0.1s) BTFSS Stisk ;minule stisknuto? MOVLW 100 ;delší čas (1s) MOVWF KLVO ;nastavit časovač pro opakování BTFSS TlS ;stisknuto TlS? CLRF KLVO ;ANO, MAX čas (2.5s) BCF Znova ;=0 BSF Stisk ;=1 BCF STATUS,Z ;=0 RETURN ;EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ;čtení EEPROM, adresu do EEADRp, vrátí data v W ERead BSF STATUS,RP0 ;Banka1 MOVF EEADRp,W MOVWF EEADR ;adresa BSF EECON1,RD ;čtení MOVF EEDATA,W BCF STATUS,RP0 ;Banka0 RETURN ;-------------------------------- ;zápis do EEPROM, adresu do EEADRp, data do W EWrite CLRWDT BCF INTCON,GIE ;zakázat přerušení BSF STATUS,RP0 ;Banka1 MOVWF EEDATA ;data MOVF EEADRp,W MOVWF EEADR ;adresa BSF EECON1,WREN ;zápis povolen MOVLW 0x55 ;úvodní MOVWF EECON2 ; sekvence MOVLW 0xAA ; MOVWF EECON2 ; BSF EECON1,WR ;zápis EEIF0 BTFSC EECON1,WR ;konec zápisu? GOTO EEIF0 ;NE BCF EECON1,WREN ;zápis zakázán BCF STATUS,RP0 ;Banka0 ;pauza po zápisu CLRW ADDLW 1 ;W+1 BTFSS STATUS,Z ;W=0? GOTO $-2 ;NE BSF INTCON,GIE ;povolit přerušení RETURN ;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP ;přerušení INT MOVWF MemW MOVF STATUS,W CLRF STATUS MOVWF MemStat ;-------------------------------- BTFSC INTCON,T0IF ;od TMR0? GOTO ITMR0 ;ANO BTFSS PIR1,TMR1IF ;od TMR1? GOTO EINT ;NE ;================================ ;přerušení od přetečení TMR1; porucha snímače při Měření signálu BCF PIR1,TMR1IF ;VYP příznak BSF PS ;ZAP porucha snímače BCF T1CON,TMR1ON ;stop časovač TMR1 CLRF PV ;vynulovat počet vzorků CLRW ;zrušit "dva kroky zpět" RETFIE ;návrat do Měření signálu ;================================ ;300Hz (krystal 19.6608MHz) přerušení od časovače TMR0 ITMR0 BCF INTCON,T0IF ;VYP příznak BSF NM ;ZAP neplatné měření ;-------------------------------- ;Displej, Klávesnice MOVLW Znak0 ;číslo adresy RAM, nikoliv obsah MOVWF FSR ; do FSR, ukazovátko (pointer) MOVF Pozice,W ;číslo zapnutého displeje (0 až 3) ADDWF FSR,f ;FSR+pozice=FSR ;zhasnout displej MOVLW B'00010111' BTFSC Re ;=1? MOVLW B'00011111' ;ANO MOVWF PORTB ;Katody=1, Anody=0, Re (bit3) se nemění CLRF PORTA ;Anody=0 ;................................ ;dělič pro klávesnici (300/12=25) DECFSZ KLVD,F ;-1=0? GOTO $+19 MOVLW 12 ;znovu MOVWF KLVD ; naplnit ;čtení klávesnice BSF STATUS,RP0 ;Banka1 MOVLW B'00010111' MOVWF TRISB ;1=vstup, 0=výstup BCF STATUS,RP0 ;Banka0 MOVF PORTB,W ;čtení MOVF PORTB,W ;čtení MOVF PORTB,W ;čtení MOVF PORTB,W ;čtení MOVF PORTB,W ;čtení MOVF PORTB,W ;čtení MOVF PORTB,W ;čtení ANDLW B'00010111' ;(1a1=1) MOVWF KLVP ;uložit BSF STATUS,RP0 ;Banka1 CLRF TRISB ;0=výstup BCF STATUS,RP0 ;Banka0 ;................................ MOVF INDF,W ;načíst znak z místa, na který odkazuje FSR ANDLW B'01111111' ;vynulovat bit7 CALL Znak ;převede číslo znaku na sedmisegment kód BTFSC INDF,7 ;nastavená tečka? IORLW B'10000000' ;ANO, ZAP tečku MOVWF PORTA ;vyslat znak na PA ANDLW B'11100000' ; IORWF PORTB,F ;vyslat znak na PB CALL Anoda ;vybrat anodu ANDWF PORTB,F ;zapnout anodu, ostatní bity neměnit INCF Pozice,f ;zvětšit pozici, další znak MOVLW B'00000011' ;celkem 4 místa (0-3) ANDWF Pozice,f ;bity 7-2 odseknout ;-------------------------------- ;dělič 300/3=100Hz DECFSZ De3,F ;-1=0? GOTO EINT ;NE MOVLW 3 ;znovu MOVWF De3 ; naplnit ;================================ ;100Hz ;dělič pro Stop Regulace MOVF DeSR,F BTFSS STATUS,Z ;DeSR=0? INCF DeSR,F ;NE, +1 ;dělič pro blikání displeje INCF BLIK,F ;+1 ;dělič pro opakování KLV DECFSZ KLVO,F ;-1=0? GOTO $+2 BSF Znova ;=1 ;-------------------------------- ;dělič 100/100=1 DECFSZ SEKD,F ;-1=0? GOTO EINT ;NE MOVLW 100 ;znovu MOVWF SEKD ; naplnit ;================================ ;1Hz, SEKUNDA ;časovač zobrazení-1 (pro časovou smyčku) MOVF CZ,F BTFSS STATUS,Z ;CZ=0? DECF CZ,F ;NE,CZ-1 ;sekunda+1 INCF Sek,F ;+1 MOVF Sek,W SUBLW 59 ;59-Sek BTFSC STATUS,C ;C=0? záporné? GOTO ESEK ;NE CLRF Sek ;=0 ;minuta+1 INCF Min,F ;+1 MOVF Min,W SUBLW 59 ;59-Min BTFSC STATUS,C ;C=0? záporné? GOTO ESEK ;NE CLRF Min ;=0 ;hodina+1 INCF Hod,F ;+1 MOVF Hod,W SUBLW 23 ;23-Hod BTFSC STATUS,C ;C=0? záporné? GOTO ESEK CLRF Hod ;ANO;=0 ;dny v týdnu+1 INCF PoNe,F ;+1 MOVF PoNe,W SUBLW 6 ;6-PoNe BTFSS STATUS,C ;C=1? kladné? CLRF PoNe ;NE;=0 MOVLW 0x18 ;adresa MOVWF EEADRp ; MOVF PoNe,W ;data CALL EWrite ;zápis do EEPROM ;dny+1 MOVLW 0x19 ;adresa MOVWF EEADRp ; INCF Den,F ;+1 MOVF Den,W SUBWF MAXden,W ;MAXden-Den BTFSS STATUS,C ;C=1?; kladné? GOTO $+4 MOVF Den,W ;data CALL EWrite ;zápis do EEPROM GOTO ESEK MOVLW 1 ;ANO MOVWF Den ;=1 CALL EWrite ;zápis do EEPROM ;měsíc+1 MOVLW 0x1A ;adresa MOVWF EEADRp ; INCF Mes,F ;+1 MOVF Mes,W SUBLW 12 ;12-Měsíc BTFSS STATUS,C ;C=1?; kladné? GOTO $+6 ;NE CALL MaxDen ;zjistit max. den v měsíci MOVWF MAXden ;uložit MOVF Mes,W ;data CALL EWrite ;zápis do EEPROM GOTO ESEK MOVLW 1 ;ANO MOVWF Mes ;=1 CALL MaxDen ;zjistit max. den v měsíci MOVWF MAXden ;uložit MOVF Mes,W ;data CALL EWrite ;zápis do EEPROM ;rok+1 INCF Rok,F ;+1 MOVF Rok,W SUBLW 99 ;99-Rok BTFSS STATUS,C ;C=1?; kladné? CLRF Rok ;NE;=0 MOVLW 0x1B ;adresa MOVWF EEADRp ; MOVF Rok,W ;data CALL EWrite ;zápis do EEPROM ;................................ ;přepnout časovou smyčku na hodiny ESEK MOVF Sek,W SUBLW 59 ;59-Sek BTFSS STATUS,Z ;=0? (Z=1) GOTO EINT ;NE MOVLW 1 ;zobrazit hodiny MOVWF NZ CLRF CZ ;-------------------------------- ;konec přerušení EINT MOVF MemStat,W MOVWF STATUS SWAPF MemW,F SWAPF MemW,W RETFIE ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ;iniciace Init MOVLW 0x07 ;OFF MOVWF CMCON ; Comparators ;obnovení RAM z EEPROM 0x00-0x1D CLRF EEADRp ;počáteční adresa EEPROM MOVLW CZ0 ;počáteční adresa RAM MOVWF FSR CALL ERead ;čtení MOVWF INDF ;zápis INCF EEADRp,F ;adresa+1 INCF FSR,F ;data+1 MOVF EEADRp,W SUBLW 0x1D ;poslední adresa EEPROM BTFSC STATUS,C ;záporné? GOTO $-7 ;NE ;základní nastavení BSF STATUS,RP0 ;Banka1 MOVLW B'00100000' ;PORTA výstup mimo A5 MOVWF TRISA ; CLRF TRISB ;PORTB výstup MOVLW B'01000101' ;předdělič 1:64 pro TMR0 MOVWF OPTION_REG ; MOVLW B'00000001' ;přerušení od TMR1 MOVWF PIE1 ; BCF STATUS,RP0 ;Banka0 MOVLW B'11100000' ;přerušení od TMR0 MOVWF INTCON ; MOVLW B'00000101' ;předdělič 1:1 pro TMR1 MOVWF T1CON ; CLRF Pozice ;vynulovat CLRF FL ; CLRF PV ; CLRF KLVD ; MOVLW B'00000111' ;UT=0 MOVWF KLVP ; CLRF Min CLRF Hod MOVLW 1 MOVWF DeSR BCF Re CALL MaxDen ;zjistit max. den v měsíci MOVWF MAXden ;uložit GOTO STEP ;*******************************; ; časová smyčka ; ;-------------------------------; ;nadpis pro časovou smyčku NCS MOVLW 0x0C MOVWF Znak3 MOVLW 0x28 MOVWF Znak2 MOVWF Znak1 MOVLW 0x24 MOVWF Znak0 CALL TNS ;test něco stisknuto? ;-------------------------------- ;teplota STEP MOVF NZ0,W ;následuje zobrazení MOVWF NZ ; MOVF CZ0,W ;časovač zobrazení MOVWF CZ ; STEP1 MOVF CZ,F BTFSC STATUS,Z ;CZ=0? GOTO ROZ ;ANO ;zobrazit Teplotu CALL ZTEP ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO STEP1 ;NE BTFSS TlM ;stisknuto? GOTO NLTEP ;ANO BTFSS TlP ;stisknuto? GOTO NHOD ;ANO CALL ZNTEP ;zobrazit nadpis [°C ] teplota CALL TNS ;test neco stisknuto? BSF CZ,3 ;časovač zobrazení (8s) GOTO STEP1 ;-------------------------------- ;hodiny SHOD MOVF NZ1,W ;následuje zobrazení MOVWF NZ ; MOVF CZ1,W ;časovač zobrazení MOVWF CZ ; SHOD1 MOVF CZ,F BTFSC STATUS,Z ;CZ=0? GOTO ROZ ;ANO ;zobrazit Hodiny CALL ZHOD ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO SHOD1 ;NE BTFSS TlM ;stisknuto? GOTO NLTEP ;ANO BTFSS TlP ;stisknuto? GOTO NHOD ;ANO CALL ZNHOD ;zobrazit nadpis [Hod. ] Hodiny CALL TNS ;test neco stisknuto? BSF CZ,3 ;časovač zobrazení (8s) GOTO SHOD1 ;-------------------------------- ;den v týdnu SDEN MOVF NZ2,W ;následuje MOVWF NZ ; MOVF CZ2,W ;časovač MOVWF CZ ; SDEN1 MOVF CZ,F BTFSC STATUS,Z ;CZ=0? GOTO ROZ ;ANO ;zobrazit Den CALL ZDEN ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO SDEN1 ;NE BTFSS TlM ;stisknuto? GOTO NLTEP ;ANO BTFSS TlP ;stisknuto? GOTO NHOD ;ANO CALL ZNDEN ;zobrazit nadpis [dEn ] Den v týdnu CALL TNS ;test neco stisknuto? BSF CZ,3 ;časovač zobrazení (8s) GOTO SDEN1 ;-------------------------------- ;datum SDAT MOVF NZ3,W ;následuje MOVWF NZ ; MOVF CZ3,W ;časovač MOVWF CZ ; SDAT1 MOVF CZ,F BTFSC STATUS,Z ;CZ=0? GOTO ROZ ;ANO ;zobrazit datum CALL ZDAT ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO SDAT1 ;NE BTFSS TlM ;stisknuto? GOTO NLTEP ;ANO BTFSS TlP ;stisknuto? GOTO NHOD ;ANO CALL ZNDAT ;zobrazit nadpis [dAt. ] Datum CALL TNS ;test neco stisknuto? BSF CZ,3 ;časovač zobrazení (8s) GOTO SDAT1 ;-------------------------------- ;rok SROK MOVF NZ4,W ;následuje MOVWF NZ ; MOVF CZ4,W ;časovač MOVWF CZ ; SROK1 MOVF CZ,F BTFSC STATUS,Z ;CZ=0? GOTO ROZ ;ANO ;zobrazit rok CALL ZROK ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO SROK1 ;NE BTFSS TlM ;stisknuto? GOTO NLTEP ;ANO BTFSS TlP ;stisknuto? GOTO NHOD ;ANO CALL ZNROK ;zobrazit nadpis [rok ] Rok CALL TNS ;test neco stisknuto? BSF CZ,3 ;časovač zobrazení (8s) GOTO SROK1 ;*******************************; ; prohlížení a nastavování ; ;-------------------------------; ;nadpis [ °C] teplota NTEP CALL ZNTEP CALL TNS ;test neco stisknuto? ;zobrazit teplotu TEP1 CALL ZTEP ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO TEP1 ;NE BTFSS TlM ;stisknuto? GOTO NCS ;ANO BTFSS TlP ;stisknuto? GOTO NHOD ;ANO, na konec CALL ZNTEP ;zobrazit nadpis [°C ] teplota ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO TEP1 ;NE BTFSS Znova ;odčasováno? GOTO $-4 ;NE BCF Znova ;nulovat ;................................ ;vložit cX MOVLW 0x23 ;c MOVWF Znak3 MOVF CZ0,W ;časovač zobrazení pro Teplotu IORLW B'10000000' ;ZAP tečku MOVWF Znak2 MOVLW 0x16 ;n MOVWF Znak1 MOVF NZ0,W ;následné zobrazení po Teplotě IORLW B'10000000' ;ZAP tečku MOVWF Znak0 ;blikat, cX TEP2 BTFSS BLIK,4 GOTO $+4 MOVLW 0xA0 ;VYP MOVWF Znak2 ; displej GOTO $+4 MOVF CZ0,W ;časovač zobrazení pro Teplotu IORLW B'10000000' ;ZAP tečku MOVWF Znak2 ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO TEP2 ;NE BTFSS TlS ;stisknuto? GOTO TEP4 ;ANO BTFSS TlP ;stisknuto? GOTO TEP3 ;ANO ;CZ0 -1 (MIN 1) DECFSZ CZ0,F ;-1=0? GOTO TEP2 MOVLW 9 MOVWF CZ0 GOTO TEP2 ;CZ0 +1 (MAX 9) TEP3 INCF CZ0,F ;+1 MOVF CZ0,W SUBLW 9 ;9-CZ0 BTFSC STATUS,C ;záporné? GOTO TEP2 ;NE MOVLW 1 MOVWF CZ0 GOTO TEP2 ;zápis CZ0 do EEPROM TEP4 MOVLW 0x00 ;adresa MOVWF EEADRp ; MOVF CZ0,W ;data CALL EWrite ;zápis MOVF CZ0,W ;časovač zobrazení pro Teplotu IORLW B'10000000' ;ZAP tečku MOVWF Znak2 ;................................ ;vložit nX TEP5 ;blikat, nX BTFSS BLIK,4 GOTO $+4 MOVLW 0xA0 ;VYP MOVWF Znak0 ; displej GOTO $+4 MOVF NZ0,W ;následné zobrazení po Teplotě IORLW B'10000000' ;ZAP tečku MOVWF Znak0 ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO TEP5 ;NE BTFSS TlS ;stisknuto? GOTO TEP7 ;ANO BTFSS TlP ;stisknuto? GOTO TEP6 ;ANO ;NZ0 -1 (MIN 0) DECF NZ0,F ;-1? BTFSS NZ0,7 ;záporné GOTO TEP5 ;NE MOVLW 4 MOVWF NZ0 GOTO TEP5 ;NZ0 +1 (MAX 4) TEP6 INCF NZ0,F ;+1 MOVF NZ0,W SUBLW 4 ;4-NZ0 BTFSC STATUS,C ;záporné? GOTO TEP5 ;NE CLRF NZ0 ;=0 GOTO TEP5 ;zápis NZ0 do EEPROM TEP7 MOVLW 0x05 ;adresa MOVWF EEADRp ; MOVF NZ0,W ;data CALL EWrite ;zápis GOTO NTEP ;-------------------------------- ;nadpis [Hod. ] Hodiny NHOD CALL ZNHOD ;zobrazit nadpis [Hod. ] Hodiny CALL TNS ;test neco stisknuto? ;zobrazit Hod HOD1 CALL ZHOD ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO HOD1 ;NE BTFSS TlM ;stisknuto? GOTO NTEP ;ANO, minulé BTFSS TlP ;stisknuto? GOTO NDEN ;ANO, další CALL ZNHOD ;zobrazit nadpis [Hod. ] Hodiny ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO HOD1 ;NE BTFSS Znova ;odčasováno? GOTO $-4 ;NE BCF Znova ;nulovat ;................................ ;Vložit HOD HOD2 ;blikat, Hod BTFSS BLIK,4 GOTO $+6 MOVLW 0x20 ;VYP MOVWF Znak3 ; displej IORLW B'10000000' ;ZAP tečku MOVWF Znak2 ; GOTO $+7 MOVF Hod,W ;hodiny CALL CHD ;vrátí R1,R10=W MOVWF Znak3 ;Hod desítky MOVF R1,W ;řád jedniček IORLW B'10000000' ;ZAP tečku MOVWF Znak2 ;Hod jedničky ;zobrazit Min MOVF Min,W ;minuty CALL CHD MOVWF Znak1 ;Min desítky MOVF R1,W ;řád jedniček MOVWF Znak0 ;Min jedničky ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO HOD2 ;NE BTFSS TlS ;stisknuto? GOTO HOD4 ;ANO BTFSS TlP ;stisknuto? GOTO HOD3 ;ANO ;Hod -1 MOVLW 1 SUBWF Hod,F ;Hod-1 BTFSC STATUS,C ;záporné? GOTO HOD2 ;NE MOVLW 23 MOVWF Hod GOTO HOD2 ;Hod +1 HOD3 INCF Hod,F ;Hod+1 MOVF Hod,W SUBLW 23 ;23-Hod BTFSS STATUS,C ;C=1? kladné? CLRF Hod ;NE;=0 GOTO HOD2 ;................................ ;vložit Minuty HOD4 ;zobrazit Hodiny MOVF Hod,W ;hodiny CALL CHD ;vrátí R1,R10=W MOVWF Znak3 ;Hod desítky MOVF R1,W ;řád jedniček IORLW B'10000000' ;ZAP tečku MOVWF Znak2 ;Hod jedničky ;blikat, Minuty BTFSS BLIK,4 GOTO $+5 MOVLW 0x20 ;VYP MOVWF Znak1 ; displej MOVWF Znak0 ; GOTO $+6 MOVF Min,W ;minuty CALL CHD MOVWF Znak1 ;Min desítky MOVF R1,W ;řád jedniček MOVWF Znak0 ;Min jedničky ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO HOD4 ;NE BTFSS TlS ;stisknuto? GOTO HOD6 ;ANO BTFSS TlP ;stisknuto? GOTO HOD5 ;ANO ;Min -1 MOVLW 1 SUBWF Min,F ;Min-1 BTFSC STATUS,C ;záporné? GOTO HOD4 ;NE MOVLW 59 MOVWF Min GOTO HOD4 ;Min +1 HOD5 INCF Min,F ;Min+1 MOVF Min,W SUBLW 59 ;59-Min BTFSS STATUS,C ;C=1? kladné? CLRF Min ;NE;=0 GOTO HOD4 ;................................ ;vložit SEK HOD6 MOVLW 0x05 ;S MOVWF Znak3 MOVLW 0x8E ;E. MOVWF Znak2 MOVF Sek,W ;sekundy CALL CHD MOVWF Znak1 ;Sek desítky MOVF R1,W ;řád jedniček MOVWF Znak0 ;Sek jedničky ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO HOD6 ;NE BTFSS TlS ;stisknuto? GOTO HOD7 ;ANO ;nulovat sekundy CLRF Sek MOVLW 100 ;znovu MOVWF SEKD ; naplnit GOTO HOD6 ;................................ ;vložit cX HOD7 MOVLW 0x23 ;c MOVWF Znak3 MOVF CZ1,W ;časovač zobrazení pro Hodiny IORLW B'10000000' ;ZAP tečku MOVWF Znak2 MOVLW 0x16 ;n MOVWF Znak1 MOVF NZ1,W ;následné zobrazení po Hodinách IORLW B'10000000' ;ZAP tečku MOVWF Znak0 ;blikat, cX HOD8 BTFSS BLIK,4 GOTO $+4 MOVLW 0xA0 ;VYP MOVWF Znak2 ; displej GOTO $+4 MOVF CZ1,W ;časovač zobrazení pro Teplotu IORLW B'10000000' ;ZAP tečku MOVWF Znak2 ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO HOD8 ;NE BTFSS TlS ;stisknuto? GOTO HOD10 ;ANO BTFSS TlP ;stisknuto? GOTO HOD9 ;ANO ;CZ1 -1 (MIN 1) DECFSZ CZ1,F ;-1=0? GOTO HOD8 MOVLW 9 MOVWF CZ1 GOTO HOD8 ;CZ1 +1 (MAX 9) HOD9 INCF CZ1,F ;+1 MOVF CZ1,W SUBLW 9 ;9-CZ1 BTFSC STATUS,C ;záporné? GOTO HOD8 ;NE MOVLW 1 MOVWF CZ1 GOTO HOD8 ;zápis CZ1 do EEPROM HOD10 MOVLW 0x01 ;adresa MOVWF EEADRp ; MOVF CZ1,W ;data CALL EWrite ;zápis MOVF CZ1,W ;časovač zobrazení pro Teplotu IORLW B'10000000' ;ZAP tečku MOVWF Znak2 ;................................ ;vložit nX HOD11 ;blikat, nX BTFSS BLIK,4 GOTO $+4 MOVLW 0xA0 ;VYP MOVWF Znak0 ; displej GOTO $+4 MOVF NZ1,W ;následné zobrazení po Teplotě IORLW B'10000000' ;ZAP tečku MOVWF Znak0 ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO HOD11 ;NE BTFSS TlS ;stisknuto? GOTO HOD13 ;ANO BTFSS TlP ;stisknuto? GOTO HOD12 ;ANO ;NZ1 -1 (MIN 0) DECF NZ1,F ;-1? BTFSS NZ1,7 ;záporné GOTO HOD11 ;NE MOVLW 4 MOVWF NZ1 GOTO HOD11 ;NZ1 +1 (MAX 4) HOD12 INCF NZ1,F ;+1 MOVF NZ1,W SUBLW 4 ;4-NZ1 BTFSC STATUS,C ;záporné? GOTO HOD11 ;NE CLRF NZ1 ;=0 GOTO HOD11 ;zápis NZ1 do EEPROM HOD13 MOVLW 0x06 ;adresa MOVWF EEADRp ; MOVF NZ1,W ;data CALL EWrite ;zápis GOTO NHOD ;-------------------------------- ;nadpis [dEn ] pondělí až neděle NDEN CALL ZNDEN ;zobrazit nadpis [dEn ] CALL TNS ;test neco stisknuto? ;zobrazit Den DEN1 CALL ZDEN ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO DEN1 ;NE BTFSS TlM ;stisknuto? GOTO NHOD ;ANO BTFSS TlP ;stisknuto? GOTO NDAT ;ANO, na konec CALL ZNDEN ;zobrazit nadpis [dEn ] ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO DEN1 ;NE BTFSS Znova ;odčasováno? GOTO $-4 ;NE BCF Znova ;nulovat ;................................ ;vložit Den, pondělí až pátek DEN2 ;blikat, Den BTFSS BLIK,4 GOTO $+7 MOVLW 0x20 ;VYP MOVWF Znak3 ; displej MOVWF Znak2 ; MOVWF Znak1 ; MOVWF Znak0 ; GOTO $+2 CALL ZDEN ;zobrazit Den ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO DEN2 ;NE BTFSS TlS ;stisknuto? GOTO DEN4 ;ANO BTFSS TlP ;stisknuto? GOTO DEN3 ;ANO ;PONE-1 DECF PoNe,F ;-1? BTFSS PoNe,7 ;záporné GOTO DEN2 ;NE MOVLW 6 MOVWF PoNe GOTO DEN2 ;PoNe+1 DEN3 INCF PoNe,F MOVF PoNe,W SUBLW 6 ;6-PoNe BTFSS STATUS,C ;C=1? kladné? CLRF PoNe ;=0 GOTO DEN2 DEN4 MOVLW 0x18 ;adresa MOVWF EEADRp ; MOVF PoNe,W ;data CALL EWrite ;zápis do EEPROM ;................................ ;vložit cX MOVLW 0x23 ;c MOVWF Znak3 MOVF CZ2,W ;časovač zobrazení pro Den IORLW B'10000000' ;ZAP tečku MOVWF Znak2 MOVLW 0x16 ;n MOVWF Znak1 MOVF NZ2,W ;následné zobrazení po Dnu IORLW B'10000000' ;ZAP tečku MOVWF Znak0 ;blikat, cX DEN5 BTFSS BLIK,4 GOTO $+4 MOVLW 0xA0 ;VYP MOVWF Znak2 ; displej GOTO $+4 MOVF CZ2,W ;časovač zobrazení pro Den IORLW B'10000000' ;ZAP tečku MOVWF Znak2 ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO DEN5 ;NE BTFSS TlS ;stisknuto? GOTO DEN7 ;ANO BTFSS TlP ;stisknuto? GOTO DEN6 ;ANO ;CZ2 -1 (MIN 1) DECFSZ CZ2,F ;-1=0? GOTO DEN5 MOVLW 9 MOVWF CZ2 GOTO DEN5 ;CZ2 +1 (MAX 9) DEN6 INCF CZ2,F ;+1 MOVF CZ2,W SUBLW 9 ;9-CZ2 BTFSC STATUS,C ;záporné? GOTO DEN5 ;NE MOVLW 1 MOVWF CZ2 GOTO DEN5 ;zápis CZ2 do EEPROM DEN7 MOVLW 0x02 ;adresa MOVWF EEADRp ; MOVF CZ2,W ;data CALL EWrite ;zápis MOVF CZ2,W ;časovač zobrazení pro Teplotu IORLW B'10000000' ;ZAP tečku MOVWF Znak2 ;................................ ;vložit nX DEN8 ;blikat, nX BTFSS BLIK,4 GOTO $+4 MOVLW 0xA0 ;VYP MOVWF Znak0 ; displej GOTO $+4 MOVF NZ2,W ;následné zobrazení po Dnu IORLW B'10000000' ;ZAP tečku MOVWF Znak0 ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO DEN8 ;NE BTFSS TlS ;stisknuto? GOTO DEN10 ;ANO BTFSS TlP ;stisknuto? GOTO DEN9 ;ANO ;NZ1 -1 (MIN 0) DECF NZ2,F ;-1? BTFSS NZ2,7 ;záporné GOTO DEN8 ;NE MOVLW 4 MOVWF NZ2 GOTO DEN8 ;NZ1 +1 (MAX 4) DEN9 INCF NZ2,F ;+1 MOVF NZ2,W SUBLW 4 ;4-NZ2 BTFSC STATUS,C ;záporné? GOTO DEN8 ;NE CLRF NZ2 ;=0 GOTO DEN8 ;zápis NZ2 do EEPROM DEN10 MOVLW 0x07 ;adresa MOVWF EEADRp ; MOVF NZ2,W ;data CALL EWrite ;zápis GOTO NDEN ;-------------------------------- ;nadpis [dAt. ] Datum NDAT CALL ZNDAT ;zobrazit nadpis [dAt. ] datum CALL TNS ;test neco stisknuto? ;zobrazit Datum DAT1 CALL ZDAT ;zobrazit Datum ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO DAT1 ;NE BTFSS TlM ;stisknuto? GOTO NDEN ;ANO BTFSS TlP ;stisknuto? GOTO NROK ;ANO, na konec CALL ZNDAT ;zobrazit nadpis [dEn ] ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO DAT1 ;NE BTFSS Znova ;odčasováno? GOTO $-4 ;NE BCF Znova ;nulovat ;................................ ;vložit Datum DAT2 ;blikat, Datum-den BTFSS BLIK,4 GOTO $+5 MOVLW 0x20 ;VYP MOVWF Znak3 ; displej MOVWF Znak2 ; GOTO $+2 CALL ZDAT ;zobrazit Datum ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO DAT2 ;NE BTFSS TlS ;stisknuto? GOTO DAT4 ;ANO BTFSS TlP ;stisknuto? GOTO DAT3 ;ANO ;Dny-1 DECFSZ Den,F ;-1=0? GOTO DAT2 MOVF MAXden,W MOVWF Den GOTO DAT2 ;Dny+1 DAT3 INCF Den,F ;+1 MOVF Den,W SUBWF MAXden,W ;MAXden-Den BTFSC STATUS,C ;C=0? záporné? GOTO DAT2 MOVLW 1 MOVWF Den GOTO DAT2 ;blikat, Datum-měsíc DAT4 BTFSS BLIK,4 GOTO $+5 MOVLW 0x20 ;VYP MOVWF Znak1 ; displej MOVWF Znak0 ; GOTO $+2 CALL ZDAT ;zobrazit Datum ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO DAT4 ;NE BTFSS TlS ;stisknuto? GOTO DAT6 ;ANO BTFSS TlP ;stisknuto? GOTO DAT5 ;ANO ;Měsíc-1 DECFSZ Mes,F ;-1=0? GOTO DAT4 MOVLW 12 MOVWF Mes GOTO DAT4 ;Měsíc+1 DAT5 INCF Mes,F ;+1 MOVF Mes,W SUBLW 12 ;12-Mes BTFSC STATUS,C ;C=0? záporné? GOTO DAT4 MOVLW 1 MOVWF Mes GOTO DAT4 DAT6 CALL MaxDen ;zjistit max. den v měsíci MOVWF MAXden ;uložit MOVLW 0x19 ;adresa MOVWF EEADRp ; MOVF Den,W ;data CALL EWrite ;zápis do EEPROM INCF EEADRp,F ;adresa+1 MOVF Mes,W ;data CALL EWrite ;zápis do EEPROM ;................................ ;vložit cX MOVLW 0x23 ;c MOVWF Znak3 MOVF CZ3,W ;časovač zobrazení pro Datum IORLW B'10000000' ;ZAP tečku MOVWF Znak2 MOVLW 0x16 ;n MOVWF Znak1 MOVF NZ3,W ;následné zobrazení po Datumu IORLW B'10000000' ;ZAP tečku MOVWF Znak0 ;blikat, cX DAT7 BTFSS BLIK,4 GOTO $+4 MOVLW 0xA0 ;VYP MOVWF Znak2 ; displej GOTO $+4 MOVF CZ3,W ;časovač zobrazení pro Teplotu IORLW B'10000000' ;ZAP tečku MOVWF Znak2 ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO DAT7 ;NE BTFSS TlS ;stisknuto? GOTO DAT9 ;ANO BTFSS TlP ;stisknuto? GOTO DAT8 ;ANO ;CZ3 -1 (MIN 1) DECFSZ CZ3,F ;-1=0? GOTO DAT7 MOVLW 9 MOVWF CZ3 GOTO DAT7 ;CZ3 +1 (MAX 9) DAT8 INCF CZ3,F ;+1 MOVF CZ3,W SUBLW 9 ;9-CZ3 BTFSC STATUS,C ;záporné? GOTO DAT7 ;NE MOVLW 1 MOVWF CZ3 GOTO DAT7 ;zápis CZ3 do EEPROM DAT9 MOVLW 0x03 ;adresa MOVWF EEADRp ; MOVF CZ3,W ;data CALL EWrite ;zápis MOVF CZ3,W ;časovač zobrazení pro Teplotu IORLW B'10000000' ;ZAP tečku MOVWF Znak2 ;................................ ;vložit nX DAT10 ;blikat, nX BTFSS BLIK,4 GOTO $+4 MOVLW 0xA0 ;VYP MOVWF Znak0 ; displej GOTO $+4 MOVF NZ3,W ;následné zobrazení po Datumu IORLW B'10000000' ;ZAP tečku MOVWF Znak0 ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO DAT10 ;NE BTFSS TlS ;stisknuto? GOTO DAT12 ;ANO BTFSS TlP ;stisknuto? GOTO DAT11 ;ANO ;NZ3 -1 (MIN 0) DECF NZ3,F ;-1? BTFSS NZ3,7 ;záporné? GOTO DAT10 ;NE MOVLW 4 MOVWF NZ3 GOTO DAT10 ;NZ3 +1 (MAX 4) DAT11 INCF NZ3,F ;+1 MOVF NZ3,W SUBLW 4 ;4-NZ3 BTFSC STATUS,C ;záporné? GOTO DAT10 ;NE CLRF NZ3 ;=0 GOTO DAT10 ;zápis NZ3 do EEPROM DAT12 MOVLW 0x08 ;adresa MOVWF EEADRp ; MOVF NZ3,W ;data CALL EWrite ;zápis GOTO NDAT ;-------------------------------- ;nadpis [rok ] NROK CALL ZNROK ;zobrazit nadpis [rok ] CALL TNS ;test neco stisknuto? ;zobrazit Rok ROK1 CALL ZROK ;zobrazit Rok ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO ROK1 ;NE BTFSS TlM ;stisknuto? GOTO NDAT ;ANO BTFSS TlP ;stisknuto? GOTO NLTEP ;ANO, na konec CALL ZNROK ;zobrazit nadpis [rok ] ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO ROK1 ;NE BTFSS Znova ;odčasováno? GOTO $-4 ;NE BCF Znova ;nulovat ;................................ ;vložit Rok ROK2 ;blikat, Rok BTFSS BLIK,4 GOTO $+7 MOVLW 0x20 ;VYP MOVWF Znak3 ; displej MOVWF Znak2 ; MOVWF Znak1 ; displej MOVWF Znak0 ; GOTO $+2 CALL ZROK ;zobrazit Rok ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO ROK2 ;NE BTFSS TlS ;stisknuto? GOTO ROK4 ;ANO BTFSS TlP ;stisknuto? GOTO ROK3 ;ANO ;Rok-1 DECFSZ Rok,F ;-1=0? GOTO ROK2 MOVLW 99 MOVWF Rok GOTO ROK2 ;Rok+1 ROK3 INCF Rok,F ;+1 MOVF Rok,W SUBLW 99 ;99-Rok BTFSC STATUS,C ;C=0? záporné? GOTO ROK2 MOVLW 1 MOVWF Rok GOTO ROK2 ROK4 MOVLW 0x1B ;adresa MOVWF EEADRp ; MOVF Rok,W ;data CALL EWrite ;zápis do EEPROM ;................................ ;vložit cX MOVLW 0x23 ;c MOVWF Znak3 MOVF CZ4,W ;časovač zobrazení pro Rok IORLW B'10000000' ;ZAP tečku MOVWF Znak2 MOVLW 0x16 ;n MOVWF Znak1 MOVF NZ4,W ;následné zobrazení po Roku IORLW B'10000000' ;ZAP tečku MOVWF Znak0 ;blikat, cX ROK5 BTFSS BLIK,4 GOTO $+4 MOVLW 0xA0 ;VYP MOVWF Znak2 ; displej GOTO $+4 MOVF CZ4,W ;časovač zobrazení pro Rok IORLW B'10000000' ;ZAP tečku MOVWF Znak2 ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO ROK5 ;NE BTFSS TlS ;stisknuto? GOTO ROK7 ;ANO BTFSS TlP ;stisknuto? GOTO ROK6 ;ANO ;CZ4 -1 (MIN 1) DECFSZ CZ4,F ;-1=0? GOTO ROK5 MOVLW 9 MOVWF CZ4 GOTO ROK5 ;CZ4 +1 (MAX 9) ROK6 INCF CZ4,F ;+1 MOVF CZ4,W SUBLW 9 ;9-CZ4 BTFSC STATUS,C ;záporné? GOTO ROK5 ;NE MOVLW 1 MOVWF CZ4 GOTO ROK5 ;zápis CZ3 do EEPROM ROK7 MOVLW 0x04 ;adresa MOVWF EEADRp ; MOVF CZ4,W ;data CALL EWrite ;zápis MOVF CZ4,W ;časovač zobrazení pro Teplotu IORLW B'10000000' ;ZAP tečku MOVWF Znak2 ;................................ ;vložit nX ROK8 ;blikat, nX BTFSS BLIK,4 GOTO $+4 MOVLW 0xA0 ;VYP MOVWF Znak0 ; displej GOTO $+4 MOVF NZ4,W ;následné zobrazení po Roku IORLW B'10000000' ;ZAP tečku MOVWF Znak0 ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO ROK8 ;NE BTFSS TlS ;stisknuto? GOTO ROK10 ;ANO BTFSS TlP ;stisknuto? GOTO ROK9 ;ANO ;NZ4 -1 (MIN 0) DECF NZ4,F ;-1? BTFSS NZ4,7 ;záporné GOTO ROK8 ;NE MOVLW 4 MOVWF NZ4 GOTO ROK8 ;NZ4 +1 (MAX 4) ROK9 INCF NZ4,F ;+1 MOVF NZ4,W SUBLW 4 ;4-NZ4 BTFSC STATUS,C ;záporné? GOTO ROK8 ;NE CLRF NZ4 ;=0 GOTO ROK8 ;zápis NZ4 do EEPROM ROK10 MOVLW 0x09 ;adresa MOVWF EEADRp ; MOVF NZ4,W ;data CALL EWrite ;zápis GOTO NROK ;-------------------------------- ;nadpis [L. °C] MIN teplota NLTEP CALL ZNLTEP CALL TNS ;test neco stisknuto? ;zobrazit teplotu LTEP1 CALL ZLTEP ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO LTEP1 ;NE BTFSS TlM ;stisknuto? GOTO NROK ;ANO BTFSS TlP ;stisknuto? GOTO NLHOD ;ANO, na konec CALL ZNLTEP ;zobrazit nadpis [L. °C] MIN teplota ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO LTEP1 ;NE BTFSS Znova ;odčasováno? GOTO $-4 ;NE BCF Znova ;nulovat ;................................ ;zápis MIN teplota CALL ZMINT CALL ZLTEP CALL TNS ;test neco stisknuto? GOTO NLTEP ;-------------------------------- ;nadpis [L.Hod.] hodina při MIN teplotě NLHOD BCF MINT ;VYP kontrolka nová MIN teplota CALL ZNLHOD CALL TNS ;test neco stisknuto? ;zobrazit MIN hodiny LHOD1 CALL ZLHOD ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO LHOD1 ;NE BTFSS TlS ;stisknuto? GOTO NLHOD ;ANO, na konec BTFSS TlM ;stisknuto? GOTO NLTEP ;ANO ;-------------------------------- ;nadpis [L.dAt.] MIN datum NLDAT CALL ZNLDAT CALL TNS ;test neco stisknuto? ;zobrazit MIN datum LDAT1 CALL ZLDAT ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO LDAT1 ;NE BTFSS TlS ;stisknuto? GOTO NLDAT ;ANO, na konec BTFSS TlM ;stisknuto? GOTO NLHOD ;ANO ;-------------------------------- ;nadpis [L.rok] MIN rok NLROK CALL ZNLROK CALL TNS ;test neco stisknuto? ;zobrazit MIN datum LROK1 CALL ZLROK ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO LROK1 ;NE BTFSS TlS ;stisknuto? GOTO NLROK BTFSS TlM ;stisknuto? GOTO NLDAT ;ANO ;-------------------------------- ;nadpis [H. °C] MAX teplota NHTEP CALL ZNHTEP CALL TNS ;test neco stisknuto? ;zobrazit teplotu HTEP1 CALL ZHTEP ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO HTEP1 ;NE BTFSS TlM ;stisknuto? GOTO NLROK ;ANO BTFSS TlP ;stisknuto? GOTO NHHOD ;ANO, na konec CALL ZNHTEP ;zobrazit nadpis [H. °C] MAX teplota ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO HTEP1 ;NE BTFSS Znova ;odčasováno? GOTO $-4 ;NE BCF Znova ;nulovat ;................................ ;zápis MAX teplota CALL ZMAXT CALL ZHTEP CALL TNS ;test neco stisknuto? GOTO NHTEP ;-------------------------------- ;nadpis [H.Hod.] hodina při MAX teplotě NHHOD BCF MAXT ;VYP kontrolka nová MAX teplota CALL ZNHHOD CALL TNS ;test neco stisknuto? ;zobrazit MAX hodiny HHOD1 CALL ZHHOD ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO HHOD1 ;NE BTFSS TlS ;stisknuto? GOTO NHHOD ;ANO, na konec BTFSS TlM ;stisknuto? GOTO NHTEP ;ANO ;-------------------------------- ;nadpis [H.dAt.] MAX datum NHDAT CALL ZNHDAT CALL TNS ;test neco stisknuto? ;zobrazit MAX datum HDAT1 CALL ZHDAT ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO HDAT1 ;NE BTFSS TlS ;stisknuto? GOTO NHDAT ;ANO, na konec BTFSS TlM ;stisknuto? GOTO NHHOD ;ANO ;-------------------------------- ;nadpis [H.rok] MAX rok NHROK CALL ZNHROK CALL TNS ;test neco stisknuto? ;zobrazit MAX datum HROK1 CALL ZHROK ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO HROK1 ;NE BTFSS TlS ;stisknuto? GOTO NHROK BTFSS TlM ;stisknuto? GOTO NHDAT ;ANO ;-------------------------------- ;nadpis [M. °C] Mez pro termostat NMEZ CALL ZNMEZ CALL TNS ;test neco stisknuto? ;zobrazit Mez MEZ1 CALL ZMEZ ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO MEZ1 ;NE BTFSS TlM ;stisknuto? GOTO NHROK ;ANO BTFSS TlP ;stisknuto? GOTO NTEP ;ANO, na konec CALL ZNMEZ ;zobrazit nadpos [rok ] ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO MEZ1 ;NE BTFSS Znova ;odcasovano? GOTO $-4 ;NE BCF Znova ;nulovat ;................................ ;vložit MEZ MEZ2 ;blikat, Mez BTFSS BLIK,4 GOTO $+6 MOVLW 0x20 ;VYP MOVWF Znak3 ; displej MOVWF Znak2 ; MOVWF Znak1 ; displej GOTO $+2 CALL ZMEZ ;zobrazit Mez ;tlačítka CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO MEZ2 ;NE BTFSS TlS ;stisknuto? GOTO MEZ4 ;ANO BTFSS TlP ;stisknuto? GOTO MEZ3 ;ANO ;Mez-1 ;X -1 (MIN -19.9) MOVF M2,W SUBLW 0xFF ;FF-M2 BTFSS STATUS,Z ;nulové? GOTO $+5 MOVF M1,W SUBLW 0x39 ;39-M1 BTFSC STATUS,Z ;nenulové? GOTO $+7 MOVLW 1 SUBWF M1,F ;M1-1 BTFSC STATUS,C ;záporné? GOTO MEZ2 SUBWF M2,F ;M2-1 GOTO MEZ2 MOVLW 0xE7 MOVWF M1 MOVLW 0x03 MOVWF M2 GOTO MEZ2 ;Mez +1 (MAX 99.9) MEZ3 MOVF M2,W SUBLW 0xFF ;FF-M2 BTFSC STATUS,Z ;nenulové? GOTO $+14 MOVLW 0x03 SUBWF M2,W ;M2-3 BTFSS STATUS,C ;kladné? GOTO $+10 MOVLW 0xE7 SUBWF M1,W ;M1-E7 BTFSS STATUS,C ;kladné? GOTO $+6 MOVLW 0x39 ;M=-199=FF39 MOVWF M1 ; MOVLW 0xFF ; MOVWF M2 ; GOTO MEZ2 INCFSZ M1,F ;+1=0? GOTO MEZ2 INCF M2,F ;+1 GOTO MEZ2 ;zápis Mez do EEPROM MEZ4 MOVLW 0x1C ;adresa MOVWF EEADRp ; MOVF M1,W ;data CALL EWrite ;zápis do EEPROM INCF EEADRp,F ;adresa+1 MOVF M2,W ;data CALL EWrite ;zápis do EEPROM GOTO NMEZ ;-------------------------------- END