LIST P=16F877A, R=DEC
	INCLUDE<P16F877A.INC>
ERRORLEVEL -302        




RAM		EQU	0X21
TM1		EQU	RAM+1
TM2		EQU	RAM+2
TMP40	EQU	RAM+3
sekunda	EQU	RAM+4			
TMP_S	EQU	RAM+5			
TMP_PCL	EQU	RAM+6			
RECIVE	EQU	RAM+7
TMP		EQU	RAM+8
TMP0	EQU	RAM+9
TMP1	EQU	RAM+10
TMP2	EQU	RAM+11
REG		EQU	RAM+12
adresa	EQU	RAM+13
dáta	EQU	RAM+14
hodnota	EQU	RAM+15
zal		EQU	RAM+16
RTC		EQU	RAM+17
T0		EQU	RAM+18
T1		EQU	RAM+19
T2		EQU	RAM+20
DSDL1   equ RAM+21                ; komunikace s DS18B20
DSREG1  equ RAM+22    
DSREG2  equ RAM+23   
TEMPL   equ	RAM+24     
TEMPH   equ RAM+25    
TEMPNM  equ RAM+26               ; ???,  °C
TEMPDP  equ RAM+27    		;    ,? °C
jednotky_K		equ RAM+28
desiatky_K		equ RAM+29
stovky_K		equ RAM+30
desatiny_K		equ RAM+31
cid_kol	equ	RAM+32
ADRESA	equ	RAM+33
TMP10	equ	RAM+34
TMP05	equ	RAM+35
day		equ	RAM+36
sec		equ	RAM+37
min		equ	RAM+38
hour	equ	RAM+39
month	equ	RAM+40
year	equ	RAM+41
date	equ	RAM+42






W_TEMP		equ	70h	; zaloha pri preruseni
STATUS_TEMP	equ	71h	; zaloha pri preruseni
PCLATH_TEMP	equ	72h	; TEMP PRERUSENIA




D550US  equ     .200             ; 550us
D90US   equ     .25              ; 90us
D1US    equ     .1               ; 3us



#define DSPIN   PORTE,2		; DS18B20 pin
#DEFINE	E	PORTE,1
#DEFINE	RS	PORTE,0

org	0x2007		; adresa konfigurace PIC16F873,876/PIC16F874,877
 	dw _BODEN_OFF & _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC & _DEBUG_OFF & _CPD_OFF & _LVP_OFF
;------------------------------------------------------------------------
org	0x2100		; adresa EERAM
	de	0x02, 0x04, 0x1E, 0x01, 0x0F, 0x11, 0x0F, 0x00	; znak0 = 40h	á
	de	0x02, 0x04, 0x0C, 0x04, 0x04, 0x04, 0x0E, 0x00	; znak1 = 48h	í
	de	0x07, 0x05, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00	; znak2 = 50h	°
	de	0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00	; znak3 = 58h	-
	de	0x0A, 0x04, 0x0E, 0x10, 0x10, 0x11, 0x0E, 0x00	; znak4 = 60h	č
	de	0x00, 0x00, 0x00, 0x00, 0x04, 0x0A, 0x1F, 0x00	; znak5 = 68h	delta
	de	0x0A, 0x04, 0x0E, 0x11, 0x08, 0x06, 0x11, 0x0E	; znak6 = 70h	š
	de	0x02, 0x04, 0x11, 0x11, 0x0F, 0x01, 0x0E, 0x00	; znak7 = 78h	ý

	ORG	0X00
	GOTO	START


	ORG	0X04	; ulozeni hlavnich registru
	MOVWF 	W_TEMP ;uložení střadače do záložního registru
	SWAPF 	STATUS,W ;načtení obsahu registru STATUS do střadače
	CLRF 	STATUS ;banka 0 nezávisle na aktuální bance
	MOVWF 	STATUS_TEMP ;uložení obsahu registru STATUS do záložního registru
	MOVF 	PCLATH, W ;požadováno jen při použití bank 1,2 a 3
	MOVWF 	PCLATH_TEMP ;uložení PCLATH do W
	CLRF 	PCLATH ;stránka 0, nezávisle na stránce paměti programu
	GOTO	PRERUS

;-------------------------------------------------------------------------
CESTINA 	movlw	0x00		; adresa prvního CZ znaku v EEPROM
			banksel	EEADR
			movwf	EEADR
			banksel	0
			movlw	0x40		; adresa prvního znaku v LCD displeji
			movwf	ADRESA
		;       ------------------------
			movf	ADRESA,W
			call	WRPRI
loopx		call	READ
			CALL	WRDATA
			banksel	EEADR
			incf	EEADR,F
			banksel	0	; banka 0
			incf	ADRESA,F
			movf	ADRESA,W
			sublw	0x80		; adresa posledního znaku v LCD displeji
			btfss	STATUS,Z
			goto	loopx
			return
READ		nop	
			banksel	EECON1;bsf	STATUS,RP0	; banka 1	!!! nastav EEADR !!!
			bsf		EECON1,RD	; EE read
			banksel	EEDATA
			movf	EEDATA,W	; EEDATA -> W
			banksel	0;bcf	STATUS,RP0	; banka 0
			return			; 		!!! data v registru W !!!

INI_LCD	CALL	T15MS			;ČAS 15 MILISEKÚND
	BCF	RS
	MOVLW	B'00000011'
	MOVWF	PORTB	
	BSF	E
	BCF	E
	CALL	T4MS 			;ČAS 4 MILISEKÚND
	BSF	E
	BCF	E
	CALL	T100US 			;ČAS 100 MIKROSEKÚND
	BSF	E
	BCF	E
	CALL	T40US 			;ČAS 100 MIKROSEKÚND
;------------------------------------------------	
	MOVLW	B'00000010'
	MOVWF	PORTB
	BSF	E
	BCF	E
	CALL	T100US 			;ČAS 100 MIKROSEKÚND	
;------------------------------------------------
	MOVLW	B'00101000'
	CALL	WRPRI 			;4.BITOVÁ KOMUNIKÁCIA A DVA RIADKY
	MOVLW	B'00001000'
	CALL	WRPRI 			;DISPLEJ OFF
	MOVLW	B'00001100'
	CALL	WRPRI 			;DISPLEJ ON, KURZOR OFF, BLIKANIE OFF
	MOVLW	B'00000110'
	CALL	WRPRI 			;INKREMENTÁCIA, NOMRÁLNA OPERÁCIA
	RETURN
;************************************************************************** 
; Prevod Hex 8bit na DEC T3,T2,T1 
;************************************************************************** 

HexDec    
	   banksel   TMP0    
	   movwf   TMP0 
	   clrf   TMP1 
	   banksel   T1 
	   CLRF   T1 
	   CLRF   T2 
Rad100 
	   banksel   TMP0    
	   MOVLW   .100 
	   SUBWF   TMP0,W      ;TMP0-100 
	   MOVWF   TMP2      ;TMP2 
	   BTFSC   STATUS,C   ;zaporne? 
	   GOTO   Uloz      ;NE 
	   MOVLW   .1      ; 
	   SUBWF   TMP1,W      ;TMP1-1 
	   BTFSS   STATUS,C   ;kladne? 
	   GOTO   Rad10      ;NE 
	   MOVWF   TMP1      ; 
	   MOVF   TMP2,W       
Uloz    
	   banksel   TMP0    
	   MOVWF   TMP0 
	   banksel   T2    
	   INCF   T2,F      ;+1 
	   GOTO   Rad100 
Rad10 
	   banksel   TMP0    
	   MOVLW   .10 
	   SUBWF   TMP0,W      ;TMP0-10 
	   BTFSS   STATUS,C   ;kladne? 
	   GOTO   End10      ;NE 
	   MOVWF   TMP0 
	   banksel   T1    
	   INCF   T1,F      ;+1 
	   GOTO   Rad10 
End10 
	   banksel   TMP0    
	   MOVF   TMP0,W 
	   banksel   T0    
	   MOVWF   T0      ;T0,1,2=vysledna hodnota 
	   banksel   0
	   return
  



WRDATA	BSF	RS 			;NASTAVENIE BITU RS PRE ZÁPIS DAT
	GOTO	$+2
WRPRI	BCF	RS 			;NASTAVENIE BITU RS A RW PRE ZÁPIS PRÍKAZU
	MOVWF	TMP 			;ČÍSLO PRÍKAZU ALEBO DATA DO REGISTRU TMP
	SWAPF	TMP,W 			;HORNÉ 4 BITY DO REGISTRU W
	BSF	E
	MOVWF	PORTB 			;ZÁPIS 4 HORNÝCH BITOV DO DISPLEJA
	BCF	E
	MOVFW	TMP 			;OBSAH REGISTRU TMP DO REGISTRU W
	BSF	E
	MOVWF	PORTB 			;ZÁPIS DOLNÝCH 4 BITOV DO DISPLEJA
	BCF	E
	CALL	T4MS			;ČAKAJ 100 MIKROSEKÚND
	RETURN
;-------------------------------------------------------------------------
;---------------------------------------------------------------------------
;	CASOVE SLUCKY
;---------------------------------------------------------------------------
T15MS	MOVLW	49 			;DOBA 15 MILISEKÚND
	GOTO	$+2
T4MS	MOVLW	14 			;DOBA 4 MILISEKÚND
	MOVWF	TM1
	MOVLW	255
	MOVWF	TM2
	DECFSZ	TM2,F
	GOTO	$-1
	DECFSZ	TM1,F
	GOTO	$-5
	RETURN
;----------------------------------------------------------------------------
T100US	MOVLW	83 			;DOBA 100 MIKROSEKÚND
	MOVWF	TM1
	DECFSZ	TM1,F
	GOTO	$-1
	RETURN
;----------------------------------------------------------------------------
T40US	MOVLW	40
	MOVWF	TMP40
	DECFSZ	TMP40,F
	GOTO	$-1
	RETURN
;**************************************************************************
;podpogramy pro I2C
;**************************************************************************
Start_I2C
;	return
	banksel		PIR1			; 
	bcf			PIR1,SSPIF		; vynulovat priznak operace
	banksel		SSPCON2
	bsf			SSPCON2,SEN		; send i2c START [S] bit
	banksel		PIR1			; dokonceno ?
	btfss		PIR1,SSPIF		; vcetne vseho?
	goto		$-1				; NE, tak pockat a testovat a cekat	goto $-1
	banksel		0
	return						; navrat
;***********
Start2_I2C	
;	return
	banksel		PIR1			; 
	bcf			PIR1,SSPIF		; vynulovat priznak operace
	banksel		SSPCON2			;
	bsf			SSPCON2,RSEN	; opakovany START,	
	banksel		PIR1			; dokonceno ?
	btfss		PIR1,SSPIF		; vcetne vseho?
	goto		$-1				; NE, tak pockat a testovat a cekat
	banksel		0
	return
;***********
Write_I2C
;	return
	banksel		SSPCON
	bcf			SSPCON,WCOL 
	banksel		PIR1			; START odeslan, jinak bych sem nedosel
	bcf			PIR1,SSPIF		; vynulovat priznak operace
	banksel		SSPBUF			;
	movwf		SSPBUF			; registru odesilani
	banksel		PIR1			; dokonceno ?
	btfss		PIR1,SSPIF		; vcetne ACK od cidla?
	goto		$-1				; NE, tak pockat a testovat a cekat
	banksel		0
	return
;***********
Read_I2C_Ack
;	return
	banksel		SSPCON
	bcf			SSPCON,SSPOV	; vynulovat neprectena data,stejne jsou v pr....
	banksel		PIR1			; Data odeslana, jinak bych sem nedosel
	bcf			PIR1,SSPIF		; vynulovat priznak operace
	banksel		SSPCON2 		;
	bsf			SSPCON2,RCEN	; zapnout prijem
	banksel		PIR1			;
	btfss		PIR1,SSPIF		; precteno?
	goto		$-1				; NE, tak pockat a testovat a cekat
	bcf			PIR1,SSPIF		; vynulovat priznak operace
	banksel		SSPBUF			;
	movfw		SSPBUF			; precist  bufer
	banksel		PIR1			; Data prectena, jinak bych sem nedosel
	bcf			PIR1,SSPIF		; vynulovat priznak operace
	banksel		SSPCON2         
	bcf			SSPCON2,ACKDT   ; vyslat AKC
	bsf			SSPCON2,ACKEN   ; nastavit odeslani ACK
	banksel		PIR1			; dokonceno ?
	btfss		PIR1,SSPIF		; vcetne ACK do cidla?
	goto		$-1				; NE, tak pockat a testovat a cekat
	banksel		0
	return				
;***********
Read_I2C_NoAck
;	return
	banksel		SSPCON
	bcf			SSPCON,SSPOV	; vynulovat neprectena data,stejne jsou v pr....
	banksel		PIR1			; Data odeslana, jinak bych sem nedosel
	bcf			PIR1,SSPIF		; vynulovat priznak operace
	banksel		SSPCON2 		;
	bsf			SSPCON2,RCEN	; zapnout prijem
	banksel		PIR1			; 
	btfss		PIR1,SSPIF		; precteno?
	goto		$-1				; NE, tak pockat a testovat a cekat
	bcf			PIR1,SSPIF		; vynulovat priznak operace
	banksel		SSPBUF			;
	movfw		SSPBUF			; precist  bufer
	banksel		PIR1			; Data prectena, jinak bych sem nedosel
	bcf			PIR1,SSPIF		; vynulovat priznak operace
	banksel		SSPCON2         
	bsf			SSPCON2,ACKDT   ; nevyslat AKC
	bsf			SSPCON2,ACKEN   ; nastavit neodeslani ACK
	banksel		PIR1			; dokonceno ?
	btfss		PIR1,SSPIF		; vcetne neACK do cidla?
	goto		$-1				; NE, tak pockat a testovat a cekat
	banksel		0
	return				
;***********
Stop_I2C
;	return
	banksel		PIR1			; Data odeslana, jinak bych sem nedosel
	bcf			PIR1,SSPIF		; vynulovat priznak operace
	banksel		SSPCON2
	bsf			SSPCON2,PEN		; odeslat STOP
	banksel		PIR1      
	btfss		PIR1,SSPIF      ; odeslan
	goto		$-1				; ne
	banksel		0
	return						; navrat

;***********
;I2C_prijmi_ack
	BANKSEL	SSPCON2	
	BTFSC	SSPCON2,ACKSTAT		; zkontroluj zda bylo přijato potvrzení ACK
	goto	$+2
	goto	$+3
	BCF		STATUS,RP0
	BSF		PORTD,7				; pokud ne, tak nastav bit PORTD,7,0
	BCF		STATUS,RP0		; banka 0
	RETURN



bin_dec	NOP		;prevod z binárnej hodnoty na dekadickú
		CLRW
		BANKSEL	RTC
		BTFSC	RTC,0
		ADDLW	1
		BTFSC	RTC,1
		ADDLW	2
		BTFSC	RTC,2
		ADDLW	4
		BTFSC	RTC,3
		ADDLW	8
		BTFSC	RTC,4
		ADDLW	10
		BTFSC	RTC,5
		ADDLW	20
		BTFSC	RTC,6
		ADDLW	40
		BTFSC	RTC,7
		ADDLW	80	;vo W je výsledok
		return	




START	BSF	STATUS,RP0		; NASTAVENIE BANKY 1
	MOVLW	B'000000'		
	MOVWF	TRISA
	MOVLW	B'00000000'		 
	MOVWF	TRISB
	MOVLW	B'00000000'		 
	MOVWF	TRISC
	MOVLW	B'00000000'		 
	MOVWF	TRISD
	MOVLW	B'100'		 
	MOVWF	TRISE
	MOVLW	B'10000101'		; PULL-UPY OFF, PREDDELIČ=1:32 PRIPOJENÝ K TMR0
	MOVWF	OPTION_REG		; F:4  :32  :256 = 122,1HZ (8,192MS)
	movlw	b'00000111'	; A/D vstupy OFF
	movwf	CMCON

	BCF	STATUS,RP0		; NASTAVENIE BANKY 0
;       ------------------------
	MOVLW	B'00000000'		 
	MOVWF	INTCON
	BSF 	STATUS,RP0
	MOVLW 	B'00000110'
	MOVWF 	ADCON1			;A/D PREVODNÍK BOL ODPOJENÝ OD PORTU A
	BCF 	STATUS,RP0

	BSF		STATUS,RP0
	BCF		STATUS,RP1		; výběr banky 1
	MOVLW		b'00011000'		; SDA a SCL musi být nastaveny jako vstupy
	MOVWF		TRISC
	BCF		STATUS,RP0

	MOVLW		b'00101000'		; nastavení registru SSPCON
	MOVWF		SSPCON
	BSF		STATUS,RP0		; banka 1
	MOVLW		b'10000000'		; nastavení registru SSPSTAT
	MOVWF		SSPSTAT
	MOVLW		10				; (Fosc / (4 * přenosová rychlost)) - 1
	MOVWF		SSPADD
	BCF		STATUS,RP0		; banka 0

	call	INI_LCD
	call	CESTINA
	MOVLW	0X01	;reset displeja
	CALL	WRPRI
	clrf	dáta
	clrf	sekunda
	CLRF	TMR0
	MOVLW	B'10100000'	;POKIAĽ TU ZAKÁŽEM PRERUŠENIE,JE VŠETKO O.K.	 
	MOVWF	INTCON
	call	resrtc	;kontrola a príp.reset RTC
;-----------------------------------------------------------------
loop	movfw	day
	movwf	RTC
	call	bin_dec	;prevod z bin na dec hodn.do reg.RTC
	call	HexDec	;prevod na j.d.s.
	MOVLW	.128	;pozícia znaku
	CALL	WRPRI


	BANKSEL	T0
	movf	T0, W
	sublw	.1			; W = CONST-A
	btfss	STATUS, Z		; Check if zero
	goto	$+2
	goto	zob_Po
	movf	T0, W
	sublw	.2			; W = CONST-A
	btfss	STATUS, Z		; Check if zero
	goto	$+2
	goto	zob_Ut
	movf	T0, W
	sublw	.3			; W = CONST-A
	btfss	STATUS, Z		; Check if zero
	goto	$+2
	goto	zob_St
	movf	T0, W
	sublw	.4			; W = CONST-A
	btfss	STATUS, Z		; Check if zero
	goto	$+2
	goto	zob_Stv
	movf	T0, W
	sublw	.5			; W = CONST-A
	btfss	STATUS, Z		; Check if zero
	goto	$+2
	goto	zob_Pi
	movf	T0, W
	sublw	.6			; W = CONST-A
	btfss	STATUS, Z		; Check if zero
	goto	$+2
	goto	zob_So
	movf	T0, W
	sublw	.0			; W = CONST-A
	btfss	STATUS, Z		; Check if zero
	goto	zob_Ne
	goto	nex	;vyčítalo blbosť



zob_Po		MOVLW	'P'
			CALL	WRDATA
			MOVLW	'o'
			CALL	WRDATA
			goto	nex
zob_Ut		MOVLW	'U'
			CALL	WRDATA
			MOVLW	't'
			CALL	WRDATA
			goto	nex
zob_St		MOVLW	'S'
			CALL	WRDATA
			MOVLW	't'
			CALL	WRDATA
			goto	nex
zob_Stv		MOVLW	0x06;š
			CALL	WRDATA
			MOVLW	't'
			CALL	WRDATA
			goto	nex
zob_Pi		MOVLW	'P'
			CALL	WRDATA
			MOVLW	'i'
			CALL	WRDATA
			goto	nex
zob_So		MOVLW	'S'
			CALL	WRDATA
			MOVLW	'o'
			CALL	WRDATA
			goto	nex
zob_Ne		MOVLW	'N'
			CALL	WRDATA
			MOVLW	'e'
			CALL	WRDATA
			goto	nex


nex	MOVLW	0X83	;pozícia znaku
		CALL	WRPRI
		MOVFW	date
		MOVWF	RTC
		
		call	bin_dec	;prevod z bin na dec
		call	HexDec	;prevod na j.d.s.
		movlw	'0'		
		iorwf	T1, w		
		call	WRDATA	;zápis diatok.
		movlw	'0'		
		iorwf	T0, w		
		call	WRDATA	;zápis jednotiek.
		MOVLW	'.'
		CALL	WRDATA	;bodka



		MOVLW	0X86	;pozícia znaku
		CALL	WRPRI;29
		MOVFW	month
		MOVWF	RTC
		call	bin_dec	;prevod z bin na dec
		call	HexDec	;prevod na j.d.s.
		movlw	'0'		
		iorwf	T1, w		
		call	WRDATA	;zápis desiatok.
		movlw	'0'		
		iorwf	T0, w		
		call	WRDATA	;zápis jednotiek.
		MOVLW	'.'
		CALL	WRDATA	;bodka


		MOVLW	'2'
		CALL	WRDATA
		MOVLW	'0'		;90
		CALL	WRDATA

		MOVFW	year
		MOVWF	RTC
		call	bin_dec	;prevod z bin na dec
		call	HexDec	;prevod na j.d.s.
		movlw	'0'		
		iorwf	T1, w		
		call	WRDATA	;zápis desiatok.
		movlw	'0'		
		iorwf	T0, w		
		call	WRDATA	;zápis jednotiek.
		nop

		



				


    MOVFW	hour
	MOVWF	RTC
	call	bin_dec	;prevod z bin na dec
	call	HexDec	;prevod na j.d.s.
	MOVLW	.192	;pozícia znaku
	CALL	WRPRI;29
	movlw	'0'		
	iorwf	T1, w		
	call	WRDATA	;zápis des.hod.
	movlw	'0'		
	iorwf	T0, w		
	call	WRDATA	;zápis jed.hod.
	MOVLW	':'
	CALL	WRDATA	;dvojbodka

	MOVFW	min
	MOVWF	RTC
	call	bin_dec	;prevod z bin na dec
	call	HexDec	;prevod na j.d.s.
	movlw	'0'		
	iorwf	T1, w		
	call	WRDATA	;zápis des.min.
	movlw	'0'		
	iorwf	T0, w		
	call	WRDATA	;zápis jed.min.
	MOVLW	':'
	CALL	WRDATA	;dvojbodka

	MOVFW	sec
	MOVWF	RTC
	call	bin_dec	;prevod z bin na dec
	call	HexDec	;prevod na j.d.s.
	movlw	'0'		
	iorwf	T1, w		
	call	WRDATA	;zápis des.sek.
	movlw	'0'		
	iorwf	T0, w		
	call	WRDATA	;zápis jed.sek.
	;goto	loop


			movlw	.200	;comparé zisť či je kl. al.záp
			subwf	cid_kol, W		; W = A-CONST
			btfss	STATUS, C		; 
			goto	kladne
			
			movlw	.210	;comparé
			subwf	cid_kol, W		; W = A-CONST
			btfss	STATUS, C		; 
			goto	zap_99			;menej ako 210
			goto	zap_999			;viac  ako 210


kladne		movlw	.100	;comparé
			subwf	cid_kol, W		; W = A-CONST
			btfss	STATUS, C		; 
			goto	cmp				;menej ako 100
			goto	kl_1999			;vicako 100

cmp			movlw	.10		;comparé
			subwf	cid_kol, W		; W = A-CONST
			btfss	STATUS, C		; 
			goto	kl_99
			goto	kl_999

			

zap_99		movlw	.201
			CALL	WRPRI
			movlw	' ' 
			CALL	WRDATA
			movlw	'-' 
			CALL	WRDATA
			movlw	'0'		; 30h = '0011 0000'
			iorwf	jednotky_K, w		; BCD -> ASCII
			CALL	WRDATA
			movlw	',' 
			CALL	WRDATA
			movlw	'0'		; 30h = '0011 0000'
			iorwf	desatiny_K, w		; BCD -> ASCII
			CALL	WRDATA
			goto	next

zap_999		movlw	.201
			CALL	WRPRI
			movlw	'-' 
			CALL	WRDATA
			movlw	'0'		; 30h = '0011 0000'
			iorwf	desiatky_K, w		; BCD -> ASCII
			CALL	WRDATA
			movlw	'0'		; 30h = '0011 0000'
			iorwf	jednotky_K, w		; BCD -> ASCII
			CALL	WRDATA
			movlw	',' 
			CALL	WRDATA
			movlw	'0'		; 30h = '0011 0000'
			iorwf	desatiny_K, w		; BCD -> ASCII
			CALL	WRDATA
			goto	next

kl_99		movlw	.201
			CALL	WRPRI
			movlw	' ' 
			CALL	WRDATA
			movlw	' ' 
			CALL	WRDATA
			movlw	'0'		; 30h = '0011 0000'
			iorwf	jednotky_K, w		; BCD -> ASCII
			CALL	WRDATA
			movlw	',' 
			CALL	WRDATA
			movlw	'0'		; 30h = '0011 0000'
			iorwf	desatiny_K, w		; BCD -> ASCII
			CALL	WRDATA
			goto	next


kl_999		movlw	.201
			CALL	WRPRI
			movlw	' ' 
			CALL	WRDATA
			movlw	'0'		; 30h = '0011 0000'
			iorwf	desiatky_K, w		; BCD -> ASCII
			CALL	WRDATA
			movlw	'0'		; 30h = '0011 0000'
			iorwf	jednotky_K, w		; BCD -> ASCII
			CALL	WRDATA
			movlw	',' 
			CALL	WRDATA
			movlw	'0'		; 30h = '0011 0000'
			iorwf	desatiny_K, w		; BCD -> ASCII
			CALL	WRDATA
			goto	next

kl_1999		movlw	.201
			CALL	WRPRI
			movlw	'0'		; 30h = '0011 0000'
			iorwf	stovky_K, w		; BCD -> ASCII
			CALL	WRDATA
			movlw	'0'		; 30h = '0011 0000'
			iorwf	desiatky_K, w		; BCD -> ASCII
			CALL	WRDATA
			movlw	'0'		; 30h = '0011 0000'
			iorwf	jednotky_K, w		; BCD -> ASCII
			CALL	WRDATA
			movlw	',' 
			CALL	WRDATA
			movlw	'0'		; 30h = '0011 0000'
			iorwf	desatiny_K, w		; BCD -> ASCII
			CALL	WRDATA
			goto	next

next		movlw	.206
			CALL	WRPRI
			movlw	0x02			
			CALL	WRDATA
			movlw	'C'				
			CALL	WRDATA
			CALL	read_RTC
			goto	loop


dec_bin		NOP
	CLRF	dáta	;vstupná hodnota
	MOVWF	zal
	MOVWF	TMP0

	MOVLW   .80 
	SUBWF   TMP0,F       
	BTFSS   STATUS,C   
	GOTO    $+5
	BSF		dáta,7  
	movfw	TMP0
	movwf	zal
	GOTO    $+3
	movfw	zal
	movwf	TMP0

	MOVLW   .40 
	SUBWF   TMP0,F       
	BTFSS   STATUS,C   
	GOTO    $+5
	BSF		dáta,6  
	movfw	TMP0
	movwf	zal
	GOTO    $+3
	movfw	zal
	movwf	TMP0

	MOVLW   .20 
	SUBWF   TMP0,F       
	BTFSS   STATUS,C   
	GOTO    $+5
	BSF		dáta,5  
	movfw	TMP0
	movwf	zal
	GOTO    $+3
	movfw	zal
	movwf	TMP0

	MOVLW   .10 
	SUBWF   TMP0,F       
	BTFSS   STATUS,C   
	GOTO    $+5
	BSF		dáta,4  
	movfw	TMP0
	movwf	zal
	GOTO    $+3
	movfw	zal
	movwf	TMP0
 
	MOVLW   .8 
	SUBWF   TMP0,F       
	BTFSS   STATUS,C   
	GOTO    $+5
	BSF		dáta,3  
	movfw	TMP0
	movwf	zal
	GOTO    $+3
	movfw	zal
	movwf	TMP0

	MOVLW   .4 
	SUBWF   TMP0,F       
	BTFSS   STATUS,C   
	GOTO    $+5
	BSF		dáta,2  
	movfw	TMP0
	movwf	zal
	GOTO    $+3
	movfw	zal
	movwf	TMP0

	MOVLW   .2 
	SUBWF   TMP0,F       
	BTFSS   STATUS,C   
	GOTO    $+5
	BSF		dáta,1  
	movfw	TMP0
	movwf	zal
	GOTO    $+3
	movfw	zal
	movwf	TMP0

	MOVLW   .1 
	SUBWF   TMP0,F       
	BTFSS   STATUS,C   
	GOTO    $+5
	BSF		dáta,0  
	movfw	TMP0
	movwf	zal
	GOTO    $+3
	movfw	zal
	movwf	TMP0
	return



I2C_write		nop
	
	BCF			INTCON,GIE
	call		Start_I2C
	movlw		b'11010000'	;adresa device DS1307
	call		Write_I2C	;zápis adresy dev.
	movfw		adresa	;adresa v DS1307
	call		Write_I2C	;zápis adr.do DS1307
	movfw		dáta	;dáta pre eeprom
	call		Write_I2C	;zápis dát do DS1307
	call		Stop_I2C	;koniec zápisu
 	BSF			INTCON,GIE
	return

	call		T15MS

	
I2C_read		nop
	BSF		INTCON,GIE
	call		Start_I2C
	movlw		b'11010000'	;adresa device DS1307
	call		Write_I2C	;zápis adresy dev.
	movfw		adresa	;adresa v eeprom 24c16
	call		Write_I2C	;zápis adr.do eeprom
	call		Start2_I2C	;druhý start
	movlw		b'11010001'	;čítanie z eeprom
	call		Write_I2C	;zápis do eeprom
	call		Read_I2C_NoAck
	banksel		RTC
	movwf		RTC
	call		Stop_I2C	;koniec čítania z eeprom 24C16
	BSF			INTCON,GIE
	return
;----------------------------------------------------------------------------
resrtc	call	read_sec
		btfss   RTC,7   ;pokud je b7 v 1,je nutny restart,nebezi oscilator
        return
		movlw	00h
		movwf	dáta
		call	write_sec
		movlw	.00
		call	dec_bin
		call	write_min

		movlw	.11
		call	dec_bin
		call	write_hour

		movlw	.0
		call	dec_bin
		call	write_day

		movlw	.21
		call	dec_bin
		call	write_date

		movlw	.3
		call	dec_bin
		call	write_month

		movlw	.10
		call	dec_bin
		call	write_year

		movlw	00h
		movwf	dáta
		call	write_control
		return
		

read_RTC	nop
			call		Start_I2C
			movlw		b'11010000'	;adresa device DS1307
			call		Write_I2C	;zápis adresy dev.
			movlw		0			;adresa v DS1307
			call		Write_I2C	;zápis adr.DS1307
			call		Start2_I2C	;druhý start
			movlw		b'11010001'	;čítanie z DS1307
			call		Write_I2C	;zápis do DS1307
			call		Read_I2C_Ack
			banksel		sec
			movwf		sec
			call		Read_I2C_Ack
			banksel		min
			movwf		min
			call		Read_I2C_Ack
			banksel		hour
			movwf		hour
			call		Read_I2C_Ack
			banksel		day
			movwf		day
			call		Read_I2C_Ack
			banksel		date
			movwf		date
			call		Read_I2C_Ack
			banksel		month
			movwf		month
			call		Read_I2C_NoAck
			banksel		year
			movwf		year
			call		Stop_I2C
			return






;----------------------------------------------------------------------------
read_sec	movlw	00h
			movwf	adresa
			call	I2C_read
			movwf	sec
			return
read_min	movlw	01h
			movwf	adresa
			call	I2C_read
			movwf	min
			return
read_hour	movlw	02h
			movwf	adresa
			call	I2C_read
			movwf	hour
			return
read_day	movlw	03h
			movwf	adresa
			call	I2C_read
			movwf	day
			return
read_date	movlw	04h
			movwf	adresa
			call	I2C_read
			movwf	date
			return
read_month	movlw	05h
			movwf	adresa
			call	I2C_read
			movwf	month
			return
read_year	movlw	06h
			movwf	adresa
			call	I2C_read
			movwf	year
			return
;----------------------------------------------------------------------------

write_sec	movlw	00h	;v reg.dáta musia byť uložené dáta
			movwf	adresa
			call	I2C_write
			return
write_min	movlw	01h
			movwf	adresa
			call	I2C_write
			return
write_hour	movlw	02h
			movwf	adresa
			call	I2C_write
			return
write_day	movlw	03h
			movwf	adresa
			call	I2C_write
			return
write_date	movlw	04h
			movwf	adresa
			call	I2C_write
			return
write_month	movlw	05h
			movwf	adresa
			call	I2C_write
			return
write_year	movlw	06h
			movwf	adresa
			call	I2C_write
			return
write_control	movlw	07h
			movwf	adresa
			call	I2C_write
			return
;----------------------------------------------------------------------------


; ========================================================================
; DS18B20 rutiny
;
DSSTART CALL    DSPINL          ; start prevodu teploty
        MOVLW   D550US          ; reset pulse
        CALL    DSDEL
        CALL    DSPINH
        MOVLW   D90US
        CALL    DSDEL
        BTFSC   DSPIN
        RETURN                  ; bez odpovedi - konec
        MOVLW   D550US
        CALL    DSDEL
        MOVLW   0xCC
        CALL    DSSEND
        MOVLW   0x44
        CALL    DSSEND
        RETURN
        
;---------------------

DSREAD  CLRF    TEMPL           ; vycteni teploty z cidla
        CLRF    TEMPH
        CALL    DSPINL
        MOVLW   D550US          ; reset pulse
        CALL    DSDEL
        CALL    DSPINH
        MOVLW   D90US
        CALL    DSDEL
        BTFSC   DSPIN
        RETURN                  ; bez odpovedi - konec
        MOVLW   D550US
        CALL    DSDEL
        MOVLW   0xCC
        CALL    DSSEND
        MOVLW   0xBE
        CALL    DSSEND
        CALL    DSREC
        MOVWF   TEMPL
        CALL    DSREC
        MOVWF   TEMPH
        RETURN
        
;---------------------
        
DSPINL  BSF     STATUS,RP0      ; pin DSPIN do L
        BCF     DSPIN
        BCF     STATUS,RP0
        BCF     DSPIN
        RETURN

;---------------------
        
DSPINH  BSF     STATUS,RP0      ; pin DSPIN do H (pull-up)
        BSF     DSPIN
        BCF     STATUS,RP0
        RETURN
        
;---------------------
        
DSDEL   MOVWF   DSDL1		; prodleva pro komunikaci
        DECFSZ  DSDL1,1
        GOTO    $-1
        RETURN

;---------------------

DSSEND  MOVWF   DSREG1          ; odeslani jednoho bytu z W do DS18B20
        MOVLW   8
        MOVWF   DSREG2
DSSND1  CALL    DSPINL
        BTFSC   DSREG1,0
        CALL    DSPINH
        MOVLW   D90US
        CALL    DSDEL
        CALL    DSPINH
        RRF     DSREG1,1
        DECFSZ  DSREG2,1
        GOTO    DSSND1
        MOVLW   D90US
        CALL    DSDEL
        RETURN
        
;---------------------
        
DSREC   CLRF    DSREG1          ; vycteni jednoho bytu z DS18B20 do W
        MOVLW   8
        MOVWF   DSREG2
DSREC1  RRF     DSREG1,1
        CALL    DSPINL
        CALL    DSPINH
        MOVLW   D1US
        CALL    DSDEL
        BCF     DSREG1,7
        BTFSC   DSPIN
        BSF     DSREG1,7
        MOVLW   D90US
        CALL    DSDEL
        DECFSZ  DSREG2,1
        GOTO    DSREC1
        MOVLW   D90US
        CALL    DSDEL
        MOVF    DSREG1,0
        RETURN

TMPCNV  CLRF    TEMPNM
        CLRF    TEMPDP
        BTFSS   TEMPH,7	;kontrola - hodnôt
        GOTO    $+5
        COMF    TEMPH,1
        COMF    TEMPL,1
        MOVLW   200
        MOVWF   TEMPNM
        
        MOVF    TEMPDP,0
	    BTFSC   TEMPL,0
        ADDLW   7
        BTFSC   TEMPL,1
        ADDLW   13
        BTFSC   TEMPL,2
        ADDLW   26
        BTFSC   TEMPL,3
        ADDLW   53
        MOVWF   TEMPDP
        
        MOVF    TEMPNM,0
        BTFSC   TEMPL,4
        ADDLW   1
        BTFSC   TEMPL,5
        ADDLW   2
        BTFSC   TEMPL,6
        ADDLW   4
        BTFSC   TEMPL,7
        ADDLW   8

        BTFSC   TEMPH,0
        ADDLW   16
        BTFSC   TEMPH,1
        ADDLW   32
        BTFSC   TEMPH,2
        ADDLW   64
        MOVWF   TEMPNM
      
        RETURN



        
; ========================================================================
PRERUS		BTFSC	INTCON,2
			GOTO	PRER0ČET		; od TMR0
			GOTO	PRERKON		; nezname = nic
PRER0ČET	BCF		INTCON,2	; smazat priznak
			INCF	sekunda
			;CALL	read_RTC

			MOVF	sekunda,W
			SUBLW	.75
			BTFSC	STATUS,Z
			GOTO	SEKUNDA
			GOTO 	PRERKON
			


SEKUNDA	CLRF	sekunda
		CALL    DSREAD          ; vyčtení teploty z cidla
        CALL    TMPCNV          ; prevod binarni teploty na hodnotu
		MOVFW	TEMPNM
		BANKSEL	cid_kol
		MOVWF	cid_kol
		CALL	HexDec
		BANKSEL	T0
		MOVFW	T0
		BANKSEL	jednotky_K
		MOVWF	jednotky_K
		BANKSEL	T1
		MOVFW	T1
		BANKSEL	desiatky_K
		MOVWF	desiatky_K
		BANKSEL	T2
		MOVFW	T2
		BANKSEL	stovky_K
		MOVWF	stovky_K
		BANKSEL	TEMPDP
		MOVFW	TEMPDP
		CALL	HexDec
		BANKSEL	T1
		MOVFW	T1
		BANKSEL	desatiny_K
		MOVWF	desatiny_K
		CALL	DSSTART
		GOTO 	PRERKON
	


PRERKON	NOP
		MOVLW	.75
		MOVWF	TMR0
		MOVF 	PCLATH_TEMP, W  ;obnova PCLATH
		MOVWF 	PCLATH 			;načtení střadače do PCLATH
		SWAPF 	STATUS_TEMP, W  ;přepnutí STATUS_TEMP (obnova nastavení Banky)
		MOVWF 	STATUS 			;načtení záložního registru s původním STATUS
		SWAPF 	W_TEMP, F 		;přemístění horních a dolních 4 bitů v registru W_TEMP
		SWAPF 	W_TEMP, W 		;obnova (POP) pracovního registru W
		BCF		INTCON,2		;smazat priznak
		retfie


















end