;-------------------------------; ; LCD INFOPANEL 2x teplota ; ; hodiny, datum, termostat ; ;-------------------------------; ;slovak@post.cz )S(02.2009; ;-------------------------------; ; ;Zobrazení na displeji ;----------------; ; 23.2°C 18.9°C;teplota snímače S0 a teplota snímače S1 (-40,0 ... 120,0°C) ;17:46:27 Po19/5 ;čas, datum ;----------------; ;MAX t0 5.5°C;Uložená maximální teplota S0 ;13:20 8/2 ;čas a datum záznamu ;----------------; ;MIN t0 -2.5°C;Uložená minimální teplota S0 ; 4:46 8/2 ;čas a datum záznamu ;----------------; ;MAX t1 25.5°C;Uložená maximální teplota S1 ;13:20 24/7 ;čas a datum záznamu ;----------------; ;MIN t1 12.9°C;Uložená maximální teplota S1 ; 6:05 19/11;čas a datum záznamu ;----------------; ;Ref.teplota 0 ;referenční teplota pro S0 (-40,0 ... 120,0°C) ; 0.0°C Hys00.1;hystereze 0 (0,0 ... 25,5) ;----------------; ;Ref.teplota 1 ;referenční teplota pro S1 ; 21.0°C Hys01.0;hystereze 1 ;----------------; ; ;Regulace ;RT1=1 při, t1 <= ref.1 ;RT1=0 při, t1 => ref.1 + hys.1 ;RT0=1 při, t0 <= ref.0 ;RT0=0 při, t0 => ref.0 + hys.0 ; ;Tlačítka ;Tl4 +/výběr displeje vpřed/plus při nastavování ;Tl3 -/výběr displeje vzad/mínus při nastavování ;Tl2 N/následný údaj při nastavování ;Tl1 S/zahájení nebo ukončení nastavování (nastavení času-podržet 4s.) ; ;Výstupy ;RB,2 RT0 relé regulace t0 ;RA,1 RT1 relé regulace t1 ;RA,0 SN signalizace nové hodnoty MIN/MAX ;RB,3 PO podsvícení displeje ; ;Vstupy (2x SMT160-30) ;RB,0 ;Senzor S0 ;RA,5 ;Senzor S1 ; ;Krystal: 19660800Hz ; ;-------------------------------- LIST P=16F88, R=DEC, MM=ON ;Direktivy překladače include ;Definice názvů registrů ;Nastavení konfigurace procesoru: __CONFIG _CONFIG1,_CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_ON & _HS_OSC __CONFIG _CONFIG2,_IESO_OFF & _FCMEN_OFF errorlevel 1, -306 cblock 0x20 MemSTATUS MemPCLATH A1 ;matematické A2 ; proměnné A3 ; a jiné funkce B1 ; B2 ; B3 ; C1 ; C2 ; C3 ; D1 ; D2 ; D3 ; X1 ; X2 ; FL ;flag,příznaky F1 ; M1 ;mezisoučet M2 ; M3 ; PV ;počet vzorků H1 ;součet úrovně H H2 ; H3 ; P1 ;součet periody P P2 ; P3 ; KLVP ;port pro tlačítka KLVD ;dělič pro čtení tlačítek KLVO ;dělič pro opakování tlačítka BLIK ;dělič pro blikání displeje SEKD ;dělič pro 1Hz DeSR ;dělič pro Stop Regulace po startu t0L ;teplota t0 °C (x10) t0H ; t1L ;teplota t1 °C (x10) t1H ; R1 ;řád jedničky pro převod HEX/DEC R2 ;řád desítky R3 ;řád stovky R4 ;řád tisíce TE ;desetiné tečky, 0=žádná tečka BR ;nastavování, blikání řádů DPO ;dělič pro ZAP/VYP podsvícení DN ;dělič pro návrat na displej 1 MAXden ;max den podle měsíce Sek ;sekundy Min ;00 ;minuty Hod ;01 ;hodiny PoNe ;02 ;den v týdnu 0=Pondělí, 6=Neděle Den ;03 ;Den 1...31 Mes ;04 ;Měsíc 1...12 Lt0L ;05 ;MIN teplota 0 Lt0H ;06 ; LHod0 ;07 ; Hodina LMin0 ;08 ; Minuta LDen0 ;09 ; Den LMes0 ;0A ; Mesíc Ht0L ;0B ;MAX teplota 0 Ht0H ;0C ; HHod0 ;0D ; Hodina HMin0 ;0E ; Minuta HDen0 ;0F ; Den HMes0 ;10 ; Měsíc Lt1L ;11 ;MIN teplota 1 Lt1H ;12 ; LHod1 ;13 ; Hodina LMin1 ;14 ; Minuta LDen1 ;15 ; Den LMes1 ;16 ; Měsíc Ht1L ;17 ;MAX teplota 1 Ht1H ;18 ; HHod1 ;19 ; Hodina HMin1 ;1A ; Minuta HDen1 ;1B ; Den HMes1 ;1C ; Měsíc RT0L ;1D ;referenčí teplota pro t0 RT0H ;1E ; HYS0 ;1F ;hystereze t0 RT1L ;20 ;referenčí teplota pro t1 RT1H ;21 ; HYS1 ;22 ;hystereze t1 endc EEADRp EQU 0x7F ;pomocná EE adresa MemW EQU 0x7E ZS EQU 0xB2 ;znak stupeň (°C) #define Znam FL,7 ;znaménko, 1=záporná hodnota #define Azn FL,6 ;znaménka pro Mat. výpočty #define Bzn FL,5 ; #define SMAX0 FL,4 ;signalizace MAX teploty 0 #define SMIN0 FL,3 ;signalizace MIN teploty 0 #define SMAX1 FL,2 ;signalizace MAX teploty 1 #define SMIN1 FL,1 ;signalizace MIN teploty 1 #define Stisk F1,7 ;minule stisknuto #define Znova F1,6 ;znova stisknuto #define Er F1,5 ;1=chyba snímače #define Er0 F1,4 ;1=chyba snímače0 #define Er1 F1,3 ;1=chyba snímače1 #define NM F1,2 ;1=neplatné měření #define V01 F1,1 ;vstup 0/1 #define TE1 TE,0 ;1=ZAP tečka (432.1) #define TE2 TE,1 ;1=ZAP tečka (43.21) #define TE3 TE,2 ;1=ZAP tečka (4.321) #define BR1 BR,0 ;blikání R1 #define BR2 BR,1 ;blikání R2 #define BR3 BR,2 ;blikání R3 #define BR4 BR,3 ;blikání R4 #define S0 PORTB,0 ;Senzor t0 #define S1 PORTA,5 ;Senzor t1 #define E PORTA,2 ;pro LCD #define RS PORTA,4 ; #define PO PORTB,3 ;podsvícení #define RT0 PORTB,2 ;relé regulace t0 #define RT1 PORTA,1 ;relé regulace t1 #define SN PORTA,0 ;signalizace nové hodnoty MIN/MAX #define Tl4 KLVP,7 ;0=ZAP horní tlačítko #define Tl3 KLVP,6 ;0=ZAP #define Tl2 KLVP,5 ;0=ZAP #define Tl1 KLVP,4 ;0=ZAP dolní tlačítho #define SC STATUS,C #define SZ STATUS,Z ;RAM banka 0 (00-7F) RAM0 macro BCF STATUS,RP0 endm ;RAM banka 1 (80-FF) RAM1 macro BSF STATUS,RP0 endm ;Program stránka 0 (000-7FF) PROG0 macro CLRF PCLATH endm ;Program stránka 1 (800-FFF) PROG1 macro BSF PCLATH,3 endm ;************************************************* ORG 0x2100 ;tabulka dat v EEPROM de 0x30, 0x10, 0x06, 0x08, 0x02, 0xFA, 0xFF, 0x10 de 0x10, 0x08, 0x02, 0x32, 0x00, 0x0E, 0x10, 0x08 de 0x02, 0xAB, 0x00, 0x0F, 0x2B, 0x08, 0x02, 0x0E de 0x01, 0x0D, 0x32, 0x08, 0x02, 0x00, 0x00, 0x01 de 0xB4, 0x00, 0x01, 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, 0x32, 0x2E, 0x32, 0x30 de 0x30, 0x39, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ;************************************************* ;reset ORG 0 GOTO Init CALL 41 CALL 83 CALL 40 ;------------------------------- ;přerušení MOVWF MemW SWAPF STATUS,W CLRF STATUS MOVWF MemSTATUS MOVF PCLATH,W MOVWF MemPCLATH PROG1 GOTO INT ;-------------------------------- ;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 ;-------------------------------- ;den v týdnu (0=pondělí, 6=neděle) ;písmeno pro znak1 PoNe1 MOVF PoNe,W ADDWF PCL,F RETLW "P" RETLW "U" RETLW "S" RETLW "C" RETLW "P" RETLW "S" RETLW "N" ;písmeno pro znak2 PoNe2 MOVF PoNe,W ADDWF PCL,F RETLW "o" RETLW "t" RETLW "t" RETLW "t" RETLW "a" RETLW "o" RETLW "e" ;-------------------------------- ;převod den, maska ;PDM MOVF PoNe,W ; ADDWF PCL,F ; RETLW B'00000001' ; RETLW B'00000010' ; RETLW B'00000100' ; RETLW B'00001000' ; RETLW B'00010000' ; RETLW B'00100000' ; RETLW B'01000000' ; ;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM ;měření vstupů MV BCF NM ;=0 MOVF PV,F BTFSS STATUS,Z ;PV=0? GOTO $+7 ;NE CLRF H1 ;vynulovat H CLRF H2 ; CLRF H3 ; CLRF P1 ;vynulovat P CLRF P2 ; CLRF P3 ; MOVLW 3 BCF Er ;=0 CLRF TMR1L ;vynulovat CLRF TMR1H ; časovač1 BSF T1CON,TMR1ON ;=1, start časovač1 BTFSS V01 ;=1? GOTO MV0 ;................................ ;měření vstupu S1 ;čekání na nulu CLRWDT BTFSC S1 ;=0? SUBWF PCL,F ;dva kroky zpět BTFSC Er ;=0? GOTO ES1 ;chyba snímače ;čekání na jedničku CLRWDT BTFSS S1 ;=1? SUBWF PCL,F ;dva kroky zpět ;start měření CLRF TMR1L ;vynulovat CLRF TMR1H ; časovač1 BTFSC Er ;=0? GOTO ES1 ;čekání na nulu CLRWDT BTFSC S1 ;=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 Er ;=0? GOTO ES1 ;čekání na jedničku MOVLW 3 CLRWDT BTFSS S1 ;=1? SUBWF PCL,F ;dva kroky zpět BTFSC Er ;=0? GOTO ES1 ;uložit délku periody BCF T1CON,TMR1ON ;=0, stop časovač1 MOVF TMR1L,W MOVWF D1 MOVF TMR1H,W MOVWF D2 ;test neplatné měření BTFSC NM ;=0? GOTO MV ;měřit znova BCF Er1 ;=0 ;součet vzorků/16 CALL SV ;256 vzorků INCFSZ PV,F ;+1=0? RETURN ;příště vstup0 BCF V01 ;=0 ;................................ ;v C1,2 je délka úrovně H (H) ;v B1,2 je délka periody (P) ;................................ ;výpočet vzorce pro t1 CALL VZOREC ;H*2128/P-681=A1,2 ;diference pro t1 MOVF t1L,W MOVWF B1 MOVF t1H,W MOVWF B2 CALL DIF ;A=nová, B=stará, A=výsledek MOVF A1,W ;teplota1 *10 je v t1L,H MOVWF t1L ; MOVF A2,W ; MOVWF t1H ; PROG1 GOTO OV ;:::::::::::::::::::::::::::::::: ;měření vstupu S0 MV0 ;čekání na nulu CLRWDT BTFSC S0 ;=0? SUBWF PCL,F ;dva kroky zpět BTFSC Er ;=0? GOTO ES0 ;chyba snímače ;čekání na jedničku CLRWDT BTFSS S0 ;=1? SUBWF PCL,F ;dva kroky zpět ;start měření CLRF TMR1L ;vynulovat CLRF TMR1H ; časovač1 BTFSC Er ;=0? GOTO ES0 ;čekání na nulu CLRWDT BTFSC S0 ;=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 Er ;=0? GOTO ES0 ;čekání na jedničku MOVLW 3 CLRWDT BTFSS S0 ;=1? SUBWF PCL,F ;dva kroky zpět BTFSC Er ;=0? GOTO ES0 ;uložit délku periody BCF T1CON,TMR1ON ;=0, stop časovač1 MOVF TMR1L,W MOVWF D1 MOVF TMR1H,W MOVWF D2 ;test neplatné měření BTFSC NM ;=0? GOTO MV ;měřit znova BCF Er0 ;=0 ;součet vzorků/16 CALL SV ;256 vzorků INCFSZ PV,F ;+1=0? RETURN ;příště vstup1 BSF V01 ;=1 ;................................ ;v C1,2 je délka úrovně H (H) ;v B1,2 je délka periody (P) ;................................ ;výpočet vzorce pro t0 CALL VZOREC ;H*2128/P-681=A1,2 ;diference pro t0 MOVF t0L,W MOVWF B1 MOVF t0H,W MOVWF B2 CALL DIF ;A=nová, B=stará, A=výsledek MOVF A1,W ;teplota0 *10 je v t0L,H MOVWF t0L ; MOVF A2,W ; MOVWF t0H ; PROG1 GOTO OV ;================================ ;porucha snímače S0 ES0 BSF V01 ;=1, příště S1 BSF Er0 ;=1, porucha S0 RETURN ;porucha snímače S1 ES1 BCF V01 ;=0, příště S0 BSF Er1 ;=1, porucha S1 RETURN ;-------------------------------; ; Matematicke podprogramy ; ;-------------------------------; ;slovak@post.cz )S(12.2004; ;-------------------------------; ; A1,2,3 / B1,2,3 = C1,2,3 ;24Bit, pouze kladna cisla ;SZ=1=deleni nulou (B1,2,3=0) ;B se nezmeni, v A bude zbytek ;pouziva D1,2,3; X1 LOMENO24 ;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 ;B1,2,3=0 ;priprava pro deleni LOM24 MOVF A1,W ;A do D 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 ;deleni LDalsi CALL x2M ;D,A posun vlevo, A-B=C BTFSS STATUS,C ;kladny vysledek? GOTO LZapor ;NE ;LKlad MOVWF A3 ;C do A MOVF C2,W ; MOVWF A2 ; MOVF C1,W ; MOVWF A1 ; LZapor DECFSZ X1,F ;-1=0? GOTO LDalsi ;jeste neni konec ;vysledek RLF D1,W ;posledni x2 MOVWF C1 ; a W do C RLF D2,W ; MOVWF C2 ; RLF D3,W ; MOVWF C3 ; BCF STATUS,Z ;SZ=0 RETURN ;-------------------------------- ; A1,2,3 / B1,2,3 = C1,2,3 ;23Bit; MSB=0=kladne, 1=zaporne ;SZ=1=deleni nulou (B1,2,3=0) ;B se nezmeni, v A bude zbytek ;pouziva D1,2,3; X1; FL,Azn,Bzn 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 ;B1,2,3=0 ;test A=zaporne BCF Azn ;=0 BTFSC A3,7 ;MSB=1? CALL ZZA ;zmena znamenka A1,2,3 ;test B=zaporne BCF Bzn ;=0 BTFSC B3,7 ;MSB=0? CALL ZZB ;zmena znamenka B1,2,3 ;vypocet CALL LOM24 ;vratit B BTFSC Bzn ;=0? CALL ZZB ;znamenko C, test Azn = Bzn BTFSC Azn ;=0? GOTO $+4 ;NE BTFSC Bzn ;=0? GOTO $+3 ;NE GOTO $+3 ;Azn = Bzn = 0 BTFSS Bzn ;=1? CALL ZZC ;NE, zmena znamenka C1,2,3 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 ; ;pokracuje MINUS ;-------------------------------- ; A1,2,3 - B1,2,3 = C1,2,3 ;SC=0=zaporny vysledek ;A,B se nezmeni MINUS MOVF B1,W ;W=B1 SUBWF A1,W ;A1-B1=W MOVWF C1 ;C1=W=vysledek1 CLRW ;W=0 BTFSS STATUS,C ;SUB kladne? 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 kladne? 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 ;-------------------------------- ; A1,2,3 + C1,2,3 = C1,2,3 ;A se nemeni ;PLUS MOVF A1,W ; ADDWF C1,F ;A1+C1=C1 ; BTFSS STATUS,C ;preteklo? ; GOTO $+4 ; INCFSZ C2,F ;+1=0? ; GOTO $+2 ; INCF C3,F ;+1 ; MOVF A2,W ; ADDWF C2,F ;A2+C2=C2 ; BTFSC STATUS,C ;nepreteklo? ; INCF C3,F ;+1 ; MOVF A3,W ; ADDWF C3,F ;A3+C3=C3 ; RETURN ; ;-------------------------------- ; A1,2,3 * B1,2,3 = C1,2,3 ;24Bit, pouze kladna cisla ;A, B se nezmeni ;pouziva D1,2,3; X1; X2 ;KRAT24 ;schovat A do D ; MOVF A1,W ;A do D ; MOVWF D1 ; ; MOVF A2,W ; ; MOVWF D2 ; ; MOVF A3,W ; ; MOVWF D3 ; ;priprava ; CLRF C1 ;nulovat ; CLRF C2 ; ; CLRF C3 ; ; BCF STATUS,C ; ; MOVLW 25 ;pocet bitu+1 ; MOVWF X1 ; ;hledat jednicku ; RRF B3,F ;posuv vpravo ; RRF B2,F ; ; RRF B1,F ; ; MOVF STATUS,W ;ulozit ; MOVWF X2 ; SC ; BTFSC STATUS,C ;=0? ;A+C=C ; CALL PLUS ;jen pri SC=1 ;A*2 ; RLF A1,F ;posuv vlevo ; RLF A2,F ; ; RLF A3,F ; ; ; MOVF X2,W ;obnovit ; MOVWF STATUS ; SC ; ; DECFSZ X1,F ;-1=0? ; GOTO $-13 ;NE ;obnovit A z D ; MOVF D1,W ;D do A ; MOVWF A1 ; ; MOVF D2,W ; ; MOVWF A2 ; ; MOVF D3,W ; ; MOVWF A3 ; ; RETURN ; ;-------------------------------- ; A1,2,3 * B1,2,3 = C1,2,3 ;23Bit, MSB=0=kladne, 1=zaporne ;A, B se nezmeni ;pouziva D1,2,3; X1; X2 ;KRAT ;test A=zaporne ; BCF Azn ; BTFSC A3,7 ;=0? ; CALL ZZA ;zmena znamenka A ;test B=zaporne ; BCF Bzn ; BTFSC B3,7 ;=0? ; CALL ZZB ;zmena znamenka B ;vypocet ; CALL KRAT24 ;A*B=C ;znamenko A ; BTFSC Azn ;=0? ; CALL ZZA ;znamenko B ; BTFSC Bzn ;=0? ; CALL ZZB ;znamenko C, test Azn = Bzn ; BTFSC Azn ;=0? ; GOTO $+4 ;NE ; BTFSC Bzn ;=0? ; GOTO $+3 ;NE ; GOTO $+3 ;Azn = Bzn = 0 ; BTFSS Bzn ;=1? ; CALL ZZC ;NE, zmena znamenka C1,2,3 ; ; BCF STATUS,Z ;SZ=0 ; RETURN ; ;-------------------------------- ;zmena znamenka A1,2,3 ZZA BSF Azn ;=1 COMF A1,F COMF A2,F COMF A3,F INCFSZ A1,F ;+1,=0? RETURN INCFSZ A2,F ;+1,=0? RETURN INCF A3,F ;+1 RETURN ;-------------------------------- ;zmena znamenka B1,2,3 ZZB BSF Bzn ;=1 COMF B1,F COMF B2,F COMF B3,F INCFSZ B1,F ;+1,=0? RETURN INCFSZ B2,F ;+1,=0? RETURN INCF B3,F ;+1 RETURN ;-------------------------------- ;zmena znamenka C1,2,3 ZZC COMF C1,F COMF C2,F COMF C3,F INCFSZ C1,F ;+1,=0? RETURN INCFSZ C2,F ;+1,=0? RETURN INCF C3,F ;+1 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 ;-------------------------------- ;X +1 (MAX 120.0) XP1 MOVLW 0xFE SUBWF X2,W ;X2-FE BTFSC STATUS,C ;záporné? GOTO $+14 MOVLW 0x04 SUBWF X2,W ;X2-5 BTFSS STATUS,C ;kladné? GOTO $+10 MOVLW 0xB0 SUBWF X1,W ;X1-14 BTFSS STATUS,C ;kladné? GOTO $+6 MOVLW 0x70 ;X=-400=FE70 MOVWF X1 ; MOVLW 0xFE ; MOVWF X2 ; RETURN INCFSZ X1,F ;+1=0? RETURN INCF X2,F ;+1 RETURN ;-------------------------------- ;X -1 (MIN -40.0) XM1 ;MOVF X2,W SUBLW 0xFE ;FE-X2 BTFSS STATUS,Z ;nulové? GOTO $+5 MOVF X1,W SUBLW 0x70 ;70-X1 BTFSC STATUS,Z ;nenulové? GOTO $+7 MOVLW 1 SUBWF X1,F ;X1-1 BTFSC STATUS,C ;záporné? RETURN SUBWF X2,F ;X2-1 RETURN MOVLW 0xB0 ;X=1200=04B0 MOVWF X1 ; MOVLW 0x04 ; MOVWF X2 ; RETURN ;-------------------------------- ; C1,2 * 2128 = A1,2,3 x2128 CLRF H3 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 ;kolikrát BCF STATUS,C ;C=0 RLF H1,F ;posuv vlevo RLF H2,F ; RLF H3,F ; DECFSZ X2,F ;-1=0? GOTO $-5 ;znova MOVF H1,W ADDWF A1,F ;C1+A1=A1 BTFSS STATUS,C ;přeteklo? GOTO $+4 INCFSZ A2,F ;+1=0? GOTO $+2 INCF A3,F ;+1 MOVF H2,W ADDWF A2,F ;C2+A2=A2 BTFSC STATUS,C ;nepřeteklo? INCF A3,F ;+1 MOVF H3,W ADDWF A3,F ;C3+A3=A3 RETURN ;-------------------------------- ;součet vzorků/16 SV ;součet délky úrovně H (16*); (A1,2+H1,2,3)/16=H1,2 MOVF A1,W ADDWF H1,F BTFSC SC INCF A2,F MOVF A2,W ADDWF H2,F BTFSC SC INCF H2,F ;součet délky periody P (16*); (D1,2+B1,2,3)/16=P1,2 MOVF D1,W ADDWF P1,F BTFSC SC INCF D2,F MOVF D2,W ADDWF P2,F BTFSC SC INCF P3,F MOVF PV,W XORLW 0x0F BTFSS SZ RETURN MOVLW 0xFF MOVWF PV RRF H3,F RRF H2,F RRF H1,F RRF H3,F RRF H2,F RRF H1,F RRF H3,F RRF H2,F RRF H1,F RRF H3,F RRF H2,F RRF H1,F RRF P3,F RRF P2,F RRF P1,F RRF P3,F RRF P2,F RRF P1,F RRF P3,F RRF P2,F RRF P1,F RRF P3,F RRF P2,F RRF P1,F RETURN ;-------------------------------- ;vzorec H*2128/P-681 = A1,2 [°C]*10 ;v C1,2 je délka úrovně H (H) ;v B1,2 je délka periody (P) VZOREC ;H*2128=A CALL x2128 ;C1,2 * 2128 = A1,2,3 ;A/P=C MOVF P1,W MOVWF B1 MOVF P2,W MOVWF B2 CLRF B3 CALL LOMENO ;A1,2,3 / B1,2,3 = C1,2,3 ;C-681=A ; MOVLW 0xA9 ;681=0x02A9 MOVLW 0xB5 ;693=0x02B5 (korekce) SUBWF C1,W ;C1-AE MOVWF A1 ; =A1 BTFSS STATUS,C ;nepřeteklo? DECF C2,F ;-1 MOVLW 0x02 SUBWF C2,W ;C2-02 MOVWF A2 ; =A2 RETURN ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD ;Diference, odstraní chvění na nejnižších bitech ;A1,2=nová hodnota, B1,2=stará; A1,2=výsledek DIF MOVF B1,W SUBWF A1,W ;A1-B1=W MOVWF C1 ;uložit MOVF B2,W BTFSS SC ;kladné? ADDLW 1 ;B2+1=W SUBWF A2,W ;A2-B2=W MOVWF C2 ;uložit ; MOVF C2,F BTFSS SZ ;C2=0? RETURN ;NE, AB+10 MOVF C1,W SUBLW 4 ;4-C1 BTFSC SC ;záporné? GOTO $+4 ;NE, A<=B+4 INCFSZ B1,F ;stará +1 GOTO $+2 ; INCF B2,F ; MOVF B1,W ;stará hodnota B do A MOVWF A1 ; MOVF B2,W ; MOVWF A2 ; RETURN ;================================ ;uložit minuty, hodiny, dny, měsíc UMHDM CLRF EEADRp MOVF Min,W CALL EWrite INCF EEADRp,F MOVF Hod,W CALL EWrite INCF EEADRp,F MOVF PoNe,W CALL EWrite INCF EEADRp,F MOVF Den,W CALL EWrite INCF EEADRp,F MOVF Mes,W CALL EWrite GOTO DIS1 ;-------------------------------- ;uložit ref.1, hys UREFT1 MOVLW 0x20 MOVWF EEADRp MOVF RT1L,W CALL EWrite INCF EEADRp,F MOVF RT1H,W CALL EWrite INCF EEADRp,F MOVF HYS1,W CALL EWrite GOTO DIS7 ;-------------------------------- ;uložit ref.0, hys UREFT0 MOVLW 0x1D MOVWF EEADRp MOVF RT0L,W CALL EWrite INCF EEADRp,F MOVF RT0H,W CALL EWrite INCF EEADRp,F MOVF HYS0,W CALL EWrite GOTO DIS6 ;-------------------------------- ;načíst z EEPROM dobu ZAP a VYP ;RDZV MOVLW 0x30 ; MOVWF EEADRp ; CALL ERead ; RAM1 ; MOVWF DZAP ; RAM0 ; INCF EEADRp,F ;adresa+1 ; CALL ERead ; RAM1 ; MOVWF DVYP ; RAM0 ; RETURN ; ;EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ;čtení EEPROM, adresu do EEADRp, vrátí data v W ERead CLRWDT BSF STATUS,RP1 ;Banka2 BCF STATUS,RP0 ; MOVF EEADRp,W ;nastavení adresy MOVWF EEADR ;do ukazatele BSF STATUS,RP0 ;Banka3 BTFSC EECON1,WR ;čekání na dokončení GOTO $-1 ;předchozího zápisu BCF EECON1,EEPGD ;aktivace paměti;dat EEPROM BSF EECON1,RD ;zahájení čtení BCF STATUS,RP0 ;Banka2 MOVF EEDATA,W ;načtení dat z EEPROM BCF STATUS,RP1 ;Banka0 RETURN ;-------------------------------- ;zápis do EEPROM, adresu do EEADRp, data do W EWrite CLRWDT BSF STATUS,RP1 ;Banka3 BSF STATUS,RP0 ; BTFSC EECON1,WR ;čekání na dokončení GOTO $-1 ;předchozího zápisu BCF STATUS,RP0 ;Banka2 MOVWF EEDATA ;příprava dat MOVF EEADRp,W ;nastavení adresy MOVWF EEADR ;do ukazatele BSF STATUS,RP0 ;Banka3 BCF EECON1,EEPGD ;aktivace paměti dat EEPROM BSF EECON1,WREN ;povolení zápisu do EEPROM BCF INTCON,GIE ;zákaz přerušení MOVLW 0x55 ; MOVWF EECON2 ;zápis 55h MOVLW 0xAA ; MOVWF EECON2 ;zápis AAh BSF EECON1,WR ;zahájení zápisu BSF INTCON,GIE ;povolení přerušení BCF EECON1,WREN ;zákaz dalších zápisů BCF STATUS,RP0 ;Banka0 BCF STATUS,RP1 ; ;pauza po zapisu ; CLRW ; ADDLW 1 ;W+1 ; BTFSS STATUS,Z ;W=0? ; GOTO $-2 ;NE ; BSF INTCON,GIE ;povolit preruseni RETURN ;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT KLV CLRWDT ;test KLV + opakovaní, sZ=0=něco stisknuto, 1=žádné tlačítko MOVF KLVP,W XORLW B'11110000' ;(st.=0) BTFSS SZ ;=1?, nenulové? (žádné tlačítko) GOTO Neco ;něco stisknuto BCF Stisk ;=0 BSF Znova ;=1 RETURN Neco MOVLW 30 ;30 sekund MOVWF DN ; pro mávrat na DIS1 CLRF DPO ;časovač pro podsvícení BTFSC Tl1 ;stisknuto TlS? CLRF BLIK ;NE, nulovat BSF SZ ;=1 BTFSS Znova ;=1? odčasováno? RETURN ;NE, jako žádné tl. ;zapnout podsvícení BTFSC PO ;podsvícení? GOTO $+5 ;zapnuté BSF PO ;ZAP BCF Znova ;=0 CLRF KLVO ;MAX čas (3.4s) RETURN MOVLW 7 ;kratší čas (0.1s) BTFSS Stisk ;minule stisknuto? MOVLW 75 ;delší čas (1s) MOVWF KLVO ;nastavit časovač pro opakování BTFSS Tl1 ;stisknuto TlS? CLRF KLVO ;ANO, MAX čas (3.4s) BCF Znova ;=0 BSF Stisk ;=1 BCF SZ ;=0 RETURN ;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW ;čekat 15000us = 15ms C15000 MOVLW 0x61 MOVWF C2 MOVLW 0x03 GOTO CEK ;čekat 4100us = 4.1ms C4100 MOVLW 0x1A MOVWF C2 MOVLW 0x82 GOTO CEK ;čekat 1640us = 1.64ms C1640 MOVLW 0x0A MOVWF C2 MOVLW 0x99 GOTO CEK ;čekat 100us = 0.1ms C100 CLRF C2 MOVLW 0xA3 GOTO CEK ;čekat 40us = 0.04ms C40 CLRF C2 MOVLW 0x40 CEK MOVWF C1 ;čekací smyčka, čas určuje hodnota v C1,2 (XTAL=20MHz) CEKEJ DECFSZ C1,F GOTO CEKEJ MOVF C2,W BTFSC SZ RETURN CLRWDT DECF C2,F GOTO CEKEJ ;inicializace LCD po zapnutí INILCD CALL C15000 BCF RS BSF E MOVLW B'00001111' ANDWF PORTB,F MOVLW B'00110000' IORWF PORTB,F BCF E CALL C4100 BSF E BCF E CALL C100 BSF E BCF E CALL C40 MOVLW 0x20 CALL WRCMD MOVLW 0x28 CALL WRCMD MOVLW 0x08 CALL WRCMD MOVLW 0x0C CALL WRCMD MOVLW 0x06 CALL WRCMD RETURN ;zápis dat WRDATA BSF RS ;RS=1=sběrnice pro data GOTO $+2 ;zápis příkazu WRCMD BCF RS ;RS=0=sběrnice pro příkazy MOVWF C3 ;schovat data BSF E ;Enable=1 ;horní půlbyt MOVLW B'00001111' ANDWF PORTB,F MOVF C3,W ANDLW B'11110000' IORWF PORTB,F BCF E ;E=0 BSF E ;E=1 ;dolní půlbyt MOVLW B'00001111' ANDWF PORTB,F SWAPF C3,W ;prohodit půlbyt ANDLW B'11110000' IORWF PORTB,F BCF E ;E=0 ;zjistit čas čekání BTFSC RS ;=0?,šlo o příkaz? GOTO C40 ;NE, šlo o data, čekat 40us MOVF C3,W ;test na příkazy: CLEAR a HOME ANDLW B'11001111' ; (1a1=1) BTFSC SZ ;Z=0=ostatní příkazy? GOTO C1640 ;NE, čekat 1.64ms GOTO C40 ;ANO, čekat 40us ;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ;převod HEX/DEC, vstup W, výstup R1,2 (pouze kladná čísla) HDW MOVWF A1 CLRF A2 CLRF B3 BCF Znam ;=0 GOTO HDPA1 ;-------------------------------- ;převod HEX/DEC, vstup A1,2, výstup R1,2,3,4 HEXDEC ;upravit záporné číslo BCF Znam ;=0 BTFSS A2,7 ;=1? GOTO PHD BSF Znam ;=1, záporné ;změna znaménka A1,2 COMF A2,F COMF A1,F INCFSZ A1,F ;+1=0? GOTO PHD INCF A2,F ;+1 ;převod PHD CLRF A3 MOVLW 0xE8 ;1000 do B MOVWF B1 ; MOVLW 0x03 ; MOVWF B2 ; CLRF B3 ; CALL LOMENO ;A/B=C, zbytek je v A MOVF C1,W ;uložit řád 1000 MOVWF R4 ; HDPA1 MOVLW 0x64 ;100 do B MOVWF B1 ; CLRF B2 ; CALL LOMENO ;A/B=C, zbytek je v A MOVF C1,W ;uložit řád 100 MOVWF R3 ; MOVLW 0x0A ;10 do B MOVWF B1 ; CLRF B2 ; CALL LOMENO ;A/B=C, zbytek je v A MOVF C1,W ;uložit řád 10 MOVWF R2 ; MOVF A1,W ;uložit řád 1 MOVWF R1 ; RETURN ;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP P5M MOVF R4,F ;řád 1000 BTFSS SZ ; R4>0? GOTO PR4 ;ANO GOTO PRINT3 ;NE ;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PRINT MOVLW 0x20 ;mezera MOVF TE,F BTFSC SZ CALL WRDATA ;TE=0, poslat mezeru PRINT4 MOVF R4,F ;řád 1000 [-4321] BTFSS SZ GOTO PZR4 ;nenulové BTFSC TE3 GOTO PZR4T ;TE3=ZAP MOVLW 0x20 ;mezera CALL WRDATA PRINT3 MOVF R3,F ;řád 100 [-321] BTFSS SZ GOTO PZR3 ;nenulové BTFSC TE2 GOTO PZR3T ;TE2=ZAP MOVLW 0x20 ;mezera CALL WRDATA PRINT2 MOVF R2,F ;řád 10 [-21] BTFSS SZ GOTO PZR2 ;nenulové BTFSC TE1 GOTO PZR2T ;TE1=ZAP MOVLW 0x20 ;mezera CALL WRDATA CALL POZN ;znaménko nebo mezera GOTO PR1 PZR2 CALL POZN ;znaménko nebo mezera PRR2 CALL POR2 ;řád 10 BTFSC TE1 GOTO PTR1 ;TE1=ZAP GOTO PR1 ;TE1=VYP PZR3 CALL POZN ;znaménko nebo mezera CALL POR3 ;řád 100 MOVF TE,F BTFSC SZ GOTO PR21 ;TE=0 PT2T BTFSS TE2 GOTO PR2T ;TE2=VYP GOTO PTR21 ;TE2=ZAP PZR4 CALL POZN ;znaménko nebo mezera PR4 CALL POR4 ;řád 1000 MOVF TE,F BTFSC SZ GOTO PR321 ;TE=0 BTFSC TE3 GOTO PTR321 ;TE3=ZAP CALL POR3 ;řád 100 GOTO PT2T PZR2T CALL POZN ;znaménko nebo mezera PR2T CALL POR2 ;řád 10 PTR1 CALL POTE ;poslat tečku GOTO PR1 PZR3T CALL POZN ;znaménko nebo mezera CALL POR3 ;řád 100 PTR21 CALL POTE ;poslat tečku GOTO PR21 PZR4T CALL POZN ;znaménko nebo mezera CALL POR4 ;řád 1000 PTR321 CALL POTE ;poslat tečku PR321 CALL POR3 ;řád 100 PR21 CALL POR2 ;řád 10 PR1 MOVF R1,W ;řád 1 PIOR IORLW B'000110000' PWRET CALL WRDATA ;PRINT W + RETURN RETURN ;................................ ;poslat znaménko nebo mezeru POZN MOVLW 0x20 ;mezera BTFSC Znam ;záoprné číslo? (Znam=1) MOVLW 0x2D ;- GOTO PWRET ;poslat tečku POTE MOVLW 0x2E ;. GOTO PWRET ;poslat řád 1000 POR4 MOVF R4,W ;řád 1000 GOTO PIOR ;poslat řád 100 POR3 MOVF R3,W ;řád 100 GOTO PIOR ;poslat řád 10 POR2 MOVF R2,W ;řád 10 GOTO PIOR ;blikat při nastavování BLIKS BTFSC BLIK,4 MOVLW 0x20 ;mezera RETURN ;-------------------------------- PRINTS CALL WRCMD ;nastavit kurzor LCD MOVLW 0x20 ;mezera MOVF TE,F BTFSC SZ CALL WRDATA ;TE=0, poslat mezeru CALL POZN MOVF R4,W ;řád 1000 IORLW B'000110000' BTFSC BR4 ;=ZAP?, nastavovat R4? CALL BLIKS ;ANO, blikat R4 CALL WRDATA BTFSC TE3 ;=ZAP? CALL POTE ;ANO, poslat tečku PSR3 MOVF R3,W ;řád 100 IORLW B'000110000' BTFSC BR3 ;=ZAP?, nastavovat R3? CALL BLIKS ;ANO, blikat R3 CALL WRDATA BTFSC TE2 ;=ZAP? CALL POTE ;ANO, poslat tečku PSR2 MOVF R2,W ;řád 10 IORLW B'000110000' BTFSC BR2 ;=ZAP?, nastavovat R4? CALL BLIKS ;ANO, blikat R4 CALL WRDATA BTFSC TE1 ;=ZAP? CALL POTE ;ANO, poslat tečku MOVF R1,W ;řád 1 IORLW B'000110000' BTFSC BR1 ;=ZAP?, nastavovat R4? CALL BLIKS ;ANO, blikat R1 GOTO PWRET ;================================ ;zobrazit ERROR ZERROR MOVLW "C" CALL WRDATA MOVLW "h" CALL WRDATA MOVLW "y" CALL WRDATA MOVLW "b" CALL WRDATA MOVLW "a" CALL WRDATA MOVLW "S" GOTO PWRET ;-------------------------------- ;zobrazit teplotu 0 ZTEP MOVLW 0x80 CALL WRCMD BSF TE1 BTFSS Er0 GOTO $+5 CALL ZERROR MOVLW "0" CALL WRDATA GOTO $+11 MOVF t0L,W MOVWF A1 MOVF t0H,W MOVWF A2 CALL HEXDEC CALL P5M MOVLW ZS CALL WRDATA MOVLW "C" CALL WRDATA MOVLW 0x20 CALL WRDATA MOVLW 0x20 CALL WRDATA ;zobrazit teplotu 1 BTFSS Er1 GOTO $+4 CALL ZERROR MOVLW "1" GOTO PWRET MOVF t1L,W MOVWF A1 MOVF t1H,W MOVWF A2 ZTSC CALL HEXDEC ;zobrazit teplotu (v A1,2) °C CALL P5M MOVLW ZS CALL WRDATA MOVLW "C" GOTO PWRET ;-------------------------------- ;zobrazit hodiny ZHOD MOVLW 0xC0 CALL WRCMD MOVF Hod,W ZHODM CALL HDW ;zobrazit hodiny MAX/MIN CLRF TE ;nezobrazovat nulu MOVF R2,F BTFSS SZ GOTO $+5 MOVLW " " CALL WRDATA CALL PR1 GOTO $+2 CALL PR21 MOVLW ":" GOTO PWRET ;-------------------------------- ;zobrazit minuty ZMIN MOVF Min,W CALL HDW CALL PR21 MOVLW ":" GOTO PWRET ;-------------------------------- ;zobrazit sekundy ZSEK MOVF Sek,W CALL HDW CALL PR21 MOVLW " " GOTO PWRET ;-------------------------------- ;zobrazit den ZDEN CALL PoNe1 CALL WRDATA CALL PoNe2 GOTO PWRET ;-------------------------------- ;zobrazit datum ZDAT MOVF Den,W ZDATM CALL HDW ;zobrazit MAX/MIN ;nezobrazovat nulu MOVF R2,F BTFSS SZ GOTO $+5 MOVLW " " CALL WRDATA CALL PR1 GOTO $+2 CALL PR21 MOVLW "/" GOTO PWRET ;-------------------------------- ;zobrazit měsíc ZMES MOVF Mes,W ZMESM CALL HDW ;zobrazit MAX/MIN ;nezobrazovat nulu MOVF R2,F BTFSS SZ GOTO PR21 CALL PR1 MOVLW " " GOTO PWRET ;-------------------------------- ;zobrazit dočasně ;ZDOC MOVLW "d" ; CALL WRDATA ; MOVLW "o" ; GOTO PWRET ; ;-------------------------------- ;zobrazit trvale ;ZTRV MOVLW "t" ; CALL WRDATA ; MOVLW "r" ; GOTO PWRET ; ;-------------------------------- ;zobrazit Ref.teolota ZRT MOVLW 0x01 CALL WRCMD CALL C15000 MOVLW "R" CALL WRDATA MOVLW "e" CALL WRDATA MOVLW "f" CALL WRDATA MOVLW "." CALL WRDATA MOVLW "t" CALL WRDATA MOVLW "e" CALL WRDATA MOVLW "p" CALL WRDATA MOVLW "l" CALL WRDATA MOVLW "o" CALL WRDATA MOVLW "t" CALL WRDATA MOVLW "a" CALL WRDATA MOVLW " " GOTO PWRET ;-------------------------------- ;zobrazit ref.1 ZRT1 MOVLW 0xC0 CALL WRCMD MOVF RT1L,W MOVWF A1 MOVF RT1H,W MOVWF A2 CALL HEXDEC CALL PRINT MOVLW ZS CALL WRDATA MOVLW "C" GOTO PWRET ;-------------------------------- ;zobrazit ref.0 ZRT0 MOVLW 0xC0 CALL WRCMD MOVF RT0L,W MOVWF A1 MOVF RT0H,W MOVWF A2 CALL HEXDEC CALL PRINT MOVLW ZS CALL WRDATA MOVLW "C" GOTO PWRET ;-------------------------------- ;zobrazit nastavení sekund ;ZNSEK MOVLW "s" ; CALL WRDATA ; MOVLW "e" ; CALL WRDATA ; MOVLW "k" ; GOTO PWRET ; ;-------------------------------- ;zobrazit nastavení minut ;ZNMIN MOVLW "m" ; CALL WRDATA ; MOVLW "i" ; CALL WRDATA ; MOVLW "n" ; GOTO PWRET ; ;-------------------------------- ;zobrazit MAX t ZMAXt MOVLW 0x80 CALL WRCMD MOVLW "M" CALL WRDATA MOVLW "A" CALL WRDATA MOVLW "X" ZMAXE CALL WRDATA MOVLW " " CALL WRDATA MOVLW "t" GOTO PWRET ;-------------------------------- ;zobrazit MIN t ZMINt MOVLW 0x80 CALL WRCMD MOVLW "M" CALL WRDATA MOVLW "I" CALL WRDATA MOVLW "N" GOTO ZMAXE ;-------------------------------- ;zobrazit mezery W=x krát ZSP MOVWF A1 MOVLW " " CALL WRDATA DECFSZ A1,F GOTO $-3 RETURN ;-------------------------------- ;uložit MAX t0, čas, datum WMAX0 MOVLW 0x0B MOVWF EEADRp MOVF t0L,W MOVWF Ht0L CALL EWrite ;0B INCF EEADRp,F MOVF t0H,W MOVWF Ht0H CALL EWrite ;0C INCF EEADRp,F MOVF Hod,W MOVWF HHod0 CALL EWrite ;0D INCF EEADRp,F MOVF Min,W MOVWF HMin0 CALL EWrite ;0E INCF EEADRp,F MOVF Den,W MOVWF HDen0 CALL EWrite ;0F INCF EEADRp,F MOVF Mes,W MOVWF HMes0 CALL EWrite ;10 GOTO ZAPSN ;-------------------------------- ;uložit MIN t0, čas, datum WMIN0 MOVLW 0x05 MOVWF EEADRp MOVF t0L,W MOVWF Lt0L CALL EWrite ;05 INCF EEADRp,F MOVF t0H,W MOVWF Lt0H CALL EWrite ;06 INCF EEADRp,F MOVF Hod,W MOVWF LHod0 CALL EWrite ;07 INCF EEADRp,F MOVF Min,W MOVWF LMin0 CALL EWrite ;08 INCF EEADRp,F MOVF Den,W MOVWF LDen0 CALL EWrite ;09 INCF EEADRp,F MOVF Mes,W MOVWF LMes0 CALL EWrite ;0A GOTO ZAPSN ;-------------------------------- ;uložit MAX t1, čas, datum WMAX1 MOVLW 0x17 MOVWF EEADRp MOVF t1L,W MOVWF Ht1L CALL EWrite ;17 INCF EEADRp,F MOVF t1H,W MOVWF Ht1H CALL EWrite ;18 INCF EEADRp,F MOVF Hod,W MOVWF HHod1 CALL EWrite ;19 INCF EEADRp,F MOVF Min,W MOVWF HMin1 CALL EWrite ;1A INCF EEADRp,F MOVF Den,W MOVWF HDen1 CALL EWrite ;1B INCF EEADRp,F MOVF Mes,W MOVWF HMes1 CALL EWrite ;1C GOTO ZAPSN ;-------------------------------- ;uložit MIN t1, čas, datum WMIN1 MOVLW 0x11 MOVWF EEADRp MOVF t1L,W MOVWF Lt1L CALL EWrite ;11 INCF EEADRp,F MOVF t1H,W MOVWF Lt1H CALL EWrite ;12 INCF EEADRp,F MOVF Hod,W MOVWF LHod1 CALL EWrite ;13 INCF EEADRp,F MOVF Min,W MOVWF LMin1 CALL EWrite ;14 INCF EEADRp,F MOVF Den,W MOVWF LDen1 CALL EWrite ;15 INCF EEADRp,F MOVF Mes,W MOVWF LMes1 CALL EWrite ;16 ;................................ ;ZAP signalizaci nové hodnoty MIN/MAX ZAPSN BSF SN RETURN ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII Init ;obnovení RAM z EEPROM 0x00-0x22 CLRF EEADRp ;počáteční adresa EEPROM MOVLW Min ;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 0x22 ;poslední adresa EEPROM BTFSC SC ;záporné? GOTO $-7 ;NE ;základní nastavení procesoru BSF STATUS,RP0 ;Banka1 CLRF INTCON CLRF PIE2 MOVLW B'11101000' ;PORTA, 0=výstup, 1=vstup MOVWF TRISA ; MOVLW B'00000011' ;PORTB, 0=výstup, 1=vstup MOVWF TRISB ; MOVLW B'00000000' ;digi. vstupy MOVWF ANSEL ; MOVLW B'11100101' ;RA0=AN0, RA1=AN1, RA3=Vref+ ; MOVWF ADCON1 ;Configure A/D inputs MOVLW B'01000111' ;předdělič 1:256 pro TMR0 MOVWF OPTION_REG ; MOVLW B'00000001' ;přerušení od TMR1 MOVWF PIE1 ; BCF STATUS,RP0 ;Banka0 ; MOVLW B'10000011' ;AD časování, výběr AD vstupu, ZAP AD ; MOVWF ADCON0 ; MOVLW B'00000000' ;předdělič 1:1 pro TMR1 MOVWF T1CON ; CALL INILCD ;iniciace LCD MOVLW 0x01 MOVWF DeSR ; CALL WRCMD ;smazat LCD MOVLW B'11100000' ;zapnout přerušení TMR0, TMR1 MOVWF INTCON ; CLRF Sek CALL MaxDen MOVWF MAXden ;uložit BCF RT0 BCF RT1 BCF SN CLRF DN CLRF DPO BSF PO MOVLW B'11110000' MOVWF KLVP ;================================ ;displej 1 DIS1 BCF SMAX0 BCF SMIN0 BCF SMAX1 BCF SMIN1 DIS11 CALL MV CALL ZTEP ;zobrazit teploty CALL ZHOD ;zobrazit hodiny CALL ZMIN ;zobrazit minuty CALL ZSEK ;zobrazit sekundy CALL ZDEN ;zobrazit den (Po...Ne) CALL ZDAT ;zobrazit datum CALL ZMES ;zobrazit měsíc CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO DIS11 ;NE BTFSS Tl4 ;stisknuto? GOTO DIS2 ;ANO BTFSS Tl3 ;stisknuto? GOTO DIS7 ;ANO BTFSC Tl1 ;stisknuto? GOTO DIS1 ;NE ;pauza pro S CLRWDT CALL ZHOD CALL ZMIN CALL ZSEK CALL ZDEN CALL ZDAT CALL ZMES BTFSC Tl1 ;stisknuto? GOTO DIS11 ;NE BTFSS Znova ;odčasováno? GOTO $-10 ;NE BCF Znova ;nulovat ;................................ ;Vložit Hodiny EHOD MOVLW 0xC0 CALL WRCMD ;blikat, Hod BSF BR1 BSF BR2 MOVF Hod,W CALL HDW CALL PSR2 MOVLW ":" CALL WRDATA CALL ZMIN CALL ZSEK CALL ZDEN CALL ZDAT CALL ZMES CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO EHOD ;NE BTFSS Tl4 ;stisknuto? GOTO EHODP ;ANO BTFSS Tl3 ;stisknuto? GOTO EHODM ;ANO BTFSS Tl1 ;stisknuto? GOTO UMHDM ;DIS1 ;ANO GOTO EMIN ;Hod -1 EHODM MOVLW 1 SUBWF Hod,F ;Hod-1 BTFSC SC ;záporné? GOTO EHOD ;NE MOVLW 23 MOVWF Hod GOTO EHOD ;Hod +1 EHODP INCF Hod,F ;Hod+1 MOVF Hod,W SUBLW 23 ;23-Hod BTFSS SC ;C=1? kladné? CLRF Hod ;NE;=0 GOTO EHOD ;................................ ;vložit Minuty EMIN CALL ZHOD ;blikat, Min MOVF Min,W CALL HDW CALL PSR2 MOVLW ":" CALL WRDATA CALL ZSEK CALL ZDEN CALL ZDAT CALL ZMES CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO EMIN ;NE BTFSS Tl4 ;stisknuto? GOTO EMINP ;ANO BTFSS Tl3 ;stisknuto? GOTO EMINM ;ANO BTFSS Tl1 ;stisknuto? GOTO UMHDM ;DIS1 ;ANO GOTO ESEK ;Min -1 EMINM MOVLW 1 SUBWF Min,F ;Min-1 BTFSC SC ;záporné? GOTO EMIN ;NE MOVLW 59 MOVWF Min GOTO EMIN ;Min +1 EMINP INCF Min,F ;Min+1 MOVF Min,W SUBLW 59 ;59-Min BTFSS SC ;C=1? kladné? CLRF Min ;NE;=0 GOTO EMIN ;................................ ;vložit Sekundy ESEK CALL ZHOD CALL ZMIN ;blikat, Sek MOVF Sek,W CALL HDW CALL PSR2 MOVLW " " CALL WRDATA CALL ZDEN CALL ZDAT CALL ZMES CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO ESEK ;NE BTFSS Tl4 ;stisknuto? GOTO ESEKN ;ANO BTFSS Tl3 ;stisknuto? GOTO ESEKN ;ANO BTFSS Tl1 ;stisknuto? GOTO UMHDM ;DIS1 ;ANO GOTO EDEN ESEKN MOVLW 1 MOVWF TMR0 MOVLW 75 ;znovu MOVWF SEKD ; naplnit CLRF Sek GOTO ESEK ;................................ ;vložit den Po-Ne EDEN CALL ZHOD CALL ZMIN CALL ZSEK ;blikat, Den BTFSC BLIK,4 GOTO $+3 CALL ZDEN GOTO $+5 MOVLW 0x20 ;mezera CALL WRDATA MOVLW 0x20 ;mezera CALL WRDATA CALL ZDAT CALL ZMES CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO EDEN ;NE BTFSS Tl4 ;stisknuto? GOTO EDENP ;ANO BTFSS Tl3 ;stisknuto? GOTO EDENM ;ANO BTFSS Tl1 ;stisknuto? GOTO UMHDM ;DIS1 ;ANO GOTO EDAT ;PONE-1 EDENM DECF PoNe,F ;-1? BTFSS PoNe,7 ;záporné GOTO EDEN ;NE MOVLW 6 MOVWF PoNe GOTO EDEN ;PoNe+1 EDENP INCF PoNe,F MOVF PoNe,W SUBLW 6 ;6-PoNe BTFSS SC ;C=1? kladné? CLRF PoNe ;=0 GOTO EDEN ;................................ ;vložit datum den EDAT CALL ZHOD CALL ZMIN CALL ZSEK CALL ZDEN ;blikat, Dat MOVF Den,W CALL HDW CALL PSR2 MOVLW "/" CALL WRDATA CALL ZMES CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO EDAT ;NE BTFSS Tl4 ;stisknuto? GOTO EDATP ;ANO BTFSS Tl3 ;stisknuto? GOTO EDATM ;ANO BTFSS Tl1 ;stisknuto? GOTO UMHDM ;DIS1 ;ANO GOTO EMES ;Dny-1 EDATM DECFSZ Den,F ;-1=0? GOTO EDAT MOVF MAXden,W MOVWF Den GOTO EDAT ;Dny+1 EDATP INCF Den,F ;+1 MOVF Den,W SUBWF MAXden,W ;MAXden-Den BTFSC SC ;C=0? záporné? GOTO EDAT MOVLW 1 MOVWF Den GOTO EDAT ;................................ ;vložit měsíc EMES CALL ZHOD CALL ZMIN CALL ZSEK CALL ZDEN CALL ZDAT ;blikat, Mes MOVF Mes,W CALL HDW CALL PSR2 CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO EMES ;NE BTFSS Tl4 ;stisknuto? GOTO EMESP ;ANO BTFSS Tl3 ;stisknuto? GOTO EMESM ;ANO BTFSS Tl1 ;stisknuto? GOTO UMHDM ;DIS1 ;ANO GOTO EHOD ;Měsíc-1 EMESM DECFSZ Mes,F ;-1=0? GOTO ZMAXD MOVLW 12 MOVWF Mes GOTO ZMAXD ;Měsíc+1 EMESP INCF Mes,F ;+1 MOVF Mes,W SUBLW 12 ;12-Mes BTFSC SC ;C=0? záporné? GOTO ZMAXD MOVLW 1 MOVWF Mes ZMAXD CALL MaxDen ;zjistit max. den v měsíci MOVWF MAXden ;uložit GOTO EMES ;-------------------------------- ;MAX t0 DIS2 BCF SN ;zobrazit hodiny MAX MOVLW 0xC0 CALL WRCMD MOVF HHod0,W CALL ZHODM ;zobrazit minuty MAX MOVF HMin0,W CALL HDW CALL PR21 MOVLW 6 CALL ZSP ;zobrazit den MAX MOVF HDen0,w CALL ZDATM ;zobrazit měsíc MAX MOVF HMes0,W CALL ZMESM ;zobrazit maximální teplotu 0 MOVLW 0x86 CALL WRCMD MOVLW 3 CALL ZSP BSF TE1 MOVF Ht0L,W MOVWF A1 MOVF Ht0H,W MOVWF A2 CALL ZTSC ;zobrazit teplotu A1,2 °C ;zobrazit MAX t0 DIS21 MOVLW 0x80 CALL WRCMD BTFSS SMAX0 GOTO $+6 BTFSS BLIK,4 GOTO $+4 MOVLW 6 CALL ZSP GOTO $+4 CALL ZMAXt MOVLW "0" CALL WRDATA MOVF DN,F ;návrat na DIS1 BTFSC STATUS,Z ; GOTO DIS1 ; CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO DIS21 ;NE BTFSS Tl4 ;stisknuto? GOTO DIS3 ;ANO BTFSS Tl3 ;stisknuto? GOTO DIS1 ;ANO BTFSC Tl1 ;stisknuto? GOTO DIS2 ;NE ;pauza pro S CLRWDT BTFSC Tl1 ;stisknuto? GOTO DIS2 ;NE BTFSS Znova ;odčasováno? GOTO $-4 ;NE BCF Znova ;nulovat ;................................ ;Vložit MAX t0 CALL WMAX0 GOTO DIS2 ;-------------------------------- ;MIN t0 DIS3 BCF SN ;zobrazit hodiny MIN MOVLW 0xC0 CALL WRCMD MOVF LHod0,W CALL ZHODM ;zobrazit minuty MIN MOVF LMin0,W CALL HDW CALL PR21 MOVLW 6 CALL ZSP ;zobrazit den MIN MOVF LDen0,w CALL ZDATM ;zobrazit měsíc MIN MOVF LMes0,W CALL ZMESM ;zobrazit minimální teplotu 0 MOVLW 0x86 CALL WRCMD MOVLW 3 CALL ZSP BSF TE1 MOVF Lt0L,W MOVWF A1 MOVF Lt0H,W MOVWF A2 CALL ZTSC ;zobrazit teplotu A1,2 °C ;zobrazit MIN t0 DIS31 MOVLW 0x80 CALL WRCMD BTFSS SMIN0 GOTO $+6 BTFSS BLIK,4 GOTO $+4 MOVLW 6 CALL ZSP GOTO $+4 CALL ZMINt MOVLW "0" CALL WRDATA MOVF DN,F ;návrat na DIS1 BTFSC STATUS,Z ; GOTO DIS1 ; CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO DIS31 ;NE BTFSS Tl4 ;stisknuto? GOTO DIS4 ;ANO BTFSS Tl3 ;stisknuto? GOTO DIS2 ;ANO BTFSC Tl1 ;stisknuto? GOTO DIS3 ;NE ;pauza pro S CLRWDT BTFSC Tl1 ;stisknuto? GOTO DIS3 ;NE BTFSS Znova ;odčasováno? GOTO $-4 ;NE BCF Znova ;nulovat ;................................ ;Vložit MIN t0 CALL WMIN0 GOTO DIS3 ;-------------------------------- ;MAX t1 DIS4 BCF SN ;zobrazit hodiny MAX MOVLW 0xC0 CALL WRCMD MOVF HHod1,W CALL ZHODM ;zobrazit minuty MAX MOVF HMin1,W CALL HDW CALL PR21 MOVLW 6 CALL ZSP ;zobrazit den MAX MOVF HDen1,w CALL ZDATM ;zobrazit měsíc MAX MOVF HMes1,W CALL ZMESM ;zobrazit maximální teplotu 1 MOVLW 0x86 CALL WRCMD MOVLW 3 CALL ZSP BSF TE1 MOVF Ht1L,W MOVWF A1 MOVF Ht1H,W MOVWF A2 CALL ZTSC ;zobrazit teplotu A1,2 °C ;zobrazit MAX t1 DIS41 MOVLW 0x80 CALL WRCMD BTFSS SMAX1 GOTO $+6 BTFSS BLIK,4 GOTO $+4 MOVLW 6 CALL ZSP GOTO $+4 CALL ZMAXt MOVLW "1" CALL WRDATA MOVF DN,F ;návrat na DIS1 BTFSC STATUS,Z ; GOTO DIS1 ; CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO DIS41 ;NE BTFSS Tl4 ;stisknuto? GOTO DIS5 ;ANO BTFSS Tl3 ;stisknuto? GOTO DIS3 ;ANO BTFSC Tl1 ;stisknuto? GOTO DIS4 ;NE ;pauza pro S CLRWDT BTFSC Tl1 ;stisknuto? GOTO DIS4 ;NE BTFSS Znova ;odčasováno? GOTO $-4 ;NE BCF Znova ;nulovat ;................................ ;Vložit MAX t1 CALL WMAX1 GOTO DIS4 ;-------------------------------- ;MIN t1 DIS5 BCF SN ;zobrazit hodiny MIN MOVLW 0xC0 CALL WRCMD MOVF LHod1,W CALL ZHODM ;zobrazit minuty MAX MOVF LMin1,W CALL HDW CALL PR21 MOVLW 6 CALL ZSP ;zobrazit den MIN MOVF LDen1,w CALL ZDATM ;zobrazit měsíc MIN MOVF LMes1,W CALL ZMESM ;zobrazit minimální teplotu 1 MOVLW 0x86 CALL WRCMD MOVLW 3 CALL ZSP BSF TE1 MOVF Lt1L,W MOVWF A1 MOVF Lt1H,W MOVWF A2 CALL ZTSC ;zobrazit teplotu A1,2 °C ;zobrazit MIN t1 DIS51 MOVLW 0x80 CALL WRCMD BTFSS SMIN1 GOTO $+6 BTFSS BLIK,4 GOTO $+4 MOVLW 6 CALL ZSP GOTO $+4 CALL ZMINt MOVLW "1" CALL WRDATA MOVF DN,F ;návrat na DIS1 BTFSC STATUS,Z ; GOTO DIS1 ; CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO DIS51 ;NE BTFSS Tl4 ;stisknuto? GOTO DIS6 ;ANO BTFSS Tl3 ;stisknuto? GOTO DIS4 ;ANO BTFSC Tl1 ;stisknuto? GOTO DIS5 ;NE ;pauza pro S CLRWDT BTFSC Tl1 ;stisknuto? GOTO DIS5 ;NE BTFSS Znova ;odčasováno? GOTO $-4 ;NE BCF Znova ;nulovat ;................................ ;Vložit MIN t1 CALL WMIN1 GOTO DIS5 ;-------------------------------- ;Ref.teplo.0 DIS6 CALL ZRT MOVLW "0" CALL WRDATA MOVLW 3 CALL ZSP BSF TE1 CALL ZRT0 MOVLW " " CALL WRDATA MOVLW "H" CALL WRDATA MOVLW "y" CALL WRDATA MOVLW "s" CALL WRDATA CLRF BR MOVF HYS0,W MOVWF A1 CLRF A2 CALL HEXDEC MOVLW 0xCC CALL PSR3 DIS61 MOVF DN,F ;návrat na DIS1 BTFSC STATUS,Z ; GOTO DIS1 ; CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO DIS61 ;NE BTFSS Tl4 ;stisknuto? GOTO DIS7 ;ANO BTFSS Tl3 ;stisknuto? GOTO DIS5 ;ANO BTFSC Tl1 ;stisknuto? GOTO DIS6 ;NE ;................................ ;vložit ref.teplo.0 ERV MOVLW B'00001111' MOVWF BR ERV2 MOVF RT0L,W MOVWF A1 MOVF RT0H,W MOVWF A2 CALL HEXDEC MOVLW 0xC0 CALL PRINTS CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO ERV2 ;NE BTFSS Tl4 ;stisknuto? GOTO ERVP ;ANO BTFSS Tl3 ;stisknuto? GOTO ERVM ;ANO BTFSS Tl1 ;stisknuto? GOTO UREFT0 ;DIS6 ;ANO CALL ZRT0 GOTO EHYSV ;RT0-1 ERVM MOVF RT0L,W MOVWF X1 MOVF RT0H,W MOVWF X2 CALL XM1 MOVF X1,W MOVWF RT0L MOVF X2,W MOVWF RT0H GOTO ERV2 ;RT0+1 ERVP MOVF RT0L,W MOVWF X1 MOVF RT0H,W MOVWF X2 CALL XP1 MOVF X1,W MOVWF RT0L MOVF X2,W MOVWF RT0H GOTO ERV2 ;............................... ;vložit Hys.0 EHYSV MOVLW B'00000111' MOVWF BR EHYSV2 MOVLW 0xCC CALL WRCMD MOVF HYS0,W MOVWF A1 CLRF A2 CALL HEXDEC CALL PSR3 CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO EHYSV2 ;NE BTFSS Tl4 ;stisknuto? GOTO EHVP ;ANO BTFSS Tl3 ;stisknuto? GOTO EHVM ;ANO BTFSS Tl1 ;stisknuto? GOTO UREFT0 ;DIS6 ;ANO MOVLW 0xCC CALL WRCMD MOVF HYS0,W MOVWF A1 CLRF A2 CALL HEXDEC CALL PSR3 GOTO ERV ;HYS0-1 EHVM DECF HYS0,F ;-1 GOTO EHYSV2 ;HYS0+1 EHVP INCF HYS0,F ;+1 GOTO EHYSV2 ;-------------------------------- ;Ref.teolo.1 DIS7 CALL ZRT MOVLW "1" CALL WRDATA MOVLW 3 CALL ZSP BSF TE1 CALL ZRT1 MOVLW " " CALL WRDATA MOVLW "H" CALL WRDATA MOVLW "y" CALL WRDATA MOVLW "s" CALL WRDATA CLRF BR MOVF HYS1,W MOVWF A1 CLRF A2 CALL HEXDEC MOVLW 0xCC CALL PSR3 DIS71 MOVF DN,F ;návrat na DIS1 BTFSC STATUS,Z ; GOTO DIS1 ; CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO DIS71 ;NE BTFSS Tl4 ;stisknuto? GOTO DIS1 ;ANO BTFSS Tl3 ;stisknuto? GOTO DIS6 ;ANO BTFSC Tl1 ;stisknuto? GOTO DIS7 ;NE ;................................ ;vložit ref.teplo.1 ERT MOVLW B'00001111' MOVWF BR ERT2 MOVF RT1L,W MOVWF A1 MOVF RT1H,W MOVWF A2 CALL HEXDEC MOVLW 0xC0 CALL PRINTS CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO ERT2 ;NE BTFSS Tl4 ;stisknuto? GOTO ERTP ;ANO BTFSS Tl3 ;stisknuto? GOTO ERTM ;ANO BTFSS Tl1 ;stisknuto? GOTO UREFT1 ;DIS7 ;ANO CALL ZRT1 GOTO EHYST ;RT1-1 ERTM MOVF RT1L,W MOVWF X1 MOVF RT1H,W MOVWF X2 CALL XM1 MOVF X1,W MOVWF RT1L MOVF X2,W MOVWF RT1H GOTO ERT2 ;RT1+1 ERTP MOVF RT1L,W MOVWF X1 MOVF RT1H,W MOVWF X2 CALL XP1 MOVF X1,W MOVWF RT1L MOVF X2,W MOVWF RT1H GOTO ERT2 ;................................ ;vložit hys.1 EHYST MOVLW B'00000111' MOVWF BR EHYST2 MOVLW 0xCC CALL WRCMD MOVF HYS1,W MOVWF A1 CLRF A2 CALL HEXDEC CALL PSR3 CALL KLV ;čtení klávesnice BTFSC SZ ;Z=0? neco stisknuto GOTO EHYST2 ;NE BTFSS Tl4 ;stisknuto? GOTO EHTP ;ANO BTFSS Tl3 ;stisknuto? GOTO EHTM ;ANO BTFSS Tl1 ;stisknuto? GOTO UREFT1 ;DIS7 ;ANO MOVLW 0xCC CALL WRCMD MOVF HYS1,W MOVWF A1 CLRF A2 CALL HEXDEC CALL PSR3 GOTO ERT ;HYS1-1 EHTM DECF HYS1,F ;-1 GOTO EHYST2 ;HYS1+1 EHTP INCF HYS1,F ;+1 GOTO EHYST2 ;///////////////////////////////; ORG 0x800 ;program pokračuje na stránce 1 ;///////////////////////////////; ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIII; ; identifikace přerušení ; ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIII; INT BTFSC INTCON,TMR0IF ;od TMR0? GOTO ITMR0 ;ANO BTFSS PIR1,TMR1IF ;od TMR1? GOTO EINT ;NE ;================================ ;přerušení od přetečení TMR1 BCF T1CON,TMR1ON ;=0, stop časovač1 CLRF PV ;=0, počet vzorků BCF PIR1,TMR1IF ;VYP příznak BSF Er ;=1, porucha snímače CLRF MemW GOTO EINT ;================================ ;přerušení od časovače TMR0 ITMR0 BCF INTCON,TMR0IF ;VYP příznak BSF NM ;=1, neplatné měření ;75Hz (krystal 19.6608MHz) ;-------------------------------- ;dělič pro Stpo Regulace MOVF DeSR,F BTFSS STATUS,Z ;DeSR=0? INCF DeSR,F ;NE, +1 ;-------------------------------- ;STOP čtení klávesnice BTFSS E ;E=1?, sběrnici používá LCD ;dělič pro klávesnici 75/5=15Hz DECFSZ KLVD,F ;-1=0? GOTO EKLV MOVLW 5 ;znovu MOVWF KLVD ; naplnit ;čtení klávesnice BSF STATUS,RP0 ;Banka1 MOVLW B'11110000' ;1=vstup, 0=výstup IORWF TRISB,F ;(0a0=0) 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'11110000' ;(1a1=1) MOVWF KLVP ;uložit BSF STATUS,RP0 ;Banka1 MOVLW B'00001111' ;PORTB, 0=výstup, 1=vstup ANDWF TRISB,F ;(1a1=1) BCF STATUS,RP0 ;Banka0 EKLV ;-------------------------------- ;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č 75/75=1Hz DECFSZ SEKD,F ;-1=0? GOTO EINT ;NE MOVLW 75 ;znovu MOVWF SEKD ; naplnit ;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS; ; 1Hz, SEKUNDA ; ;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS; ;dělič pro podsvícení INCFSZ DPO,F ;+1=0? GOTO $+2 BCF PO ;VYP podsvícení (po 256sek) ;-------------------------------- ;dělič pro návrat na displej 1 MOVF DN,F BTFSS STATUS,Z DECF DN,F ;-------------------------------- ;sekunda+1 INCF Sek,F ;+1 MOVF Sek,W SUBLW 59 ;59-Sek BTFSC SC ;C=0? záporné? GOTO EINT ;NE CLRF Sek ;=0 ;minuta+1 INCF Min,F ;+1 MOVF Min,W SUBLW 59 ;59-Min BTFSC SC ;C=0? záporné? GOTO MiEE ;NE CLRF Min ;=0 ;hodina+1 INCF Hod,F ;+1 MOVF Hod,W SUBLW 23 ;23-Hod BTFSC SC ;C=0? záporné? GOTO HoEE CLRF Hod ;ANO;=0 ;dny v týdnu+1 INCF PoNe,F ;+1 MOVF PoNe,W SUBLW 6 ;6-PoNe BTFSS SC ;C=1? kladné? CLRF PoNe ;NE;=0 ;dny+1 INCF Den,F ;+1 MOVF Den,W SUBWF MAXden,W ;MAXden-Den BTFSC SC ;C=1?; záporné? GOTO DnEE MOVLW 1 ;ANO MOVWF Den ;=1 ;měsíc+1 INCF Mes,F ;+1 MOVF Mes,W SUBLW 12 ;12-Měsíc BTFSC SC ;C=0?; záporné? GOTO $+3 ;NE MOVLW 1 ;ANO MOVWF Mes ;=1 PROG0 CALL MaxDen ;zjistit max. den v měsíci PROG1 MOVWF MAXden ;uložit ;................................ ;uložit měsíc do EEPROM MeEE MOVLW 0x04 MOVWF EEADRp ;adresa MOVF Mes,W ;data CALL EWR ;zápis ;uložit dny do EEPROM DnEE MOVLW 0x02 MOVWF EEADRp ;adresa MOVF PoNe,W ;data CALL EWR ;zápis INCF EEADRp,F MOVF Den,W ;data CALL EWR ;zápis ;uložit hodiny do EEPROM HoEE MOVLW 0x01 MOVWF EEADRp ;adresa MOVF Hod,W ;data CALL EWR ;zápis ;uložit minuty do EEPROM MiEE CLRF EEADRp ;adresa MOVF Min,W ;data CALL EWR ;zápis ;-------------------------------- ;konec přerušení EINT MOVF MemPCLATH,W MOVWF PCLATH SWAPF MemSTATUS,W MOVWF STATUS SWAPF MemW,F SWAPF MemW,W RETFIE ;================================ ;zápis do EEPROM (pouze pro zápis v přerušení) EWR CLRWDT BSF STATUS,RP1 ;Banka3 BSF STATUS,RP0 ; BTFSC EECON1,WR ;čekání na dokončení GOTO $-1 ;předchozího zápisu BCF STATUS,RP0 ;Banka2 MOVWF EEDATA ;příprava dat MOVF EEADRp,W ;nastavení adresy MOVWF EEADR ;do ukazatele BSF STATUS,RP0 ;Banka3 BCF EECON1,EEPGD ;aktivace paměti dat EEPROM BSF EECON1,WREN ;povolení zápisu do EEPROM MOVLW 0x55 ; MOVWF EECON2 ;zápis 55h MOVLW 0xAA ; MOVWF EECON2 ;zápis AAh BSF EECON1,WR ;zahájení zápisu BCF EECON1,WREN ;zákaz dalších zápisů BCF STATUS,RP0 ;Banka0 BCF STATUS,RP1 ; RETURN ;================================ ;teplota t0 do A T0A MOVF t0L,W MOVWF A1 MOVF t0H,W WA2 MOVWF A2 RETURN ;-------------------------------- ;teplota t0 do B T0B MOVF t0L,W MOVWF B1 MOVF t0H,W WB2 MOVWF B2 RETURN ;-------------------------------- ;teplota t1 do A T1A MOVF t1L,W MOVWF A1 MOVF t1H,W GOTO WA2 ;-------------------------------- ;teplota t1 do B T1B MOVF t1L,W MOVWF B1 MOVF t1H,W GOTO WB2 ;-------------------------------- ;ref.0 RT0 do A RT0A MOVF RT0L,W MOVWF A1 MOVF RT0H,W GOTO WA2 ;-------------------------------- ;ref.0 RT0 do B RT0B MOVF RT0L,W MOVWF B1 MOVF RT0H,W GOTO WB2 ;-------------------------------- ;ref.1 RT1 do A RT1A MOVF RT1L,W MOVWF A1 MOVF RT1H,W GOTO WA2 ;-------------------------------- ;ref.1 RT1 do B RT1B MOVF RT1L,W MOVWF B1 MOVF RT1H,W GOTO WB2 ;-------------------------------- ;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 PAB ;porovnat znaménka MOVF A2,W XORWF B2,W ;(stejné=0) ANDLW B'10000000' ;(1a1=1) RLF B2,W ;vlevo(SC=MSB) BTFSS SZ ;stejné znaménka? (SZ=1) RETURN ;NE ;A-B ;ANO CLRF A3 CLRF B3 PROG0 CALL MINUS ;A-B=C; SC=0=záporný výsledek PROG1 ;test C=0; SZ=1=ANO MOVF C3,F BTFSC SZ ;nenulove? MOVF C2,F BTFSC SZ ;nenulove? MOVF C1,F BTFSC SZ ;nenulové? BCF SC ;SC=0 (A=B) jako záporné RETURN ;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO; OV; ovládání výstupů ; ;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO; ;stop regulace po startu MOVF DeSR,F BTFSS STATUS,Z ;DeSR=0? GOTO RET0 ;NE, čekání po startu ;-------------------------------- ;porucha S1? BTFSS Er1 ;=1? GOTO ORT1 ;NE ; BCF RT1 ;=0 ; BSF RT1 ;=1 GOTO OV0 ;................................ ;RT1=1 při, t1 <= ref.1 ORT1 CALL T1A ;teplota T1 do A CALL RT1B ;ref.1 RT1 do B CALL PAB ;Test A <= B ; sC=0=ANO, 1=NE BTFSS SC ; BSF RT1 ;ANO, RT1=1, ZAP rele ;RT1=0 při, t1 => ref.1 + hys.1 CALL T1B ;teplota T1 do B CALL RT1A ;ref.teplota RT1,2 do A MOVF HYS1,W ;hystereze ADDWF A1,F ;HYST+A1=A1 BTFSC SC ;nepřeteklo? INCF A2,F ;+1 CALL PAB ;Test A <= B ; sC=0=ANO, 1=NE BTFSS SC ; BCF RT1 ;ANO, RT1=0, VYP rele ;................................ ;t1 < MIN t1 CALL T1B MOVF Lt1L,W MOVWF A1 MOVF Lt1H,W MOVWF A2 CALL PAB ;B < A SC=1 BTFSS SC ;SC=1? GOTO $+5 ;NE PROG0 CALL WMIN1 ;zápis MIN t1 PROG1 BSF SMIN1 ;ZAP signalizace ;................................ ;t1 > MAX t1 CALL T1A MOVF Ht1L,W MOVWF B1 MOVF Ht1H,W MOVWF B2 CALL PAB ;A > B SC=1 BTFSS SC ;SC=1? GOTO $+5 ;NE PROG0 CALL WMAX1 ;zápis MAX t1 PROG1 BSF SMAX1 ;ZAP signalizace ;-------------------------------- ;porucha S0? OV0 BTFSS Er0 ;=1? GOTO ORT0 ;NE ; BCF RT0 ;=0 ; BSF RT0 ;=1 GOTO RET0 ;................................ ;RT0=1 při, T0 <= ref.0 ORT0 CALL T0A ;teplota T0 do A CALL RT0B ;ref.1 RT1 do B CALL PAB ;Test A <= B ; sC=0=ANO, 1=NE BTFSS SC ; BSF RT0 ;ANO, RT0=1, ZAP rele ;RT0=0 při, t0 => ref.0 + hys.0 CALL T0B ;teplota T0 do A CALL RT0A ;ref.teplota RT1,2 do B MOVF HYS0,W ;hystereze ADDWF A1,F ;HYST+A1=A1 BTFSC SC ;nepřeteklo? INCF A2,F ;+1 CALL PAB ;Test A <= B ; sC=0=ANO, 1=NE BTFSS SC ; BCF RT0 ;ANO, RT0=0, VYP rele ;................................ ;t0 < MIN t0 CALL T0B MOVF Lt0L,W MOVWF A1 MOVF Lt0H,W MOVWF A2 CALL PAB ;B < A SC=1 BTFSS SC ;SC=1? GOTO $+5 ;NE PROG0 CALL WMIN0 ;zápis MIN t0 PROG1 BSF SMIN0 ;ZAP signalizace ;................................ ;t0 > MAX t0 CALL T0A MOVF Ht0L,W MOVWF B1 MOVF Ht0H,W MOVWF B2 CALL PAB ;A > B SC=1 BTFSS SC ;SC=1? GOTO $+5 ;NE PROG0 CALL WMAX0 ;zápis MAX t0 PROG1 BSF SMAX0 ;ZAP signalizace ;-------------------------------- RET0 PROG0 RETURN ;-------------------------------- END