/*
 * Pajeci_pec_software.c
 *
 * Created: 19.01.2025 11:30:15
 * Author : buryanec
 VER: 5.3.2025
 */ 
#define F_CPU 10000000
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <avr/eeprom.h>
#include <stdint.h>
#include <stdlib.h>
#include <avr/wdt.h>
#include <ctype.h>

//######################Pro snejka
// C program to implement an interactive
// snake game

// Array to store the coordinates of snake
// tail (x-axis, y-axis)
int snakeTailX[100], snakeTailY[100];

// Variable to store the length of the
// snake's tail
int snakeTailLen;

// Score and signal flags
int score;
int8_t key;
uint8_t gameover;

// Coordinates of snake's head and fruit
uint8_t x, y, fruitx, fruity;
//#########################konec pro snejka

//DEFINOVANI LCD PINU
#define LCD_RES_PIN 0b10000000
#define LCD_RES_OFF_PORT PORTC_OUTSET
#define LCD_RES_ON_PORT PORTC_OUTCLR
#define LCD_CS_PIN 0b00010000
#define LCD_CS_OFF_PORT PORTD_OUTSET
#define LCD_CS_ON_PORT PORTD_OUTCLR
#define LCD_A0_PIN 0b01000000
#define LCD_A0_DATA_PORT PORTC_OUTSET
#define LCD_A0_COMM_PORT PORTC_OUTCLR
#define LCD_WIDTH  128
#define LCD_HEIGHT 64
#define LCD_PAGES  (LCD_HEIGHT / 8)

//DEFINOVANI REGISTRU MAX
#define CR0		0x00
#define CR1		0x01
#define MASK	0x02
#define CJHF	0x03
#define CJLF	0x04
#define LTHFTH	0x05
#define LTHFTL	0x06
#define LTLFTH	0x07
#define LTLFTL	0x08
#define CJTO	0x09
#define CJTH	0x0A
#define CJTL	0x0B
#define LTCBH	0x0C
#define LTCBM	0x0D
#define LTCBL	0x0E
#define SR		0x0F

//DEFINICE ADRES EEPROM
#define EEPROM_ADDR_LCD_BL      0x00
#define EEPROM_ADDR_PID_P       0x01
#define EEPROM_ADDR_PID_I       0x02
#define EEPROM_ADDR_PID_D       0x03
#define EEPROM_ADDR_BZUCAK      0x04
#define EEPROM_ADDR_VENTILATOR  0x05
#define EEPROM_ADDR_CHYBA		0x09
#define EEPROM_ADDR_TEPLOTA1	0x0D
#define EEPROM_ADDR_TEPLOTA2	0x11
#define EEPROM_ADDR_TEPLOTA3	0x15
#define EEPROM_ADDR_TEPLOTA4	0x19
#define EEPROM_ADDR_TEPLOTA5	0x1D
#define EEPROM_ADDR_CAS1		0x21
#define EEPROM_ADDR_CAS2		0x22
#define EEPROM_ADDR_CAS3		0x23
#define EEPROM_ADDR_CAS4		0x24
#define EEPROM_ADDR_CAS5		0x25
#define EEPROM_ADDR_KONTRAST	0x26
#define EEPROM_ADDR_TERMTYPE1	0x27
#define EEPROM_ADDR_TERMTYPE2	0x28
#define EEPROM_ADDR_TERMMASK1	0x29
#define EEPROM_ADDR_TERMMASK2	0x2A
#define EEPROM_ADDR_SNAKE_HIGH_SCORE	0x2F

//DEFINOVANI CISEL CHYB a POMOCNYCH VELICIN
typedef enum { ZASEKNUTI_PROGRAMU,			//priznak watchdogu
			   CHYBA_TOP_TEL,				//=ztrata signalu pruchodu nulou
			   CHYBA_VENTILATORU,			//zadny signal od snimace i pri vysokem PWM vystupu
			   CHYBA_TERMOCLANKU1,
			   CHYBA_TERMOCLANKU2 } chyby_pece;

#define HEAT_DUT_VAL	30			  

//PROMENE EEPROM
uint8_t EEPROM_LCD_BL;
uint8_t EEPROM_PID_P;
uint8_t EEPROM_PID_I;
uint8_t EEPROM_PID_D;
uint8_t EEPROM_BZUCAK;
uint16_t EEPROM_VENTILATOR;
uint8_t EEPROM_CHYBA;
uint16_t EEPROM_TEPLOTA1;
uint16_t EEPROM_TEPLOTA2;
uint16_t EEPROM_TEPLOTA3;
uint16_t EEPROM_TEPLOTA4;
uint16_t EEPROM_TEPLOTA5;
uint8_t EEPROM_CAS1;
uint8_t EEPROM_CAS2;
uint8_t EEPROM_CAS3;
uint8_t EEPROM_CAS4;
uint8_t EEPROM_CAS5;
uint8_t EEPROM_KONTRAST;
uint8_t EEPROM_TERMTYPE1;
uint8_t EEPROM_TERMTYPE2;
uint8_t EEPROM_TERMMASK1;
uint8_t EEPROM_TERMMASK2;
uint16_t EEPROM_SNAKE_HIGH_SCORE;

//PROMENE V PRERUSENICH
volatile int8_t ROT_rotace = 0;
volatile int8_t TL_stisk = 0;
volatile uint8_t Diagnostika_flag = 0;
volatile uint8_t BEEP_opakovani = 0;
volatile uint8_t ZCD_POCITANI = 0;
volatile uint8_t VENT_POCITANI = 0;
volatile uint8_t ZCD_FREKVENCE = 0;
volatile uint8_t VENT_FREKVENCE = 0;
volatile uint8_t readEEPROM_flag = 1;
volatile uint16_t CAS_Pajeni = 0;
volatile uint8_t POCITADLO_VTERINY = 0;
volatile uint8_t ZmerARegulace_flag = 0;
volatile uint8_t VENT_CHYBA_flag = 0;
volatile uint8_t DRAW_GRAF_flag = 0;
volatile uint8_t HEAT_ON_flag = 0;
volatile uint8_t ZCD_REG = 0;
volatile uint8_t HEAT_DUT = 0;
volatile uint8_t HEAT_OFF_flag = 0;

//PROMENE
uint16_t duty_cycle_minule = 0;
uint8_t VENT_CHYBA_POC = 0;
uint16_t VENT_CHYBA_DUT = 0;
uint8_t VENT_START_flag = 0;
float poradi_pixelu = 0;
uint8_t REG_ONOFF_STAV_MEM = 0;
uint16_t teplota_minula = 0;
uint8_t pocitadlo = 0;
uint16_t PP = 10;
uint8_t pocitadlo_chyb = 0;
uint8_t pocitadlo_spatne_mereni = 0;

		float e_1 = 0.0;
		float e_2 = 0.0;
		float ef_1 = 0.0;
		float ef_2 = 0.0;
		float u_1 = 0.0;

//PREDDEFINOVANI FUNKCI
void LCD_SEND_COMM(uint8_t comm);
void PORT_INIT(void);
void LCD_INIT(void);
void LCD_SEND_DATA(uint8_t data);
void LCD_UpdateScreen(void);
void LCD_DrawChar(char c, uint8_t row, uint8_t col);
uint8_t reverseByte(uint8_t b);
void LCD_DrawString(const char *str, uint8_t row, uint8_t col);
void LCD_DrawPixel(uint8_t x, uint8_t y);
void LCD_DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2);
void LCD_DrawNumber(uint16_t cislo, uint8_t row, uint8_t col);
void FCE_Pajeni(void);
void FCE_Suseni(void);
void FCE_Nastaveni(void);
void FCE_Diagnostika(void);
void FCE_Diagnostika_Viko(void);
void FCE_Diagnostika_Vystupy(void);
void FCE_Diagnostika_Info(void);
void FCE_Diagnostika_Termoclanky(void);
void FCE_Diagnostika_TopneTeleso(void);
void FCE_Diagnostika_Ventilator(void);
void writeEEPROM(void);
void readEEPROM(void);
void FCE_Nastaveni_PajeciProfil(void);
void FCE_Nastaveni_Regulace(void);
void FCE_Nastaveni_Bzucak(void);
void FCE_Nastaveni_Podsvetleni(void);
void FCE_Nastaveni_Ventilator(void);
void FCE_Nastaveni_Termoclanek(void);
void BZUCAK_BEEP();
uint8_t FCE_Suseni_Start(uint16_t cas, uint16_t teplota, uint8_t rychlost_nabehu);
void VENTILATOR_RIZENI (uint16_t otacky);
void CHYBY(uint8_t cislo_chyby);
void FCE_Diagnostika_Info_SerioveCislo(void);
void LCD_DrawNumberFixed(uint16_t cislo, uint8_t row, uint8_t col, uint8_t minWidth);
void Regulace(uint16_t teplota_zadana, uint16_t teplota_skutecna);
void TEMP_INIT(void);
uint16_t GET_TEMP(void);
void FCE_Pajeni_Pb(void);
void FCE_Pajeni_RoHS(void);
void FCE_Pajeni_Vlastni(void);
uint8_t FCE_Pajeni_Start(uint8_t cas1, uint8_t cas2, uint8_t cas3, uint8_t cas4, uint8_t cas5, uint16_t teplota1, uint16_t teplota2, uint16_t teplota3, uint16_t teplota4, uint16_t teplota5);
void NastaveniKontrastu(void);
uint8_t SPI_transfer(uint8_t data);
void MAX31856_1_writeRegister(uint8_t reg, uint8_t value);
void MAX31856_2_writeRegister(uint8_t reg, uint8_t value);
uint8_t MAX31856_1_readRegister(uint8_t reg);
uint8_t MAX31856_2_readRegister(uint8_t reg);
uint16_t binarniNaDesitkove(uint16_t cislo);
void DRAW_GRAF(uint16_t teplota_zadana, uint16_t teplota_aktualni, uint16_t teplota_cilova, uint8_t cas_zbyvajici, uint16_t cas_aktualni_celkovy, uint8_t cislo_faze);
void SNAKE(void);

//LCD BUFFER
uint8_t lcd_buffer[LCD_WIDTH * LCD_PAGES] = {0};
//FONT V PROGMEM	
extern const uint8_t font[] PROGMEM; 
extern const uint8_t animation[][1024] PROGMEM;

//############################################################ obsluha preruseni
	
	//PRERUSENI OD PORTU F
	ISR(PORTF_PORT_vect){

		//ROT ENKODER
		if (PORTF_INTFLAGS&(1<<0))
		{
			_delay_ms(4);
			PORTF_INTFLAGS = (1<<0);
			if (PORTF_IN&(1<<2))
			{
				ROT_rotace = 1;
			} 
			else
			{
				ROT_rotace = -1;
			}
			if(Diagnostika_flag == 0)
			{
			BEEP_opakovani = 2;
			BZUCAK_BEEP();
			}
		}
		
		//TLACITKO
		if (PORTF_INTFLAGS&(1<<1))
		{
			PORTF_INTFLAGS = (1<<1); 
			TL_stisk = 1;
			if(Diagnostika_flag == 0)
			{
			BEEP_opakovani = 5;
			BZUCAK_BEEP();
			}
			_delay_ms(4);
		}
		
		//ZERO CROSSING DETECTOR
		if (PORTF_INTFLAGS&(1<<4))
		{
			PORTF_INTFLAGS = (1<<4);
			ZCD_POCITANI++;
			
			if (ZCD_REG < HEAT_DUT_VAL)
			{
				ZCD_REG++;
			}
			
			
			if (HEAT_ON_flag)
			{
				if (ZCD_REG <= HEAT_DUT)
				{					
					//zapnout topeni
					PORTB_OUTSET = (1<<5);
				}
				else
				{
					//vypnout topeni
					PORTB_OUTCLR = (1<<5);
				}
				if (ZCD_REG >= HEAT_DUT_VAL)//vybrat tim periodu PWM
				{
					ZCD_REG = 0;
					if (HEAT_OFF_flag)
					{
						HEAT_ON_flag = 0;
						HEAT_OFF_flag = 0;
						PORTB_OUTCLR = (1<<5);
					}
				}
			}
		}
	
		//SNIMANI OTACEK VENTILATORU
		if (PORTF_INTFLAGS&(1<<5))
		{
			PORTF_INTFLAGS = (1<<5);
			VENT_POCITANI++;
		}
		
		//RESET
		if (PORTF_INTFLAGS&(1<<6))
		{
			PORTF_INTFLAGS = (1<<6);
			readEEPROM_flag = 0;
			EEPROM_LCD_BL = 1;
			EEPROM_PID_P = 100;
			EEPROM_PID_I = 0;
			EEPROM_PID_D = 0;
			EEPROM_BZUCAK = 1;
			EEPROM_VENTILATOR = 2000;
			EEPROM_CHYBA = 0;
			EEPROM_TEPLOTA1 = 100;
			EEPROM_TEPLOTA2 = 150;
			EEPROM_TEPLOTA3 = 250;
			EEPROM_TEPLOTA4 = 250;
			EEPROM_TEPLOTA5 = 200;
			EEPROM_CAS1 = 60;
			EEPROM_CAS2 = 90;
			EEPROM_CAS3 = 30;
			EEPROM_CAS4 = 10;
			EEPROM_CAS5 = 30;
			EEPROM_KONTRAST = 15;
			EEPROM_TERMTYPE1 = 2;
			EEPROM_TERMTYPE2 = 2;
			EEPROM_TERMMASK1 = 0;
			EEPROM_TERMMASK2 = 0;
			EEPROM_SNAKE_HIGH_SCORE = 0;
			writeEEPROM();
			_delay_ms(500);
			CPU_CCP = 0xD8;
			RSTCTRL_SWRR = 1;
		}
	}
	
	//PRERUSENI OD RTC_PIT PERIODA = 0,25s
	ISR(RTC_PIT_vect)
	{
		RTC_PITINTFLAGS = 1;
		
//Timer pravidelne preruseni kde se nacitaji nove hodnoty z eeprom, blika led pokud se paji atd...
		readEEPROM();
		//Podlsvetleni zap vyp v preruseni
		if(Diagnostika_flag == 0)
		{
		if (EEPROM_LCD_BL)
		{
			PORTA_OUTSET = 0b0000100;
		}
		else
		{
			PORTA_OUTCLR = 0b0000100;
		}
		}
		//priznak ze se muze udelat dalsi zmereni teploty a regulacni zasah
		ZmerARegulace_flag = 1;
		
		DRAW_GRAF_flag = 1;
	}
	
	//PRERUSENI OD BZUCAKU
	ISR(TCB0_INT_vect)
	{
		TCB0_INTFLAGS = 1;
		
		if (BEEP_opakovani)
		{
			BEEP_opakovani--;
		} 
		else
		{
			//Vypnout bzucak
			PORTA_OUTCLR = 0b00000010;
			TCB0_CTRLA = 0;
		}
	}
	
	//PRERUSENI OD RTC PERIODA 1s
	ISR(RTC_CNT_vect)
	{
		RTC_INTFLAGS = 1;
		
		VENT_CHYBA_flag = 1;	
		
		//DRAW_GRAF_flag = 1;																	
		
		ZCD_FREKVENCE = ZCD_POCITANI;
		VENT_FREKVENCE = VENT_POCITANI;
		ZCD_POCITANI = 0;
		VENT_POCITANI = 0;
		if (CAS_Pajeni != 0)
		{
		CAS_Pajeni--;
		}
		
		POCITADLO_VTERINY++;
		
		//OBNOVENI WDT
		wdt_reset();
	}
	
	//############################################################ MAIN
	
int main(void)
{
	//PROMENE
	int8_t MENU1_pozice = 0;
	uint8_t MENU1_vyber = 0;
	
	//NASTAVENI OSCILATORU -> 10MHz
	CPU_CCP = 0xD8;
	CLKCTRL_MCLKCTRLB = 0b00000001;
	CLKCTRL_MCLKLOCK = 1;
	
	//NASTAVENI PORTU
	PORT_INIT();
	
	//NACTENI POTREBNYCH DAT Z EEPROM
	readEEPROM();
	
	//INICIALIZACE SPI
	SPI0_CTRLB = 0b00000111;
	SPI0_CTRLA = 0b00100011;
	
	//INICIALIZACE LCD
	LCD_INIT();
	//LCD VSECHNY PIXELY OFF
	
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
	LCD_UpdateScreen();
	
	//INICIALIZACE RTC a RTC_PIT
	//while(RTC_STATUS &=(1<<0))
	//	;
	//RTC_CTRLA = 0b0000000;
	RTC_CLKSEL = 0b00000001;
	while(RTC_PITSTATUS &(1<<0))
		;
	RTC_PITCTRLA = 0b00111001;
	RTC_PITINTCTRL = 1;
	while(RTC_STATUS &(1<<2))
		;
	RTC_PER = 1024;
	
	RTC_INTCTRL = 1;
	
	while(RTC_STATUS &=(1<<0))
		;
	RTC_CTRLA |= 1;
	
	//INICIALIZACE TERMOCLANKU
	TEMP_INIT();
			
	//VYPRAZDNIT BUFFER																
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
	
	//Podsvetleni
	if (EEPROM_LCD_BL)
	{
		PORTA_OUTSET = 0b0000100;
	}
	else
	{
		PORTA_OUTCLR = 0b0000100;
	}
	
	//POVOLENI PRERUSENI
	CPU_SREG |= 1<<7;
	sei();
	
	//ANIMACE
	memcpy_P(lcd_buffer, animation[0], 1024);
	LCD_UpdateScreen();
	_delay_ms(1000);
	for (uint8_t i = 1; i<=11; i++)
	{
		memcpy_P(lcd_buffer, animation[i], 1024);
		LCD_UpdateScreen();
		_delay_ms(200);
	}
	memcpy_P(lcd_buffer, animation[12], 1024);
	LCD_UpdateScreen();
	_delay_ms(1000);
	
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
	LCD_DrawString("Pajeci pec", 1, 35);
	LCD_DrawString("Autor:", 3, 48);
	LCD_DrawString("Matyas Buryanec", 4, 20);
	LCD_DrawString("UPCE 2025", 6, 37);
	LCD_DrawString("Verze 1.0", 7, 37);	
	LCD_UpdateScreen();
	_delay_ms(2500);
	
	for (uint8_t i = 0; i < 64; i++)
	{
	LCD_DrawLine( 0, i, 127, i);
	LCD_UpdateScreen();
	_delay_ms(25);
	}
	
	
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
	
	TEMP_INIT();
	
	BEEP_opakovani = 10;
	BZUCAK_BEEP();

	//ZMENA KONTRASTU								
	if((PORTF_IN & (1<<1)) == 0)
	{
	TL_stisk = 0;	
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
	NastaveniKontrastu();
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
	LCD_DrawString("Pajeci pec", 1, 35);
	LCD_DrawString("Autor:", 3, 48);
	LCD_DrawString("Matyas Buryanec", 4, 20);
	LCD_DrawString("UPCE 2025", 6, 37);
	LCD_DrawString("Verze 1.0", 7, 37);
	LCD_UpdateScreen();
	_delay_ms(2500);
	
	for (uint8_t i = 0; i < 64; i++)
	{
		LCD_DrawLine( 0, i, 127, i);
		LCD_UpdateScreen();
		_delay_ms(25);
	}
	_delay_ms(200);
	}
	
	CHYBY(ZASEKNUTI_PROGRAMU);
	
	//HLAVNI SMYCKA
    while (1) 
    {
		if (TL_stisk)
		{
			TL_stisk = 0;
			MENU1_vyber = 1;
		}
		
		if(MENU1_vyber == 0)
		{
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			LCD_DrawString("Funkce:", 0, 0);
			LCD_DrawString("Pajeni", 1, 7);
			LCD_DrawString("Suseni", 2, 7);
			LCD_DrawString("Nastaveni", 3, 7);
			LCD_DrawString("Diagnostika", 4, 7);
		
			if (ROT_rotace == 1)
			{
				MENU1_pozice++;
				ROT_rotace = 0;
			}
			if (ROT_rotace == -1)
			{
				MENU1_pozice--;
				ROT_rotace = 0;
			}
			if (MENU1_pozice > 3)
			{
				MENU1_pozice = 0;
			}
			if (MENU1_pozice < 0)
			{
				MENU1_pozice = 3;
			}
		
			switch (MENU1_pozice){
				//Pajeni
				case 0:
				LCD_DrawString(">", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				break;
				//Suseni
				case 1:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(">", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				break;
				//Nastaveni
				case 2:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(">", 3, 0);
				LCD_DrawString(" ", 4, 0);
				break;
				//Diagnistika
				case 3:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(">", 4, 0);
				break;
				//Chyba
				default:
				MENU1_pozice = 0;
				break;
			}
			LCD_UpdateScreen();	
		}
		else
		{
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		
			switch(MENU1_pozice){
				case 0:
				FCE_Pajeni();
				break;
				
				case 1:
				FCE_Suseni();
				break;
				
				case 2:
				FCE_Nastaveni();
				break;
				
				case 3:
				FCE_Diagnostika();
				break;
				
				default:
				MENU1_vyber = 0;
				break;
			}
			MENU1_vyber = 0;
			LCD_UpdateScreen();
		}
		
    }
}

//############################################################ funkce menu

void FCE_Pajeni(void){
	
	int8_t MENU_pajeni_pozice = 0;
	uint8_t MENU_pajeni_vyber = 0;
	
	while(1){
		if (TL_stisk)
		{
			TL_stisk = 0;
			MENU_pajeni_vyber = 1;
		}
		
		if (MENU_pajeni_vyber == 0)
		{
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		    LCD_DrawString("Pajeni:", 0, 0);
			LCD_DrawString("Pajeni Pb", 1, 7);
			LCD_DrawString("Pajeni RoHS", 2, 7);
			LCD_DrawString("Pajeni vlastni", 3, 7);
			LCD_DrawString("Zpet", 4, 7);
			
			if (ROT_rotace == 1)
			{
				MENU_pajeni_pozice++;
				ROT_rotace = 0;
			}
			if (ROT_rotace == -1)
			{
				MENU_pajeni_pozice--;
				ROT_rotace = 0;
			}
			if (MENU_pajeni_pozice > 3)
			{
				MENU_pajeni_pozice = 0;
			}
			if (MENU_pajeni_pozice < 0)
			{
				MENU_pajeni_pozice = 3;
			}
			
			switch (MENU_pajeni_pozice){
				
				case 0:
				LCD_DrawString(">", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				break;
				
				case 1:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(">", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				break;
				
				case 2:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(">", 3, 0);
				LCD_DrawString(" ", 4, 0);
				break;
				
				case 3:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(">", 4, 0);
				break;
				
				default:
				MENU_pajeni_pozice = 0;
				break;	
			}
			LCD_UpdateScreen();
		}
		else
		{
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			
			switch (MENU_pajeni_pozice){
				
				case 0:
				FCE_Pajeni_Pb();
				break;
				
				case 1:
				FCE_Pajeni_RoHS();
				break;
				
				case 2:
				FCE_Pajeni_Vlastni();
				break;
				
				case 3:
				MENU_pajeni_vyber = 0;
				return;
				break;
				
				default:
				MENU_pajeni_vyber = 0;
				break;
			}
			MENU_pajeni_vyber = 0;
			LCD_UpdateScreen();
		}
	}
}

void FCE_Pajeni_Pb(void){
	uint8_t ukonceni = 0;
	ukonceni = FCE_Pajeni_Start(30, 90, 30, 60, 0, 100, 150, 183, 235, 0);
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
	if (ukonceni)
	{
		LCD_DrawString("Predcasne ukonceno", 3, 18);
		LCD_DrawString("Kod:", 4, 18);
		LCD_DrawNumber((uint16_t)ukonceni, 4, 50);
	}
	else
	{
		LCD_DrawString("Uspesne ukonceno", 3, 18);
	}
	LCD_DrawString(">Zpet", 7, 0);
	LCD_UpdateScreen();
	uint8_t pocet_pisknuti = 0;
	POCITADLO_VTERINY = 0;
	while (TL_stisk == 0)
	{
		
		if ((pocet_pisknuti <= 2) && (POCITADLO_VTERINY == 2))
		{
			pocet_pisknuti++;
			BEEP_opakovani = 100;
			BZUCAK_BEEP();
			POCITADLO_VTERINY = 0;
		}
	}
	TL_stisk = 0;
}

void FCE_Pajeni_RoHS(void){
	uint8_t ukonceni = 0;
	ukonceni = FCE_Pajeni_Start(90, 90, 30, 30, 0, 150, 175, 217, 249, 0);
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
	if (ukonceni)
	{
		LCD_DrawString("Predcasne ukonceno", 3, 18);
		LCD_DrawString("Kod:", 4, 18);
		LCD_DrawNumber((uint16_t)ukonceni, 4, 50);
	}
	else
	{
		LCD_DrawString("Uspesne ukonceno", 3, 18);
	}
	LCD_DrawString(">Zpet", 7, 0);
	LCD_UpdateScreen();
	uint8_t pocet_pisknuti = 0;
	POCITADLO_VTERINY = 0;
	while (TL_stisk == 0)
	{
		
		if ((pocet_pisknuti <= 2) && (POCITADLO_VTERINY == 2))
		{
			pocet_pisknuti++;
			BEEP_opakovani = 100;
			BZUCAK_BEEP();
			POCITADLO_VTERINY = 0;
		}
	}
	TL_stisk = 0;
}

void FCE_Pajeni_Vlastni(void){
	uint8_t ukonceni = 0;
	ukonceni = FCE_Pajeni_Start(EEPROM_CAS1, EEPROM_CAS2, EEPROM_CAS3, EEPROM_CAS4, EEPROM_CAS5, EEPROM_TEPLOTA1, EEPROM_TEPLOTA2, EEPROM_TEPLOTA3, EEPROM_TEPLOTA4, EEPROM_TEPLOTA5);
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
	if (ukonceni)
	{
		LCD_DrawString("Predcasne ukonceno", 3, 18);
		LCD_DrawString("Kod:", 4, 18);
		LCD_DrawNumber((uint16_t)ukonceni, 4, 50);
	}
	else
	{
		LCD_DrawString("Uspesne ukonceno", 3, 18);
	}
	LCD_DrawString(">Zpet", 7, 0);
	LCD_UpdateScreen();
	uint8_t pocet_pisknuti = 0;
	POCITADLO_VTERINY = 0;
	while (TL_stisk == 0)
	{
		
		if ((pocet_pisknuti <= 2) && (POCITADLO_VTERINY == 2))
		{
			pocet_pisknuti++;
			BEEP_opakovani = 100;
			BZUCAK_BEEP();
			POCITADLO_VTERINY = 0;
		}
	}
	TL_stisk = 0;
}

uint8_t FCE_Pajeni_Start(uint8_t cas1, uint8_t cas2, uint8_t cas3, uint8_t cas4, uint8_t cas5, uint16_t teplota1, uint16_t teplota2, uint16_t teplota3, uint16_t teplota4, uint16_t teplota5){
	uint16_t zmerena_teplota = 0;
	uint16_t CAS_Pajeni_POM = 0;
	uint8_t CHYBY_OBOU_TERM = 0;
	
	uint16_t teplota1_pom = 0;
	uint16_t teplota2_pom = 0;
	uint16_t teplota3_pom = 0;
	uint16_t teplota4_pom = 0;
	uint16_t teplota5_pom = 0;
	
	pocitadlo_spatne_mereni = 0;
	
	poradi_pixelu = 0;
	//stav ukonceni zahlasi kdyz doslo k nedokonceni pajeni napriklad otevrenim vika nebo jinou chybou
	//spusteni elektromagnetu
	PORTB_OUTSET = 0b00000010;
	while (PORTF_IN & (1<<3))//uzavrit viko
	{
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		LCD_DrawString("Zavrete viko", 3, 30);
		
		//FUNKCE KONTROLY TLACITKA PRO OPUSTENI PAJENI A OSTATNICH STAVU PRI KTERYCH DOJDE K VYPNUTI PAJENI
		if (TL_stisk)
		{
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			TL_stisk = 0;
			CAS_Pajeni = 6;
			while (CAS_Pajeni)
			{
				if (TL_stisk)
				{
					TL_stisk = 0;
					return 1;
				}
				
				LCD_DrawString(">Zpet do menu?", 3, 25);
				LCD_DrawString("Pokracovat za:   s", 7, 0);
				LCD_DrawNumber((uint16_t)CAS_Pajeni, 7, 88);
				LCD_UpdateScreen();
			}
		}
		
		
		LCD_UpdateScreen();
	}
	_delay_ms(1000);
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
	
	//Na obrazovku graf v samostatne funkci DRAW graf, ktera vepisuje jednotlive bity aktualni teploty a casu a take muze vykreslovat pozadovany prubeh
	
	
	//spusteni prvniho casu a teploty
	//hlidani poruch pajeni, chyb a stisknuteho tlacitka
	pocitadlo_chyb = 0;
	//SEKCE 1
	CAS_Pajeni = cas1;
	if (cas1 > 1)
	{
	do 
	{
		
		//FUNKCE KONTROLY TLACITKA PRO OPUSTENI PAJENI A OSTATNICH STAVU PRI KTERYCH DOJDE K VYPNUTI PAJENI    POZOR NUTNE VYPNOUT REGULACI A TAK PRI OPUSTENI
		if (TL_stisk)
		{
			uint8_t lcd_backup[sizeof(lcd_buffer)];
			memcpy(lcd_backup, lcd_buffer, sizeof(lcd_buffer));
			CAS_Pajeni_POM = CAS_Pajeni;
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			TL_stisk = 0;
			CAS_Pajeni = 6;
			while (CAS_Pajeni)
			{
				if (TL_stisk)
				{
					VENTILATOR_RIZENI(0);
					Regulace(0,0);
					PORTB_OUTCLR = 0b00000010;
					TL_stisk = 0;
					return 1;
				}
				
				LCD_DrawString(">Zpet do menu?", 3, 25);
				LCD_DrawString("Pokracovat za:   s", 7, 0);
				LCD_DrawNumber((uint16_t)CAS_Pajeni, 7, 88);
				LCD_UpdateScreen();
			}
			memcpy(lcd_buffer, lcd_backup, sizeof(lcd_buffer));
		}
		if (CAS_Pajeni == 0)
		{
			CAS_Pajeni = CAS_Pajeni_POM;
			CAS_Pajeni_POM = 0;
		}
		
		while (PORTF_IN & (1<<3))	//otevreni vika v prubehu
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 2;
		}
		
		//Dalsi chyby_______!!!
		
		CHYBY(CHYBA_TERMOCLANKU1);
		CHYBY_OBOU_TERM = EEPROM_CHYBA;
		CHYBY(CHYBA_TERMOCLANKU2);
		if ((EEPROM_CHYBA == 2) && (CHYBY_OBOU_TERM == 1))
		{
			CHYBY_OBOU_TERM = 1;
		}
		else
		{
			CHYBY_OBOU_TERM = 0;
		}
		CHYBY(CHYBA_VENTILATORU);
		CHYBY(CHYBA_TOP_TEL);
		
		if (CHYBY_OBOU_TERM)//oba termoclanky v chybe
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 3;
		}
		if (EEPROM_CHYBA == 3)//topne teleso v chybe
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 4;
		}
		if (EEPROM_CHYBA == 4)//ventilator v chybe
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 5;
		}
		
		
		
		
			//Podle flagu od preruseni PIT 0,25s
			if (ZmerARegulace_flag)
			{
				ZmerARegulace_flag = 0;
				zmerena_teplota = GET_TEMP();
				if (zmerena_teplota == 0xFFFF)
				{
					VENTILATOR_RIZENI(0);
					Regulace(0,0);
					PORTB_OUTCLR = 0b00000010;
					return 7;
				}
				teplota1_pom = teplota1 - (CAS_Pajeni*teplota1/cas1);
				Regulace(teplota1_pom, zmerena_teplota);								//v dalsich sekcich upravit
				VENTILATOR_RIZENI(EEPROM_VENTILATOR);
				
				int16_t odchylka_P = 80;
				int16_t odchylka_N = 80;
				
				if (odchylka_N > teplota1_pom)
				{
					odchylka_N = teplota1_pom;
				}
				
				if ((zmerena_teplota > (teplota1_pom + odchylka_P)) || (zmerena_teplota < (teplota1_pom - odchylka_N)))//prilis rozdilne teploty realna od zadany
				{
					if (pocitadlo_chyb > 4)
					{
						//vse vypnout
						VENTILATOR_RIZENI(0);
						Regulace(0,0);
						PORTB_OUTCLR = 0b00000010;
						return 6;
					}
					else
					{
						pocitadlo_chyb++;
					}
				}
			}
															//teplota na regulaci: pocatecni teplota, koncova teplota, cas na zmenu; vzorec 
		
		if (DRAW_GRAF_flag)
		{
			DRAW_GRAF_flag = 0;
			DRAW_GRAF(teplota1_pom, zmerena_teplota, teplota1, CAS_Pajeni, (uint16_t)(cas1-CAS_Pajeni), 1);
		}
	
		
	} while (CAS_Pajeni);
	}
	pocitadlo_chyb = 0;
	//SEKCE 2
	CAS_Pajeni = cas2;
	if (cas2 > 1)
	{
	do
	{
	
	//FUNKCE KONTROLY TLACITKA PRO OPUSTENI PAJENI A OSTATNICH STAVU PRI KTERYCH DOJDE K VYPNUTI PAJENI    POZOR NUTNE VYPNOUT REGULACI A TAK PRI OPUSTENI
	if (TL_stisk)
	{
		uint8_t lcd_backup[sizeof(lcd_buffer)];
		memcpy(lcd_backup, lcd_buffer, sizeof(lcd_buffer));
		CAS_Pajeni_POM = CAS_Pajeni;
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		TL_stisk = 0;
		CAS_Pajeni = 6;
		while (CAS_Pajeni)
		{
			if (TL_stisk)
			{
				VENTILATOR_RIZENI(0);
				Regulace(0,0);
				PORTB_OUTCLR = 0b00000010;
				TL_stisk = 0;
				return 1;
			}
			
			LCD_DrawString(">Zpet do menu?", 3, 25);
			LCD_DrawString("Pokracovat za:   s", 7, 0);
			LCD_DrawNumber((uint16_t)CAS_Pajeni, 7, 88);
			LCD_UpdateScreen();
		}
		memcpy(lcd_buffer, lcd_backup, sizeof(lcd_buffer));
	}
	if (CAS_Pajeni == 0)
	{
		CAS_Pajeni = CAS_Pajeni_POM;
		CAS_Pajeni_POM = 0;
	}
	
	while (PORTF_IN & (1<<3))	//otevreni vika v prubehu
	{
		//vse vypnout
		VENTILATOR_RIZENI(0);
		Regulace(0,0);
		PORTB_OUTCLR = 0b00000010;
		return 2;
	}
	
	//Dalsi chyby_______!!!
	
	CHYBY(CHYBA_TERMOCLANKU1);
	CHYBY_OBOU_TERM = EEPROM_CHYBA;
	CHYBY(CHYBA_TERMOCLANKU2);
	if ((EEPROM_CHYBA == 2) && (CHYBY_OBOU_TERM == 1))
	{
		CHYBY_OBOU_TERM = 1;
	}
	else
	{
		CHYBY_OBOU_TERM = 0;
	}
	CHYBY(CHYBA_VENTILATORU);
	CHYBY(CHYBA_TOP_TEL);
	
	if (CHYBY_OBOU_TERM)//oba termoclanky v chybe
	{
		//vse vypnout
		VENTILATOR_RIZENI(0);
		Regulace(0,0);
		PORTB_OUTCLR = 0b00000010;
		return 3;
	}
	if (EEPROM_CHYBA == 3)//topne teleso v chybe
	{
		//vse vypnout
		VENTILATOR_RIZENI(0);
		Regulace(0,0);
		PORTB_OUTCLR = 0b00000010;
		return 4;
	}
	if (EEPROM_CHYBA == 4)//ventilator v chybe
	{
		//vse vypnout
		VENTILATOR_RIZENI(0);
		Regulace(0,0);
		PORTB_OUTCLR = 0b00000010;
		return 5;
	}
	
	
	
	
	//Podle flagu od preruseni PIT 0,25s
	if (ZmerARegulace_flag)
	{
		ZmerARegulace_flag = 0;
		zmerena_teplota = GET_TEMP();
		if (zmerena_teplota == 0xFFFF)
		{
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 7;
		}
		
		
		if (teplota2 > teplota1)
		{
		teplota2_pom = ((teplota2-teplota1) - (CAS_Pajeni*(teplota2-teplota1)/cas2));
		teplota2_pom += teplota1;
		}
		else
		{
			teplota2_pom = teplota2;
		}
		Regulace(teplota2_pom, zmerena_teplota);								//v dalsich sekcich upravit
		VENTILATOR_RIZENI(EEPROM_VENTILATOR);
		
		int16_t odchylka_P = 80;
		int16_t odchylka_N = 80;
		
		if (odchylka_N > teplota2_pom)
		{
			odchylka_N = teplota2_pom;
		}
		
		if ((zmerena_teplota > (teplota2_pom + odchylka_P)) || (zmerena_teplota < (teplota2_pom - odchylka_N)))//prilis rozdilne teploty realna od zadany
		{
			if (pocitadlo_chyb > 4)
			{
				//vse vypnout
				VENTILATOR_RIZENI(0);
				Regulace(0,0);
				PORTB_OUTCLR = 0b00000010;
				return 6;
			}
			else
			{
				pocitadlo_chyb++;
			}
		}
	}
	//teplota na regulaci: pocatecni teplota, koncova teplota, cas na zmenu; vzorec
	
	
	if (DRAW_GRAF_flag)
	{
		DRAW_GRAF_flag = 0;
		DRAW_GRAF(teplota2_pom, zmerena_teplota, teplota2, CAS_Pajeni, (uint16_t)((cas2-CAS_Pajeni) + cas1), 2);
	}
	
	
	} while (CAS_Pajeni);
	}
	pocitadlo_chyb = 0;
	//SEKCE 3
	CAS_Pajeni = cas3;
	if (cas3 > 1)
	{
	do
	{
	
	//FUNKCE KONTROLY TLACITKA PRO OPUSTENI PAJENI A OSTATNICH STAVU PRI KTERYCH DOJDE K VYPNUTI PAJENI    POZOR NUTNE VYPNOUT REGULACI A TAK PRI OPUSTENI
	if (TL_stisk)
	{
		uint8_t lcd_backup[sizeof(lcd_buffer)];
		memcpy(lcd_backup, lcd_buffer, sizeof(lcd_buffer));
		CAS_Pajeni_POM = CAS_Pajeni;
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		TL_stisk = 0;
		CAS_Pajeni = 6;
		while (CAS_Pajeni)
		{
			if (TL_stisk)
			{
				VENTILATOR_RIZENI(0);
				Regulace(0,0);
				PORTB_OUTCLR = 0b00000010;
				TL_stisk = 0;
				return 1;
			}
			
			LCD_DrawString(">Zpet do menu?", 3, 25);
			LCD_DrawString("Pokracovat za:   s", 7, 0);
			LCD_DrawNumber((uint16_t)CAS_Pajeni, 7, 88);
			LCD_UpdateScreen();
		}
		memcpy(lcd_buffer, lcd_backup, sizeof(lcd_buffer));
	}
	if (CAS_Pajeni == 0)
	{
		CAS_Pajeni = CAS_Pajeni_POM;
		CAS_Pajeni_POM = 0;
	}
	
	while (PORTF_IN & (1<<3))	//otevreni vika v prubehu
	{
		//vse vypnout
		VENTILATOR_RIZENI(0);
		Regulace(0,0);
		PORTB_OUTCLR = 0b00000010;
		return 2;
	}
	
	//Dalsi chyby_______!!!
	
	CHYBY(CHYBA_TERMOCLANKU1);
	CHYBY_OBOU_TERM = EEPROM_CHYBA;
	CHYBY(CHYBA_TERMOCLANKU2);
	if ((EEPROM_CHYBA == 2) && (CHYBY_OBOU_TERM == 1))
	{
		CHYBY_OBOU_TERM = 1;
	}
	else
	{
		CHYBY_OBOU_TERM = 0;
	}
	CHYBY(CHYBA_VENTILATORU);
	CHYBY(CHYBA_TOP_TEL);
	
	if (CHYBY_OBOU_TERM)//oba termoclanky v chybe
	{
		//vse vypnout
		VENTILATOR_RIZENI(0);
		Regulace(0,0);
		PORTB_OUTCLR = 0b00000010;
		return 3;
	}
	if (EEPROM_CHYBA == 3)//topne teleso v chybe
	{
		//vse vypnout
		VENTILATOR_RIZENI(0);
		Regulace(0,0);
		PORTB_OUTCLR = 0b00000010;
		return 4;
	}
	if (EEPROM_CHYBA == 4)//ventilator v chybe
	{
		//vse vypnout
		VENTILATOR_RIZENI(0);
		Regulace(0,0);
		PORTB_OUTCLR = 0b00000010;
		return 5;
	}
	
	
	
	
	//Podle flagu od preruseni PIT 0,25s
	if (ZmerARegulace_flag)
	{
		ZmerARegulace_flag = 0;
		zmerena_teplota = GET_TEMP();
		if (zmerena_teplota == 0xFFFF)
		{
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 7;
		}
		
		
	if (teplota3 > teplota2)
	{	
		teplota3_pom = ((teplota3-teplota2) - (CAS_Pajeni*(teplota3-teplota2)/cas3));
		teplota3_pom += teplota2;
	}
	else
	{
		teplota3_pom = teplota3;
	}
		Regulace(teplota3_pom, zmerena_teplota);								//v dalsich sekcich upravit
		VENTILATOR_RIZENI(EEPROM_VENTILATOR);
		
		int16_t odchylka_P = 80;
		int16_t odchylka_N = 80;
		
		if (odchylka_N > teplota3_pom)
		{
			odchylka_N = teplota3_pom;
		}
		
		if ((zmerena_teplota > (teplota3_pom + odchylka_P)) || (zmerena_teplota < (teplota3_pom - odchylka_N)))//prilis rozdilne teploty realna od zadany
		{
			if (pocitadlo_chyb > 4)
			{
				//vse vypnout
				VENTILATOR_RIZENI(0);
				Regulace(0,0);
				PORTB_OUTCLR = 0b00000010;
				return 6;
			}
			else
			{
				pocitadlo_chyb++;
			}
		}
	}
	//teplota na regulaci: pocatecni teplota, koncova teplota, cas na zmenu; vzorec
	
	if (DRAW_GRAF_flag)
	{
		DRAW_GRAF_flag = 0;
		DRAW_GRAF(teplota3_pom, zmerena_teplota, teplota3, CAS_Pajeni, (uint16_t)((cas3-CAS_Pajeni) + cas1 + cas2), 3);
	}
	
	
	} while (CAS_Pajeni);
	}
	pocitadlo_chyb = 0;
	//SEKCE 4
	CAS_Pajeni = cas4;
	if (cas4 > 1)
	{
	do
	{
		
		//FUNKCE KONTROLY TLACITKA PRO OPUSTENI PAJENI A OSTATNICH STAVU PRI KTERYCH DOJDE K VYPNUTI PAJENI    POZOR NUTNE VYPNOUT REGULACI A TAK PRI OPUSTENI
		if (TL_stisk)
		{
			uint8_t lcd_backup[sizeof(lcd_buffer)];
			memcpy(lcd_backup, lcd_buffer, sizeof(lcd_buffer));
			CAS_Pajeni_POM = CAS_Pajeni;
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			TL_stisk = 0;
			CAS_Pajeni = 6;
			while (CAS_Pajeni)
			{
				if (TL_stisk)
				{
					VENTILATOR_RIZENI(0);
					Regulace(0,0);
					PORTB_OUTCLR = 0b00000010;
					TL_stisk = 0;
					return 1;
				}
				
				LCD_DrawString(">Zpet do menu?", 3, 25);
				LCD_DrawString("Pokracovat za:   s", 7, 0);
				LCD_DrawNumber((uint16_t)CAS_Pajeni, 7, 88);
				LCD_UpdateScreen();
			}
			memcpy(lcd_buffer, lcd_backup, sizeof(lcd_buffer));
		}
		if (CAS_Pajeni == 0)
		{
			CAS_Pajeni = CAS_Pajeni_POM;
			CAS_Pajeni_POM = 0;
		}
		
		while (PORTF_IN & (1<<3))	//otevreni vika v prubehu
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 2;
		}
		
		//Dalsi chyby_______!!!
		
		CHYBY(CHYBA_TERMOCLANKU1);
		CHYBY_OBOU_TERM = EEPROM_CHYBA;
		CHYBY(CHYBA_TERMOCLANKU2);
		if ((EEPROM_CHYBA == 2) && (CHYBY_OBOU_TERM == 1))
		{
			CHYBY_OBOU_TERM = 1;
		}
		else
		{
			CHYBY_OBOU_TERM = 0;
		}
		CHYBY(CHYBA_VENTILATORU);
		CHYBY(CHYBA_TOP_TEL);
		
		if (CHYBY_OBOU_TERM)//oba termoclanky v chybe
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 3;
		}
		if (EEPROM_CHYBA == 3)//topne teleso v chybe
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 4;
		}
		if (EEPROM_CHYBA == 4)//ventilator v chybe
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 5;
		}
		
		
		
		
		//Podle flagu od preruseni PIT 0,25s
		if (ZmerARegulace_flag)
		{
			ZmerARegulace_flag = 0;
			zmerena_teplota = GET_TEMP();
			if (zmerena_teplota == 0xFFFF)
			{
				VENTILATOR_RIZENI(0);
				Regulace(0,0);
				PORTB_OUTCLR = 0b00000010;
				return 7;
			}
			
			
			if (teplota4 > teplota3)
			{
			teplota4_pom = ((teplota4-teplota3) - (CAS_Pajeni*(teplota4-teplota3)/cas4));
			teplota4_pom += teplota3;
			}
			else
			{
			teplota4_pom = teplota4;	
			}
			Regulace(teplota4_pom, zmerena_teplota);								//v dalsich sekcich upravit
			VENTILATOR_RIZENI(EEPROM_VENTILATOR);
			
			int16_t odchylka_P = 80;
			int16_t odchylka_N = 80;
			
			if (odchylka_N > teplota4_pom)
			{
				odchylka_N = teplota4_pom;
			}
			
			if ((zmerena_teplota > (teplota4_pom + odchylka_P)) || (zmerena_teplota < (teplota4_pom - odchylka_N)))//prilis rozdilne teploty realna od zadany
			{
				if (pocitadlo_chyb > 4)
				{
					//vse vypnout
					VENTILATOR_RIZENI(0);
					Regulace(0,0);
					PORTB_OUTCLR = 0b00000010;
					return 6;
				}
				else
				{
					pocitadlo_chyb++;
				}
			}
		}
		//teplota na regulaci: pocatecni teplota, koncova teplota, cas na zmenu; vzorec

		
		if (DRAW_GRAF_flag)
		{
			DRAW_GRAF_flag = 0;
			DRAW_GRAF(teplota4_pom, zmerena_teplota, teplota4, CAS_Pajeni, (uint16_t)((cas4-CAS_Pajeni) + cas1 + cas2 + cas3), 4);
		}
		
		
	} while (CAS_Pajeni);
	}
	pocitadlo_chyb = 0;
	//SEKCE 5
	CAS_Pajeni = cas5;
	if (cas5 > 1)
	{
	do
	{
	
	//FUNKCE KONTROLY TLACITKA PRO OPUSTENI PAJENI A OSTATNICH STAVU PRI KTERYCH DOJDE K VYPNUTI PAJENI    POZOR NUTNE VYPNOUT REGULACI A TAK PRI OPUSTENI
	if (TL_stisk)
	{
		uint8_t lcd_backup[sizeof(lcd_buffer)];
		memcpy(lcd_backup, lcd_buffer, sizeof(lcd_buffer));
		CAS_Pajeni_POM = CAS_Pajeni;
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		TL_stisk = 0;
		CAS_Pajeni = 6;
		while (CAS_Pajeni)
		{
			if (TL_stisk)
			{
				VENTILATOR_RIZENI(0);
				Regulace(0,0);
				PORTB_OUTCLR = 0b00000010;
				TL_stisk = 0;
				return 1;
			}
			
			LCD_DrawString(">Zpet do menu?", 3, 25);
			LCD_DrawString("Pokracovat za:   s", 7, 0);
			LCD_DrawNumber((uint16_t)CAS_Pajeni, 7, 88);
			LCD_UpdateScreen();
		}
		memcpy(lcd_buffer, lcd_backup, sizeof(lcd_buffer));
	}
	if (CAS_Pajeni == 0)
	{
		CAS_Pajeni = CAS_Pajeni_POM;
		CAS_Pajeni_POM = 0;
	}
	
	while (PORTF_IN & (1<<3))	//otevreni vika v prubehu
	{
		//vse vypnout
		VENTILATOR_RIZENI(0);
		Regulace(0,0);
		PORTB_OUTCLR = 0b00000010;
		return 2;
	}
	
	//Dalsi chyby_______!!!
	
	CHYBY(CHYBA_TERMOCLANKU1);
	CHYBY_OBOU_TERM = EEPROM_CHYBA;
	CHYBY(CHYBA_TERMOCLANKU2);
	if ((EEPROM_CHYBA == 2) && (CHYBY_OBOU_TERM == 1))
	{
		CHYBY_OBOU_TERM = 1;
	}
	else
	{
		CHYBY_OBOU_TERM = 0;
	}
	CHYBY(CHYBA_VENTILATORU);
	CHYBY(CHYBA_TOP_TEL);
	
	if (CHYBY_OBOU_TERM)//oba termoclanky v chybe
	{
		//vse vypnout
		VENTILATOR_RIZENI(0);
		Regulace(0,0);
		PORTB_OUTCLR = 0b00000010;
		return 3;
	}
	if (EEPROM_CHYBA == 3)//topne teleso v chybe
	{
		//vse vypnout
		VENTILATOR_RIZENI(0);
		Regulace(0,0);
		PORTB_OUTCLR = 0b00000010;
		return 4;
	}
	if (EEPROM_CHYBA == 4)//ventilator v chybe
	{
		//vse vypnout
		VENTILATOR_RIZENI(0);
		Regulace(0,0);
		PORTB_OUTCLR = 0b00000010;
		return 5;
	}
	
	
	
	
	//Podle flagu od preruseni PIT 0,25s
	if (ZmerARegulace_flag)
	{
		ZmerARegulace_flag = 0;
		zmerena_teplota = GET_TEMP();
		if (zmerena_teplota == 0xFFFF)
		{
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 7;
		}
		
		if (teplota5 > teplota4)
		{
		teplota5_pom = ((teplota5-teplota4) - (CAS_Pajeni*(teplota5-teplota4)/cas5));
		teplota5_pom += teplota4;
		}
		else
		{
		teplota5_pom = teplota5;
		}
		Regulace(teplota5_pom, zmerena_teplota);								//v dalsich sekcich upravit
		VENTILATOR_RIZENI(EEPROM_VENTILATOR);
		
		int16_t odchylka_P = 80;
		int16_t odchylka_N = 80;
		
		if (odchylka_N > teplota5_pom)
		{
			odchylka_N = teplota5_pom;
		}
		
		if ((zmerena_teplota > (teplota5_pom + odchylka_P)) || (zmerena_teplota < (teplota5_pom - odchylka_N)))//prilis rozdilne teploty realna od zadany
		{
			if (pocitadlo_chyb > 4)
			{
				//vse vypnout
				VENTILATOR_RIZENI(0);
				Regulace(0,0);
				PORTB_OUTCLR = 0b00000010;
				return 6;
			}
			else
			{
				pocitadlo_chyb++;
			}
		}
	}
	//teplota na regulaci: pocatecni teplota, koncova teplota, cas na zmenu; vzorec
	
	if (DRAW_GRAF_flag)
	{
		DRAW_GRAF_flag = 0;
		DRAW_GRAF(teplota5_pom, zmerena_teplota, teplota5, CAS_Pajeni, (uint16_t)((cas5-CAS_Pajeni) + cas1 + cas2 + cas3 + cas4), 5);
	}
	
		
	} while (CAS_Pajeni);
	}
	
	
	//vypnuti veskerych pouzivanych periferii
	VENTILATOR_RIZENI(0);
	Regulace(0,0);
	PORTB_OUTCLR = 0b00000010;
	return 0;
}

void FCE_Suseni(void){
	
	int8_t MENU_suseni_pozice = 0;
	uint8_t MENU_suseni_vyber = 0;
	uint16_t cas = 0;
	uint16_t teplota = 0;
	uint8_t rychlost_nabehu = 1;
	uint8_t smycka = 1;
	uint8_t hlaska_ukonceni = 0;
	
	while(1){
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		if (TL_stisk)
		{
			TL_stisk = 0;
			MENU_suseni_vyber = 1;
		}
		
		if (MENU_suseni_vyber == 0)
		{
		LCD_DrawString("Suseni:", 0, 0);		
		LCD_DrawString("Cas", 1, 7);
		LCD_DrawString("Teplota", 2, 7);
		LCD_DrawString("Nabeh", 3, 7);
		LCD_DrawString("Start", 4, 7);
		LCD_DrawString("Zpet", 5, 7);	
		LCD_DrawNumber(cas, 1, 84);
		LCD_DrawNumber(teplota, 2, 84);
		LCD_DrawNumber(rychlost_nabehu, 3, 84);
		LCD_DrawString("min", 1, 105);
		LCD_DrawChar(0, 2, 104);
		LCD_DrawString("C", 2, 110);
		LCD_DrawChar(0, 3, 104);
		LCD_DrawString("C/s", 3, 110);
	
	if (ROT_rotace == 1)
	{
		MENU_suseni_pozice++;
		ROT_rotace = 0;
	}
	if (ROT_rotace == -1)
	{
		MENU_suseni_pozice--;
		ROT_rotace = 0;
	}
	if (MENU_suseni_pozice > 4)
	{
		MENU_suseni_pozice = 0;
	}
	if (MENU_suseni_pozice < 0)
	{
		MENU_suseni_pozice = 4;
	}
	
	switch (MENU_suseni_pozice){
		
		case 0:
		LCD_DrawString(">", 1, 0);
		LCD_DrawString(" ", 2, 0);
		LCD_DrawString(" ", 3, 0);
		LCD_DrawString(" ", 4, 0);
		LCD_DrawString(" ", 5, 0);
		break;
		
		case 1:
		LCD_DrawString(" ", 1, 0);
		LCD_DrawString(">", 2, 0);
		LCD_DrawString(" ", 3, 0);
		LCD_DrawString(" ", 4, 0);
		LCD_DrawString(" ", 5, 0);
		break;
		
		case 2:
		LCD_DrawString(" ", 1, 0);
		LCD_DrawString(" ", 2, 0);
		LCD_DrawString(">", 3, 0);
		LCD_DrawString(" ", 4, 0);
		LCD_DrawString(" ", 5, 0);
		break;
		
		case 3:
		LCD_DrawString(" ", 1, 0);
		LCD_DrawString(" ", 2, 0);
		LCD_DrawString(" ", 3, 0);
		LCD_DrawString(">", 4, 0);
		LCD_DrawString(" ", 5, 0);
		break;
		
		case 4:
		LCD_DrawString(" ", 1, 0);
		LCD_DrawString(" ", 2, 0);
		LCD_DrawString(" ", 3, 0);
		LCD_DrawString(" ", 4, 0);
		LCD_DrawString(">", 5, 0);
		break;
		
		default:
		MENU_suseni_pozice = 0;
		break;
	}
		LCD_UpdateScreen();
		}
		else
		{
			smycka = 1;
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			LCD_DrawString("Suseni:", 0, 0);
			LCD_DrawString("Cas", 1, 7);
			LCD_DrawString("Teplota", 2, 7);
			LCD_DrawString("Nabeh", 3, 7);
			LCD_DrawString("Start", 4, 7);
			LCD_DrawString("Zpet", 5, 7);
			LCD_DrawNumber(cas, 1, 84);
			LCD_DrawNumber(teplota, 2, 84);
			LCD_DrawNumber(rychlost_nabehu, 3, 84);
			LCD_DrawString("min", 1, 105);
			LCD_DrawChar(0, 2, 104);
			LCD_DrawString("C", 2, 110);
			LCD_DrawChar(0, 3, 104);
			LCD_DrawString("C/s", 3, 110);
			
			switch (MENU_suseni_pozice){
				
				case 0:
				LCD_DrawChar('>', 1, 78);
				do
				{
					if (ROT_rotace == 1)
					{
						cas -= 5;
						ROT_rotace = 0;
					}
					if (ROT_rotace == -1)
					{
						cas += 5;
						ROT_rotace = 0;
					}
					
					if (cas > 1000)
					{
						cas = 0;
					}
					if ((cas > 960) && (cas < 1000))
					{
						cas = 960;
					}
					
					LCD_DrawString("   ", 1, 84);
					LCD_DrawNumber(cas, 1, 84);
					LCD_UpdateScreen();
					if (TL_stisk)
					{
						TL_stisk = 0;
						smycka = 0;
					}
					
				}while (smycka);

				break;
				
				case 1:
				LCD_DrawChar('>', 2, 78);
				do
				{
					if (ROT_rotace == 1)
					{
						teplota -= 2;
						ROT_rotace = 0;
					}
					if (ROT_rotace == -1)
					{
						teplota += 2;
						ROT_rotace = 0;
					}
					
					if (teplota > 500)
					{
						teplota = 0;
					}
					if ((teplota > 350) && (teplota < 500))
					{
						teplota = 350;
					}
					
					LCD_DrawString("   ", 2, 84);
					LCD_DrawNumber(teplota, 2, 84);
					LCD_UpdateScreen();
					if (TL_stisk)
					{
						TL_stisk = 0;
						smycka = 0;
					}
				}while (smycka);
				break;
				
				case 2:
				LCD_DrawChar('>', 3, 78);
				do
				{
					if (ROT_rotace == 1)
					{
						rychlost_nabehu--;
						ROT_rotace = 0;
					}
					if (ROT_rotace == -1)
					{
						rychlost_nabehu++;
						ROT_rotace = 0;
					}
					
					if (rychlost_nabehu == 0)
					{
						rychlost_nabehu = 1;
					}
					if (rychlost_nabehu > 5)
					{
						rychlost_nabehu = 5;
					}
					
					LCD_DrawString("   ", 3, 84);
					LCD_DrawNumber(rychlost_nabehu, 3, 84);
					LCD_UpdateScreen();
					if (TL_stisk)
					{
						TL_stisk = 0;
						smycka = 0;
					}
				}while (smycka);
				break;
				
				case 3:
				hlaska_ukonceni = FCE_Suseni_Start(cas, teplota, rychlost_nabehu);
				//obrazovka ukonceni na odkliknuti
				memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
				if (hlaska_ukonceni)
				{
					LCD_DrawString("Predcasne ukonceno", 3, 18);
					LCD_DrawString("Kod:", 4, 18);
					LCD_DrawNumber((uint16_t)hlaska_ukonceni, 4, 50);
				}
				else
				{
					LCD_DrawString("Uspesne ukonceno", 3, 18);
				}
				LCD_DrawString(">Zpet", 7, 0);
				LCD_UpdateScreen();
				uint8_t pocet_pisknuti = 0;
				POCITADLO_VTERINY = 0;
				while (TL_stisk == 0)
				{
				
				if ((pocet_pisknuti <= 2) && (POCITADLO_VTERINY == 2))
				{
					pocet_pisknuti++;
					BEEP_opakovani = 100;
					BZUCAK_BEEP();
					POCITADLO_VTERINY = 0;
				}
				}
				TL_stisk = 0;
											//zobraz na LCD hlasku o uspesnem nebo neuspesnem ukonceni a cekej na tlacitko
				break;
				
				case 4:
				MENU_suseni_vyber = 0;
				return;
				break;
				
				default:
				MENU_suseni_vyber = 0;
				break;
			}
			MENU_suseni_vyber = 0;
			LCD_UpdateScreen();
		}
	}
}

uint8_t FCE_Suseni_Start(uint16_t cas, uint16_t teplota, uint8_t rychlost_nabehu){
	uint16_t zmerena_teplota = 0;
	uint16_t CAS_Pajeni_POM = 0;
	uint8_t CHYBY_OBOU_TERM = 0;
	pocitadlo_spatne_mereni = 0;
	//spusteni elektromagnetu
	PORTB_OUTSET = 0b00000010;
	while (PORTF_IN & (1<<3))//uzavrit viko
	{
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		LCD_DrawString("Zavrete viko", 3, 30);
		
		//FUNKCE KONTROLY TLACITKA PRO OPUSTENI PAJENI A OSTATNICH STAVU PRI KTERYCH DOJDE K VYPNUTI PAJENI
		if (TL_stisk)
		{
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			TL_stisk = 0;
			CAS_Pajeni = 6;
			while (CAS_Pajeni)
			{
				if (TL_stisk)
				{
					TL_stisk = 0;
					PORTB_OUTCLR = 0b00000010;
					return 1;
				}
				
				LCD_DrawString(">Zpet do menu?", 3, 25);
				LCD_DrawString("Pokracovat za:   s", 7, 0);
				LCD_DrawNumber((uint16_t)CAS_Pajeni, 7, 88);
				LCD_UpdateScreen();
			}
		}
		LCD_UpdateScreen();
	}
	_delay_ms(1000);
	
	POCITADLO_VTERINY = 0;
	do
	{
		//FUNKCE KONTROLY TLACITKA PRO OPUSTENI PAJENI A OSTATNICH STAVU PRI KTERYCH DOJDE K VYPNUTI PAJENI
		if (TL_stisk)
		{
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			TL_stisk = 0;
			CAS_Pajeni = 6;
			while (CAS_Pajeni)
			{
				if (TL_stisk)
				{
					VENTILATOR_RIZENI(0);
					Regulace(0,0);
					PORTB_OUTCLR = 0b00000010;
					TL_stisk = 0;
					return 1;
				}
				
				LCD_DrawString(">Zpet do menu?", 3, 25);
				LCD_DrawString("Pokracovat za:   s", 7, 0);
				LCD_DrawNumber((uint16_t)CAS_Pajeni, 7, 88);
				LCD_UpdateScreen();
			}
		}
		
		while (PORTF_IN & (1<<3))	//otevreni vika v prubehu
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 2;
		}
		
		//Dalsi chyby_______!!!
		
		CHYBY(CHYBA_TERMOCLANKU1);
		CHYBY_OBOU_TERM = EEPROM_CHYBA;
		CHYBY(CHYBA_TERMOCLANKU2);
		if ((EEPROM_CHYBA == 2) && (CHYBY_OBOU_TERM == 1))
		{
			CHYBY_OBOU_TERM = 1;
		}
		else
		{
			CHYBY_OBOU_TERM = 0;
		}
		CHYBY(CHYBA_VENTILATORU);
		CHYBY(CHYBA_TOP_TEL);
		
		if (CHYBY_OBOU_TERM)//oba termoclanky v chybe
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 3;
		}
		if (EEPROM_CHYBA == 3)//topne teleso v chybe
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 4;
		}
		if (EEPROM_CHYBA == 4)//ventilator v chybe
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 5;
		}
		
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		//zahrivat pouze maximalni rychlsoti nabehu - kazdou sekundu pricist k zadane teplote hodnotu strmosti az do zadaní kkoncove teploty
		if (POCITADLO_VTERINY*rychlost_nabehu >= teplota)
		{
			POCITADLO_VTERINY = (teplota / rychlost_nabehu);
		}
		
		//Podle flagu od preruseni PIT 0,25s
		if (ZmerARegulace_flag)
		{
			ZmerARegulace_flag = 0;
		zmerena_teplota = GET_TEMP();
		if (zmerena_teplota == 0xFFFF)
		{
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 7;
		}
		Regulace((POCITADLO_VTERINY*rychlost_nabehu), zmerena_teplota);
		VENTILATOR_RIZENI(EEPROM_VENTILATOR);
		}
																					
		int16_t odchylka_P = 80;
		int16_t odchylka_N = 80;
		if (odchylka_N > (POCITADLO_VTERINY*rychlost_nabehu))
		{
			odchylka_N = (POCITADLO_VTERINY*rychlost_nabehu);
		}
		if ((zmerena_teplota > ((POCITADLO_VTERINY*rychlost_nabehu) + odchylka_P)) || (zmerena_teplota < ((POCITADLO_VTERINY*rychlost_nabehu) - odchylka_N)))//prilis rozdilne teploty realna od zadany
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 6;
		}
		
		LCD_DrawString("Zahrivani", 3, 30);//Zahrivani
		LCD_DrawString("T zadana:       C", 5, 0);//Teplota zadana				
		LCD_DrawNumber(teplota, 5, 72);
		LCD_DrawChar(0, 5, 90);
		LCD_DrawString("T aktualni:     C", 6, 0);//Teplota aktualni			
		LCD_DrawNumber(zmerena_teplota, 6, 72);
		LCD_DrawChar(0, 6, 90);
		LCD_UpdateScreen();
		
	} while (zmerena_teplota < (teplota-(teplota/10)));
	
	CAS_Pajeni = cas*60;
	do 
	{
		//FUNKCE KONTROLY TLACITKA PRO OPUSTENI PAJENI A OSTATNICH STAVU PRI KTERYCH DOJDE K VYPNUTI PAJENI
		if (TL_stisk)
		{
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			TL_stisk = 0;
			CAS_Pajeni_POM = CAS_Pajeni;
			CAS_Pajeni = 6;
			while (CAS_Pajeni)
			{
				if (TL_stisk)
				{
					VENTILATOR_RIZENI(0);
					Regulace(0,0);
					PORTB_OUTCLR = 0b00000010;
					TL_stisk = 0;
					return 1;
				}
				
				LCD_DrawString(">Zpet do menu?", 3, 25);
				LCD_DrawString("Pokracovat za:   s", 7, 0);
				LCD_DrawNumber((uint16_t)CAS_Pajeni, 7, 88);
				LCD_UpdateScreen();
			}
			CAS_Pajeni = CAS_Pajeni_POM;
		}
		
		//opusteni programu pri chybach, otevrenem viku...
		
		
		while (PORTF_IN & (1<<3))	//otevreni vika v prubehu
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 2;
		}
		
		//Dalsi chyby_______!!!
		
		CHYBY(CHYBA_TERMOCLANKU1);
		CHYBY_OBOU_TERM = EEPROM_CHYBA;
		CHYBY(CHYBA_TERMOCLANKU2);
		if ((EEPROM_CHYBA == 2) && (CHYBY_OBOU_TERM == 1))
		{
			CHYBY_OBOU_TERM = 1;
		}
		else
		{
			CHYBY_OBOU_TERM = 0;
		}
		CHYBY(CHYBA_VENTILATORU);
		CHYBY(CHYBA_TOP_TEL);
		
		if (CHYBY_OBOU_TERM)//oba termoclanky v chybe
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 3;
		}
		if (EEPROM_CHYBA == 3)//topne teleso v chybe
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 4;
		}
		if (EEPROM_CHYBA == 4)//ventilator v chybe
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 5;
		}
		
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		
		//Podle flagu od preruseni PIT 0,25s
		if (ZmerARegulace_flag)
		{
		ZmerARegulace_flag = 0;
		zmerena_teplota = GET_TEMP();
		if (zmerena_teplota == 0xFFFF)
		{
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 7;
		}
		Regulace(teplota, zmerena_teplota);
		VENTILATOR_RIZENI(EEPROM_VENTILATOR);
		}
		
		LCD_DrawString("Probiha suseni", 3, 15);//Probiha suseni	
		LCD_DrawString("T zadana:       C", 5, 0);//Teplota zadana
		LCD_DrawNumber(teplota, 5, 72);
		LCD_DrawChar(0, 5, 90);
		LCD_DrawString("T aktualni:     C", 6, 0);//Teplota aktualni
		LCD_DrawNumber(zmerena_teplota, 6, 72);
		LCD_DrawChar(0, 6, 90);
		LCD_DrawString("Zbyvajici cas:    min", 7, 0);//Zbyvajici cas
		LCD_DrawNumber(((CAS_Pajeni/60) + 1), 7, 90);
		LCD_UpdateScreen();
		
		int16_t odchylka_P = 80;
		int16_t odchylka_N = 80;
		
		if (odchylka_N > teplota)
		{
			odchylka_N = teplota ;
		}
		
		
		if ((zmerena_teplota > (teplota + odchylka_P)) || (zmerena_teplota < (teplota - odchylka_N)))//prilis rozdilne teploty realna od zadany
		{
			//vse vypnout
			VENTILATOR_RIZENI(0);
			Regulace(0,0);
			PORTB_OUTCLR = 0b00000010;
			return 6;
		}
		
	} while (CAS_Pajeni);
	
	//vse vypnout
	
	VENTILATOR_RIZENI(0);
	Regulace(0,0);
	PORTB_OUTCLR = 0b00000010;
	return 0;
}

void FCE_Nastaveni(void){
	
	int8_t MENU_nastaveni_pozice = 0;
	uint8_t MENU_nastaveni_vyber = 0;
	
	while(1){
		if (TL_stisk)
		{
			TL_stisk = 0;
			MENU_nastaveni_vyber = 1;
		}
		
		if (MENU_nastaveni_vyber == 0)
		{
			LCD_DrawString("Nastaveni:", 0, 0);
			LCD_DrawString("Pajeci profil", 1, 7);
			LCD_DrawString("Regulace", 2, 7);
			LCD_DrawString("Bzucak", 3, 7);
			LCD_DrawString("Podsvetleni LDC", 4, 7);
			LCD_DrawString("Ventilator", 5, 7);
			LCD_DrawString("Termoclanek", 6, 7);
			LCD_DrawString("Zpet", 7, 7);
			
			if (ROT_rotace == 1)
			{
				MENU_nastaveni_pozice++;
				ROT_rotace = 0;
			}
			if (ROT_rotace == -1)
			{
				MENU_nastaveni_pozice--;
				ROT_rotace = 0;
			}
			if (MENU_nastaveni_pozice > 6)
			{
				MENU_nastaveni_pozice = 0;
			}
			if (MENU_nastaveni_pozice < 0)
			{
				MENU_nastaveni_pozice = 6;
			}
			
			switch (MENU_nastaveni_pozice){
				
				case 0:
				LCD_DrawString(">", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				LCD_DrawString(" ", 5, 0);
				LCD_DrawString(" ", 6, 0);
				LCD_DrawString(" ", 7, 0);
				break;
				
				case 1:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(">", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				LCD_DrawString(" ", 5, 0);
				LCD_DrawString(" ", 6, 0);
				LCD_DrawString(" ", 7, 0);
				break;
				
				case 2:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(">", 3, 0);
				LCD_DrawString(" ", 4, 0);
				LCD_DrawString(" ", 5, 0);
				LCD_DrawString(" ", 6, 0);
				LCD_DrawString(" ", 7, 0);
				break;
				
				case 3:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(">", 4, 0);
				LCD_DrawString(" ", 5, 0);
				LCD_DrawString(" ", 6, 0);
				LCD_DrawString(" ", 7, 0);
				break;
				
				case 4:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				LCD_DrawString(">", 5, 0);
				LCD_DrawString(" ", 6, 0);
				LCD_DrawString(" ", 7, 0);
				break;
				
				case 5:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				LCD_DrawString(" ", 5, 0);
				LCD_DrawString(">", 6, 0);
				LCD_DrawString(" ", 7, 0);
				break;
				
				case 6:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				LCD_DrawString(" ", 5, 0);
				LCD_DrawString(" ", 6, 0);
				LCD_DrawString(">", 7, 0);
				break;
				
				default:
				MENU_nastaveni_pozice = 0;
				break;
			}
			LCD_UpdateScreen();
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		}
		else
		{
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			if(EEPROM_LCD_BL)
			{
				LCD_DrawString("ON ", 4, 110);
			}
			else
			{
				LCD_DrawString("OFF", 4, 110);
			}
			if(EEPROM_BZUCAK)
			{
				LCD_DrawString("ON ", 3, 110);
			}
			else
			{
				LCD_DrawString("OFF", 3, 110);
			}
			LCD_DrawNumber(EEPROM_VENTILATOR, 5, 74);
			LCD_DrawString("ot/min", 5, 104);
			readEEPROM_flag = 0;
			switch (MENU_nastaveni_pozice){
				
				case 0:
				FCE_Nastaveni_PajeciProfil();
				break;
				
				case 1:
				FCE_Nastaveni_Regulace();
				break;
				
				case 2:
				FCE_Nastaveni_Bzucak();
				break;
				
				case 3:
				FCE_Nastaveni_Podsvetleni();
				break;
				
				case 4:
				FCE_Nastaveni_Ventilator();
				break;
				
				case 5:
				FCE_Nastaveni_Termoclanek();
				break;
				
				case 6:
				MENU_nastaveni_vyber = 0;
				return;
				break;
				
				default:
				MENU_nastaveni_vyber = 0;
				break;
			}
			MENU_nastaveni_vyber = 0;
			LCD_UpdateScreen();
			writeEEPROM();
			readEEPROM_flag = 1;
		}
		if(EEPROM_LCD_BL)
		{
			LCD_DrawString("ON ", 4, 110);
		}
		else
		{
			LCD_DrawString("OFF", 4, 110);
		}
		if(EEPROM_BZUCAK)
		{
			LCD_DrawString("ON ", 3, 110);
		}
		else
		{
			LCD_DrawString("OFF", 3, 110);
		}
		LCD_DrawNumber(EEPROM_VENTILATOR, 5, 74);
		LCD_DrawString("ot/min", 5, 104);
	}	
}
													
void FCE_Nastaveni_PajeciProfil(void){
	
	uint8_t smycka = 1;
	uint8_t EEPROM_CAS1_POM = EEPROM_CAS1;
	uint8_t EEPROM_CAS2_POM = EEPROM_CAS2;
	uint8_t EEPROM_CAS3_POM = EEPROM_CAS3;
	uint8_t EEPROM_CAS4_POM = EEPROM_CAS4;
	uint8_t EEPROM_CAS5_POM = EEPROM_CAS5;
	uint16_t EEPROM_TEPLOTA1_POM = EEPROM_TEPLOTA1;
	uint16_t EEPROM_TEPLOTA2_POM = EEPROM_TEPLOTA2;
	uint16_t EEPROM_TEPLOTA3_POM = EEPROM_TEPLOTA3;
	uint16_t EEPROM_TEPLOTA4_POM = EEPROM_TEPLOTA4;
	uint16_t EEPROM_TEPLOTA5_POM = EEPROM_TEPLOTA5;
	
	if (EEPROM_TEPLOTA1_POM > 350)
	{
		EEPROM_TEPLOTA1_POM = 0;
	}
	if (EEPROM_TEPLOTA2_POM > 350)
	{
		EEPROM_TEPLOTA2_POM = 0;
	}
	if (EEPROM_TEPLOTA3_POM > 350)
	{
		EEPROM_TEPLOTA3_POM = 0;
	}
	if (EEPROM_TEPLOTA4_POM > 350)
	{
		EEPROM_TEPLOTA4_POM = 0;
	}
	if (EEPROM_TEPLOTA5_POM > 350)
	{
		EEPROM_TEPLOTA5_POM = 0;
	}
	
	if (EEPROM_CAS1_POM > 90)
	{
		EEPROM_CAS1_POM = 0;
	}
	if (EEPROM_CAS2_POM > 90)
	{
		EEPROM_CAS2_POM = 0;
	}
	if (EEPROM_CAS3_POM > 90)
	{
		EEPROM_CAS3_POM = 0;
	}
	if (EEPROM_CAS4_POM > 90)
	{
		EEPROM_CAS4_POM = 0;
	}
	if (EEPROM_CAS5_POM > 90)
	{
		EEPROM_CAS5_POM = 0;
	}
	
	
	//TEPLOTA1
	do 
	{
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		
		LCD_DrawLine(0, 54, 0, 0);
		LCD_DrawLine(0, 54, 127, 54);
		LCD_DrawString(">Tep:    C   Cas:   s", 7, 0);
		LCD_DrawChar(0, 7, 48);
		LCD_DrawNumber(EEPROM_TEPLOTA1_POM, 7, 30);
		LCD_DrawNumber(EEPROM_CAS1_POM, 7, 102);
		
		if (ROT_rotace == 1)
		{
			ROT_rotace = 0;
			if (EEPROM_TEPLOTA1_POM > 0)
			{
				EEPROM_TEPLOTA1_POM -= 2;
			}
		}
		if (ROT_rotace == -1)
		{
			ROT_rotace = 0;
			if (EEPROM_TEPLOTA1_POM < 350)
			{
				EEPROM_TEPLOTA1_POM += 2;
			}
		}
		
		LCD_DrawLine(0, 54, (uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15));
		
		LCD_UpdateScreen();
		if (TL_stisk)
		{
			TL_stisk = 0;
			smycka = 0;
		}
	} while (smycka);
	smycka = 1;
	
	//CAS1
	do 
	{
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		
		LCD_DrawLine(0, 54, 0, 0);
		LCD_DrawLine(0, 54, 127, 54);
		LCD_DrawString(" Tep:    C  >Cas:   s", 7, 0);
		LCD_DrawChar(0, 7, 48);
		LCD_DrawNumber(EEPROM_TEPLOTA1_POM, 7, 30);
		LCD_DrawNumber(EEPROM_CAS1_POM, 7, 102);
		
		if (ROT_rotace == 1)
		{
			ROT_rotace = 0;
			if (EEPROM_CAS1_POM > 0)
			{
			EEPROM_CAS1_POM -= 5;
			}
		}
		if (ROT_rotace == -1)
		{
			ROT_rotace = 0;
			if (EEPROM_CAS1_POM < 90)
			{
			EEPROM_CAS1_POM += 5;
			}
		}
		
		LCD_DrawLine(0, 54, (uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15));
		
		LCD_UpdateScreen();
		if (TL_stisk)
		{
			TL_stisk = 0;
			smycka = 0;
		}
	} while (smycka);
	smycka = 1;
	
	//TEPLOTA2
	do 
	{
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		
		LCD_DrawLine(0, 54, 0, 0);
		LCD_DrawLine(0, 54, 127, 54);
		LCD_DrawString(">Tep:    C   Cas:   s", 7, 0);
		LCD_DrawChar(0, 7, 48);
		LCD_DrawNumber(EEPROM_TEPLOTA2_POM, 7, 30);
		LCD_DrawNumber(EEPROM_CAS2_POM, 7, 102);
		
		if (ROT_rotace == 1)
		{
			ROT_rotace = 0;
			if (EEPROM_TEPLOTA2_POM > 0)
			{
				EEPROM_TEPLOTA2_POM -= 2;
			}
		}
		if (ROT_rotace == -1)
		{
			ROT_rotace = 0;
			if (EEPROM_TEPLOTA2_POM < 350)
			{
				EEPROM_TEPLOTA2_POM += 2;
			}
		}
		
		LCD_DrawLine(0, 54, (uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15));
		LCD_DrawLine((uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)), (uint16_t)(54-EEPROM_TEPLOTA2_POM*0.15));
		
		LCD_UpdateScreen();
		if (TL_stisk)
		{
			TL_stisk = 0;
			smycka = 0;
		}
	} while (smycka);
	smycka = 1;
	
	//CAS2
	do 
	{
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		
		LCD_DrawLine(0, 54, 0, 0);
		LCD_DrawLine(0, 54, 127, 54);
		LCD_DrawString(" Tep:    C  >Cas:   s", 7, 0);
		LCD_DrawChar(0, 7, 48);
		LCD_DrawNumber(EEPROM_TEPLOTA2_POM, 7, 30);
		LCD_DrawNumber(EEPROM_CAS2_POM, 7, 102);
		
		if (ROT_rotace == 1)
		{
			ROT_rotace = 0;
			if (EEPROM_CAS2_POM > 0)
			{
				EEPROM_CAS2_POM -= 5;
			}
		}
		if (ROT_rotace == -1)
		{
			ROT_rotace = 0;
			if (EEPROM_CAS2_POM < 90)
			{
				EEPROM_CAS2_POM += 5;
			}
		}
		
		LCD_DrawLine(0, 54, (uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15));
		LCD_DrawLine((uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)), (uint16_t)(54-EEPROM_TEPLOTA2_POM*0.15));
		
		LCD_UpdateScreen();
		if (TL_stisk)
		{
			TL_stisk = 0;
			smycka = 0;
		}
	} while (smycka);
	smycka = 1;
	
	//TEPLOTA3
	do 
	{
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		
		LCD_DrawLine(0, 54, 0, 0);
		LCD_DrawLine(0, 54, 127, 54);
		LCD_DrawString(">Tep:    C   Cas:   s", 7, 0);
		LCD_DrawChar(0, 7, 48);
		LCD_DrawNumber(EEPROM_TEPLOTA3_POM, 7, 30);
		LCD_DrawNumber(EEPROM_CAS3_POM, 7, 102);
		
		if (ROT_rotace == 1)
		{
			ROT_rotace = 0;
			if (EEPROM_TEPLOTA3_POM > 0)
			{
				EEPROM_TEPLOTA3_POM -= 2;
			}
		}
		if (ROT_rotace == -1)
		{
			ROT_rotace = 0;
			if (EEPROM_TEPLOTA3_POM < 350)
			{
				EEPROM_TEPLOTA3_POM += 2;
			}
		}
		
		LCD_DrawLine(0, 54, (uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15));
		LCD_DrawLine((uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)), (uint16_t)(54-EEPROM_TEPLOTA2_POM*0.15));
		LCD_DrawLine((uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)), (uint16_t)(54-EEPROM_TEPLOTA2_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)), (uint16_t)(54-EEPROM_TEPLOTA3_POM*0.15));
		
		LCD_UpdateScreen();
		if (TL_stisk)
		{
			TL_stisk = 0;
			smycka = 0;
		}
	} while (smycka);
	smycka = 1;
	
	//CAS3
	do
	{
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		
		LCD_DrawLine(0, 54, 0, 0);
		LCD_DrawLine(0, 54, 127, 54);
		LCD_DrawString(" Tep:    C  >Cas:   s", 7, 0);
		LCD_DrawChar(0, 7, 48);
		LCD_DrawNumber(EEPROM_TEPLOTA3_POM, 7, 30);
		LCD_DrawNumber(EEPROM_CAS3_POM, 7, 102);
		
		if (ROT_rotace == 1)
		{
			ROT_rotace = 0;
			if (EEPROM_CAS3_POM > 0)
			{
				EEPROM_CAS3_POM -= 5;
			}
		}
		if (ROT_rotace == -1)
		{
			ROT_rotace = 0;
			if (EEPROM_CAS3_POM < 90)
			{
				EEPROM_CAS3_POM += 5;
			}
		}
		
		LCD_DrawLine(0, 54, (uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15));
		LCD_DrawLine((uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)), (uint16_t)(54-EEPROM_TEPLOTA2_POM*0.15));
		LCD_DrawLine((uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)), (uint16_t)(54-EEPROM_TEPLOTA2_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)), (uint16_t)(54-EEPROM_TEPLOTA3_POM*0.15));
		
		LCD_UpdateScreen();
		if (TL_stisk)
		{
			TL_stisk = 0;
			smycka = 0;
		}
	} while (smycka);
	smycka = 1;
	
	//TEPLOTA4
	do
	{
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		
		LCD_DrawLine(0, 54, 0, 0);
		LCD_DrawLine(0, 54, 127, 54);
		LCD_DrawString(">Tep:    C   Cas:   s", 7, 0);
		LCD_DrawChar(0, 7, 48);
		LCD_DrawNumber(EEPROM_TEPLOTA4_POM, 7, 30);
		LCD_DrawNumber(EEPROM_CAS4_POM, 7, 102);
		
		if (ROT_rotace == 1)
		{
			ROT_rotace = 0;
			if (EEPROM_TEPLOTA4_POM > 0)
			{
				EEPROM_TEPLOTA4_POM -= 2;
			}
		}
		if (ROT_rotace == -1)
		{
			ROT_rotace = 0;
			if (EEPROM_TEPLOTA4_POM < 350)
			{
				EEPROM_TEPLOTA4_POM += 2;
			}
		}
		
		LCD_DrawLine(0, 54, (uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15));
		LCD_DrawLine((uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)), (uint16_t)(54-EEPROM_TEPLOTA2_POM*0.15));
		LCD_DrawLine((uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)), (uint16_t)(54-EEPROM_TEPLOTA2_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)), (uint16_t)(54-EEPROM_TEPLOTA3_POM*0.15));
		LCD_DrawLine((uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)), (uint16_t)(54-EEPROM_TEPLOTA3_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)+(0.28*EEPROM_CAS4_POM)), (uint16_t)(54-EEPROM_TEPLOTA4_POM*0.15));
		
		LCD_UpdateScreen();
		if (TL_stisk)
		{
			TL_stisk = 0;
			smycka = 0;
		}
	} while (smycka);
	smycka = 1;
	
	//CAS4
	do
	{
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		
		LCD_DrawLine(0, 54, 0, 0);
		LCD_DrawLine(0, 54, 127, 54);
		LCD_DrawString(" Tep:    C  >Cas:   s", 7, 0);
		LCD_DrawChar(0, 7, 48);
		LCD_DrawNumber(EEPROM_TEPLOTA4_POM, 7, 30);
		LCD_DrawNumber(EEPROM_CAS4_POM, 7, 102);
		
		if (ROT_rotace == 1)
		{
			ROT_rotace = 0;
			if (EEPROM_CAS4_POM > 0)
			{
				EEPROM_CAS4_POM -= 5;
			}
		}
		if (ROT_rotace == -1)
		{
			ROT_rotace = 0;
			if (EEPROM_CAS4_POM < 90)
			{
				EEPROM_CAS4_POM += 5;
			}
		}
		
		LCD_DrawLine(0, 54, (uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15));
		LCD_DrawLine((uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)), (uint16_t)(54-EEPROM_TEPLOTA2_POM*0.15));
		LCD_DrawLine((uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)), (uint16_t)(54-EEPROM_TEPLOTA2_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)), (uint16_t)(54-EEPROM_TEPLOTA3_POM*0.15));
		LCD_DrawLine((uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)), (uint16_t)(54-EEPROM_TEPLOTA3_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)+(0.28*EEPROM_CAS4_POM)), (uint16_t)(54-EEPROM_TEPLOTA4_POM*0.15));
		
		LCD_UpdateScreen();
		if (TL_stisk)
		{
			TL_stisk = 0;
			smycka = 0;
		}
	} while (smycka);
	smycka = 1;
	
	//TEPLOTA5
	do
	{
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		
		LCD_DrawLine(0, 54, 0, 0);
		LCD_DrawLine(0, 54, 127, 54);
		LCD_DrawString(">Tep:    C   Cas:   s", 7, 0);
		LCD_DrawChar(0, 7, 48);
		LCD_DrawNumber(EEPROM_TEPLOTA5_POM, 7, 30);
		LCD_DrawNumber(EEPROM_CAS5_POM, 7, 102);
		
		if (ROT_rotace == 1)
		{
			ROT_rotace = 0;
			if (EEPROM_TEPLOTA5_POM > 0)
			{
				EEPROM_TEPLOTA5_POM -= 2;
			}
		}
		if (ROT_rotace == -1)
		{
			ROT_rotace = 0;
			if (EEPROM_TEPLOTA5_POM < 350)
			{
				EEPROM_TEPLOTA5_POM += 2;
			}
		}
		
		LCD_DrawLine(0, 54, (uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15));
		LCD_DrawLine((uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)), (uint16_t)(54-EEPROM_TEPLOTA2_POM*0.15));
		LCD_DrawLine((uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)), (uint16_t)(54-EEPROM_TEPLOTA2_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)), (uint16_t)(54-EEPROM_TEPLOTA3_POM*0.15));
		LCD_DrawLine((uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)), (uint16_t)(54-EEPROM_TEPLOTA3_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)+(0.28*EEPROM_CAS4_POM)), (uint16_t)(54-EEPROM_TEPLOTA4_POM*0.15));
		LCD_DrawLine((uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)+(0.28*EEPROM_CAS4_POM)), (uint16_t)(54-EEPROM_TEPLOTA4_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)+(0.28*EEPROM_CAS4_POM)+(0.28*EEPROM_CAS5_POM)), (uint16_t)(54-EEPROM_TEPLOTA5_POM*0.15));
		
		LCD_UpdateScreen();
		if (TL_stisk)
		{
			TL_stisk = 0;
			smycka = 0;
		}
	} while (smycka);
	smycka = 1;
	
	//CAS5
	do
	{
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		
		LCD_DrawLine(0, 54, 0, 0);
		LCD_DrawLine(0, 54, 127, 54);
		LCD_DrawString(" Tep:    C  >Cas:   s", 7, 0);
		LCD_DrawChar(0, 7, 48);
		LCD_DrawNumber(EEPROM_TEPLOTA5_POM, 7, 30);
		LCD_DrawNumber(EEPROM_CAS5_POM, 7, 102);
		
		if (ROT_rotace == 1)
		{
			ROT_rotace = 0;
			if (EEPROM_CAS5_POM > 0)
			{
				EEPROM_CAS5_POM -= 5;
			}
		}
		if (ROT_rotace == -1)
		{
			ROT_rotace = 0;
			if (EEPROM_CAS5_POM < 90)
			{
				EEPROM_CAS5_POM += 5;
			}
		}
		
		LCD_DrawLine(0, 54, (uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15));
		LCD_DrawLine((uint16_t)(0.28*EEPROM_CAS1_POM), (uint16_t)(54-EEPROM_TEPLOTA1_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)), (uint16_t)(54-EEPROM_TEPLOTA2_POM*0.15));
		LCD_DrawLine((uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)), (uint16_t)(54-EEPROM_TEPLOTA2_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)), (uint16_t)(54-EEPROM_TEPLOTA3_POM*0.15));
		LCD_DrawLine((uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)), (uint16_t)(54-EEPROM_TEPLOTA3_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)+(0.28*EEPROM_CAS4_POM)), (uint16_t)(54-EEPROM_TEPLOTA4_POM*0.15));
		LCD_DrawLine((uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)+(0.28*EEPROM_CAS4_POM)), (uint16_t)(54-EEPROM_TEPLOTA4_POM*0.15), (uint16_t)((0.28*EEPROM_CAS2_POM)+(0.28*EEPROM_CAS1_POM)+(0.28*EEPROM_CAS3_POM)+(0.28*EEPROM_CAS4_POM)+(0.28*EEPROM_CAS5_POM)), (uint16_t)(54-EEPROM_TEPLOTA5_POM*0.15));
		
		LCD_UpdateScreen();
		if (TL_stisk)
		{
			TL_stisk = 0;
			smycka = 0;
		}
	} while (smycka);
	
	//vypnout nacitani dat z eeprom
	readEEPROM_flag = 0;
	
	EEPROM_TEPLOTA1 = EEPROM_TEPLOTA1_POM;
	EEPROM_TEPLOTA2 = EEPROM_TEPLOTA2_POM;
	EEPROM_TEPLOTA3 = EEPROM_TEPLOTA3_POM;
	EEPROM_TEPLOTA4 = EEPROM_TEPLOTA4_POM;
	EEPROM_TEPLOTA5 = EEPROM_TEPLOTA5_POM;
	
	EEPROM_CAS1 = EEPROM_CAS1_POM;
	EEPROM_CAS2 = EEPROM_CAS2_POM;
	EEPROM_CAS3 = EEPROM_CAS3_POM;
	EEPROM_CAS4 = EEPROM_CAS4_POM;
	EEPROM_CAS5 = EEPROM_CAS5_POM;
	
	writeEEPROM();
	
	//zase zapnout eeprom read
	readEEPROM_flag = 1;
	
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
	LCD_DrawString("Ulozeno!", 3, 40);
	LCD_UpdateScreen();
	_delay_ms(800);
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
}

void FCE_Nastaveni_Regulace(void){
	
	
	int8_t MENU_Nastaveni_Regulace_pozice = 0;
	uint8_t MENU_Nastaveni_Regulace_vyber = 0;
	uint8_t smycka = 1;
	
	uint8_t EEPROM_PID_P_POM = EEPROM_PID_P;
	uint8_t EEPROM_PID_I_POM = EEPROM_PID_I;
	uint8_t EEPROM_PID_D_POM = EEPROM_PID_D;
	
	while(1){
		if (TL_stisk)
		{
			TL_stisk = 0;
			MENU_Nastaveni_Regulace_vyber = 1;
		}
		
		if (MENU_Nastaveni_Regulace_vyber == 0)
		{
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			LCD_DrawString("Nastaveni-Regulace:", 0, 0);
			LCD_DrawString("P", 1, 7);
			LCD_DrawString("I", 2, 7);
			LCD_DrawString("D", 3, 7);
			LCD_DrawString("Zpet", 4, 7);
			
			LCD_DrawNumber(EEPROM_PID_P_POM, 1, 32);
			LCD_DrawNumber(EEPROM_PID_I_POM, 2, 32);
			LCD_DrawNumber(EEPROM_PID_D_POM, 3, 32);
			
			if (ROT_rotace == 1)
			{
				MENU_Nastaveni_Regulace_pozice++;
				ROT_rotace = 0;
			}
			if (ROT_rotace == -1)
			{
				MENU_Nastaveni_Regulace_pozice--;
				ROT_rotace = 0;
			}
			if (MENU_Nastaveni_Regulace_pozice > 3)
			{
				MENU_Nastaveni_Regulace_pozice = 0;
			}
			if (MENU_Nastaveni_Regulace_pozice < 0)
			{
				MENU_Nastaveni_Regulace_pozice = 3;
			}
			
			switch (MENU_Nastaveni_Regulace_pozice){
				
				case 0:
				LCD_DrawString(">", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				break;
				
				case 1:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(">", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				break;
				
				case 2:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(">", 3, 0);
				LCD_DrawString(" ", 4, 0);
				break;
				
				case 3:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(">", 4, 0);
				break;
				
				default:
				MENU_Nastaveni_Regulace_pozice = 0;
				break;
			}
		}
		else
		{
			smycka = 1;
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			
			LCD_DrawString("Nastaveni-Regulace:", 0, 0);
			LCD_DrawString("P", 1, 7);
			LCD_DrawString("I", 2, 7);
			LCD_DrawString("D", 3, 7);
			LCD_DrawString("Zpet", 4, 7);
			LCD_DrawNumber(EEPROM_PID_P_POM, 1, 32);
			LCD_DrawNumber(EEPROM_PID_I_POM, 2, 32);
			LCD_DrawNumber(EEPROM_PID_D_POM, 3, 32);
			
			switch (MENU_Nastaveni_Regulace_pozice){
				
				case 0:
				LCD_DrawChar('>', 1, 25);
				do
				{
					if (ROT_rotace == 1)
					{
						EEPROM_PID_P_POM -= 1;
						ROT_rotace = 0;
					}
					if (ROT_rotace == -1)
					{
						EEPROM_PID_P_POM += 1;
						ROT_rotace = 0;
					}
					
					if (EEPROM_PID_P_POM > 110)
					{
						EEPROM_PID_P_POM = 0;
					}
					if ((EEPROM_PID_P_POM > 100) && (EEPROM_PID_P_POM < 110))
					{
						EEPROM_PID_P_POM = 100;
					}
					
					LCD_DrawString("   ", 1, 32);
					LCD_DrawNumber((uint16_t)EEPROM_PID_P_POM, 1, 32);
					LCD_UpdateScreen();
					if (TL_stisk)
					{
						TL_stisk = 0;
						smycka = 0;
					}
					
				}while (smycka);
				break;
				
				case 1:
				LCD_DrawChar('>', 2, 25);
				do
				{
					if (ROT_rotace == 1)
					{
						EEPROM_PID_I_POM -= 1;
						ROT_rotace = 0;
					}
					if (ROT_rotace == -1)
					{
						EEPROM_PID_I_POM += 1;
						ROT_rotace = 0;
					}
					
					if (EEPROM_PID_I_POM > 110)
					{
						EEPROM_PID_I_POM = 0;
					}
					if ((EEPROM_PID_I_POM > 100) && (EEPROM_PID_I_POM < 110))
					{
						EEPROM_PID_I_POM = 100;
					}
					
					LCD_DrawString("   ", 2, 32);
					LCD_DrawNumber((uint16_t)EEPROM_PID_I_POM, 2, 32);
					LCD_UpdateScreen();
					if (TL_stisk)
					{
						TL_stisk = 0;
						smycka = 0;
					}
					
				}while (smycka);
				break;
				
				case 2:
				LCD_DrawChar('>', 3, 25);
				do
				{
					if (ROT_rotace == 1)
					{
						EEPROM_PID_D_POM -= 1;
						ROT_rotace = 0;
					}
					if (ROT_rotace == -1)
					{
						EEPROM_PID_D_POM += 1;
						ROT_rotace = 0;
					}
					
					if (EEPROM_PID_D_POM > 110)
					{
						EEPROM_PID_D_POM = 0;
					}
					if ((EEPROM_PID_D_POM > 100) && (EEPROM_PID_D_POM < 110))
					{
						EEPROM_PID_D_POM = 100;
					}
					
					LCD_DrawString("   ", 3, 32);
					LCD_DrawNumber((uint16_t)EEPROM_PID_D_POM, 3, 32);
					LCD_UpdateScreen();
					if (TL_stisk)
					{
						TL_stisk = 0;
						smycka = 0;
					}
					
				}while (smycka);
				break;
				
				case 3:
				MENU_Nastaveni_Regulace_vyber = 0;
				readEEPROM_flag = 0;
				EEPROM_PID_P = EEPROM_PID_P_POM;
				EEPROM_PID_I = EEPROM_PID_I_POM;
				EEPROM_PID_D = EEPROM_PID_D_POM;
				writeEEPROM();
				readEEPROM_flag = 1;
				return;
				break;
				
				default:
				MENU_Nastaveni_Regulace_vyber = 0;
				break;
				
				
			}
			MENU_Nastaveni_Regulace_vyber = 0;
		}
		LCD_UpdateScreen();
	}
}

void FCE_Nastaveni_Bzucak(void){
	if (EEPROM_BZUCAK)
	{
		EEPROM_BZUCAK = 0;
	}
	else
	{
		EEPROM_BZUCAK = 1;
	}
}

void FCE_Nastaveni_Podsvetleni(void){
	if (EEPROM_LCD_BL)
	{
		EEPROM_LCD_BL = 0;
	}
	else
	{
		EEPROM_LCD_BL = 1;
	}
}

void FCE_Nastaveni_Ventilator(void){
	uint8_t smycka = 1;
	uint16_t EEPROM_VENTILATOR_POM = EEPROM_VENTILATOR;
	LCD_DrawString("Nastaveni:", 0, 0);
	LCD_DrawString("Pajeci profil", 1, 7);
	LCD_DrawString("Regulace", 2, 7);
	LCD_DrawString("Bzucak", 3, 7);
	LCD_DrawString("Podsvetleni LDC", 4, 7);
	LCD_DrawString("Ventilator", 5, 7);
	LCD_DrawString("Termoclanek", 6, 7);
	LCD_DrawString("Zpet", 7, 7);
	LCD_DrawString(">     ", 5, 68);
	
	do 
	{
			if (ROT_rotace == 1)
			{
				EEPROM_VENTILATOR_POM -= 100;
				ROT_rotace = 0;
			}
			if (ROT_rotace == -1)
			{
				EEPROM_VENTILATOR_POM += 100;
				ROT_rotace = 0;
			}
			
			if (EEPROM_VENTILATOR_POM > 11000)
			{
				EEPROM_VENTILATOR_POM = 0;
			}
			if ((EEPROM_VENTILATOR_POM < 1000) && (EEPROM_VENTILATOR_POM > 500))
			{
				EEPROM_VENTILATOR_POM = 0;
			}
			if ((EEPROM_VENTILATOR_POM > 0) && (EEPROM_VENTILATOR_POM < 500))
			{
				EEPROM_VENTILATOR_POM = 1000;
			}
			if ((EEPROM_VENTILATOR_POM > 10000) && (EEPROM_VENTILATOR_POM < 11000))
			{
				EEPROM_VENTILATOR_POM = 10000;
			}
			
			LCD_DrawString("     ", 5, 74);
			LCD_DrawNumber(EEPROM_VENTILATOR_POM, 5, 74);
			LCD_UpdateScreen();
			if (TL_stisk)
			{
				TL_stisk = 0;
				smycka = 0;
			}
	} while (smycka);
	readEEPROM_flag = 0;
	EEPROM_VENTILATOR = EEPROM_VENTILATOR_POM;
	writeEEPROM();
	readEEPROM_flag = 1;
}

void FCE_Nastaveni_Termoclanek(void){
	
		int8_t MENU_Nastaveni_Termoclanek_pozice = 0;
		uint8_t MENU_Nastaveni_Termoclanek_vyber = 0;
		uint8_t smycka = 1;
		
		uint8_t EEPROM_TERMTYPE1_POM = EEPROM_TERMTYPE1;
		uint8_t EEPROM_TERMTYPE2_POM = EEPROM_TERMTYPE2;
		uint8_t EEPROM_TERMMASK1_POM = EEPROM_TERMMASK1;
		uint8_t EEPROM_TERMMASK2_POM = EEPROM_TERMMASK2;
		
		while(1){
			if (TL_stisk)
			{
				TL_stisk = 0;
				MENU_Nastaveni_Termoclanek_vyber = 1;
			}
			
			if (MENU_Nastaveni_Termoclanek_vyber == 0)
			{
				memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
				LCD_DrawString("Nastaveni-Term:", 0, 0);
				LCD_DrawString("T1 typ", 1, 7);
				LCD_DrawString("T2 typ", 2, 7);
				LCD_DrawString("T1 mask", 3, 7);
				LCD_DrawString("T2 mask", 4, 7);
				LCD_DrawString("Zpet", 5, 7);
				
				switch (EEPROM_TERMTYPE1_POM)
				{
					case 0:
					LCD_DrawString("typ B", 1, 54);
					break;
					
					case 1:
					LCD_DrawString("typ E", 1, 54);
					break;
					
					case 2:
					LCD_DrawString("typ J", 1, 54);
					break;
					
					case 3:
					LCD_DrawString("typ K", 1, 54);
					break;
					
					case 4:
					LCD_DrawString("typ N", 1, 54);
					break;
					
					case 5:
					LCD_DrawString("typ R", 1, 54);
					break;
					
					case 6:
					LCD_DrawString("typ S", 1, 54);
					break;
					
					case 7:
					LCD_DrawString("typ T", 1, 54);
					break;
					
					case 8:
					LCD_DrawString("mod U G=8", 1, 54);
					break;
					
					case 12:
					LCD_DrawString("mod U G=32", 1, 54);
					break;
					
					default:
					LCD_DrawString("???", 1, 54);
					break;
				}
				
				switch (EEPROM_TERMTYPE2_POM)
				{
					case 0:
					LCD_DrawString("typ B", 2, 54);
					break;
					
					case 1:
					LCD_DrawString("typ E", 2, 54);
					break;
					
					case 2:
					LCD_DrawString("typ J", 2, 54);
					break;
					
					case 3:
					LCD_DrawString("typ K", 2, 54);
					break;
					
					case 4:
					LCD_DrawString("typ N", 2, 54);
					break;
					
					case 5:
					LCD_DrawString("typ R", 2, 54);
					break;
					
					case 6:
					LCD_DrawString("typ S", 2, 54);
					break;
					
					case 7:
					LCD_DrawString("typ T", 2, 54);
					break;
					
					case 8:
					LCD_DrawString("mod U G=8", 2, 54);
					break;
					
					case 12:
					LCD_DrawString("mod U G=32", 2, 54);
					break;
					
					default:
					LCD_DrawString("???", 2, 54);
					break;
				}
				
				uint16_t mask_1_1 = (EEPROM_TERMMASK1_POM & 0b00001111);
				uint16_t mask_1_2 = ((EEPROM_TERMMASK1_POM & 0b11110000) >> 4);
				uint16_t mask_2_1 = (EEPROM_TERMMASK2_POM & 0b00001111);
				uint16_t mask_2_2 = ((EEPROM_TERMMASK2_POM & 0b11110000) >> 4);
				
				uint16_t mask_1_1_bin = binarniNaDesitkove(mask_1_1);
				uint16_t mask_1_2_bin = binarniNaDesitkove(mask_1_2);
				uint16_t mask_2_1_bin = binarniNaDesitkove(mask_2_1);
				uint16_t mask_2_2_bin = binarniNaDesitkove(mask_2_2);
				
				LCD_DrawNumberFixed(mask_1_1_bin, 3, 78, 4);
				LCD_DrawNumberFixed(mask_1_2_bin, 3, 54, 4);
				LCD_DrawNumberFixed(mask_2_1_bin, 4, 78, 4);
				LCD_DrawNumberFixed(mask_2_2_bin, 4, 54, 4);
				
				if (ROT_rotace == 1)
				{
					MENU_Nastaveni_Termoclanek_pozice++;
					ROT_rotace = 0;
				}
				if (ROT_rotace == -1)
				{
					MENU_Nastaveni_Termoclanek_pozice--;
					ROT_rotace = 0;
				}
				if (MENU_Nastaveni_Termoclanek_pozice > 4)
				{
					MENU_Nastaveni_Termoclanek_pozice = 0;
				}
				if (MENU_Nastaveni_Termoclanek_pozice < 0)
				{
					MENU_Nastaveni_Termoclanek_pozice = 4;
				}
				
				switch (MENU_Nastaveni_Termoclanek_pozice){
					
					case 0:
					LCD_DrawString(">", 1, 0);
					LCD_DrawString(" ", 2, 0);
					LCD_DrawString(" ", 3, 0);
					LCD_DrawString(" ", 4, 0);
					LCD_DrawString(" ", 5, 0);
					break;
					
					case 1:
					LCD_DrawString(" ", 1, 0);
					LCD_DrawString(">", 2, 0);
					LCD_DrawString(" ", 3, 0);
					LCD_DrawString(" ", 4, 0);
					LCD_DrawString(" ", 5, 0);
					break;
					
					case 2:
					LCD_DrawString(" ", 1, 0);
					LCD_DrawString(" ", 2, 0);
					LCD_DrawString(">", 3, 0);
					LCD_DrawString(" ", 4, 0);
					LCD_DrawString(" ", 5, 0);
					break;
					
					case 3:
					LCD_DrawString(" ", 1, 0);
					LCD_DrawString(" ", 2, 0);
					LCD_DrawString(" ", 3, 0);
					LCD_DrawString(">", 4, 0);
					LCD_DrawString(" ", 5, 0);
					break;
					
					case 4:
					LCD_DrawString(" ", 1, 0);
					LCD_DrawString(" ", 2, 0);
					LCD_DrawString(" ", 3, 0);
					LCD_DrawString(" ", 4, 0);
					LCD_DrawString(">", 5, 0);
					break;
					
					default:
					MENU_Nastaveni_Termoclanek_pozice = 0;
					break;
				}
			}
			else
			{
				smycka = 1;
				memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
				LCD_DrawString("Nastaveni-Term:", 0, 0);
				LCD_DrawString("Nastaveni-Term:", 0, 0);
				LCD_DrawString("T1 typ", 1, 7);
				LCD_DrawString("T2 typ", 2, 7);
				LCD_DrawString("T1 mask", 3, 7);
				LCD_DrawString("T2 mask", 4, 7);
				LCD_DrawString("Zpet", 5, 7);
				
								switch (EEPROM_TERMTYPE1_POM)
								{
									case 0:
									LCD_DrawString("typ B", 1, 54);
									break;
									
									case 1:
									LCD_DrawString("typ E", 1, 54);
									break;
									
									case 2:
									LCD_DrawString("typ J", 1, 54);
									break;
									
									case 3:
									LCD_DrawString("typ K", 1, 54);
									break;
									
									case 4:
									LCD_DrawString("typ N", 1, 54);
									break;
									
									case 5:
									LCD_DrawString("typ R", 1, 54);
									break;
									
									case 6:
									LCD_DrawString("typ S", 1, 54);
									break;
									
									case 7:
									LCD_DrawString("typ T", 1, 54);
									break;
									
									case 8:
									LCD_DrawString("mod U G=8", 1, 54);
									break;
									
									case 12:
									LCD_DrawString("mod U G=32", 1, 54);
									break;
									
									default:
									LCD_DrawString("???", 1, 54);
									break;
								}
								
								switch (EEPROM_TERMTYPE2_POM)
								{
									case 0:
									LCD_DrawString("typ B", 2, 54);
									break;
									
									case 1:
									LCD_DrawString("typ E", 2, 54);
									break;
									
									case 2:
									LCD_DrawString("typ J", 2, 54);
									break;
									
									case 3:
									LCD_DrawString("typ K", 2, 54);
									break;
									
									case 4:
									LCD_DrawString("typ N", 2, 54);
									break;
									
									case 5:
									LCD_DrawString("typ R", 2, 54);
									break;
									
									case 6:
									LCD_DrawString("typ S", 2, 54);
									break;
									
									case 7:
									LCD_DrawString("typ T", 2, 54);
									break;
									
									case 8:
									LCD_DrawString("mod U G=8", 2, 54);
									break;
									
									case 12:
									LCD_DrawString("mod U G=32", 2, 54);
									break;
									
									default:
									LCD_DrawString("???", 2, 54);
									break;
								}
								
								uint16_t mask_1_1 = (EEPROM_TERMMASK1_POM & 0b00001111);
								uint16_t mask_1_2 = ((EEPROM_TERMMASK1_POM & 0b11110000) >> 4);
								uint16_t mask_2_1 = (EEPROM_TERMMASK2_POM & 0b00001111);
								uint16_t mask_2_2 = ((EEPROM_TERMMASK2_POM & 0b11110000) >> 4);
								
								uint16_t mask_1_1_bin = binarniNaDesitkove(mask_1_1);
								uint16_t mask_1_2_bin = binarniNaDesitkove(mask_1_2);
								uint16_t mask_2_1_bin = binarniNaDesitkove(mask_2_1);
								uint16_t mask_2_2_bin = binarniNaDesitkove(mask_2_2);
								
								LCD_DrawNumberFixed(mask_1_1_bin, 3, 78, 4);
								LCD_DrawNumberFixed(mask_1_2_bin, 3, 54, 4);
								LCD_DrawNumberFixed(mask_2_1_bin, 4, 78, 4);
								LCD_DrawNumberFixed(mask_2_2_bin, 4, 54, 4);
				
				switch (MENU_Nastaveni_Termoclanek_pozice){
					
					case 0:
					LCD_DrawChar('>', 1, 48);
					do
					{
						if (ROT_rotace == 1)
						{
							EEPROM_TERMTYPE1_POM -= 1;
							ROT_rotace = 0;
						}
						if (ROT_rotace == -1)
						{
							EEPROM_TERMTYPE1_POM += 1;
							ROT_rotace = 0;
						}
						if (EEPROM_TERMTYPE1_POM == 255)
						{
							EEPROM_TERMTYPE1_POM = 0;
						}
						if (EEPROM_TERMTYPE1_POM == 9)
						{
							EEPROM_TERMTYPE1_POM = 12;
						}
						if (EEPROM_TERMTYPE1_POM == 11)
						{
							EEPROM_TERMTYPE1_POM = 8;
						}
						if (EEPROM_TERMTYPE1_POM == 13)
						{
							EEPROM_TERMTYPE1_POM = 12;
						}
						
						LCD_DrawString("          ", 1, 54);
						
						switch (EEPROM_TERMTYPE1_POM)
						{
							case 0:
							LCD_DrawString("typ B", 1, 54);
							break;
							
							case 1:
							LCD_DrawString("typ E", 1, 54);
							break;
							
							case 2:
							LCD_DrawString("typ J", 1, 54);
							break;
							
							case 3:
							LCD_DrawString("typ K", 1, 54);
							break;
							
							case 4:
							LCD_DrawString("typ N", 1, 54);
							break;
							
							case 5:
							LCD_DrawString("typ R", 1, 54);
							break;
							
							case 6:
							LCD_DrawString("typ S", 1, 54);
							break;
							
							case 7:
							LCD_DrawString("typ T", 1, 54);
							break;
							
							case 8:
							LCD_DrawString("mod U G=8", 1, 54);
							break;
							
							case 12:
							LCD_DrawString("mod U G=32", 1, 54);
							break;
							
							default:
							LCD_DrawString("???", 1, 54);
							break;
						}
						LCD_UpdateScreen();
						if (TL_stisk)
						{
							TL_stisk = 0;
							smycka = 0;
						}
					}while (smycka);
					break;
					
					case 1:
					LCD_DrawChar('>', 2, 48);
					do
					{
						if (ROT_rotace == 1)
						{
							EEPROM_TERMTYPE2_POM -= 1;
							ROT_rotace = 0;
						}
						if (ROT_rotace == -1)
						{
							EEPROM_TERMTYPE2_POM += 1;
							ROT_rotace = 0;
						}
						if (EEPROM_TERMTYPE2_POM == 255)
						{
							EEPROM_TERMTYPE2_POM = 0;
						}
						if (EEPROM_TERMTYPE2_POM == 9)
						{
							EEPROM_TERMTYPE2_POM = 12;
						}
						if (EEPROM_TERMTYPE2_POM == 11)
						{
							EEPROM_TERMTYPE2_POM = 8;
						}
						if (EEPROM_TERMTYPE2_POM == 13)
						{
							EEPROM_TERMTYPE2_POM = 12;
						}
						
						LCD_DrawString("          ", 2, 54);
						
						switch (EEPROM_TERMTYPE2_POM)
						{
							case 0:
							LCD_DrawString("typ B", 2, 54);
							break;
							
							case 1:
							LCD_DrawString("typ E", 2, 54);
							break;
							
							case 2:
							LCD_DrawString("typ J", 2, 54);
							break;
							
							case 3:
							LCD_DrawString("typ K", 2, 54);
							break;
							
							case 4:
							LCD_DrawString("typ N", 2, 54);
							break;
							
							case 5:
							LCD_DrawString("typ R", 2, 54);
							break;
							
							case 6:
							LCD_DrawString("typ S", 2, 54);
							break;
							
							case 7:
							LCD_DrawString("typ T", 2, 54);
							break;
							
							case 8:
							LCD_DrawString("mod U G=8", 2, 54);
							break;
							
							case 12:
							LCD_DrawString("mod U G=32", 2, 54);
							break;
							
							default:
							LCD_DrawString("???", 2, 54);
							break;
						}
						LCD_UpdateScreen();
						if (TL_stisk)
						{
							TL_stisk = 0;
							smycka = 0;
						}
					}while (smycka);
					break;
					
					case 2:
					LCD_DrawChar('>', 3, 48);
					do
					{
						if (ROT_rotace == 1)
						{
							EEPROM_TERMMASK1_POM -= 1;
							ROT_rotace = 0;
						}
						if (ROT_rotace == -1)
						{
							EEPROM_TERMMASK1_POM += 1;
							ROT_rotace = 0;
						}
					
					LCD_DrawString("        ", 3, 54);
					uint16_t mask_1_1 = (EEPROM_TERMMASK1_POM & 0b00001111);
					uint16_t mask_1_2 = ((EEPROM_TERMMASK1_POM & 0b11110000) >> 4);
					uint16_t mask_1_1_bin = binarniNaDesitkove(mask_1_1);
					uint16_t mask_1_2_bin = binarniNaDesitkove(mask_1_2);
					LCD_DrawNumberFixed(mask_1_1_bin, 3, 78, 4);
					LCD_DrawNumberFixed(mask_1_2_bin, 3, 54, 4);
					LCD_UpdateScreen();
					if (TL_stisk)
					{
						TL_stisk = 0;
						smycka = 0;
					}
				}while (smycka);
					break;
					
					case 3:
					LCD_DrawChar('>', 4, 48);
					do
					{
						if (ROT_rotace == 1)
						{
							EEPROM_TERMMASK2_POM -= 1;
							ROT_rotace = 0;
						}
						if (ROT_rotace == -1)
						{
							EEPROM_TERMMASK2_POM += 1;
							ROT_rotace = 0;
						}
					
					LCD_DrawString("        ", 4, 54);
					uint16_t mask_2_1 = (EEPROM_TERMMASK2_POM & 0b00001111);
					uint16_t mask_2_2 = ((EEPROM_TERMMASK2_POM & 0b11110000) >> 4);
					uint16_t mask_2_1_bin = binarniNaDesitkove(mask_2_1);
					uint16_t mask_2_2_bin = binarniNaDesitkove(mask_2_2);
					LCD_DrawNumberFixed(mask_2_1_bin, 4, 78, 4);
					LCD_DrawNumberFixed(mask_2_2_bin, 4, 54, 4);
					LCD_UpdateScreen();
					if (TL_stisk)
					{
						TL_stisk = 0;
						smycka = 0;
					}
				}while (smycka);
					break;
					
					case 4:
					MENU_Nastaveni_Termoclanek_vyber = 0;
					readEEPROM_flag = 0;
					EEPROM_TERMTYPE1 = EEPROM_TERMTYPE1_POM;
					EEPROM_TERMTYPE2 = EEPROM_TERMTYPE2_POM;
					EEPROM_TERMMASK1 = EEPROM_TERMMASK1_POM;
					EEPROM_TERMMASK2 = EEPROM_TERMMASK2_POM;
					writeEEPROM();
					readEEPROM_flag = 1;
					TEMP_INIT();
					return;
					break;
					
					default:
					MENU_Nastaveni_Termoclanek_vyber = 0;
					break;
				}
				MENU_Nastaveni_Termoclanek_vyber = 0;
			}
			LCD_UpdateScreen();
		}
}

void FCE_Diagnostika(void){
	
	int8_t MENU_diagnostika_pozice = 0;
	uint8_t MENU_diagnostika_vyber = 0;
	
	while(1){
		if (TL_stisk)
		{
			TL_stisk = 0;
			MENU_diagnostika_vyber = 1;
		}
		
		if (MENU_diagnostika_vyber == 0)
		{
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			LCD_DrawString("Diagnostika:", 0, 0);
			LCD_DrawString("Termoclanky", 1, 7);
			LCD_DrawString("Topne teleso", 2, 7);
			LCD_DrawString("Ventilator", 3, 7);
			LCD_DrawString("Viko", 4, 7);
			LCD_DrawString("Vystupy", 5, 7);
			LCD_DrawString("Info", 6, 7);
			LCD_DrawString("Zpet", 7, 7);
			
			if (ROT_rotace == 1)
			{
				MENU_diagnostika_pozice++;
				ROT_rotace = 0;
			}
			if (ROT_rotace == -1)
			{
				MENU_diagnostika_pozice--;
				ROT_rotace = 0;
			}
			if (MENU_diagnostika_pozice > 6)
			{
				MENU_diagnostika_pozice = 0;
			}
			if (MENU_diagnostika_pozice < 0)
			{
				MENU_diagnostika_pozice = 6;
			}
			
			switch (MENU_diagnostika_pozice){
				
				case 0:
				LCD_DrawString(">", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				LCD_DrawString(" ", 5, 0);
				LCD_DrawString(" ", 6, 0);
				LCD_DrawString(" ", 7, 0);
				break;
				
				case 1:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(">", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				LCD_DrawString(" ", 5, 0);
				LCD_DrawString(" ", 6, 0);
				LCD_DrawString(" ", 7, 0);
				break;
				
				case 2:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(">", 3, 0);
				LCD_DrawString(" ", 4, 0);
				LCD_DrawString(" ", 5, 0);
				LCD_DrawString(" ", 6, 0);
				LCD_DrawString(" ", 7, 0);
				break;
				
				case 3:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(">", 4, 0);
				LCD_DrawString(" ", 5, 0);
				LCD_DrawString(" ", 6, 0);
				LCD_DrawString(" ", 7, 0);
				break;
				
				case 4:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				LCD_DrawString(">", 5, 0);
				LCD_DrawString(" ", 6, 0);
				LCD_DrawString(" ", 7, 0);
				break;
				
				case 5:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				LCD_DrawString(" ", 5, 0);
				LCD_DrawString(">", 6, 0);
				LCD_DrawString(" ", 7, 0);
				break;
				
				case 6:
				LCD_DrawString(" ", 1, 0);
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(" ", 3, 0);
				LCD_DrawString(" ", 4, 0);
				LCD_DrawString(" ", 5, 0);
				LCD_DrawString(" ", 6, 0);
				LCD_DrawString(">", 7, 0);
				break;
				
				default:
				MENU_diagnostika_pozice = 0;
				break;
				
			}
			LCD_UpdateScreen();
		}
		else
		{
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			
			switch (MENU_diagnostika_pozice){
				
				case 0:
				FCE_Diagnostika_Termoclanky();
				break;
				
				case 1:
				FCE_Diagnostika_TopneTeleso();
				break;
				
				case 2:
				FCE_Diagnostika_Ventilator();
				break;
				
				case 3:
				FCE_Diagnostika_Viko();
				break;
				
				case 4:
				FCE_Diagnostika_Vystupy();
				break;
				
				case 5:
				FCE_Diagnostika_Info();
				break;
				
				case 6:
				MENU_diagnostika_vyber = 0;
				return;
				break;
				
				default:
				MENU_diagnostika_vyber = 0;
				break;
			}
			MENU_diagnostika_vyber = 0;
			LCD_UpdateScreen();
		}
		
	}	
}

void FCE_Diagnostika_Termoclanky(void){
	//TEPLOTA TERMOCLANKU A COLD JUNCTION Z OBOU OBVODŮ, CHYBY ...
	uint16_t teplota1 = 0;
	uint16_t teplota2 = 0;
	uint16_t chyby = 0;
	uint16_t chyby_bin_1 = 0;
	uint16_t chyby_bin_2 = 0;
	uint16_t chyby_bin_3 = 0;
	uint16_t chyby_bin_4 = 0;
	uint8_t dal = 1;
	uint8_t POM_Reg = 0;
	do 
	{
		memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
		_delay_ms(200);
		if ((PORTE_IN & (1<<0)) == 0)
		{
		uint8_t MSB_T_1 = MAX31856_1_readRegister(LTCBH);
		uint8_t LSB_T_1 = MAX31856_1_readRegister(LTCBM);
		
		LSB_T_1 = LSB_T_1 & 0b11110000;
		LSB_T_1 = LSB_T_1 >> 4;
		POM_Reg = MSB_T_1 & 0b00001111;
		POM_Reg = POM_Reg << 4;
		LSB_T_1 = LSB_T_1 | POM_Reg;
		MSB_T_1 = MSB_T_1 & 0b01110000;
		MSB_T_1 = MSB_T_1 >> 4;
		teplota1 =  (MSB_T_1 << 8) | LSB_T_1;
		}
		
		if ((PORTE_IN & (1<<2)) == 0)
		{
		uint8_t MSB_T_2 = MAX31856_2_readRegister(LTCBH);
		uint8_t LSB_T_2 = MAX31856_2_readRegister(LTCBM);
		
		LSB_T_2 = LSB_T_2 & 0b11110000;
		LSB_T_2 = LSB_T_2 >> 4;
		POM_Reg = MSB_T_2 & 0b00001111;
		POM_Reg = POM_Reg << 4;
		LSB_T_2 = LSB_T_2 | POM_Reg;
		MSB_T_2 = MSB_T_2 & 0b01110000;
		MSB_T_2 = MSB_T_2 >> 4;
		teplota2 =  (MSB_T_2 << 8) | LSB_T_2;
		}
		
		LCD_DrawNumber(teplota1, 1,70);
		LCD_DrawNumber(teplota2, 3,70);
		
		uint8_t MSB_1 = MAX31856_1_readRegister(CJTH);
		uint8_t LSB_1 = MAX31856_1_readRegister(CJTL);
		LCD_DrawNumberFixed(MSB_1, 2, 70, 3);
		LCD_DrawChar('.', 2, 88);
		LCD_DrawNumberFixed(LSB_1, 2, 94, 3);
		
		uint8_t MSB_2 = MAX31856_2_readRegister(CJTH);
		uint8_t LSB_2 = MAX31856_2_readRegister(CJTL);
		LCD_DrawNumberFixed(MSB_2, 4, 70, 3);
		LCD_DrawChar('.', 4, 88);
		LCD_DrawNumberFixed(LSB_2, 4, 94, 3);
		
		uint8_t chyby_1 = MAX31856_1_readRegister(SR);
		uint8_t chyby_2 = MAX31856_2_readRegister(SR);
		
		chyby = ((chyby_2 << 8) | chyby_1);
		
		//LCD_DrawNumber(chyby, 5, 70);
		
		LCD_DrawString("T1", 5, 42);
		LCD_DrawString("T2", 6, 42);
		
		chyby_bin_1 = binarniNaDesitkove((chyby & 0b0000000000001111));
		
		LCD_DrawNumberFixed(chyby_bin_1, 5, 84, 4);
		
		chyby_bin_2 = binarniNaDesitkove((chyby & 0b0000000011110000) >> 4);
		
		LCD_DrawNumberFixed(chyby_bin_2, 5, 60, 4);
		
		chyby_bin_3 = binarniNaDesitkove((chyby & 0b0000111100000000) >> 8);
		
		LCD_DrawNumberFixed(chyby_bin_3, 6, 84, 4);
		
		chyby_bin_4 = binarniNaDesitkove((chyby & 0b1111000000000000) >> 12);
		
		LCD_DrawNumberFixed(chyby_bin_4, 6, 60, 4);
		
		LCD_DrawString("Diagnostika-Term:", 0, 0);
		LCD_DrawString("T1 Horky", 1, 7);
		LCD_DrawString("T1 Studeny", 2, 7);
		LCD_DrawString("T2 Horky", 3, 7);
		LCD_DrawString("T2 Studeny", 4, 7);
		LCD_DrawString("Chyby", 5, 7);
		LCD_DrawString("Zpet", 7, 7);
		LCD_DrawString(">", 7, 0);
		
		LCD_DrawChar(0, 1, 115);
		LCD_DrawChar('C', 1, 121);
		LCD_DrawChar(0, 2, 115);
		LCD_DrawChar('C', 2, 121);
		LCD_DrawChar(0, 3, 115);
		LCD_DrawChar('C', 3, 121);
		LCD_DrawChar(0, 4, 115);
		LCD_DrawChar('C', 4, 121);
		
		LCD_UpdateScreen();
		if (TL_stisk)
		{
			TL_stisk = 0;
			dal = 0;
		}
	} while (dal);
}

void FCE_Diagnostika_TopneTeleso(void){
		
		
		int8_t MENU_Diagnostika_TopneTeleso_pozice = 0;
		uint8_t MENU_Diagnostika_TopneTeleso_vyber = 0;
		
		while(1){
			if (TL_stisk)
			{
				TL_stisk = 0;
				MENU_Diagnostika_TopneTeleso_vyber = 1;
			}
			
			if (MENU_Diagnostika_TopneTeleso_vyber == 0)
			{
				LCD_DrawString("Diagnostika-Teleso:", 0, 0);
				LCD_DrawString("Pruchod nulou", 1, 7);
				LCD_DrawString("Topne teleso", 2, 7);
				LCD_DrawString("Zpet", 3, 7);
				
				if (ROT_rotace == 1)
				{
					MENU_Diagnostika_TopneTeleso_pozice++;
					ROT_rotace = 0;
				}
				if (ROT_rotace == -1)
				{
					MENU_Diagnostika_TopneTeleso_pozice--;
					ROT_rotace = 0;
				}
				if (MENU_Diagnostika_TopneTeleso_pozice > 1)
				{
					MENU_Diagnostika_TopneTeleso_pozice = 0;
				}
				if (MENU_Diagnostika_TopneTeleso_pozice < 0)
				{
					MENU_Diagnostika_TopneTeleso_pozice = 1;
				}
				
				switch (MENU_Diagnostika_TopneTeleso_pozice){
					
					case 0:
					LCD_DrawString(">", 2, 0);
					LCD_DrawString(" ", 3, 0);

					break;
					
					case 1:
					LCD_DrawString(" ", 2, 0);
					LCD_DrawString(">", 3, 0);
					break;
					
					default:
					MENU_Diagnostika_TopneTeleso_pozice = 0;
					break;
				}
			}
			else
			{
				memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
				
				switch (MENU_Diagnostika_TopneTeleso_pozice){
					
					case 0:
					PORTB_OUTTGL = 0b00100000;
					MENU_Diagnostika_TopneTeleso_vyber = 0;
					break;
					
					case 1:
					MENU_Diagnostika_TopneTeleso_vyber = 0;
					PORTB_OUTCLR = 0b00100000;
					return;
					break;
					
					default:
					MENU_Diagnostika_TopneTeleso_vyber = 0;
					break;
				}
			}
		
			
			if (PORTB_OUT&(1<<5))
			{
				LCD_DrawString("ON", 2, 110);
			}
			else
			{
				LCD_DrawString("OFF", 2, 110);
			}
			
			if (ZCD_FREKVENCE > 0)
			{
				LCD_DrawNumber((uint16_t)ZCD_FREKVENCE, 1, 95);
			} 
			else
			{
				LCD_DrawString("NaN", 1, 95);
			}
			LCD_DrawString("Hz", 1, 116);
			LCD_UpdateScreen();
		}
}

void FCE_Diagnostika_Ventilator(void){
	
	
	int8_t MENU_Diagnostika_Ventilator_pozice = 0;
	uint8_t MENU_Diagnostika_Ventilator_vyber = 0;
	uint16_t VENT_OTACKY_NAS = 0;
	uint8_t smycka = 1;
	
	while(1){
		if (TL_stisk)
		{
			TL_stisk = 0;
			MENU_Diagnostika_Ventilator_vyber = 1;
		}
		
		if (MENU_Diagnostika_Ventilator_vyber == 0)
		{
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			LCD_DrawString("Diagnostika-Vent:", 0, 0);
			LCD_DrawString("Skutecne", 1, 7);
			LCD_DrawString("Nastavene", 2, 7);
			LCD_DrawString("Zpet", 3, 7);
			
			if (ROT_rotace == 1)
			{
				MENU_Diagnostika_Ventilator_pozice++;
				ROT_rotace = 0;
			}
			if (ROT_rotace == -1)
			{
				MENU_Diagnostika_Ventilator_pozice--;
				ROT_rotace = 0;
			}
			if (MENU_Diagnostika_Ventilator_pozice > 1)
			{
				MENU_Diagnostika_Ventilator_pozice = 0;
			}
			if (MENU_Diagnostika_Ventilator_pozice < 0)
			{
				MENU_Diagnostika_Ventilator_pozice = 1;
			}
			
			switch (MENU_Diagnostika_Ventilator_pozice){
				
				case 0:
				LCD_DrawString(">", 2, 0);
				LCD_DrawString(" ", 3, 0);

				break;
				
				case 1:
				LCD_DrawString(" ", 2, 0);
				LCD_DrawString(">", 3, 0);
				break;
				
				default:
				MENU_Diagnostika_Ventilator_pozice = 0;
				break;
			}
		}
		else
		{
			smycka = 1;
			memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
			
			LCD_DrawString("Diagnostika-Vent:", 0, 0);
			LCD_DrawString("Skutecne", 1, 7);
			LCD_DrawString("Nastavene", 2, 7);
			LCD_DrawString("Zpet", 3, 7);
			
			switch (MENU_Diagnostika_Ventilator_pozice){
				
				case 0:
				LCD_DrawChar('>', 2, 64);
				do
				{
					if (ROT_rotace == 1)
					{
						VENT_OTACKY_NAS -= 500;
						ROT_rotace = 0;
					}
					if (ROT_rotace == -1)
					{
						VENT_OTACKY_NAS += 500;
						ROT_rotace = 0;
					}
					
					if (VENT_OTACKY_NAS > 11000)
					{
						VENT_OTACKY_NAS = 0;
					}
					if ((VENT_OTACKY_NAS > 10000) && (VENT_OTACKY_NAS < 11000))
					{
						VENT_OTACKY_NAS = 10000;
					}
					
					LCD_DrawString("     ", 2, 70);
					LCD_DrawNumber(VENT_OTACKY_NAS, 2, 70);
					LCD_DrawNumber(((uint16_t)VENT_FREKVENCE*60), 1, 70);
					LCD_DrawString("ot/min", 1, 100);
					LCD_DrawString("ot/min", 2, 100);
					LCD_UpdateScreen();
					VENTILATOR_RIZENI(VENT_OTACKY_NAS);
					_delay_ms(250);
					if (TL_stisk)
					{
						TL_stisk = 0;
						smycka = 0;
					}
					
				}while (smycka);
				
				break;
				
				case 1:
				MENU_Diagnostika_Ventilator_vyber = 0;
				VENTILATOR_RIZENI(0);
				return;
				break;
				
				default:
				MENU_Diagnostika_Ventilator_vyber = 0;
				break;
				
				
			}
			MENU_Diagnostika_Ventilator_vyber = 0;
		}
		
		
	
		LCD_DrawNumber(((uint16_t)VENT_FREKVENCE*60), 1, 70);
		LCD_DrawNumber(VENT_OTACKY_NAS, 2, 70);
		LCD_DrawString("ot/min", 1, 100);
		LCD_DrawString("ot/min", 2, 100);
		VENTILATOR_RIZENI(VENT_OTACKY_NAS);
		LCD_UpdateScreen();
	}
}

void FCE_Diagnostika_Viko(void){
	
		
		int8_t MENU_Diagnostika_Viko_pozice = 0;
		uint8_t MENU_Diagnostika_Viko_vyber = 0;
		
		while(1){
			if (TL_stisk)
			{
				TL_stisk = 0;
				MENU_Diagnostika_Viko_vyber = 1;
			}
			
			if (MENU_Diagnostika_Viko_vyber == 0)
			{
				LCD_DrawString("Diagnostika-Viko:", 0, 0);
				LCD_DrawString("Stav snimace", 1, 7);
				LCD_DrawString("Elekromagnet", 2, 7);
				LCD_DrawString("Zpet", 3, 7);
				
				if (ROT_rotace == 1)
				{
					MENU_Diagnostika_Viko_pozice++;
					ROT_rotace = 0;
				}
				if (ROT_rotace == -1)
				{
					MENU_Diagnostika_Viko_pozice--;
					ROT_rotace = 0;
				}
				if (MENU_Diagnostika_Viko_pozice > 1)
				{
					MENU_Diagnostika_Viko_pozice = 0;
				}
				if (MENU_Diagnostika_Viko_pozice < 0)
				{
					MENU_Diagnostika_Viko_pozice = 1;
				}
				
				switch (MENU_Diagnostika_Viko_pozice){
					
					case 0:
					LCD_DrawString(">", 2, 0);
					LCD_DrawString(" ", 3, 0);

					break;
					
					case 1:
					LCD_DrawString(" ", 2, 0);
					LCD_DrawString(">", 3, 0);
					break;
					
					default:
					MENU_Diagnostika_Viko_pozice = 0;
					break;
				}
			}
			else
			{
				memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
				
				switch (MENU_Diagnostika_Viko_pozice){
					
					case 0:
					PORTB_OUTTGL = 0b00000010;
					MENU_Diagnostika_Viko_vyber = 0;
					break;
					
					case 1:
					MENU_Diagnostika_Viko_vyber = 0;
					PORTB_OUTCLR = 0b00000010;
					return;
					break;
					
					default:
					MENU_Diagnostika_Viko_vyber = 0;
					break;
				}
			}
			if ((PORTF_IN&(1<<3)) == 0)
			{
				LCD_DrawString("ON ", 1, 110);
			} 
			else
			{
				LCD_DrawString("OFF", 1, 110);
			}
			
			if (PORTB_OUT&(1<<1))
			{
				LCD_DrawString("ON ", 2, 110);
			}
			else
			{
				LCD_DrawString("OFF", 2, 110);
			}
			
			LCD_UpdateScreen();
		}
}

void FCE_Diagnostika_Vystupy(void){
		Diagnostika_flag = 1;
		
		int8_t MENU_Diagnostika_Vystupy_pozice = 0;
		uint8_t MENU_Diagnostika_Vystupy_vyber = 0;
		
		while(1){
			if (TL_stisk)
			{
				TL_stisk = 0;
				MENU_Diagnostika_Vystupy_vyber = 1;
			}
			
			if (MENU_Diagnostika_Vystupy_vyber == 0)
			{
				LCD_DrawString("Diagnostika-Vystupy:", 0, 0);
				LCD_DrawString("Podsviceni", 1, 7);
				LCD_DrawString("LED", 2, 7);
				LCD_DrawString("Bzucak", 3, 7);
				LCD_DrawString("Zpet", 4, 7);
				
				if (ROT_rotace == 1)
				{
					MENU_Diagnostika_Vystupy_pozice++;
					ROT_rotace = 0;
				}
				if (ROT_rotace == -1)
				{
					MENU_Diagnostika_Vystupy_pozice--;
					ROT_rotace = 0;
				}
				if (MENU_Diagnostika_Vystupy_pozice > 3)
				{
					MENU_Diagnostika_Vystupy_pozice = 0;
				}
				if (MENU_Diagnostika_Vystupy_pozice < 0)
				{
					MENU_Diagnostika_Vystupy_pozice = 3;
				}
				
				switch (MENU_Diagnostika_Vystupy_pozice){
					
					case 0:
					LCD_DrawString(">", 1, 0);
					LCD_DrawString(" ", 2, 0);
					LCD_DrawString(" ", 3, 0);
					LCD_DrawString(" ", 4, 0);

					break;
					
					case 1:
					LCD_DrawString(" ", 1, 0);
					LCD_DrawString(">", 2, 0);
					LCD_DrawString(" ", 3, 0);
					LCD_DrawString(" ", 4, 0);
					break;
					
					case 2:
					LCD_DrawString(" ", 1, 0);
					LCD_DrawString(" ", 2, 0);
					LCD_DrawString(">", 3, 0);
					LCD_DrawString(" ", 4, 0);
					break;
					
					case 3:
					LCD_DrawString(" ", 1, 0);
					LCD_DrawString(" ", 2, 0);
					LCD_DrawString(" ", 3, 0);
					LCD_DrawString(">", 4, 0);
					break;
					
					default:
					MENU_Diagnostika_Vystupy_pozice = 0;
					break;
				}
			}
			else
			{
				memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
				
				switch (MENU_Diagnostika_Vystupy_pozice){
					
					case 0:
					PORTA_OUTTGL = 0b00000100;
					MENU_Diagnostika_Vystupy_vyber = 0;
					break;
					
					case 1:
					PORTB_OUTTGL = 0b00000001;
					MENU_Diagnostika_Vystupy_vyber = 0;
					break;
					
					case 2:
					PORTA_OUTTGL = 0b00000010;
					MENU_Diagnostika_Vystupy_vyber = 0;
					break;
					
					case 3:
					MENU_Diagnostika_Vystupy_vyber = 0;
					PORTB_OUTSET = 0b00000001;
					PORTA_OUTCLR = 0b00000010;
					readEEPROM();
					Diagnostika_flag = 0;
					return;
					break;
					
					default:
					MENU_Diagnostika_Vystupy_vyber = 0;
					break;
				}
			}
			if (PORTA_OUT&(1<<2))
			{
				LCD_DrawString("ON ", 1, 110);
			}
			else
			{
				LCD_DrawString("OFF", 1, 110);
			}
			
			if ((PORTB_OUT&(1<<0)) == 0)
			{
				LCD_DrawString("ON ", 2, 110);
			}
			else
			{
				LCD_DrawString("OFF", 2, 110);
			}
			if (PORTA_OUT&(1<<1))
			{
				LCD_DrawString("ON ", 3, 110);
			}
			else
			{
				LCD_DrawString("OFF", 3, 110);
			}
			
			LCD_UpdateScreen();
		}
}

void FCE_Diagnostika_Info(void){
			
			int8_t MENU_Diagnostika_Info_pozice = 0;
			uint8_t MENU_Diagnostika_Info_vyber = 0;
			uint8_t pocitadlo_snake = 0;
			
			while(1){
				if (TL_stisk)
				{
					TL_stisk = 0;
					MENU_Diagnostika_Info_vyber = 1;
				}
				
				if (MENU_Diagnostika_Info_vyber == 0)
				{
					LCD_DrawString("Diagnostika-Info:", 0, 0);
					LCD_DrawString("Seriove cislo", 3, 7);
					LCD_DrawString("Verze systemu", 2, 7);
					LCD_DrawString("Posledni chyba", 1, 7);
					LCD_DrawString("Zpet", 4, 7);
					
					if(EEPROM_CHYBA)
					{
						LCD_DrawChar('E', 1, 110);
					LCD_DrawNumber(EEPROM_CHYBA, 1, 116);
					}
					else
					{
					LCD_DrawString("__", 1, 116);
					}
					LCD_DrawString("250210", 2, 92);
					
					if (ROT_rotace == 1)
					{
						MENU_Diagnostika_Info_pozice++;
						ROT_rotace = 0;
					}
					if (ROT_rotace == -1)
					{
						MENU_Diagnostika_Info_pozice--;
						ROT_rotace = 0;
					}
					if (MENU_Diagnostika_Info_pozice > 1)
					{
						MENU_Diagnostika_Info_pozice = 0;
						pocitadlo_snake++;
					}
					if (MENU_Diagnostika_Info_pozice < 0)
					{
						MENU_Diagnostika_Info_pozice = 1;
					}
					if (pocitadlo_snake == 5)
					{
						pocitadlo_snake = 0;
						SNAKE();
					}
					
					switch (MENU_Diagnostika_Info_pozice){
						
						case 0:
						LCD_DrawString(">", 3, 0);
						LCD_DrawString(" ", 4, 0);
						break;
						
						case 1:
						LCD_DrawString(" ", 3, 0);
						LCD_DrawString(">", 4, 0);
						break;
						
						default:
						MENU_Diagnostika_Info_pozice = 0;
						break;
					}
				}
				else
				{
					memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
					
					switch (MENU_Diagnostika_Info_pozice){
						
						case 0:
						FCE_Diagnostika_Info_SerioveCislo();
						break;
						
						case 1:
						MENU_Diagnostika_Info_vyber = 0;
						readEEPROM_flag = 0;
						EEPROM_CHYBA = 0;
						writeEEPROM();
						readEEPROM_flag = 1;
						return;
						break;
						
						default:
						MENU_Diagnostika_Info_vyber = 0;
						break;
					}
				}
				MENU_Diagnostika_Info_vyber = 0;
				LCD_UpdateScreen();
			}
}

void FCE_Diagnostika_Info_SerioveCislo(void){
	uint8_t smycka = 1;
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
	do 
	{
		LCD_DrawString("Seriove cislo:",0, 0);
		LCD_DrawNumberFixed((uint16_t)SIGROW_SERNUM0 , 2, 0, 2);
		LCD_DrawNumberFixed((uint16_t)SIGROW_SERNUM1 , 2, 12, 2);
		LCD_DrawNumberFixed((uint16_t)SIGROW_SERNUM2 , 2, 24, 2);
		LCD_DrawNumberFixed((uint16_t)SIGROW_SERNUM3 , 2, 36, 2);
		LCD_DrawNumberFixed((uint16_t)SIGROW_SERNUM4 , 2, 48, 2);
		LCD_DrawNumberFixed((uint16_t)SIGROW_SERNUM5 , 2, 60, 2);
		LCD_DrawNumberFixed((uint16_t)SIGROW_SERNUM6 , 2, 72, 2);
		LCD_DrawNumberFixed((uint16_t)SIGROW_SERNUM7 , 2, 84, 2);
		LCD_DrawNumberFixed((uint16_t)SIGROW_SERNUM8 , 2, 96, 2);
		LCD_DrawNumberFixed((uint16_t)SIGROW_SERNUM9 , 2, 108, 2);
		LCD_DrawString(">Zpet", 4, 0);
		LCD_UpdateScreen();
		if (TL_stisk)
		{
			TL_stisk = 0;
			smycka = 0;
		}
	} while (smycka);
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
}

//############################################################ funkce behu programu a soucasti

//mozna pridat aktualnia otacky ventilatoru
//Vkreslovani grafu na displej
void DRAW_GRAF(uint16_t teplota_zadana, uint16_t teplota_aktualni, uint16_t teplota_cilova, uint8_t cas_zbyvajici, uint16_t cas_aktualni_celkovy, uint8_t cislo_faze){
	
	
	LCD_DrawLine(12, 0, 12, 54);
	LCD_DrawLine(12, 54, 127, 54);
	LCD_DrawString("t:", 1, 0);
	LCD_DrawString("  ", 2, 0);
	LCD_DrawNumber((uint16_t)(cas_zbyvajici), 2, 0);
	LCD_DrawChar('s', 3, 0);
	LCD_DrawChar('F', 0, 0);
	LCD_DrawString(" ", 0, 6);
	LCD_DrawNumber((uint16_t)(cislo_faze), 0, 6);
	
	
	LCD_DrawString("Tm", 7, 0);//jako teplota měřená
	LCD_DrawString("   ", 7, 12);
	LCD_DrawNumber(teplota_aktualni, 7, 12);
	
	
	LCD_DrawString("Tr", 7, 34);//jako teplota regulační
	LCD_DrawString("   ", 7, 46);
	LCD_DrawNumber(teplota_zadana, 7, 46);
	
	
	LCD_DrawString("Tc", 7, 68);//jako teplota cílová
	LCD_DrawString("   ", 7, 80);
	LCD_DrawNumber(teplota_cilova, 7, 80);
	
	LCD_DrawChar('[', 7, 102);
	LCD_DrawChar(0, 7, 108);
	LCD_DrawChar('C', 7, 114);
	LCD_DrawChar(']', 7, 120);
	
	
	
	//vykreslovani pixelů podle teploty_aktualni a casu_celkoveho
	
	if ((poradi_pixelu/0.255) < cas_aktualni_celkovy)
	{
		poradi_pixelu++;
	}
	
	LCD_DrawPixel((uint8_t)(poradi_pixelu) + 12, (uint8_t)(54 - (0.154*teplota_aktualni)));
	
	
	LCD_DrawChar(' ', 4, 4);																							//animace bezici kolecko
	LCD_DrawString("  ", 4, 0);
	
	switch (pocitadlo)
	{
	case 0:
	LCD_DrawLine(0, 35, 6, 35);
	break;
	
	case 1:
	LCD_DrawLine(0, 34, 6, 36);
	break;
	
	case 2:
	LCD_DrawLine(1, 33, 5, 37);
	break;
	
	case 3:
	LCD_DrawLine(2, 32, 4, 38);
	break;
	
	case 4:
	LCD_DrawLine(3, 32, 3, 38);
	break;
	
	case 5:
	LCD_DrawLine(4, 32, 2, 38);
	break;
	
	case 6:
	LCD_DrawLine(5, 33, 1, 37);
	break;
	
	case 7:
	LCD_DrawLine(6, 34, 0, 36);
	break;
	}
	if (pocitadlo == 7)
	{
		pocitadlo = 0;
	}
	else
	{
		pocitadlo++;
	}
	
	
	
	//bargraf vykonu telesa
	LCD_DrawString("  ", 5, 0);
	LCD_DrawString("  ", 6, 0);
	LCD_DrawChar(' ', 5, 4);
	LCD_DrawChar(' ', 6, 4);
	
	if (HEAT_DUT >= (1*HEAT_DUT_VAL/16))
	{
		LCD_DrawLine( 0, 54, 10, 54);
	}
	if (HEAT_DUT >= (2*HEAT_DUT_VAL/16))
	{
		LCD_DrawLine( 0, 53, 10, 53);
	}
	if (HEAT_DUT >= (3*HEAT_DUT_VAL/16))
	{
		LCD_DrawLine( 0, 52, 10, 52);
	}
	if (HEAT_DUT >= (4*HEAT_DUT_VAL/16))
	{
		LCD_DrawLine( 0, 51, 10, 51);
	}
	if (HEAT_DUT >= (5*HEAT_DUT_VAL/16))
	{
		LCD_DrawLine( 0, 50, 10, 50);
	}
	if (HEAT_DUT >= (6*HEAT_DUT_VAL/16))
	{
		LCD_DrawLine( 0, 49, 10, 49);
	}
	if (HEAT_DUT >= (7*HEAT_DUT_VAL/16))
	{
		LCD_DrawLine( 0, 48, 10, 48);
	}
	if (HEAT_DUT >= (8*HEAT_DUT_VAL/16))
	{
		LCD_DrawLine( 0, 47, 10, 47);
	}
	if (HEAT_DUT >= (9*HEAT_DUT_VAL/16))
	{
		LCD_DrawLine( 0, 46, 10, 46);
	}
	if (HEAT_DUT >= (10*HEAT_DUT_VAL/16))
	{
		LCD_DrawLine( 0, 45, 10, 45);
	}
	if (HEAT_DUT >= (11*HEAT_DUT_VAL/16))
	{
		LCD_DrawLine( 0, 44, 10, 44);
	}
	if (HEAT_DUT >= (12*HEAT_DUT_VAL/16))
	{
		LCD_DrawLine( 0, 43, 10, 43);
	}
	if (HEAT_DUT >= (13*HEAT_DUT_VAL/16))
	{
		LCD_DrawLine( 0, 42, 10, 42);
	}
	if (HEAT_DUT >= (14*HEAT_DUT_VAL/16))
	{
		LCD_DrawLine( 0, 41, 10, 41);
	}
	if (HEAT_DUT >= (15*HEAT_DUT_VAL/16))
	{
		LCD_DrawLine( 0, 40, 10, 40);
	}
	
	
	LCD_UpdateScreen();
	return;
}

//FUNKCE REGULACE
void Regulace(uint16_t teplota_zadana, uint16_t teplota_skutecna){
	if (HEAT_ON_flag == 0)
	{
		e_1 = 0.0;
		e_2 = 0.0;
		ef_1 = 0.0;
		ef_2 = 0.0;
		u_1 = 0.0;
		HEAT_ON_flag = 1;
		PORTB_OUTCLR = 1;			//pokud topi, pokud netopi tak zhasnout nebo neco takoveho
	}
	
	//spinat topne teleso v nule a vykon regulovat poctem sepnutych pulvln (softwarové PWM)
	
	if((teplota_zadana == 0) && (teplota_skutecna == 0))//Pri vstupu 0 a 0 vypnout regulaci
	{
		ZCD_REG = 0;
		HEAT_OFF_flag = 1;
		PORTB_OUTSET = 1;
		return;
	}
	else
	{
		if((EEPROM_PID_P == 100) && (EEPROM_PID_I == 0) && (EEPROM_PID_D == 0))//Pri P slozce 100 a ostatni 0 prepnout regulator na ON/OFF mod
		{				// pridat hysterezi 2 K
		if (REG_ONOFF_STAV_MEM)
		{
			if (teplota_skutecna >= (teplota_zadana + 1))
			{
				HEAT_DUT = 0;
				REG_ONOFF_STAV_MEM = 0;
			}
		} 
		else
		{
			if (teplota_skutecna <= (teplota_zadana - 1))
			{
				HEAT_DUT = HEAT_DUT_VAL;
				REG_ONOFF_STAV_MEM = 1;
			}
		}
		}
		else//PID regulace
		{					//normovani hodnot, ochrana proti nadmernemu integrovani do vysokych cisel, filtr pro D slozlu
		
										//normovani konstant a prevedeni do spravneho tvaru (vstup je procento zásahu dané konstanty)
		float Kp = (float)(EEPROM_PID_P) * 2;// / 2.0;				//hodnoty 0 až 100
		float Ti = (float)(101 - EEPROM_PID_I) / 10.0;
		float Td = (float)(EEPROM_PID_D) / 400.0;
		const float h = 0.25;    // Časový krok
		
		float b0 = 0.5;
		float b1 = 0.3;
		float b2 = 0.2;

		if (EEPROM_PID_I == 0)
		{
			Ti = 10000;			//vypnutí integrační složky
		}
			
		
		
		float e = (float)(teplota_zadana) - (float)(teplota_skutecna); //normovani hodnot
		e = e / 350;
		
		float ef = b0 * e + b1 * e_1 + b2 * e_2;
																
		float delta_u = (Kp * (e - e_1)) + (((Kp * h) / Ti) * e) + (((Kp * Td) / h ) * (ef - (2 * ef_1) + ef_2));
		e_2 = e_1;
		e_1 = e;
		ef_2 = ef_1;
		ef_1 = ef;
				
		float u = u_1 + delta_u;
													//denormovani hodnot (asi neni třeba)
		if (u > HEAT_DUT_VAL)// Maximální hodnota
			{
				delta_u = 0;
				u_1 = HEAT_DUT_VAL;
			}  
		if (u < 0)// Minimální hodnota
			{
				delta_u = 0;   
				u_1 = 0;   
			}
		
		u = u_1 + delta_u;
		u_1 = u;
		
		
		HEAT_DUT = (uint8_t)(u);
		}
	}
	return;
}

//FUNKCE KONTROLY CHYB
void CHYBY(uint8_t cislo_chyby){
	uint8_t symbol_erroru = 0;
	switch (cislo_chyby)
	{
		case ZASEKNUTI_PROGRAMU:
		if (RSTCTRL_RSTFR &(1<<3))
		{
			symbol_erroru = 5;
		}
		break;
		
		case CHYBA_TERMOCLANKU1:
		if ((PORTE_IN & (1<<1)) == 0)
		{
			symbol_erroru = 1;
			MAX31856_1_writeRegister(CR0, 0b10010111);
		}
		break;
		
		case CHYBA_TERMOCLANKU2:
		if ((PORTE_IN & (1<<3)) == 0)
		{
			symbol_erroru = 2;
			MAX31856_2_writeRegister(CR0, 0b10010111);
		}
		break;
		
		case CHYBA_TOP_TEL://ztrata signalu ZCD
		if (ZCD_FREKVENCE == 0)
		{
			symbol_erroru = 3;
		}
		break;
		
		case CHYBA_VENTILATORU://i pres vysoke pwm se netoci, osetrit roztaceni
		if (VENT_CHYBA_flag && VENT_START_flag)
		{
			VENT_CHYBA_flag = 0;
			if (VENT_CHYBA_POC < 10)
			{
				VENT_CHYBA_POC++;
				break;
			}
			else
			{
				VENT_CHYBA_POC = 0;
				if (VENT_CHYBA_DUT > 6000)
				{
					symbol_erroru = 4;
				}
			}
		}
		break;
		
		default:
		//spatne volani funkce
		break;
	}
	
	
	
	if (symbol_erroru != 0)
	{
		readEEPROM_flag = 0;
		EEPROM_CHYBA = symbol_erroru;
		writeEEPROM();
		readEEPROM_flag = 1;
	}
}

//Ziskani teploty z termoclanků
uint16_t GET_TEMP(void){
	uint16_t teplota1 = 0;
	uint16_t teplota2 = 0;
	uint16_t teplota = 0;
	uint8_t POM_Reg = 0;
	uint8_t fail_term_1 = 1;
	uint8_t fail_term_2 = 1;
	
	
	//pokud neni v chybe_1
	if ((PORTE_IN & (1<<1)) && ((PORTE_IN & (1<<0)) == 0))
	{
		fail_term_1	= 0;
		
		uint8_t MSB = MAX31856_1_readRegister(LTCBH);
		uint8_t LSB = MAX31856_1_readRegister(LTCBM);
		
		LSB = LSB & 0b11110000;
		LSB = LSB >> 4;
		POM_Reg = MSB & 0b00001111;
		POM_Reg = POM_Reg << 4;
		LSB = LSB | POM_Reg;
		MSB = MSB & 0b01110000;
		MSB = MSB >> 4;
		teplota1 =  (MSB << 8) | LSB;
	}
	
	//pokud neni v chybe_2
	if ((PORTE_IN & (1<<3)) && ((PORTE_IN & (1<<2)) == 0))
	{
		fail_term_2 = 0;
		
		uint8_t MSB = MAX31856_2_readRegister(LTCBH);
		uint8_t LSB = MAX31856_2_readRegister(LTCBM);
		
		LSB = LSB & 0b11110000;
		LSB = LSB >> 4;
		POM_Reg = MSB & 0b00001111;
		POM_Reg = POM_Reg << 4;
		LSB = LSB | POM_Reg;
		MSB = MSB & 0b01110000;
		MSB = MSB >> 4;
		teplota2 =  (MSB << 8) | LSB;
	}
	
	if ((fail_term_2 == 1) && (fail_term_1 == 0))
	{
		teplota_minula = teplota1;
		return teplota1;
	}
	
	if ((fail_term_1 == 1) && (fail_term_2 == 0))
	{
		teplota_minula = teplota2;
		return teplota2;
	}
	if (fail_term_1 && fail_term_2)
	{
		return teplota_minula;
	}
	
	//oba v poradku (overit jestli neni prilis velky rozdil teplot)
	
	if ((teplota1 > teplota2 && teplota1 - teplota2 > 25) ||
	(teplota2 > teplota1 && teplota2 - teplota1 > 25))
	{
		if (pocitadlo_spatne_mereni > 4)
		{
		readEEPROM_flag = 0;
		EEPROM_CHYBA = 6;
		writeEEPROM();
		readEEPROM_flag = 1;
		return 0xFFFF;
		}
		else
		{
			pocitadlo_spatne_mereni++;
		}
	}
	
	teplota = ((teplota1 + teplota2) / 2);
	teplota_minula = teplota;
	return teplota;
}

//FUNKCE RIZENI VENTILATORU
void VENTILATOR_RIZENI (uint16_t otacky_nastavene){
	uint16_t duty_cycle = 0;
	if (otacky_nastavene > 0)
	{
		//spustit ventilator a pokud uz je tak generovat pwm podle regulace
		if((TCA0_SINGLE_CTRLA & (1<<0)) == 0)
		{
			TCA0_SINGLE_CTRLB = 0b00010011;
			TCA0_SINGLE_CTRLC = 0b00000001;
			
			TCA0_SINGLE_CMP0 = 0;//duty cycle
			TCA0_SINGLE_PER = 0xFFFF;//period
			
			TCA0_SINGLE_CTRLA = 0b00000001;
			
			VENT_START_flag = 1;
			PP = 10;
		}
		//  Otacky 0 - 10 000, duty cycle 0 - 65535
		if (otacky_nastavene > (VENT_FREKVENCE*60))
		{
			while (((otacky_nastavene - (VENT_FREKVENCE*60))*PP) > 40000)
			{
				PP--;
			}
			duty_cycle = (otacky_nastavene - (VENT_FREKVENCE*60))*PP;
		}
		else
		{
			duty_cycle = duty_cycle_minule;
			if(((int)(VENT_FREKVENCE*60) - (int)(otacky_nastavene)) > 700)
			{
				duty_cycle -= 50;
			}
		}
		duty_cycle_minule = duty_cycle;
		if (duty_cycle > 25000)
		{
			duty_cycle = 25000;
		}
		TCA0_SINGLE_CMP0 = duty_cycle;//duty cycle
		int VENT_ODCH = ((int)(otacky_nastavene) - (int)(VENT_FREKVENCE*60));
		if ((VENT_ODCH > 1000) || (VENT_ODCH < -1000))
		{
			if (VENT_ODCH > 1000)
			{
				PP++;
			}
			if (VENT_ODCH < -1000)
			{
				PP--;
			}
		}
	}
	else
	{
		//stopnout ventilator
		
		//dekrementovat postupne k nule
		
		
		while (duty_cycle_minule > 1000)
		{
			duty_cycle_minule -= 1000;
			TCA0_SINGLE_CMP0 = duty_cycle_minule;
			_delay_ms(10);
		}
		
		TCA0_SINGLE_CTRLA = 0b00001110;
		PORTA_OUTCLR = 0b00000001;
		VENT_START_flag = 0;
	}
}

//PRENOS DAT NA SPI PRO TERMOCLANKY
uint8_t SPI_transfer(uint8_t data) {
	SPI0.DATA = data;            // Zápis dat do SPI
	while (!(SPI0.INTFLAGS & SPI_IF_bm))
	; // Čekání na dokončení přenosu
	return SPI0.DATA;            // Návrat přijatých dat
}

//ZAPIS DO REGISTRU TEMP1
void MAX31856_1_writeRegister(uint8_t reg, uint8_t value) {
	_delay_ms(10);
	PORTD.OUTCLR = PIN5_bm;  // CS LOW (aktivace senzoru)
	_delay_ms(10);
	SPI_transfer(reg | 0x80); // Nastavit MSB bit pro zápis
	_delay_ms(3);
	SPI_transfer(value);
	PORTD.OUTSET = PIN5_bm;  // CS HIGH (deaktivace senzoru)
}

//ZAPIS DO REGISTRU TEMP2
void MAX31856_2_writeRegister(uint8_t reg, uint8_t value) {
	_delay_ms(10);
	PORTD.OUTCLR = PIN6_bm;  // CS LOW (aktivace senzoru)
	_delay_ms(10);
	SPI_transfer(reg | 0x80); // Nastavit MSB bit pro zápis
	_delay_ms(3);
	SPI_transfer(value);
	PORTD.OUTSET = PIN6_bm;  // CS HIGH (deaktivace senzoru)
}

//CTENI Z REGISTRU TEMP1
uint8_t MAX31856_1_readRegister(uint8_t reg) {
	_delay_ms(10);
	PORTD.OUTCLR = PIN5_bm;  // CS LOW
	_delay_ms(10);
	SPI_transfer(reg & 0x7F); // MSB = 0 pro čtení
	uint8_t value = SPI_transfer(0xFF); // Dummy byte
	PORTD.OUTSET = PIN5_bm;  // CS HIGH
	return value;
}

//CTENI Z REGISTRU TEMP2
uint8_t MAX31856_2_readRegister(uint8_t reg) {
	_delay_ms(10);
	PORTD.OUTCLR = PIN6_bm;  // CS LOW
	_delay_ms(10);
	SPI_transfer(reg & 0x7F); // MSB = 0 pro čtení
	uint8_t value = SPI_transfer(0xFF); // Dummy byte
	PORTD.OUTSET = PIN6_bm;  // CS HIGH
	return value;
}

//inicializace termoclánků
void TEMP_INIT(void){
	_delay_ms(10);
	MAX31856_1_writeRegister(CJHF, 0b01010000);
	_delay_ms(10);
	MAX31856_2_writeRegister(CJHF, 0b01010000);
	_delay_ms(10);
	MAX31856_1_writeRegister(CJLF, 0b00000000);
	_delay_ms(10);
	MAX31856_2_writeRegister(CJLF, 0b00000000);
	_delay_ms(10);
	MAX31856_1_writeRegister(LTHFTH, 0b00011001);
	_delay_ms(10);
	MAX31856_2_writeRegister(LTHFTH, 0b00011001);
	_delay_ms(10);
	MAX31856_1_writeRegister(LTHFTL, 0b00000000);
	_delay_ms(10);
	MAX31856_2_writeRegister(LTHFTL, 0b00000000);
	_delay_ms(10);
	MAX31856_1_writeRegister(LTLFTH, 0b00000000);
	_delay_ms(10);
	MAX31856_2_writeRegister(LTLFTH, 0b00000000);
	_delay_ms(10);
	MAX31856_1_writeRegister(LTLFTL, 0b00000000);
	_delay_ms(10);
	MAX31856_2_writeRegister(LTLFTL, 0b00000000);
	_delay_ms(10);
	MAX31856_1_writeRegister(CJTO, 0b00000000);
	_delay_ms(10);
	MAX31856_2_writeRegister(CJTO, 0b00000000);
	_delay_ms(10);
	MAX31856_1_writeRegister(MASK, EEPROM_TERMMASK1);
	_delay_ms(10);
	MAX31856_2_writeRegister(MASK, EEPROM_TERMMASK2);
	_delay_ms(10);
	//MAX31856_1_writeRegister(CR1, 0b00110011);	//MAX31856_1_writeRegister(CR1, (0b00110000 | (EEPROM_TERMTYPE1)));
	MAX31856_1_writeRegister(CR1, (0b00110000 | (EEPROM_TERMTYPE1)));
	_delay_ms(10);
	//MAX31856_2_writeRegister(CR1, 0b00110011);	//MAX31856_2_writeRegister(CR1, (0b00110000 | (EEPROM_TERMTYPE2)));
	MAX31856_2_writeRegister(CR1, (0b00110000 | (EEPROM_TERMTYPE2)));
	_delay_ms(10);
	MAX31856_1_writeRegister(CR0, 0b10010111);
	_delay_ms(10);
	MAX31856_2_writeRegister(CR0, 0b10010111);
	_delay_ms(10);
}

//PREVOD BINARNIHO CISLA NA DESITKOVE
uint16_t binarniNaDesitkove(uint16_t cislo) {
	uint16_t vysledek = 0;
	uint16_t nasobic = 1;

	while (cislo > 0) {
		uint16_t bit = cislo & 1;  // Získání nejnižšího bitu
		vysledek += bit * nasobic; // Přidání bitu do výsledného čísla
		nasobic *= 10;             // Posunutí na další desítkové místo
		cislo >>= 1;               // Posun bitů doprava
	}

	return vysledek;
}

//NASTAVENI HODNOTY KONTRASTU DO EEPROM A ZNOVUSPUSTENI LCD INIT
void NastaveniKontrastu(void){
	
	LCD_DrawChar('>', 3, 42);
	LCD_DrawString("Kontrast:", 2, 42);
	uint8_t smycka = 1;
	uint8_t EEPROM_KONTRAST_POM = EEPROM_KONTRAST;
	//_delay_ms(2000);
	do
	{
		if (ROT_rotace == 1)
		{
			EEPROM_KONTRAST_POM -= 1;
			ROT_rotace = 0;
		}
		if (ROT_rotace == -1)
		{
			EEPROM_KONTRAST_POM += 1;
			ROT_rotace = 0;
		}
		
		if (EEPROM_KONTRAST_POM < 10)
		{
			EEPROM_KONTRAST_POM = 10;
		}
		if (EEPROM_KONTRAST_POM > 20)
		{
			EEPROM_KONTRAST_POM = 20;
		}
		
		LCD_DrawString("   ", 3, 49);
		LCD_DrawNumber((uint16_t)EEPROM_KONTRAST_POM, 3, 49);
		LCD_UpdateScreen();
		if (TL_stisk)
		{
			TL_stisk = 0;
			smycka = 0;
		}
		
	}while (smycka);
	
	readEEPROM_flag = 0;
	EEPROM_KONTRAST = EEPROM_KONTRAST_POM;
	writeEEPROM();
	readEEPROM_flag = 1;

	LCD_INIT();
}

//FUNKCE PISKNUTI BZUCAKU
void BZUCAK_BEEP(){
	
	if (EEPROM_BZUCAK)
	{
		//zapnout bzucak
		PORTA_OUTSET = 0b00000010;

		TCB0_CCMP = 0xFFFF;
		TCB0_CTRLA = 0b00000011;
		TCB0_INTCTRL = 1;
	}
}

//ZAPIS DO EEPROM
void writeEEPROM(void) {
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_LCD_BL, EEPROM_LCD_BL);
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_PID_P, EEPROM_PID_P);
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_PID_I, EEPROM_PID_I);
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_PID_D, EEPROM_PID_D);
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_BZUCAK, EEPROM_BZUCAK);
	eeprom_update_word((uint16_t*)EEPROM_ADDR_VENTILATOR, EEPROM_VENTILATOR);
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_CHYBA, EEPROM_CHYBA);
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_KONTRAST, EEPROM_KONTRAST);
	
	eeprom_update_word((uint16_t*)EEPROM_ADDR_TEPLOTA1, EEPROM_TEPLOTA1);
	eeprom_update_word((uint16_t*)EEPROM_ADDR_TEPLOTA2, EEPROM_TEPLOTA2);
	eeprom_update_word((uint16_t*)EEPROM_ADDR_TEPLOTA3, EEPROM_TEPLOTA3);
	eeprom_update_word((uint16_t*)EEPROM_ADDR_TEPLOTA4, EEPROM_TEPLOTA4);
	eeprom_update_word((uint16_t*)EEPROM_ADDR_TEPLOTA5, EEPROM_TEPLOTA5);
	
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_CAS1, EEPROM_CAS1);
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_CAS2, EEPROM_CAS2);
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_CAS3, EEPROM_CAS3);
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_CAS4, EEPROM_CAS4);
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_CAS5, EEPROM_CAS5);
	
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_TERMTYPE1, EEPROM_TERMTYPE1);
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_TERMTYPE2, EEPROM_TERMTYPE2);
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_TERMMASK1, EEPROM_TERMMASK1);
	eeprom_update_byte((uint8_t*)EEPROM_ADDR_TERMMASK2, EEPROM_TERMMASK2);
	
	eeprom_update_word((uint16_t*)EEPROM_ADDR_SNAKE_HIGH_SCORE, EEPROM_SNAKE_HIGH_SCORE);
}

//CTENI Z EEPROM
void readEEPROM(void) {
	if (readEEPROM_flag)
	{
	EEPROM_LCD_BL		= eeprom_read_byte((uint8_t*)EEPROM_ADDR_LCD_BL);
	EEPROM_PID_P		= eeprom_read_byte((uint8_t*)EEPROM_ADDR_PID_P);
	EEPROM_PID_I		= eeprom_read_byte((uint8_t*)EEPROM_ADDR_PID_I);
	EEPROM_PID_D		= eeprom_read_byte((uint8_t*)EEPROM_ADDR_PID_D);
	EEPROM_BZUCAK		= eeprom_read_byte((uint8_t*)EEPROM_ADDR_BZUCAK);
	EEPROM_VENTILATOR	= eeprom_read_word((uint16_t*)EEPROM_ADDR_VENTILATOR);
	EEPROM_CHYBA		= eeprom_read_byte((uint8_t*)EEPROM_ADDR_CHYBA);
	EEPROM_KONTRAST		= eeprom_read_byte((uint8_t*)EEPROM_ADDR_KONTRAST);
	
	EEPROM_TEPLOTA1		= eeprom_read_word((uint16_t*)EEPROM_ADDR_TEPLOTA1);
	EEPROM_TEPLOTA2		= eeprom_read_word((uint16_t*)EEPROM_ADDR_TEPLOTA2);
	EEPROM_TEPLOTA3		= eeprom_read_word((uint16_t*)EEPROM_ADDR_TEPLOTA3);
	EEPROM_TEPLOTA4		= eeprom_read_word((uint16_t*)EEPROM_ADDR_TEPLOTA4);
	EEPROM_TEPLOTA5		= eeprom_read_word((uint16_t*)EEPROM_ADDR_TEPLOTA5);
	
	EEPROM_CAS1			= eeprom_read_byte((uint8_t*)EEPROM_ADDR_CAS1);
	EEPROM_CAS2			= eeprom_read_byte((uint8_t*)EEPROM_ADDR_CAS2);
	EEPROM_CAS3			= eeprom_read_byte((uint8_t*)EEPROM_ADDR_CAS3);
	EEPROM_CAS4			= eeprom_read_byte((uint8_t*)EEPROM_ADDR_CAS4);
	EEPROM_CAS5			= eeprom_read_byte((uint8_t*)EEPROM_ADDR_CAS5);
	
	EEPROM_TERMTYPE1	= eeprom_read_byte((uint8_t*)EEPROM_ADDR_TERMTYPE1);
	EEPROM_TERMTYPE2	= eeprom_read_byte((uint8_t*)EEPROM_ADDR_TERMTYPE2);
	EEPROM_TERMMASK1	= eeprom_read_byte((uint8_t*)EEPROM_ADDR_TERMMASK1);
	EEPROM_TERMMASK2	= eeprom_read_byte((uint8_t*)EEPROM_ADDR_TERMMASK2);
	
	EEPROM_SNAKE_HIGH_SCORE	= eeprom_read_word((uint16_t*)EEPROM_ADDR_SNAKE_HIGH_SCORE);
	}
}

//POSILANI PRIKAZU LCD
void LCD_SEND_COMM(uint8_t comm){
LCD_CS_ON_PORT = LCD_CS_PIN;
LCD_A0_COMM_PORT = LCD_A0_PIN;

SPI0_DATA = comm;
while ((SPI0_INTFLAGS&(1<<7)) == 0)
;

LCD_CS_OFF_PORT = LCD_CS_PIN;
return;
}

//NASTAVENI PORTU
void PORT_INIT(void){
	//NASTAVENI VSTUPU A VYSTUPU
	PORTA_DIRSET = 0b01010111;
	PORTA_DIRCLR = 0b10101000;
	
	PORTB_DIRSET = 0b00100011;
	PORTB_DIRCLR = 0b11011100;
	
	PORTC_DIRSET = 0b11000000;
	PORTC_DIRCLR = 0b00111111;
	
	PORTD_DIRSET = 0b01110000;
	PORTD_DIRCLR = 0b10001111;
	
	PORTE_DIRSET = 0b00000000;
	PORTE_DIRCLR = 0b11111111;
	
	PORTF_DIRSET = 0b00000000;
	PORTF_DIRCLR = 0b11111111;
	
	//SLEW RATE LIMIT
	PORTA_PORTCTRL = 1;
	PORTB_PORTCTRL = 1;
	PORTC_PORTCTRL = 1;
	PORTD_PORTCTRL = 1;
	PORTE_PORTCTRL = 1;
	PORTF_PORTCTRL = 1;
	
	//PULLUP REZISTORY A VYBER PRERUSENI
	PORTA_PIN0CTRL = 0b10000000;
	PORTA_PIN1CTRL = 0;
	PORTA_PIN2CTRL = 0;
	PORTA_PIN3CTRL = 0b00001000;
	PORTA_PIN4CTRL = 0;
	PORTA_PIN5CTRL = 0;
	PORTA_PIN6CTRL = 0;
	PORTA_PIN7CTRL = 0b00001000;
	
	PORTB_PIN0CTRL = 0;
	PORTB_PIN1CTRL = 0;
	PORTB_PIN2CTRL = 0b00001000;
	PORTB_PIN3CTRL = 0b00001000;
	PORTB_PIN4CTRL = 0b00001000;
	PORTB_PIN5CTRL = 0;
	
	PORTC_PIN0CTRL = 0b00001000;
	PORTC_PIN1CTRL = 0b00001000;
	PORTC_PIN2CTRL = 0b00001000;
	PORTC_PIN3CTRL = 0b00001000;
	PORTC_PIN4CTRL = 0b00001000;
	PORTC_PIN5CTRL = 0b00001000;
	PORTC_PIN6CTRL = 0;
	PORTC_PIN7CTRL = 0;
	
	PORTD_PIN0CTRL = 0b00001000;
	PORTD_PIN1CTRL = 0b00001000;
	PORTD_PIN2CTRL = 0b00001000;
	PORTD_PIN3CTRL = 0b00001000;
	PORTD_PIN4CTRL = 0;
	PORTD_PIN5CTRL = 0;
	PORTD_PIN6CTRL = 0;
	PORTD_PIN7CTRL = 0b00001000;
	
	PORTE_PIN0CTRL = 0;
	PORTE_PIN1CTRL = 0;
	PORTE_PIN2CTRL = 0;
	PORTE_PIN3CTRL = 0;
	
	PORTF_PIN0CTRL = 0b00001011;
	PORTF_PIN1CTRL = 0b00001011;
	PORTF_PIN2CTRL = 0b00001000;
	PORTF_PIN3CTRL = 0b00001000;
	PORTF_PIN4CTRL = 0b00001001;
	PORTF_PIN5CTRL = 0b00000010;
	PORTF_PIN6CTRL = 0b00000011;
	
	//PRVOTNI STAVY PORTU
	PORTA_OUTSET = 0b00000000;
	PORTA_OUTCLR = 0b00000111;
	
	PORTB_OUTSET = 0b00000001;
	PORTB_OUTCLR = 0b00100010;
	
	PORTC_OUTCLR = 0b00000000;
	PORTC_OUTCLR = 0b11000000;
	
	PORTD_OUTCLR = 0b01110000;
	PORTD_OUTCLR = 0b00000000;
	
	PORTE_OUTCLR = 0b00000000;
	PORTE_OUTCLR = 0b00000000;
	
	PORTF_OUTCLR = 0b00000000;
	PORTF_OUTCLR = 0b00000000;
}

//INICIALIZACE LCD
void LCD_INIT(void){
	uint8_t Kontrast_set = EEPROM_KONTRAST;
	if (Kontrast_set > 20)
	{
		Kontrast_set = 20;
	}
	if (Kontrast_set < 10)
	{
		Kontrast_set = 10;
	}
	
	LCD_CS_ON_PORT = LCD_CS_PIN;
	LCD_RES_ON_PORT = LCD_RES_PIN;
	_delay_ms(50);
	LCD_RES_OFF_PORT = LCD_RES_PIN;
	_delay_ms(50);
	LCD_SEND_COMM(0xA2);
	LCD_SEND_COMM(0xA0);
	LCD_SEND_COMM(0xC8);
	LCD_SEND_COMM(0xC8);//C0
	LCD_SEND_COMM(0x40);
	LCD_SEND_COMM(0x25);
	LCD_SEND_COMM(0x81);
	LCD_SEND_COMM(Kontrast_set);//upravuje kontrast 0x00 az 0x3f (default 0x19) nejlepsi 0F
	//LCD_SEND_COMM(0x0F);
	LCD_SEND_COMM(0x2F);
	LCD_SEND_COMM(0xAF);
	LCD_SEND_COMM(0b10100101);
	_delay_ms(2000);
	LCD_SEND_COMM(0b10100100);
	LCD_CS_OFF_PORT = LCD_CS_PIN;
}

//POSILANI DAT LCD
void LCD_SEND_DATA(uint8_t data){
	LCD_CS_ON_PORT = LCD_CS_PIN;
	LCD_A0_DATA_PORT = LCD_A0_PIN;
	
	SPI0_DATA = data;
	while ((SPI0_INTFLAGS&(1<<7)) == 0)
	;
	
	LCD_CS_OFF_PORT = LCD_CS_PIN;
}

//vykresleni bufferu na displej
void LCD_UpdateScreen(void) {
	for (uint8_t page = 0; page < LCD_PAGES; page++) {
		LCD_SEND_COMM(0xB0 | page);  // Nastavení stránky
		LCD_SEND_COMM(0x10);         // Nastavení horních 4 bitů sloupcové adresy (0x10 = 0)
		LCD_SEND_COMM(0x00);         // Nastavení dolních 4 bitů sloupcové adresy (0x00 = 0)

		for (uint8_t col = 0; col < LCD_WIDTH; col++) {
			LCD_SEND_DATA(lcd_buffer[page * LCD_WIDTH + col]);
		}
	}
}

//NAKRESLI CHAR NA DISPLAY; ('CHAR', radek 0-7, sloupec 0-63)
void LCD_DrawChar(char c, uint8_t row, uint8_t col) {
	if (c < 0 || c > 1000) return; // Ověření platného ASCII rozsahu
	//if (c < 32 || c > 126) return; // Ověření platného ASCII rozsahu
	if (col > LCD_WIDTH - 5 || row >= LCD_PAGES) return; // Ověření hranic bufferu

	//uint16_t fontIndex = (c - 32) * 5; // Každý znak začíná na (ASCII - 32) * 5
	uint16_t fontIndex = (c) * 5; // Každý znak začíná na (ASCII - 32) * 5
	for (uint8_t i = 0; i < 5; i++) {
		uint8_t originalByte = pgm_read_byte(&font[fontIndex + i]);
		lcd_buffer[row * LCD_WIDTH + col + i] = reverseByte(originalByte);
		//lcd_buffer[row * LCD_WIDTH + col + i] = pgm_read_byte(&font[fontIndex + i]);
	}
}

//OTOCENI BYTU
uint8_t reverseByte(uint8_t b) {
	b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; // Převrácení nibbles (4-bitových skupin)
	b = (b & 0xCC) >> 2 | (b & 0x33) << 2; // Převrácení dvojic bitů
	b = (b & 0xAA) >> 1 | (b & 0x55) << 1; // Převrácení jednotlivých bitů
	return b;
	}
	
//NAKRESLI RETEZEC ZNAKU; ("STRING", radek zacatku 0-7, sloupec zacatku 0-127)
void LCD_DrawString(const char *str, uint8_t row, uint8_t col) {
		while (*str) {  // Procházíme znak po znaku
			if (col > LCD_WIDTH - 5) { // Pokud by znak přesáhl okraj, skončíme
				break;
			}
			LCD_DrawChar(*str, row, col); // Vykreslení znaku
			col += 6; // Posun na další znak (5 pixelů + 1 pixel mezera)
			str++;  // Další znak
		}
	}

//NAKRESLI PIXEL (x souradnice 0-127, y souradnice 0-63)	
void LCD_DrawPixel(uint8_t x, uint8_t y) {
		if (x >= LCD_WIDTH || y >= LCD_HEIGHT) return;  // Ověření hranic displeje
		lcd_buffer[(y / 8) * LCD_WIDTH + x] |= (1 << (y % 8));  // Nastavení bitu v bufferu
	}

//NAKRESLI PRIMKU MEZI BODY (x bod 1, y bod 1, x bod 2, y bod 2) x<0;127>; y<0;63>
void LCD_DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2) {
		int dx = abs(x2 - x1), sx = x1 < x2 ? 1 : -1;
		int dy = -abs(y2 - y1), sy = y1 < y2 ? 1 : -1;
		int err = dx + dy, e2;  // Chybový člen

		while (1) {
			LCD_DrawPixel(x1, y1);  // Nastavení pixelu
			if (x1 == x2 && y1 == y2) break;  // Pokud jsme dosáhli konce
			e2 = 2 * err;
			if (e2 >= dy) { err += dy; x1 += sx; }  // Posun v ose X
			if (e2 <= dx) { err += dx; y1 += sy; }  // Posun v ose Y
		}
	}
	
//NAPISE NA DISPLEJ CISLO
void LCD_DrawNumber(uint16_t cislo, uint8_t row, uint8_t col) {
		char buffer[6];  // Maximálně 5 číslic + null terminátor (65535 ? "65535\0")
		itoa(cislo, buffer, 10);  // Převod čísla na string (základ 10)
		LCD_DrawString(buffer, row, col);  // Vykreslení čísla na displej
}

//CISLA NA DISPLEJ I S NULAMI
void LCD_DrawNumberFixed(uint16_t cislo, uint8_t row, uint8_t col, uint8_t minWidth) {
	char buffer[6];  // Maximálně 5 číslic + null terminátor
	uint8_t index = 5;  // Poslední pozice (buffer končí null terminátorem)
	buffer[index] = '\0';  // Ukončení řetězce

	// 1?? Konverze čísla do stringu (odzadu)
	do {
		buffer[--index] = (cislo % 10) + '0';  // Převod číslice na ASCII
		cislo /= 10;
	} while (cislo > 0);

	// 2?? Doplnění nul, pokud je číslo kratší než minWidth
	while ((5 - index) < minWidth) {
		buffer[--index] = '0';
	}

	// 3?? Poslat string na displej
	LCD_DrawString(&buffer[index], row, col);
}

//######################################################################################KONEC HLAVNI CASTI PROGRAMU








//snake setup DONE
void setup_snake() {

	memset(snakeTailX, 0x00, sizeof(snakeTailX));
	memset(snakeTailY, 0x00, sizeof(snakeTailY));
	// snake's tail
	snakeTailLen = 0;

	key = 0;

	// Flag to signal the gameover
	gameover = 0;

	// Initial coordinates of the snake
	x = 50;
	y = 29;
	
	// Initial coordinates of the fruit
	fruitx = 5 + (rand() % ((122 - 5) / 3 + 1)) * 3;
	fruity = 5 + (rand() % ((59 - 5) / 3 + 1)) * 3;
	
	// Score initialzed
	score = 0;
	
	
	
}

//kresleni tela DONE
void Snake_body(uint8_t x, uint8_t y){
	LCD_DrawLine(x-1, y+1, x+1, y+1);
	LCD_DrawLine(x-1, y, x+1, y);
	LCD_DrawLine(x-1, y-1, x+1, y-1);
}

//kresleni ovoce DONE
void Snake_fruit(uint8_t x, uint8_t y){
	LCD_DrawPixel(x, y+1);
	LCD_DrawPixel(x, y-1);
	LCD_DrawPixel(x+1, y);
	LCD_DrawPixel(x-1, y);
}

// Function to draw the game field, snake and fruit DONE
void draw() {
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
	
	// Creating top wall
	LCD_DrawLine( 0, 0, 127, 0);
	LCD_DrawLine( 0, 1, 127, 1);
	LCD_DrawLine( 0, 2, 127, 2);
	
	// Creating side walls
	LCD_DrawLine( 0, 0, 0, 63);
	LCD_DrawLine( 1, 0, 1, 63);
	LCD_DrawLine( 2, 0, 2, 63);
	
	LCD_DrawLine( 127, 0, 127, 63);
	LCD_DrawLine( 126, 0, 126, 63);
	LCD_DrawLine( 125, 0, 125, 63);
	
	// Creating bottom walls
	LCD_DrawLine( 0, 63, 127, 63);
	LCD_DrawLine( 0, 62, 127, 62);
	
	
	for (int i = 5; i <= 59; i+=3) {
		for (int j = 5; j <= 122; j+=3) {

			// Creating snake's head
			if (i == y && j == x){
			Snake_body(j, i);
			
			// Creating the snake's food
			}else if (i == fruity && j == fruitx){
			Snake_fruit(j, i);
			
			// Creating snake's body
			}else{
				for (int k = 0; k < snakeTailLen; k++) {
					if (snakeTailX[k] == j
					&& snakeTailY[k] == i) {
						Snake_body(j, i);
					}
				}
			}
		}
	}
	LCD_UpdateScreen();
}

// Function to take the real time input and set the 'flag' variable accordingly	DONE
void input() {
	if (ROT_rotace == -1)
	{
		key--;
	}
	if (ROT_rotace == 1)
	{
		key++;
	}
	if (key == 0)
	{
		key = 4;
	}
	if (key == 5)
	{
		key = 1;
	}
	ROT_rotace = 0;
}

// Function for the movement logic that checks eat, move, collisions DONE
void logic() {
	
	// Updating the coordinates for continous
	// movement of snake
	int prevX = snakeTailX[0];
	int prevY = snakeTailY[0];
	int prev2X, prev2Y;
	snakeTailX[0] = x;
	snakeTailY[0] = y;
	for (int i = 1; i < snakeTailLen; i++) {
		prev2X = snakeTailX[i];
		prev2Y = snakeTailY[i];
		snakeTailX[i] = prevX;
		snakeTailY[i] = prevY;
		prevX = prev2X;
		prevY = prev2Y;
	}
	
	// Changing the direction of movement of snake
	switch (key) {
		case 1:
		x-=3;
		break;
		case 2:
		y+=3;
		break;
		case 3:
		x+=3;
		break;
		case 4:
		y-=3;
		break;
		default:
		break;
	}

	// If the game is over
	if (x <= 2 || x >= 125 || y <= 2 || y >= 62)
	gameover = 1;
	
	// Checks for collision with the tail
	for (int i = 0; i < snakeTailLen; i++) {
		if (snakeTailX[i] == x && snakeTailY[i] == y)
		gameover = 1;
	}

	// If snake reaches the fruit
	// then update the score
	if (x == fruitx && y == fruity) {
		
		uint8_t collision;
		do {
			fruitx = 5 + (rand() % ((122 - 5) / 3 + 1)) * 3;
			fruity = 5 + (rand() % ((59 - 5) / 3 + 1)) * 3;

			collision = 0; // Předpokládáme, že nedošlo ke kolizi

			// Kontrola kolize s tělem hada
			for (int i = 0; i < 100; i++) {
				if (snakeTailX[i] == fruitx && snakeTailY[i] == fruity) {
					collision = 1;
					break; // Pokud je kolize, přeruš smyčku
				}
			}
			
			if (x == fruitx && y == fruity)
				collision = 1;
			
			
		} while (collision);
		
		
		score += 1;
		snakeTailLen++;
	}
}

//hlavni hra DONE
void SNAKE(void){
	
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
	LCD_DrawString("SNAKE!!!", 3, 40);
	LCD_UpdateScreen();
	_delay_ms(1000);

	//INICIALIZACE SNAKE
	setup_snake();
	
	//SAMOTNA HRA
	// Game loop starts here
	while (!gameover) {

		// Functions that will be called
		// repeatedly after the given interval
		draw();
		input();
		logic();
		_delay_ms(250);
	}
	
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
	LCD_DrawString("Konec hry", 1, 0);
	LCD_DrawString("Skore:", 2, 0);
	LCD_DrawNumber(score, 2, 100);
	LCD_DrawString("Nejvyssi skore:", 3, 0);
	LCD_DrawNumber(EEPROM_SNAKE_HIGH_SCORE, 3, 100);

	
	//na displej dosazene skore a high score z eeprom
	//pokud nove high score tak aktualizovat v EEPROM
	if(score > EEPROM_SNAKE_HIGH_SCORE) {
		readEEPROM_flag = 0;
		EEPROM_SNAKE_HIGH_SCORE = score;
		writeEEPROM();
		readEEPROM_flag = 1;
	LCD_DrawString("Nove nejvyssi skore!", 4, 0);
	}
	LCD_UpdateScreen();	
	_delay_ms(5000);
	memset(lcd_buffer, 0x00, sizeof(lcd_buffer));
}
