;-------------------------------;
;	 MIKRO TERMOSTAT	;
;-------------------------------;
;slovak@post.cz	      )S(01.2009;
;-------------------------------;
;Displej: (LED 2 místný, společná anoda)
;°C	teplota (-45 až 99°C, krok 1°C)
;M0	Mez0
;M1	Mez1
;M2	Mez2
;M3	Mez3
;M4	Mez4
;M5	Mez5
;--------------------------------
;Tlačítka:
;Tl.S	Set, nastavit	(levé)
;Tl.M	Mínus		(prostřední)
;Tl.P	Plus		(pravé)
;--------------------------------
;vstup:
;MCLR	Teplotní čidlo SMT 160-30
;--------------------------------
;Výstupy:
;A0=1 při, teplota < Mez0
;A0=0 při, teplota => Mez0
;
;A1=1 při, teplota < Mez1
;A1=0 při, teplota => Mez1
;
;A2=1 při, teplota < Mez2
;A2=0 při, teplota => Mez2
;
;A3=1 při, teplota < Mez3
;A3=0 při, teplota => Mez3
;
;A4=1 při, teplota <= Mez4
;A4=0 při, teplota => Mez5
;--------------------------------

 LIST P=16F628A, R=DEC		;Direktivy překladače
 include<p16f628a.inc>		;Definice názvů registrů
 __CONFIG 0x3F54		;Nastaví následující konfiguraci
; CP=OFF, CPD=OFF, LVP=OFF, BOREN=ON,
; MCLRE=I/O, PWRTEN=Enable, WDTE=ON, OSC=INTRC-I/O

 cblock	0x20
MemStat
A1		;matematické
A2		; proměnné
A3		; a jiné funkce
B1		;
B2		;
B3		;
C1		;
C2		;
C3		;
D1		;
D2		;
D3		;
X1		;
X2		;
FL		;flag,příznaky
Znak0		;číslo znaku, pozice 0 (vlevo)
Znak1		;číslo znaku, pozice 1 (vpravo)
PZnak		;pro převod číslo/znak
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
PV		;počet vzorků
SH1		;součt úrovně H
SH2		;
SH3		;
SP1		;součet periody P
SP2		;
SP3		;
T1		;teplota [°C*10]
T2		;
TEP		;teplota [°C]
DN		;dělič pro návrat na teplotu
D122		;dělič 122
DeSR		;dělič pro Stop Regulace po startu
	;EEPROM adresa
M0	;00	;Mez0
M1	;01	;Mez1
M2	;02	;Mez2
M3	;03	;Mez3
M4	;04	;Mez4
M5	;05	;Mez5
 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	;porucha snímače
#define	NM	FL,3	;neplatné měření
#define	Znam	FL,4	;znaménko 1=záporná teplota
#define	Z01	FL,5	;Znak 0/1
#define	Azn	FL,6	;znaménko A, 0=kladné 1=záporné
#define	Bzn	FL,7	;znaménko B, 0=kladné 1=záporné

#define	TlS	KLVP,2	;levé tlačítko SET
#define	TlM	KLVP,3	;prostřední tlačítko MÍNUS
#define	TlP	KLVP,1	;pravé tlačítko PLUS

#define	SMT	PORTA,5	;vstup pro teplotní čidlo
#define	RA0	PORTA,0	;výstup A0
#define	RA1	PORTA,1	;výstup A1
#define	RA2	PORTA,2	;výstup A2
#define	RA3	PORTA,3	;výstup A3
#define	RA4	PORTA,4	;výstup A4
#define	LM	PORTB,0	;LED Mínus


;*************************************************
 ORG	0x2100		;tabulka dat v EEPROM

 de 0x00, 0x0A, 0x14, 0x1E, 0x28, 0x32, 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 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, 0x31, 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
	MOVF	STATUS,W
	CLRF	STATUS
	MOVWF	MemStat
;--------------------------------
	BTFSS	PIR1,TMR1IF	;od TMR1?
	GOTO	ITMR0		;NE
;................................
;přerušení od přetečení TMR1
	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
	RETFIE
;--------------------------------
ITMR0	BTFSS	INTCON,T0IF	;od TMR0?
	GOTO	EINT		;NE
;................................
;přerušení od časovače TMR0 122Hz (INTRC OSC 4MHz)
	BCF	INTCON,T0IF	;VYP příznak
	BSF	NM		;ZAP neplatné měření
;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
;--------------------------------
;obsluha displeje a klávesnice
	BCF	PORTA,7		;zhasnout displej
	BCF	PORTA,6		;

;................................
;dělič pro klávesnici (122/5=24)
	DECFSZ	KLVD,F		;-1=0?
	GOTO	$+19
	MOVLW	5		;znovu
	MOVWF	KLVD		; naplnit
;čtení klávesnice
	BSF	STATUS,RP0	;Banka1
	MOVLW	B'00001110'
	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'00001110'	;(1a1=1)
	MOVWF	KLVP		;uložit
	BSF	STATUS,RP0	;Banka1
	CLRF	TRISB		;0=výstup
	BCF	STATUS,RP0	;Banka0
;................................

	MOVLW	B'00000001'	;příprava
	ANDWF	PORTB,F		; katod
	MOVF	Znak0,W		;načíst Znak0
	BTFSC	Z01		;Znak 0 nebo 1
	MOVF	Znak1,W		;načíst Znak1
	CALL	Znak		;převede číslo znaku na sedmisegmentový kód
	IORWF	PORTB,F		;zapnout katody, ostatní bity neměnit
;zapnout anodu
	BTFSS	Z01
	BSF	PORTA,6
	BTFSC	Z01
	BSF	PORTA,7
;připravit příští anodu
	BTFSS	Z01
	GOTO	$+3
	BCF	Z01
	GOTO	$+2
	BSF	Z01
;--------------------------------
;dělič pro Stop Regulace
	MOVF	DeSR,F
	BTFSS	STATUS,Z	;DeSR=0?
	INCF	DeSR,F		;NE, +1
;--------------------------------
;dělič pro návrat na zobrazení teploty
	DECFSZ	D122,F
	GOTO	EINT
	MOVLW	122
	MOVWF	D122
	MOVF	DN,F
	BTFSS	STATUS,Z
	DECF	DN,F
;--------------------------------
;konec přerušení
EINT	MOVF	MemStat,W
	MOVWF	STATUS
	SWAPF	MemW,F
	SWAPF	MemW,W
	RETFIE

;================================
Znak	MOVWF	PZnak
	SUBLW	0x26		;26-PZnak
	MOVF	PZnak,W		;původní znak
	BTFSS	STATUS,C	;kladné?
	MOVLW	0x13		;NE, nahradit znak
	ADDWF	PCL,F		;k PC se přičte číslo znaku
;		  bagfedc	;Segment (0=svítí)
	RETLW	B'00100000'	;0x00/0
	RETLW	B'01111100'	;0x01/1
	RETLW	B'00010010'	;0x02/2
	RETLW	B'00011000'	;0x03/3
	RETLW	B'01001100'	;0x04/4
	RETLW	B'10001000'	;0x05/5
	RETLW	B'10000000'	;0x06/6
	RETLW	B'00111100'	;0x07/7
	RETLW	B'00000000'	;0x08/8
	RETLW	B'00001000'	;0x09/9
	RETLW	B'00000100'	;0x0A/A
	RETLW	B'11000000'	;0x0B/b
	RETLW	B'10100010'	;0x0C/C
	RETLW	B'01010000'	;0x0D/d
	RETLW	B'10000010'	;0x0E/E
	RETLW	B'10000110'	;0x0F/F
	RETLW	B'01000100'	;0x10/H
	RETLW	B'11110110'	;0x11/i
	RETLW	B'01110000'	;0x12/J
	RETLW	B'10011010'	;0x13/ (3x -)
	RETLW	B'11100010'	;0x14/L
	RETLW	B'00100100'	;0x15/M
	RETLW	B'11010100'	;0x16/n
	RETLW	B'11010000'	;0x17/o
	RETLW	B'00000110'	;0x18/P
	RETLW	B'11010110'	;0x19/r
	RETLW	B'10001100'	;0x1A/S
	RETLW	B'11000010'	;0x1B/t
	RETLW	B'11110000'	;0x1C/u
	RETLW	B'01100000'	;0x1D/V
	RETLW	B'01001000'	;0x1E/Y
	RETLW	B'11011110'	;0x1F/-
	RETLW	B'11111110'	;0x20/ (zhasnuto)
	RETLW	B'11011010'	;0x21/=
	RETLW	B'01100100'	;0x22/II
	RETLW	B'11010010'	;0x23/c
	RETLW	B'00111000'	;0x24/)
	RETLW	B'01011100'	;0x25/-1
	RETLW	B'00001110'	;0x26/°

;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 SMT 160-30
;čekání na nulu
	MOVLW	3
	CLRWDT
	BTFSC	SMT		;vstup=0?
	SUBWF	PCL,F		;dva kroky zpět

	BTFSC	PS		;porucha snímače?
	GOTO	ES		;ANO
;čekání na jedničku
	CLRWDT
	BTFSS	SMT		;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?
	GOTO	ES		;ANO
;čekání na nulu
	CLRWDT
	BTFSC	SMT		;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?
	GOTO	ES		;ANO
;čekání na jedničku
	MOVLW	3
	CLRWDT
	BTFSS	SMT		;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?
	GOTO	ES		;ANO
;test neplatné měření
	BTFSC	NM		;neplatné měření?
	GOTO	MT		;ANO, znova měřit teplotu
;v A1,2 je délka úrovně H (H)
;v D1,2 je délka periody  (P)
;     ______          _____
; ___|      |________|
;
;    |--H---|
;    |--------P------|
;................................
;součet vzorků/256
;délka H; (H1,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; (P1,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ě
;--------------------------------
;výpočet teploty
;v SH1,2 je průměrná délka úrovně H (H)
;v SP1,2 je průměrná délka periody  (P)
;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		;
;vzorec H*2128/P-681 = A1,2 [°C*10]
;H*2128=A
	CALL	x2128		;C1,2 * 2128 = A1,2,3
;A/P=C
	CLRF	B3
	CALL	LOMENO24	;A1,2,3 / B1,2,3 = C1,2,3
;C-681=A
;	MOVLW	0xA9		;681=0x02A9
	MOVLW	0xB8		;696=0x02B8 (korekce)
	SUBWF	C1,W		;C1-A9
	MOVWF	A1		; =A1
	BTFSS	STATUS,C	;kladné?
	DECF	C2,F		;-1
	MOVLW	0x02
	SUBWF	C2,W		;C2-02
	MOVWF	A2		; =A2

;................................
;Diference, odstraní chvění na nejnižších bitech.
;VSTUP: A1,2=nová hodnota, T1,2=stará hodnota
;VYSTUP: T1,2=výsledek
DIF
;A - B = C
	MOVF	T1,W
	SUBWF	A1,W		;A1-B1=W
	MOVWF	C1		;uložit
	MOVF	T2,W
	BTFSS	STATUS,C	;kladné?
	ADDLW	1		;B2+1=W
	SUBWF	A2,W		;A2-B2=W
	MOVWF	C2		;uložit
;C2 = nenulové?  (A<B nebo A>B+255)
;	MOVF	C2,F
	BTFSS	STATUS,Z	;C2=0?
	GOTO	ADT		;NE, nová hodnota z A
;C1 > 10? (A>B+10)
	MOVF	C1,W
	SUBLW	20		;10-C1
	BTFSS	STATUS,C	;kladné?
	GOTO	ADT		;NE, nová hodnota z A
;C1 <= 4? (A<=B+4)
	MOVF	C1,W
	SUBLW	9		;4-C1
	BTFSC	STATUS,C	;záporné?
	GOTO	T10		;NE, stará hodnota z T
;C1 > 4 (A>B+4)
	INCFSZ	T1,F		;stará hodnota T+1
	GOTO	T10		;
	INCF	T2,F		;
	GOTO	T10		;
ADT
	MOVF	A1,W		;přesun nové hodnoty A do T
	MOVWF	T1		;
	MOVF	A2,W		;
	MOVWF	T2		;
;--------------------------------
;teplota T1,2/10=TEP
T10	MOVF	T1,W
	MOVWF	A1
	MOVF	T2,W
	MOVWF	A2
	CLRF	A3
	BTFSC	A2,7
	DECF	A3,F
	MOVLW	10
	MOVWF	B1
	CLRF	B2
	CLRF	B3
	CALL	LOMENO
	MOVF	C1,W
	MOVWF	TEP
;Stop Regulace
	MOVF	DeSR,F
	BTFSC	STATUS,Z	;DeSR=0?
	GOTO	PR		;ANO, reguluje se
	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
;
;================================
;násobení konstantou 8192
;pro posunutí desetiné čárky
; A1,2 * 8192 = A1,2,3
;x8192	SWAPF	A2,W
;	ANDLW	0xF0
;	MOVWF	A3
;	SWAPF	A1,W
;	ANDLW	0x0F
;	IORWF	A3,F
;	SWAPF	A1,W
;	ANDLW	0xF0
;	MOVWF	A2
;	CLRF	A1
;	BCF	STATUS,C
;	RLF	A2,F
;	RLF	A3,F
;	RETURN
;
;--------------------------------
;násobení konstantou 2128
;pro výpočet teploty ze snímače SMT160-30
; 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		;kolikrát
	BCF	STATUS,C	;SC=0
	RLF	C1,F		;posuv vlevo
	RLF	C2,F		;
	RLF	C3,F		;
	DECFSZ	X2,F		;-1=0?
	GOTO	$-5		;znova

CPA	MOVF	C1,W		;součet
	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	C2,W
	ADDWF	A2,F		;C2+A2=A2
	BTFSC	STATUS,C	;nepřeteklo?
	INCF	A3,F		;+1
	MOVF	C3,W
	ADDWF	A3,F		;C3+A3=A3
	RETURN

;--------------------------------
;Mez + 1 (MAX 99)
MP	MOVWF	A1
	DECF	A1,F
	BTFSS	A1,7		;záporné?
	GOTO	$+7			;NE
	MOVLW	0xD3		;-45
	SUBWF	A1,W		;A1-W
	BTFSC	STATUS,C	;záporné?
	GOTO	$+3		;NE
	MOVLW	0x63		;99
	RETURN
	MOVF	A1,W
	RETURN
;--------------------------------
;Mez - 1 (MIN -45)
MM	MOVWF	A1
	INCF	A1,F
	BTFSC	A1,7		;kladné?
	GOTO	$-5		;NE
	MOVF	A1,W
	SUBLW	0x63		;99-A1
	BTFSC	STATUS,C	;záporné?
	GOTO	$-9		;NE
	MOVLW	0xD3		;-45
	RETURN

;--------------------------------
;Hex z W převede na Dec do Znak0,1 (zobrazení teploty)
HEXDEC	MOVWF	A1
;upravit záporné číslo
	BCF	Znam
	BTFSS	A1,7		;=1?
	GOTO	$+4
	BSF	Znam		;=1, záporné
	COMF	A1,F
	INCF	A1,F		;+1=0?
;převod
	MOVLW	10
	MOVWF	B1
	CLRF	A2
	CLRF	A3
	CLRF	B2
	CLRF	B3
	CALL	LOMENO24
	MOVF	A1,W
	MOVWF	Znak1

	BTFSC	Znam		;kladný znak?
	GOTO	$+7		;NE
;kladný znak
	BCF	LM		;VYP
	MOVF	C1,W
	BTFSC	STATUS,Z
	MOVLW	0x20		;nezobrazovat nulu
	MOVWF	Znak0
	RETURN
;záporný znak
	MOVF	C1,W
	BTFSC	STATUS,Z
	GOTO	$+3
	BSF	LM		;ZAP
	GOTO	$+3

	BCF	LM		;VYP
	MOVLW	0x1F		;znak mínus
	MOVWF	Znak0
	RETURN
;================================
;test něco stisknuto?
TNS	CLRWDT
	MOVF	KLVP,W
	ANDLW	B'00001110'
	XORLW	B'00001110'	;(st.=0)
	BTFSS	STATUS,Z	;nic?
	GOTO	TNS		;něco
	RETURN
;--------------------------------
KLVM	CLRWDT
	CALL	MT		;nejdřív měření teploty
;test KLV + opakovaní, sZ=0=něco stisknuto, 1=žádné tlačítko
KLV	CLRWDT
	MOVF	KLVP,W
	ANDLW	B'00001110'
	XORLW	B'00001110'	;(st.=0)
	BTFSS	STATUS,Z	;=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 zobrazení teploty
	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

;================================
;č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
	BTFSC	EECON1,WR	;čekání na dokončení
	GOTO	$-1		;předchozího zápisu
	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
	BCF	EECON1,WREN	;zápis zákázán
	BCF	STATUS,RP0	;Banka0
	BSF	INTCON,GIE	;povolit přerušení
	RETURN

;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
;iniciace
Init	MOVLW   0x07		;OFF
	MOVWF	CMCON		; Comparators

;obnovení RAM z EEPROM 0x00-0x05
	CLRF	EEADRp		;počáteční adresa EEPROM
	MOVLW	M0		;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	0x05		;poslední adresa EEPROM
	BTFSC	STATUS,C	;záporné?
	GOTO	$-7		;NE

;základní nastevení
	BSF	STATUS,RP0	;Banka1
	MOVLW	B'00100000'	;PORTA výstup mimo A5
	MOVWF	TRISA		;
	CLRF	TRISB		;PORTB výstup
	MOVLW	B'01000100'	;předdělič 1:32 pro TMR0
	MOVWF	OPTION_REG	;
	MOVLW	B'00000001'	;přerušení od TMR1
	MOVWF	PIE1		;
	BCF	STATUS,RP0	;Banka0
	MOVLW	B'10100000'	;přerušení od TMR0
	MOVWF	INTCON		;
	MOVLW	B'00000101'	;předdělič 1:1 pro TMR1
	MOVWF	T1CON		;
	CLRF	FL		;nulovat
	CLRF	PV		;
	MOVLW	1
	MOVWF	DeSR
	BCF	RA0
	BCF	RA1
	BCF	RA2
	BCF	RA3
	BCF	RA4

INT	MOVLW	255		;návrat na teplotu
	MOVWF	KLVD		;
	CLRF	KLVP		;


;********************************
;nadpis [°C] teplota
NT	BCF	LM		;VYP
	MOVLW	0x26		;°
	MOVWF	Znak0
	MOVLW	0x0C		;C
	MOVWF	Znak1
	CALL	TNS		;test neco stisknuto?
;zobrazit teplotu
ZT	BTFSS	PS		;porucha snímače?
	GOTO	$+6
	MOVLW	0x0E
	MOVWF	Znak0
	MOVLW	0x19
	MOVWF	Znak1
	GOTO	$+3

	MOVF	TEP,W		;zobrazit
	CALL	HEXDEC		; teplotu

	CALL	KLVM		;KLV test + Měření
	BTFSC	STATUS,Z	;Z=0? neco stisknuto
	GOTO	ZT		;NE
	BTFSS	TlS		;stisknuto?
	GOTO	NT		;ANO
	BTFSS	TlM		;stisknuto?
	GOTO	NM5		;ANO, na konec

;--------------------------------
;nadpis [M0] Mez0
NM0	BCF	LM		;VYP
	MOVLW	0x15		;M
	MOVWF	Znak0
	MOVLW	0x00		;0
	MOVWF	Znak1
	CALL	TNS		;test neco stisknuto?
;zobrazit M0
ZM0	MOVF	DN,F		;návrat na teplotu
	BTFSC	STATUS,Z	;
	GOTO	INT		;

	MOVF	M0,W		;zobrazit
	CALL	HEXDEC		; mez

	CALL	KLVM		;test KLV + M
	BTFSC	STATUS,Z	;Z=0? neco stisknuto
	GOTO	ZM0		;NE
	BTFSS	TlM		;stisknuto?
	GOTO	NT		;ANO
	BTFSS	TlP		;stisknuto?
	GOTO	NM1		;ANO

	BCF	LM		;VYP
	MOVLW	0x15		;M
	MOVWF	Znak0
	MOVLW	0x00		;0
	MOVWF	Znak1
;pauza pro S
	CLRWDT
	BTFSC	TlS		;stisknuto?
	GOTO	ZM0		;NE
	BTFSS	Znova		;odcasovano?
	GOTO	$-4		;NE
	BCF	Znova		;nulovat
;Vložit dolní Mez0
EM0	BTFSS	BLIK,4
	GOTO	$+6

	MOVLW	0x20		;VYP
	MOVWF	Znak0		; displej
	MOVWF	Znak1		;
	BCF	LM		;
	GOTO	$+3

	MOVF	M0,W		;zobrazit
	CALL	HEXDEC		; mez

	CALL	KLVM
	BTFSC	STATUS,Z	;Z=0? neco stisknuto?
	GOTO	EM0		;NE
	BTFSS	TlS		;stisknuto?
	GOTO	SM0		;ANO
	BTFSS	TlP		;stisknuto?
	GOTO	M0P		;ANO
;Mez0 -1
	MOVF	M0,W
	CALL	MP
	MOVWF	M0
	GOTO	EM0
;Mez0 +1
M0P	MOVF	M0,W
	CALL	MM
	GOTO	$-4
;uložit do EEPROM
SM0	CLRF	EEADRp
	MOVF	M0,W
	CALL	EWrite
	GOTO	NM0

;--------------------------------
;nadpis [M1] Mez1
NM1	BCF	LM		;VYP
	MOVLW	0x15		;M
	MOVWF	Znak0
	MOVLW	0x01		;1
	MOVWF	Znak1
	CALL	TNS		;test neco stisknuto?
;zobrazit M1
ZM1	MOVF	DN,F		;návrat na teplotu
	BTFSC	STATUS,Z	;
	GOTO	INT		;

	MOVF	M1,W
	CALL	HEXDEC

	CALL	KLVM		;test KLV + M
	BTFSC	STATUS,Z	;Z=0? neco stisknuto
	GOTO	ZM1		;NE
	BTFSS	TlM		;stisknuto?
	GOTO	NM0		;ANO
	BTFSS	TlP		;stisknuto?
	GOTO	NM2		;ANO

	BCF	LM		;VYP
	MOVLW	0x15		;M
	MOVWF	Znak0
	MOVLW	0x01		;1
	MOVWF	Znak1
;pauza pro S
	CLRWDT
	BTFSC	TlS		;stisknuto?
	GOTO	ZM1		;NE
	BTFSS	Znova		;odcasovano?
	GOTO	$-4		;NE
	BCF	Znova		;nulovat
;Vložit dolní Mez1
EM1	BTFSS	BLIK,4
	GOTO	$+6

	MOVLW	0x20		;VYP
	MOVWF	Znak0		; displej
	MOVWF	Znak1		;
	BCF	LM		;
	GOTO	$+3

	MOVF	M1,W
	CALL	HEXDEC

	CALL	KLVM
	BTFSC	STATUS,Z	;Z=0? neco stisknuto?
	GOTO	EM1		;NE
	BTFSS	TlS		;stisknuto?
	GOTO	SM1		;ANO
	BTFSS	TlP		;stisknuto?
	GOTO	M1P		;ANO
;Mez1 -1
	MOVF	M1,W
	CALL	MP
	MOVWF	M1
	GOTO	EM1
;Mez1 +1
M1P	MOVF	M1,W
	CALL	MM
	GOTO	$-4
;uložit do EEPROM
SM1	MOVLW	1
	MOVWF	EEADRp
	MOVF	M1,W
	CALL	EWrite
	GOTO	NM1

;--------------------------------
;nadpis [M2] Mez2
NM2	BCF	LM		;VYP
	MOVLW	0x15		;M
	MOVWF	Znak0
	MOVLW	0x02		;2
	MOVWF	Znak1
	CALL	TNS		;test neco stisknuto?
;zobrazit M2
ZM2	MOVF	DN,F		;návrat na teplotu
	BTFSC	STATUS,Z	;
	GOTO	INT		;

	MOVF	M2,W
	CALL	HEXDEC

	CALL	KLVM		;test KLV + M
	BTFSC	STATUS,Z	;Z=0? neco stisknuto
	GOTO	ZM2		;NE
	BTFSS	TlM		;stisknuto?
	GOTO	NM1		;ANO
	BTFSS	TlP		;stisknuto?
	GOTO	NM3		;ANO

	BCF	LM		;VYP
	MOVLW	0x15		;M
	MOVWF	Znak0
	MOVLW	0x02		;2
	MOVWF	Znak1
;pauza pro S
	CLRWDT
	BTFSC	TlS		;stisknuto?
	GOTO	ZM2		;NE
	BTFSS	Znova		;odcasovano?
	GOTO	$-4		;NE
	BCF	Znova		;nulovat
;Vložit dolní Mez2
EM2	BTFSS	BLIK,4
	GOTO	$+6

	MOVLW	0x20		;VYP
	MOVWF	Znak0		; displej
	MOVWF	Znak1		;
	BCF	LM		;
	GOTO	$+3

	MOVF	M2,W
	CALL	HEXDEC

	CALL	KLVM
	BTFSC	STATUS,Z	;Z=0? neco stisknuto?
	GOTO	EM2		;NE
	BTFSS	TlS		;stisknuto?
	GOTO	SM2		;ANO
	BTFSS	TlP		;stisknuto?
	GOTO	M2P		;ANO
;Mez2 -1
	MOVF	M2,W
	CALL	MP
	MOVWF	M2
	GOTO	EM2
;Mez2 +1
M2P	MOVF	M2,W
	CALL	MM
	GOTO	$-4
;uložit do EEPROM
SM2	MOVLW	2
	MOVWF	EEADRp
	MOVF	M2,W
	CALL	EWrite
	GOTO	NM2

;--------------------------------
;nadpis [M3] Mez3
NM3	BCF	LM		;VYP
	MOVLW	0x15		;M
	MOVWF	Znak0
	MOVLW	0x03		;3
	MOVWF	Znak1
	CALL	TNS		;test neco stisknuto?
;zobrazit M3
ZM3	MOVF	DN,F		;návrat na teplotu
	BTFSC	STATUS,Z	;
	GOTO	INT		;

	MOVF	M3,W
	CALL	HEXDEC

	CALL	KLVM		;test KLV + M
	BTFSC	STATUS,Z	;Z=0? neco stisknuto
	GOTO	ZM3		;NE
	BTFSS	TlM		;stisknuto?
	GOTO	NM2		;ANO
	BTFSS	TlP		;stisknuto?
	GOTO	NM4		;ANO

	BCF	LM		;VYP
	MOVLW	0x15		;M
	MOVWF	Znak0
	MOVLW	0x03		;3
	MOVWF	Znak1
;pauza pro S
	CLRWDT
	BTFSC	TlS		;stisknuto?
	GOTO	ZM3		;NE
	BTFSS	Znova		;odcasovano?
	GOTO	$-4		;NE
	BCF	Znova		;nulovat
;Vložit dolní Mez3
EM3	BTFSS	BLIK,4
	GOTO	$+6

	MOVLW	0x20		;VYP
	MOVWF	Znak0		; displej
	MOVWF	Znak1		;
	BCF	LM		;
	GOTO	$+3

	MOVF	M3,W
	CALL	HEXDEC

	CALL	KLVM
	BTFSC	STATUS,Z	;Z=0? neco stisknuto?
	GOTO	EM3		;NE
	BTFSS	TlS		;stisknuto?
	GOTO	SM3		;ANO
	BTFSS	TlP		;stisknuto?
	GOTO	M3P		;ANO
;Mez3 -1
	MOVF	M3,W
	CALL	MP
	MOVWF	M3
	GOTO	EM3
;Mez3 +1
M3P	MOVF	M3,W
	CALL	MM
	GOTO	$-4
;uložit do EEPROM
SM3	MOVLW	3
	MOVWF	EEADRp
	MOVF	M3,W
	CALL	EWrite
	GOTO	NM3

;--------------------------------
;nadpis [M4] Mez4
NM4	BCF	LM		;VYP
	MOVLW	0x15		;M
	MOVWF	Znak0
	MOVLW	0x04		;4
	MOVWF	Znak1
	CALL	TNS		;test neco stisknuto?
;zobrazit M4
ZM4	MOVF	DN,F		;návrat na teplotu
	BTFSC	STATUS,Z	;
	GOTO	INT		;

	MOVF	M4,W
	CALL	HEXDEC

	CALL	KLVM		;test KLV + M
	BTFSC	STATUS,Z	;Z=0? neco stisknuto
	GOTO	ZM4		;NE
	BTFSS	TlM		;stisknuto?
	GOTO	NM3		;ANO
	BTFSS	TlP		;stisknuto?
	GOTO	NM5		;ANO

	BCF	LM		;VYP
	MOVLW	0x15		;M
	MOVWF	Znak0
	MOVLW	0x04		;4
	MOVWF	Znak1
;pauza pro S
	CLRWDT
	BTFSC	TlS		;stisknuto?
	GOTO	ZM4		;NE
	BTFSS	Znova		;odcasovano?
	GOTO	$-4		;NE
	BCF	Znova		;nulovat
;Vložit dolní Mez4
EM4	BTFSS	BLIK,4
	GOTO	$+6

	MOVLW	0x20		;VYP
	MOVWF	Znak0		; displej
	MOVWF	Znak1		;
	BCF	LM		;
	GOTO	$+3

	MOVF	M4,W
	CALL	HEXDEC

	CALL	KLVM
	BTFSC	STATUS,Z	;Z=0? neco stisknuto?
	GOTO	EM4		;NE
	BTFSS	TlS		;stisknuto?
	GOTO	SM4		;ANO
	BTFSS	TlP		;stisknuto?
	GOTO	M4P		;ANO
;Mez4 -1
	MOVF	M4,W
	CALL	MP
	MOVWF	M4
	GOTO	EM4
;Mez4 +1
M4P	MOVF	M4,W
	CALL	MM
	GOTO	$-4
;uložit do EEPROM
SM4	MOVLW	4
	MOVWF	EEADRp
	MOVF	M4,W
	CALL	EWrite
	GOTO	NM4

;--------------------------------
;nadpis [M5] Mez5
NM5	BCF	LM		;VYP
	MOVLW	0x15		;M
	MOVWF	Znak0
	MOVLW	0x05		;5
	MOVWF	Znak1
	CALL	TNS		;test neco stisknuto?
;zobrazit M5
ZM5	MOVF	DN,F		;návrat na teplotu
	BTFSC	STATUS,Z	;
	GOTO	INT		;

	MOVF	M5,W
	CALL	HEXDEC

	CALL	KLVM		;test KLV + M
	BTFSC	STATUS,Z	;Z=0? neco stisknuto
	GOTO	ZM5		;NE
	BTFSS	TlM		;stisknuto?
	GOTO	NM4		;ANO
	BTFSS	TlP		;stisknuto?
	GOTO	NT		;ANO

	BCF	LM		;VYP
	MOVLW	0x15		;M
	MOVWF	Znak0
	MOVLW	0x05		;5
	MOVWF	Znak1
;pauza pro S
	CLRWDT
	BTFSC	TlS		;stisknuto?
	GOTO	ZM5		;NE
	BTFSS	Znova		;odcasovano?
	GOTO	$-4		;NE
	BCF	Znova		;nulovat
;Vložit dolní Mez5
EM5	BTFSS	BLIK,4
	GOTO	$+6

	MOVLW	0x20		;VYP
	MOVWF	Znak0		; displej
	MOVWF	Znak1		;
	BCF	LM		;
	GOTO	$+3

	MOVF	M5,W
	CALL	HEXDEC

	CALL	KLVM
	BTFSC	STATUS,Z	;Z=0? neco stisknuto?
	GOTO	EM5		;NE
	BTFSS	TlS		;stisknuto?
	GOTO	SM5		;ANO
	BTFSS	TlP		;stisknuto?
	GOTO	M5P		;ANO
;Mez5 -1
	MOVF	M5,W
	CALL	MP
	MOVWF	M5
	GOTO	EM5
;Mez5 +1
M5P	MOVF	M5,W
	CALL	MM
	GOTO	$-4
;uložit do EEPROM
SM5	MOVLW	5
	MOVWF	EEADRp
	MOVF	M5,W
	CALL	EWrite
	GOTO	NM5

;================================
;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
TEST
;porovnat znaménka
	MOVF	A1,W
	XORWF	B1,W		;(stejné=0)
	ANDLW	B'10000000'	;(1a1=1)
	RLF	B1,W		;vlevo(SC=MSB)
	BTFSS	STATUS,Z	;stejné znaménka? (SZ=1)
	RETURN			;NE
;A-B				;ANO
	MOVF	B1,W
	SUBWF	A1,W		;A-B; SC=0=záporný výsledek
	BTFSC	STATUS,Z	;nenulové?
	BCF	STATUS,C	;SC=0 (A=B) jako záporné
	RETURN

;EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
;Nastavení výstupů při poruše snímače
ES
;	BCF	RA0		;výstup A0=0
;	BSF	RA0		;výstup A0=1
;	BCF	RA1		;výstup A1=0
;	BSF	RA1		;výstup A1=1
;	BCF	RA2		;výstup A2=0
;	BSF	RA2		;výstup A2=1
;	BCF	RA3		;výstup A3=0
;	BSF	RA3		;výstup A3=1
;	BCF	RA4		;výstup A4=0
;	BSF	RA4		;výstup A4=1
	RETURN

;RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
;Program Regulace
PR
;A0=1 při, teplota < Mez0
;A0=0 při, teplota => Mez0
	MOVF	TEP,W
	MOVWF	B1
	MOVF	M0,W
	MOVWF	A1
	CALL	TEST		;B<A (SC=1)
	BTFSC	STATUS,C
	BSF	RA0		;A0=1
	BTFSS	STATUS,C
	BCF	RA0		;A0=0
;--------------------------------
;A1=1 při, teplota < Mez1
;A1=0 při, teplota => Mez1
	MOVF	TEP,W
	MOVWF	B1
	MOVF	M1,W
	MOVWF	A1
	CALL	TEST		;B<A (SC=1)
	BTFSC	STATUS,C
	BSF	RA1		;A1=1
	BTFSS	STATUS,C
	BCF	RA1		;A1=0
;--------------------------------
;A2=1 při, teplota < Mez2
;A2=0 při, teplota => Mez2
	MOVF	TEP,W
	MOVWF	B1
	MOVF	M2,W
	MOVWF	A1
	CALL	TEST		;B<A (SC=1)
	BTFSC	STATUS,C
	BSF	RA2		;A2=1
	BTFSS	STATUS,C
	BCF	RA2		;A2=0
;--------------------------------
;A3=1 při, teplota < Mez3
;A3=0 při, teplota => Mez3
	MOVF	TEP,W
	MOVWF	B1
	MOVF	M3,W
	MOVWF	A1
	CALL	TEST		;B<A (SC=1)
	BTFSC	STATUS,C
	BSF	RA3		;A3=1
	BTFSS	STATUS,C
	BCF	RA3		;A3=0
;--------------------------------
;A4=1 při, teplota <= Mez4
	MOVF	TEP,W
	MOVWF	A1
	MOVF	M4,W
	MOVWF	B1
	CALL	TEST		;A<=B (SC=0)
	BTFSS	STATUS,C
	BSF	RA4		;A4=1
;A4=0 při, teplota => Mez5
	MOVF	TEP,W
	MOVWF	B1
	MOVF	M5,W
	MOVWF	A1
	CALL	TEST		;B=>A (SC=0)
	BTFSS	STATUS,C
	BCF	RA4		;A4=0
	RETURN
;--------------------------------
  	END
