;****************************************************************************************
;*                     Teploměr s DS 18B20 a PIC 16F630 ,zobrazovací modul 4DM8010      *
;****************************************************************************************
;                                  --------\/--------
;                     	    +5V  -|Vdd            Vss|-  0V                           	       
;*		      interní  / -|osc1/RA5       RA0|-  
;*                    oscilat. \ -|osc2/RA4       RA1|-  vstup z čidla DS18b20                      
;*         Připojen přes R na +	 -|MCLR/RA3       RA2|-  desetinná tečka displeje                   
;*                  JEDNOTKY 	 -|RC5	          RC0|-  D seriový výstup dat  
;	            DESITKY      -|RC4	          RC1|-  CLK Clock pro data 
;	 	    STOVKY	 -|RC3	          RC2|-  TISICE 
;                 		   ------------------                         
;*                                              			  
;**************************************************************************  

	LIST	P=16F630, R=DEC
	INCLUDE <P16F630.INC>
;*********************    definice proměnných   *************************

#define	D			PORTC,0		;seriový výstup DAT		
#define	CLK			PORTC,1		;CLOCK hodiny pro data
#define	DIG_T		PORTC,2		;číslice tisíců
#define	DIG_S		PORTC,3		;číslice stovek
#define	DIG_D		PORTC,4		;číslice desítek
#define	DIG_J		PORTC,5		;číslice jednotek
#define P_Z_T		PRIZNAKY,0	;příznak pro zobrazení záporné teploty
#define	DS		PORTA,1		;čidlo DS 18b20
#define	TECKA		PORTA,2		;desetinná tečka




RAM		equ	20h
DTISIC		equ	RAM	;zobrazená hodnota DTISIC na displej
TISICE		equ	RAM+1	;zobrazená hodnota TISICE na displej
STOVKY		equ	RAM+2	;zobrazená hodnota STOVKY na displej
DESITKY		equ	RAM+3	;zobrazená hodnota DESITKY na displej
JEDNOTKY	equ	RAM+4	;zobrazená hodnota JEDNOTKY na displej
POCET_B		equ	RAM+5	;počet přenášených bitu
TMP_S		equ	RAM+8	;uložení STATUS registru při přerusení
TMP_W		equ	RAM+9	;uložení W registru při přerušení
ROTACE		equ	RAM+11	;registr pro rotaci bitu do pos. registru
CISLICE		equ	RAM+12	;registr pro výběr číslice
ADR_ZNAKU	equ	RAM+13	;registr provyzvednutí znaku z tabulky znaků
LS_Byte		equ	RAM+14	;nižší byte teploty
MS_Byte		equ	RAM+15	;vyšší byte teploty 
ROTACE1		equ	RAM+16	;registr pro rotaci čtyř bitů
R1			equ	RAM+17	;pomocný registr pro přepočet teploty
R2			equ	RAM+18	;pomocný registr pro přepočet teploty
TDN			equ	RAM+19	;Desetiny teploty
TJ			equ	RAM+20	;Jednotky teploty
TDE			equ	RAM+21	;Desítky teploty
TS			equ	RAM+22	;Stovky teploty
PRIZNAKY	equ	RAM+23	;registr pro různé příznaky
R3			equ	RAM+24	;pomocný registr pro přepočet teploty
TMP0		EQU	RAM+25	; pomocny registr
TMP1		EQU	RAM+26	; pomocny registr
TMP2		EQU	RAM+27	; pomocny registr
TMP3		EQU	RAM+28	; pomocny registr
TMP4		EQU	RAM+29	; pomocny registr
SM_AD1		EQU	RAM+30	; ADRESA, KTEROU POUZIVA BRZDA - CASOVA SMYCKA 
SM_AD2		EQU	RAM+31	; ADRESA, KTEROU POUZIVA BRZDA - CASOVA SMYCKA
SM_AD3		EQU	RAM+32	; ADRESA, KTEROU POUZIVA BRZDA - CASOVA SMYCKA
TMP5		EQU	RAM+33	; pomocny registr
;--------------------------------------------------------------------------

	org	0x2007		; adresa konfigurace PIC16F630 a 675
;	dw _BODEN_OFF & _CP_OFF & _PWRTE_OFF & _WDT_ON & _MCLRE_ON & _CPD_OFF & _XT_OSC
		__CONFIG 0x3FA1
;************************     Reset procesoru     *************************
	
	org	0x0000			; zacatek programu

	goto	INIT		; skok na počáteční inicalizaci

	org	0x0004			; vektor přerušení
	goto	PRERUS	

;************************ Inicializace procesoru  *************************


INIT			movlw	b'000000'	; prednastavit 0 na RA0 - RA5, 
			movwf	PORTA

			movlw	b'000000'	; prednastavit 0 na RC0 - RC5, 
			movwf	PORTC

			movlw	b'00000111'	; =07h, digitalni vstupy na GP0 - GP2 (comparator OFF)
			movwf	CMCON
;       ------------------------
			bsf	STATUS,RP0	; nastaveni BANKY 1

			movlw	b'001000'
			movwf	TRISA		; RA2 vstup zbytek výstup  (0=vystup, 1=vstup)

			movlw	b'000000'
			movwf	TRISC		; RC0 – RC3vystup, RC4-RC vstupy  ( 0=vystup, 1=vstup)

			movlw	b'10001111'	; 
			movwf	OPTION_REG	; 
;			call	3FFh		; zapsat kalibraci vnitrniho oscilatoru
;			movwf	OSCCAL		;00h min. f, 80h stred f, 0FFh pro max. f
;       ------------------------
			movlw	b'00000000'	; nastaveni PULL-UP na vstupu RA0 - RA2, RA4-RA5
			movwf	WPUA		; (0 zakazan, 1 povolen)
			movlw	b'00000000'	; preruseni pri zmene na vstupu RC0 - RC5
			movwf	IOCA		; Povolit INT on CHANGE na GP0 (0 zakazano, 1 povoleno)
			movlw	b'01000000'	; 
			movwf	INTCON
			bcf		STATUS,RP0	; nastaveni BANKY 0
			bcf		INTCON,T0IF	
			clrf	TISICE
			clrf	STOVKY
			clrf	DESITKY
			clrf	JEDNOTKY
			movlw	.0
			movwf	ADR_ZNAKU

;**********************;* Hlavní program  j************************
START			
			movlw	.26		;26 pro minutové zpoždění 18mS x 128 x 26 = přibližně 1 minuta
			movwf	TMP5		
			bsf TECKA
	TEMPERATURE	call	KOM_S_C_1	;podprogram pro komunikaci s čidlem
			call	TEPLOTA1 	;podprogram pro převod teploty	
			call	ZOBRAZ_T  	;podprogram pro zobrazení teploty

	SPI		clrwdt
			sleep			;předdělička přiřazena k WDT a děl poměr 1:128	probuzení za 2,3 S
			btfsc	STATUS,4	;přetekl WATCHDOG
			goto	SPI
			

	CAS_ZPO		decfsz	TMP5,1
			goto	SPI
			movlw	.26		;26 pro minutové zpoždění 18mS x 128 x 26 = přibližně 1 minuta
			movwf	TMP5
			goto	TEMPERATURE

;***********************************************************************************************************************
;* Tady se přepočíta teplotu z LS_Byte a MS_ Byte na dekadické číslo pro zobrazení na displej                  * 
;***********************************************************************************************************************

TEPLOTA	
           		movlw	b'00000000'		;zobrazí 0
			movwf	TDN
			movlw	b'00000000'		;zobrazí 0
			movwf	TJ
			movlw	b'00001111'		;zobrazí mezeru
			movwf	TDE
			movlw	b'00001111'		;zobrazí mezeru
			movwf	TS
			return

TEPLOTA1		
			bcf		P_Z_T
			clrf	R1
			clrf	R2
			clrf	R3
			rlf		MS_Byte,W	;zjistí se jestli je horní polovina MS_Byte 1 potom je číslo záporné
			btfss	STATUS,C	
			goto	KLADNA_T
			bsf		P_Z_T		;příznak záporné teploty

ZAPORNA_T	movf	LS_Byte,W	;spodní byte přesune do R1
			movwf	R1					
			movlw	b'00001111'	;maska pro vynulování horní poloviny LS_Byte a uložení do R1
			andwf	R1,F
			movf	R1,W
			btfsc	STATUS,Z
			incf	R3,F	
			movwf	ADR_ZNAKU	;W přesuň do registru ADR_ZNAKU
			call	TAB_ZAP		;zavolej tabulku znaku desetiny stupně (záporné desetiny)
			movwf	R1			;přesuň znak z tabulky který je ve W do R1
			movf	LS_Byte,W	;načte LS_Byte do W
			movwf	R2
			movlw	b'11110000'	;maska pro vynulování spodní poloviny LS_Byte a uložení do R2
			andwf	R2,1		; v R2 je uložena zbývající hodnota teploty
			swapf	R2,1
			movlw	b'00001111'
			andwf	MS_Byte,1;	andwf	MS_Byte,1	;zamaskování horních čtyř bitů zbývající teplota jeve spodních 4 bitech
			swapf	MS_Byte,1
			movf	MS_Byte,W;prohození čtveřice bitů
			addwf	R2,1
			comf	R2,1		;sečteme teplotu z MS_Byte a R2 coč je výsledná teplota bed desetiného čísla, které je v R1
			movf	R3,W
			addwf	R2,1
			goto	T_DISPLEJ

KLADNA_T	bcf		P_Z_T
			movf	LS_Byte,W	;přesun LS_Byte do W
			movwf	R1			;přesun W do R1
			movlw	b'00001111'	;maska pro vynulování horní poloviny LS_Byte a uložení do R1
			andwf	R1,1	
			movf	R1,W		;registr R1 přesuň do W
			movwf	ADR_ZNAKU	;W přesuň do registru ADR_ZNAKU
			call	TAB_KLA		;zavolej tabulku znaku desetiny stupně (kladné desetiny)
			movwf	R1			;přesuň znak z tabulky který je ve W do R1	
			movf	LS_Byte,W	;;přesun LS_Byte do W
			movwf	R2			;;přesun W do R1
			movlw	b'11110000'	;maska pro vynulování spodní poloviny LS_Byte a uložení do R2
			andwf	R2,1		; v R2 je uložena zbývající hodnota teploty
			swapf	R2,1		;prohození horní a dolní poloviny R2 
			movlw	b'00001111'	;;maska pro vynulování horní poloviny MS_Byte a uložení
			andwf	MS_Byte,1	;zamaskování horních čtyř bitů zbývající teplota je ve spodních 4 bitech
			swapf	MS_Byte,1	;prohození čtveřice bitů
			movf	MS_Byte,W	;přesunutí MS_Byte do W
			addwf	R2,1		;sečteme teplotu z MS_Byte a R2 coč je výsledná teplota bed desetiného čísla, které je v R1

;**************************************************************************************************************************
;* Tady se upraví teplota dekadického čísla z registru R2 na stovky,desitky,jednotky pro zobrazení na displej * 
;**************************************************************************************************************************


T_DISPLEJ	clrf	TDN
			clrf	TJ
			clrf	TDE
			clrf	TS
		
			
			movf	R1,W
			movwf	TDN
			movf	R2,W
			movwf	TJ

			movlw	.10			;teplota jednotky přepočet
T_JP		subwf	TJ,1
			btfss	STATUS,C
			goto	T_DP1
			incf	TDE,1
			goto	T_JP

T_DP1		addwf  	TJ,1		;teplota desitky přepočet
T_DP		subwf	TDE,1
			btfss	STATUS,C
			goto	T_SP1
			incf	TS,1
			goto	T_DP
		

T_SP1		addwf	TDE,1		;teplota stovky přepočet
T_SP		subwf	TS,1
			btfss	STATUS,C
			goto	T_SP2
			incf	TS,1
			goto	T_SP
T_SP2		addwf	TS,1
	
;**************************************************************************************************************************
;*  nezobrazí žádný znak když jsou stovky nebo desitky 0 , zobrazí - při záporné teplotě * 
;**************************************************************************************************************************		


ZNA_MINUS	movf	TS,1			;stovky při plus teplotě 
			btfsc	STATUS,Z
			goto	$+3
			btfss	P_Z_T
			goto	ZNA_END
			movf	TDE,1
			btfss	STATUS,Z		
			goto	STO_MINUS	
			btfss	P_Z_T
			goto	DES_0
			movlw	b'00001010'		;zobrazí -
			movwf	TDE
			goto 	STO_0
DES_0		movlw	b'00001111'		;zobrazí mezeru
			movwf	TDE
			goto 	STO_0
STO_MINUS	btfss	P_Z_T
			goto	STO_0	
			movlw	b'00001010'		;zobrazí -
			movwf	TS
			goto	ZNA_END
STO_0		movlw	b'00001111'		;zobrazí mezeru
			movwf	TS
ZNA_END
	return

;**************************************************************************************************************************
;*  Pošlou se hodnoty z registrů přes posuvný registr na displej * 
;**************************************************************************************************************************		

ZOBRAZ_T	
		movlw	.8
		movwf	POCET_B
		movf	TS,W
		movwf	ROTACE	
CISLS		BCF		D				;Data=0
		RLF		ROTACE,1		;posun vlevo
		BTFSC	STATUS,C		;C=0?
		BSF		D				;Data=1
		BCF		CLK				;CLK=0
		BSF		CLK				;CLK=1
		DECFSZ	POCET_B,1		;-1=0?
		GOTO	CISLS			;dalsi bit
		bsf		DIG_T
		bcf		DIG_T
			
		movlw	.8
		movwf	POCET_B
		movf	TDE,W
		movwf	ROTACE
CISLDE	BCF		D				;Data=0
		RLF		ROTACE,1		;posun vlevo
		BTFSC	STATUS,C		;C=0?
		BSF		D				;Data=1
		BCF		CLK				;CLK=0
		BSF		CLK				;CLK=1
		DECFSZ	POCET_B,1		;-1=0?
		GOTO	CISLDE			;dalsi bit
		bsf		DIG_S
		bcf		DIG_S
			
		movlw	.8
		movwf	POCET_B
		movf	TJ,W
		movwf	ROTACE
CISLJ	BCF		D				;Data=0
		RLF		ROTACE,1		;posun vlevo
		BTFSC	STATUS,C		;C=0?
		BSF		D				;Data=1
		BCF		CLK				;CLK=0
		BSF		CLK				;CLK=1
		DECFSZ	POCET_B,1		;-1=0?
		GOTO	CISLJ			;dalsi bit
		bsf		DIG_D
		bcf		DIG_D
			
		movlw	.8
		movwf	POCET_B
		movf	TDN,W
		movwf	ROTACE
CISLDN	BCF		D				;Data=0
		RLF		ROTACE,1		;posun vlevo
		BTFSC	STATUS,C		;C=0?
		BSF		D				;Data=1
		BCF		CLK				;CLK=0
		BSF		CLK				;CLK=1
		DECFSZ	POCET_B,1		;-1=0?
		GOTO	CISLDN			;dalsi bit
		bsf		DIG_J
		bcf		DIG_J
	return

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;  Podprogramy pro DS18B20   použity od pana BLÁHY za což mu moc děkuji  +
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


;********************************************************************************************************************** 
; TEST KOMUNIKACE (z cidla musi byt nactena hodnota +85st.C. (0550h A PO UPRAVE V TEMP_MSB bit0 =0 A V TEMP_LSB=0xAA));
;**********************************************************************************************************************
;KOM_S_C
;	CALL	A0_RESET_C	;PROCEDURA RESET
;	MOVLW	0xCC		;PRIKAZ ROM - SKIPROM
;	CALL	A0_WR_DO_C	;ZAPIS PRIKAZU DO CIDLA
;	MOVLW	0xBE		;FUNKCNI PRIKAZ - READ SCRATCHPAD	
;	CALL	A0_WR_DO_C	;ZAPIS PRIKAZU DO CIDLA
;    	CALL    A0_CTI_Z_C  ;CTENI DAT Z CIDLA - NACTENA DATA JSOU V TMP0 reg.
;    	MOVF    TMP0,W
;    	MOVWF   LS_Byte
;    	CALL    A0_CTI_Z_C  ;CTENI DAT Z CIDLA - NACTENA DATA JSOU V TMP0 reg.
;    	MOVF    TMP0,W
;    	MOVWF   MS_Byte
;	RETURN


KOM_S_C_1 
	CALL	A0_RESET_C	;PROCEDURA RESET
	MOVLW	0xCC		;PRIKAZ ROM - SKIPROM
	CALL	A0_WR_DO_C	;ZAPIS PRIKAZU DO CIDLA
	MOVLW	0x44		;PRIKAZ ROM - SKIPROM
	CALL	A0_WR_DO_C	;ZAPIS PRIKAZU DO CIDLA

;**********************************************************************************************************************
; TEST UKONČENÍ PŘEVODU  *
;*************************
; Pro zjisteni ukonceni prevodu teploty se musi vyslat "cteci casovy usek" (pekne blbej výraz :-(  )
; toto cteni se musi provadet pokazde, kdy chceme cist stav sbernice, protoze cidlo odpovi pouze jednou na
; otazku, zda probiha prevod, takze cekaci smycka se vraci o 10 radku nahoru na nove vyslani
; cteciho casoveho useku. ;-)
  
	bsf	STATUS,RP0
	bcf	TRISA,1
	bcf	STATUS,RP0
	bsf	DS
	bcf	DS
	bsf	STATUS,RP0
	bsf	TRISA,1
	bcf	STATUS,RP0
	call	BR_10us
	btfss	DS
	goto	$-0x0A	
;************************* 
; TEST UKONČENÍ PŘEVODU  *
;**********************************************************************************************************************
	CALL	A0_RESET_C	;PROCEDURA RESET
	MOVLW	0xCC		;PRIKAZ ROM - SKIPROM
	CALL	A0_WR_DO_C	;ZAPIS PRIKAZU DO CIDLA
	MOVLW	0xBE		;FUNKCNI PRIKAZ - READ SCRATCHPAD	
	CALL	A0_WR_DO_C	;ZAPIS PRIKAZU DO CIDLA
    	CALL    A0_CTI_Z_C  ;CTENI DAT Z CIDLA - NACTENA DATA JSOU V TMP0 reg.
    	MOVF    TMP0,W
    	MOVWF   LS_Byte
    	CALL    A0_CTI_Z_C  ;CTENI DAT Z CIDLA - NACTENA DATA JSOU V TMP0 reg.
    	MOVF    TMP0,W
    	MOVWF   MS_Byte
;  CALL    UPR_VYS      ;UPRAVI VYSLEDEK NA FORMAT: TEMP_LSB - HODNOTA A REG.TEMP_MSB - ZNAMENKO
                        ;KONTROLA HODNOT V REGISTRECH TEMP_MSB A TEMP_LSB, ZDA JE NACTENA HODNOTA +85ST.C
 	RETURN
;********************************************************************************************************************** 
; Když čidlo není zapojeno nebo neodpovídá tak se zobrazí v JEDNOTKÁCH a DESETINÁCH  -.-                              *
;**********************************************************************************************************************
NENI_DS		
			movlw	b'00001010'
			movwf	TDN
			movwf	TJ
			movlw	b'00001111'
			movwf	TDE
			movwf	TS
			call	ZOBRAZ_T
			goto	DS_KOM_1
			return
;********************************************************************************************************************** 
;********************************************************************************************************************** 
	; Ovladaci ROUTINE pro cidlo DS18B20 
	; Casovani je pro pouziti krystalu 4MHz
	; Casova smycka je 10us, 25us, 60us, 100us, 160us, 490us
	; Cidlo je napajeno pres Ucc pin
;.......................................................................
	;PRSENTACNI CAST;
	;---------------;
A0_RESET_C	
	BSF		STATUS,RP0	;BANKA1
	BCF		TRISA,1		;PIN RA0 JAKO VYSTUP
	BCF		STATUS,RP0	;BANKA0
	BSF		DS			;LOG.1 NA TCK
	BCF		DS			;LOG.0 NA TCK
	CALL		BR_490us	;CEKEJ CCA 490us
    	BSF		STATUS,RP0	;BANKA1
	BSF		TRISA,1		;PIN RA0 JAKO VSTUP
	BCF		STATUS,RP0	;BANKA0
	CALL		BR_100us	;CEKEJ CCA 100us

	BTFSC	DS			;TEST PRESENTACNIHO PULSU OD CIDLA
	goto	NENI_DS		;CIDLO NEODPOVIDA PRESENCNIM PULSEM - CHYBA
	CALL	BR_490us

	RETURN
;-----------------------------------------------------------------------------
	;TEST KOMUNIKACE  (z cidla musi byt nactena hodnota +85st.C. (0550h));
;-----------------------------------------------------------------------------
	;VYSLANI 8BITU DO CIDLA (DATA NEBO PRIKAZ)
	;ODESILANA DATA (1 BAJT) MUSI BYT V W REGISTRU
A0_WR_DO_C
	MOVWF	TMP0
	BSF		STATUS,RP0	;BANKA1
	BCF		TRISA,1		;PIN RA0 JAKO VYSTUP
	BCF		STATUS,RP0	;BANKA0
	BSF		DS			;LOG.1 NA TCK
	MOVLW	0X08		;POCET BITU DO CIDLA (8)
	MOVWF	TMP1

A0_ZAPISS
	BTFSS	TMP0,0		;TEST BITU 0 REG. TMP0
	GOTO	A0_ZAPIS0
	GOTO	A0_ZAPIS1
;-------------------------------	
A0_ZAPIS0				;TAKTO ZAPISUJE LOG.0
	BSF		DS			;LOG.1 NA TCK
	BCF		DS			;LOG.0 NA TCK
	CALL	BR_100us	;BRZDA 100us
	BSF		DS			;LOG.1 NA TCK
	GOTO	A0_POSUNN
;-------------------------------	
A0_ZAPIS1				;TAKTO ZAPISUJE LOG.1
	BSF		DS			;LOG.1 NA TCK
	BCF		DS			;LOG.0 NA TCK
	CALL	BR_10us		;BRZDA 10us
	BSF		DS			;LOG.1 NA TCK
	CALL	BR_100us	;BRZDA 100us
	GOTO	A0_POSUNN
;-----------------------------------------------------------------------------
A0_POSUNN 
 	RRF		TMP0,F		;POSUN OBSAHU REGISTRU O JEDEN BIT DOPRAVA
	DECFSZ	TMP1,F		;TEST POCTU ODESLANYCH BITU
	GOTO	A0_ZAPISS	;JESTE NEBYLO ODESLANO 8BITU
	RETURN			;ODESLANO 8BITU - VYSTUP Z PODPROGRAMU
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
	;  PRIJMUTI 8BITU Z CIDLA
	; (DATA Z CIDLA JSOU V REG.TMP0)
A0_CTI_Z_C
	BCF		STATUS,RP0	;BANKA0
	MOVLW	0X08		;POCET BITU PRO PRIKAZ (8)
	MOVWF	TMP1
	CLRF	TMP0
A0_CTI_Z_C1
	RRF		TMP0,F
	BSF		STATUS,RP0	;BANKA1
	BCF		TRISA,1		;PIN RA0 JAKO VYSTUP
	BCF		STATUS,RP0	;BANKA0
	BSF		DS			;LOG.1 NA TCK	- PRIPRAVA NA START CTENI
	BCF		DS			;LOG.0 NA TCK	- START CTECIHO CASOVAHO USEKU 
	CALL	BR_10us		;BRZDA 10us
;-------------------------------
	BSF		STATUS,RP0	;BANKA1
	BSF		TRISA,1		;PIN RA0 JAKO VSTUP
	BCF		STATUS,RP0	;BANKA0
	BTFSS	DS			;TEST UROVNE SBERNICE - VYSLANI BITU Z CIDLA
	GOTO	A0_CTI_0	;CIDLO POSLALO LOG.0
	GOTO	A0_CTI_1	;CIDLO POSLALO LOG.1
;-------------------------------
A0_CTI_0
 	BCF		TMP0,7		;NASTAV BIT7 REG.TMP0 DO LOG.0
	CALL	BR_60us		;BRZDA 60us
	DECFSZ	TMP1,F		;TEST POCTU ODESLANYCH BITU
	GOTO	A0_CTI_Z_C1	;JESTE NEBYLO ODESLANO/PRIJMUTO 8BITU
	RETURN					;ODESLANO 8BITU - VYSTUP Z PODPROGRAMU
;-------------------------------	
A0_CTI_1
 	BSF		TMP0,7		;NASTAV BIT7 REG.TMP0 DO LOG.0
	CALL	BR_60us		;BRZDA 60us
	DECFSZ	TMP1,F		;TEST POCTU ODESLANYCH BITU
	GOTO	A0_CTI_Z_C1	;JESTE NEBYLO ODESLANO/PRIJMUTO 8BITU
	RETURN					;ODESLANO 8BITU - VYSTUP Z PODPROGRAMU
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
;UPR_VYS         ;TENTO PROGRAMEK UPRAVI DATA Z CIDLA TAK, ABY TEPLOTA BYLA V REG. TEMP_LSB A ZNAMÉNKO + NEBO - V REG. TEMP_MSB
                		;VSTUPNI DATA MUSI BYT V REGISTRECH TEMP_LSB A TEMP_MSB
   ;  RRF     MS_Byte,F
    ; RRF     LS_Byte,F
    ; RRF     MS_Byte,F
    ; RRF     LS_Byte,F
    ; RRF     MS_Byte,F
    ; RRF     LS_Byte,F
    ; RETURN  		;VYSLEDEK JE V REG.TEMP_LSB - HODNOTA A REG.TEMP_MSB - ZNAMENKO
;********************************************************************************************************************** 
;ALARM_C1		;ODBAVENI ALARMU1 CIDLA - NEHLASI SE NA RESET PULS
;	BSF     PORTB,0
;	BSF     PORTB,1        
;	BSF     PORTB,2
;	BSF     PORTB,3
;        GOTO    $-1
;********************************************************************************************************************** 
;********************************************************************************************************************** 
;CASOVA SMYCKA PRO 4MHz
BR_10us
	MOVLW	0X02		;NASTAV W REGISTR NA HODNOTU CAS1
	MOVWF	SM_AD1		;PRESUN OBSAH W DO PAMETI SM_AD1
	DECFSZ	SM_AD1,F	;ODECTI 1 OD CISLA V PAMETI SM_AD1
	GOTO	$-1	
	return
;-------------------------------
BR_25us
	MOVLW	0X05		;NASTAV W REGISTR NA HODNOTU CAS1
	MOVWF	SM_AD1		;PRESUN OBSAH W DO PAMETI SM_AD1
	MOVLW	0X01
	MOVWF	SM_AD2		;PRESUN OBSAH W DO PAMETI SM_AD2
	GOTO	BRZDA2
;-------------------------------
BR_60us
	MOVLW	0X11		;NASTAV W REGISTR NA HODNOTU CAS1
	MOVWF	SM_AD1		;PRESUN OBSAH W DO PAMETI SM_AD1
	MOVLW	0X01
	MOVWF	SM_AD2		;PRESUN OBSAH W DO PAMETI SM_AD2
	GOTO	BRZDA2
;-------------------------------
BR_100us
	MOVLW	0X1E		;NASTAV W REGISTR NA HODNOTU CAS1
	MOVWF	SM_AD1		;PRESUN OBSAH W DO PAMETI SM_AD1
	MOVLW	0X01
	MOVWF	SM_AD2		;PRESUN OBSAH W DO PAMETI SM_AD2
	GOTO	BRZDA2
;-------------------------------
BR_160us
	MOVLW	0X32		;NASTAV W REGISTR NA HODNOTU CAS1
	MOVWF	SM_AD1		;PRESUN OBSAH W DO PAMETI SM_AD1
	MOVLW	0X01
	MOVWF	SM_AD2		;PRESUN OBSAH W DO PAMETI SM_AD2
	GOTO	BRZDA2
;-------------------------------
BR_490us
	MOVLW	0XA0		;NASTAV W REGISTR NA HODNOTU CAS1
	MOVWF	SM_AD1		;PRESUN OBSAH W DO PAMETI SM_AD1
	MOVLW	0X01
	MOVWF	SM_AD2		;PRESUN OBSAH W DO PAMETI SM_AD2
	GOTO	BRZDA2
;-------------------------------
BR_MAX
	MOVLW	0XFF		;NASTAV W REGISTR NA HODNOTU CAS1
	MOVWF	SM_AD1		;PRESUN OBSAH W DO PAMETI SM_AD1
	MOVLW	0XFF
	MOVWF	SM_AD2		;PRESUN OBSAH W DO PAMETI SM_AD2
	MOVLW	0X07
	MOVWF	SM_AD3
	DECFSZ	SM_AD3,F	;ODECTI 1 OD CISLA V PAMETI SM_AD1
	GOTO	$+2			;POKUD JE VYSLEDEK 0,TOTO PRESKOC, JINAK SE VRAT NA BRZDA1	
	return
	call	BRZDA2
	GOTO	$-4
;-------------------------------
BRZDA2	
	DECFSZ	SM_AD1,F	;ODECTI 1 OD CISLA V PAMETI SM_AD1
	GOTO	BRZDA2		;POKUD JE VYSLEDEK 0,TOTO PRESKOC, JINAK SE VRAT NA BRZDA1
	DECFSZ	SM_AD2,F	;ODECTI 1 OD CISLA V PAMETI SM_AD2
	GOTO	BRZDA2		;POKUD JE VYSLEDEK 0,TOTO PRESKOC, JINAK SE VRAT NA BRZDA1
	RETURN
;********************************************************************************************************************** 





;-----------------------------------------------------------------------------

TAB_ZNAKU	ORG	768
			movlw	.3
			movwf	PCLATH
			movf	ADR_ZNAKU,W
			addwf	PCL,F

			retlw b'00000000'	;znak 0
			retlw b'00000001'	;znak 1
			retlw b'00000010'	;znak 2
			retlw b'00000011'	;znak 3
			retlw b'00000100'	;znak 4
			retlw b'00000101'	;znak 5
			retlw b'00000110'	;znak 6
			retlw b'00000111'	;znak 7
			retlw b'00001000'	;znak 8
			retlw b'00001001'	;znak 9
			retlw b'00001010'	;znak -
			retlw b'00001011'	;znak E
			retlw b'00001100'	;znak H
			retlw b'00001101'	;znak L
			retlw b'00001110'	;znak P
			retlw b'00001111'	;znak mezera

TAB_ZAP		movlw	.3
			movwf	PCLATH
			movf	ADR_ZNAKU,W
			addwf	PCL,F

			retlw b'00000000'	;znak 0
			retlw b'00001001'	;znak 9
			retlw b'00001001'	;znak 8  ;puvodně byla 8 když tak vrátit
			retlw b'00001000'	;znak 8
			retlw b'00000111'	;znak 7
			retlw b'00000110'	;znak 6
			retlw b'00000110'	;znak 6
			retlw b'00000101'	;znak 5
			retlw b'00000101'	;znak 5
			retlw b'00000100'	;znak 4
			retlw b'00000011'	;znak 3
			retlw b'00000011'	;znak 3
			retlw b'00000010'	;znak 2
			retlw b'00000010'	;znak 2	;puvodně byla 1 když tak změnit
			retlw b'00000001'	;znak 1
			retlw b'00000000'	;znak 0 zobrazi 0 ale připodte 1 o řád výš

TAB_KLA		movlw	.3
			movwf	PCLATH
			movf	ADR_ZNAKU,W
			addwf	PCL,F

			retlw b'00000000'	;znak 0
			retlw b'00000000'	;znak 0
			retlw b'00000001'	;znak 1
			retlw b'00000001'	;znak 1
			retlw b'00000010'	;znak 2
			retlw b'00000011'	;znak 3
			retlw b'00000011'	;znak 3
			retlw b'00000100'	;znak 4
			retlw b'00000101'	;znak 5
			retlw b'00000101'	;znak 5
			retlw b'00000110'	;znak 6
			retlw b'00000110'	;znak 6
			retlw b'00000111'	;znak 7
			retlw b'00001000'	;znak 8
			retlw b'00001000'	;znak 8
			retlw b'00001001'	;znak 9 

			




;**************************************************************************
;*                      Preruseni kazdych 2s (500Hz)                      *
;**************************************************************************
PRERUS	movwf	TMP_W		; (ulozeni hodnot registru W a STATUS)
		swapf	STATUS,W	; prohodi nibble STATUS a ulozi do W
		bcf		STATUS,RP0	; nastaveni banky 0
		movwf	TMP_S		; ulozit STATUS
;       ------------------------
;		bcf	INTCON,T0IF	; vynulovat priznak preruseni (pretekl casovac TMR0)
;		bcf	INTCON,GPIF	; vynulovat priznak preruseni (zmena na portu RA0-RA5)
;		bcf	INTCON,INTF	; vynulovat priznak preruseni (vstup RA2)
;-------------------------------

;	!!! zde napiste co ma preruseni vykonat !!!


;------------------------------- (obnovení hodnot registru W a STATUS)
INT_END	bcf	INTCON,INTF
		bcf	INTCON,T0IF
		swapf	TMP_S,W		; prohodí nibble TMP_S a uloží do W
		movwf	STATUS		; obnova STATUS

		swapf	TMP_W,F		; prohodi nibble TMP_W
		swapf	TMP_W,W		; obnova W
;       ------------------------
	retfie			; návrat z přerušení


	END
