/*
 * Diplomová práce:     Meteostanice 2013
 * Autor práce:         Pavel Beneděla
 * Vedoucí práce:       Ing. Marie Havlíková, Ph.D.
 * Mikroprocesor:       PIC18F4520 (využito 66% ROM paměti, 16% RAM paměti)
 * Pracovní kmitočet:   20.000 MHz
 * Compiler:            CCS PCH V4.128
 * Poslední úprava:     04/03/2013


 *Použité funkce:
  void natoceni();                                               //Funkce měří směr větru
  void shtx();                                                   //Funkce měří teplotu a relativní vlhkost vzduchu
  void senddata (char posli);                                    //Funkce odesílá zakódované data přes uart
  void nacti_nastaveni(void);                                    //Funkce načte nastavení a data z EEPROM
  void odesilani_maxim (void);                                   //Funkce připravuje a odesílá denní minima a maxima
  void mer_tlak (void);                                          //Funkce měří atmosférický tlak
  void mer_datum (void);                                         //Funkce vyčte datum a čas z RTC
  void mer_srazky (void);                                        //Funkce upraví naměřené srážky do pole
  void nulovani_pulnoc (void);                                   //Funkce nuluje denní naměřené maxima a minima
  void cista_obrazovka(void);                                    //Funkce vytiskne úvodní obrazovku
  void menu (void);                                              //Funkce zobrazí hlavní menu stanice
  void Maxima(void);                                             //Funkce tiskne teplotní minima a maxima na displej
  void Maxima2(void);                                            //Funkce tiskne maxima a minima rel. vlhkosti na displej
  void Maxima3(void);                                            //Funkce tiskne maxima a minima atm. tlaku na displej
  void Vyska(void);                                              //Funkce pro nastavení nadm. výšky stanice
  void Time( void);                                              //Funkce vyčte aktuální datum a čas z RTC
  void Smaz(void);                                               //Funkce maže data na EEPROM
  void Srazky_m(void);                                           //Funkce tiskne na displej denní a roční srážky
  void set_Position( unsigned char Sign);                        //Funkce nastavuje kurzor při nastavování data a času
  void IncDecSign( unsigned Sign, unsigned direct);              //Funkce přičítá/odečítá hodnotu při nastavování času a data
  int16 ulozvyska(void);                                         //Funkce přepočítává atm. tlak podle nadm. výšky
  char send_char (char retez[],unsigned int kontrolni);          //Funkce zakóduje data do manchester kódu
  unsigned int16 read_pamet (BYTE high, BYTE low);               //Funkce načte data z EEPROM
  void write_pamet(unsigned int16 vstup, BYTE high, BYTE low);   //Funkce uloží data do EEPROM 
 */

 
#include <18F4520.h>         //naincludování použitého procesoru

#fuses HS,NOWDT,NOPROTECT,NOLVP,NOMCLR                         //pojistky
#device ADC=10                                                 //nastavení A/D převodníku jako 10ti bitový
#use delay(clock = 20000000)                                   //Definice frekvence mikrokontroléru pro funkci delay
#use rs232(baud=1200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)   //Nastavení sériové linky
#use i2c(Master, sda=PIN_C4, scl=PIN_C3)                       //Nastavení i2c

#include <main.h>            //hlavičkový soubor, kde se nachází použité knihovny a deklarace funkcí
#include <math.h>

//----------------------------------Makra---------------------------------------//
#define menu_pin    PIN_E2   //tlačítko menu
#define sel_pin     PIN_E1   //tlačítko výběr
#define up_pin      PIN_E0   //tlačítko nahorů
#define down_pin    PIN_C1   //tlačítko dolů

//--------------------------Globální proměnné-----------------------------------//

int8 nacteno = 0;

unsigned int sekundy=0,intr5=0,intr2 = 0;       //pomocné proměnné pro timer
unsigned int crc = 0;                           //proměnná pro kontrolní součet
unsigned int natoc_id=8, natoc_id2=0;           //proměnné pro směr natočení

unsigned int16 destpomoc=0;
unsigned int16 v_preruseni=0,v_pocet_imp=0;     //proměnné pro rychlost větru
unsigned int16 srazky = 0, srazky_rok=0;        //proměnné pro srážky
unsigned int16 vys;                             //proměnná nesoucí nastavenou výšku stanice

signed int16 Tamax=-9900,Tamin=9999,maxpom=0,Rhmax=0,Rhmin=9999,Tlmax=0,Tlmin=90000,Vetrmax=0;  //proměnné pro ukládání hodnot denních maxim a minim

BYTE h_tep_max, h_tep_min, m_tep_max, m_tep_min, m_vetr_max, h_vetr_max;   //proměnné pro ukládání času naměřených denních minim a maxim
BYTE h_vlh_max, m_vlh_max, h_vlh_min, m_vlh_min;                           //proměnné pro ukládání času naměřených denních minim a maxim
BYTE h_tlak_max, m_tlak_max, h_tlak_min,m_tlak_min;                        //proměnné pro ukládání času naměřených denních minim a maxim
BYTE sec, min, hrs, day, month, yr, dow;                                   //proměnné obsahující aktuální datum a čas
BYTE low_byte, high_byte;                                                  //proměnné používané pro dělení int16 na dva bajty

unsigned int32 v_pocet_imp2=0,v_pocet_imp3=9;     //proměnné pro rychlost větru

unsigned char Rh[7];                //pole s naměřenou hodnotou relativní vlhkosti pro výpis na displej 
unsigned char Ta[8];                //pole s naměřenou hodnotou teploty pro výpis na displej 
unsigned char tlak [8];             //pole s naměřenou hodnotou atmosférického tlaku pro výpis na displej 
unsigned char vitr[7];              //pole s naměřenou hodnotou rychlosti větru pro výpis na displej 
unsigned char sraz[7];              //pole s naměřenou hodnotou srážek pro výpis na displej 
unsigned char natoc2[4] = "   ";    //pole s naměřeným směrem větru pro výpis na displej 
unsigned char posl[5];              //pole s daty pro odeslání
char ret[7] ="      ";
unsigned char   output[21];

//***************************obsluhy přerušení***********************************//

//--------------- obsluha extreního přerušení INT0 ------------------------------//
#int_ext       //externí přerušení od pinu RB0
void ISR()
{
   v_preruseni++;
}

//--------------- obsluha přerušení TIMER0 při přetečení -----------------------//

#INT_RTCC      //přerušení od timeru 0
void TIMER_INTERRUPT ( void ) //t=(4*256*delicka)/(fosc)      8bit = 256
{                             // přeteče za 13ms
if(intr2==228)    {v_pocet_imp = v_preruseni, intr2 = 0, v_preruseni = 0;}  //3sec
if(intr5==76)     {intr5=0,sekundy++; }                //1sec
if(sekundy==60)   {sekundy=0;}                         //1min
intr2++;
intr5++;
}

//************************konec obsluhy přerušení********************************//

//*******************************MAIN********************************************//

void main() //hlavní program
{            

 unsigned int16 usek=0;
//-----inicializace displeje-----------------//  
    delay_ms(100); 
    nokia_init(); 
    delay_ms(1000);
    nokia_init();
    delay_ms(1000);


//--------startovaci obrazovka---------------//
    nokia_gotoxy(0,0); 
    printf(nokia_printchar,"Meteostanice");
    nokia_gotoxy(0,2); 
    printf(nokia_printchar,"MCU 18f4520");
    nokia_gotoxy(0,4); 
    printf(nokia_printchar,"V.3d");
    nokia_gotoxy(10,5); 
    printf(nokia_printchar,"PB 2013");
    delay_ms(2000);
    nokia_clear_screen();
    delay_ms(200);

 
 // Nastavení TIMER0 
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_BIT);  // nastaví časovač jako 8bit, dělička 256
                                                         //t=(4*256*delicka)/(fosc)      8bit = 256
                                                         // přeteče za 13ms
 // Nastavení TIMER1 jako čítač
  set_timer1(0);                         // vynulování registru čítače
  setup_timer_1(T1_EXTERNAL|H_TO_L);     // nastaví časovač jako čítač
 
 // Povolení přerušení
  enable_interrupts(INT_EXT|INT_RTCC);   // povoleni preruseni
  enable_interrupts(GLOBAL);             // povolí globální přerušení
 
 // Nastavení A/D úřevodníku a pinů
  setup_adc_ports(AN0_TO_AN3_ANALOG);    // nastaveni A/D prevodniku na piny AN0-AN3
  setup_adc(ADC_CLOCK_INTERNAL);         // nastavení interních hodin A/D převodníku
  set_adc_channel(1);                    // Nastaví A/D převod na pin AN0

  nacti_nastaveni();     // načte nastavení a data z EEPROM
  cista_obrazovka();     //nacte uvodni obrazovku

while(true) // Začátek cyklu
 {
   if(!input(menu_pin))   // testuje jestli nebylo zmáčknuto tlačítko menu
   {                  
      while((!input(menu_pin))){}         //ošetření při držení tlačítka
      menu();                             // skočí do hlavního menu měřicí centrály
          if(nacteno == 1)     //pokud už byly načteny data a vrací se z menu
          {
             //tiskne data na LCD
             mer_datum ();
             nokia_gotoxy(0,1);
             printf(nokia_printchar,"Tep%s",Ta);
             nokia_print_degree();
             printf(nokia_printchar,"C");       
             nokia_gotoxy(0,2);
             printf(nokia_printchar,"Vlh:%s%%",Rh);      
             nokia_gotoxy(0,3);
             printf(nokia_printchar,"Tlak%shPa",tlak); 
             nokia_gotoxy(0,4);
             printf(nokia_printchar,"Sraz%smm",sraz);      
             nokia_gotoxy(0,5);
             printf(nokia_printchar,"V%s",vitr);       
             nokia_gotoxy(65,5);
             printf(nokia_printchar,"%s",natoc2);
          }
          else
          {
          cista_obrazovka();    
          }
      v_pocet_imp3=9;
   } //konec menu 
    
   switch(sekundy)  // kazdych cca 10s se měří dané prvky
   {
      case 10:
               sekundy++; mer_datum ();        //měří datum, čas
               nulovani_pulnoc ();           //testuje zda není půlnoc
               break;
      case 20:
               sekundy++; mer_tlak ();         // měří atmosférický tlak
               break;
      case 30:
               sekundy++; shtx();              //měří teplotu a relativní vlhkost vzduchu
               break;
      case 40:
               sekundy++; mer_srazky ();       //výpis srážek na displej
               break;
      case 50:
               sekundy++; odesilani_maxim ();  //aktualizuje naměřené maxima a minima
               nacteno = 1;
               break;
   } //konec Switch
     
   if(intr5==60) { usek=get_timer1();                        //měření srážek
                   if(usek>0){destpomoc++; set_timer1(0); }  //pokud došlo k překlopení plováku
                 }
   if(intr2==100){ natoceni();  }     //měří směr větru
                 
    //----------------------------------------vetr--------------------------------------------// 
     v_pocet_imp2=v_pocet_imp;
   if(v_pocet_imp2!=v_pocet_imp3)  // pouze pokud je zmena rychlosti vetru
   {   
         v_pocet_imp3=v_pocet_imp2;
         /*nokia_gotoxy(0,4);
         printf(nokia_printchar,"%uimp",v_pocet_imp2);*/
   
         //------kalibrace anemometru-----//
         v_pocet_imp2 =(v_pocet_imp2*10000); //k vuli deleni celocislneho typu
         v_pocet_imp2 =(v_pocet_imp2/615);   //koef z grafu 606
         v_pocet_imp2 = v_pocet_imp2/36;     //přepočet z km/h na m/s
            
         if(v_pocet_imp2>Vetrmax){Vetrmax=v_pocet_imp2,h_vetr_max=hrs, m_vetr_max = min; }   // testuje na maximum
          
         vitr[0] ='V';
         vitr[1] = v_pocet_imp2 / 100 + 48;
         vitr[2] = v_pocet_imp2 % 100 / 10 + 48;
         vitr[3] ='.';
         vitr[4] = v_pocet_imp2 % 10 + 48;
         vitr[5]='\0';
         if (vitr[1]=='0') vitr[1]=' ';
           
         nokia_gotoxy(0,5);
         printf(nokia_printchar,"%s m/s",vitr);
         
         high_byte = v_pocet_imp2 >> 8;
         low_byte = v_pocet_imp2; 
         crc = ((high_byte /2) + (low_byte/2)+1);
         
         posl[0] = 'V';
         posl[1] = high_byte;
         posl[2] = low_byte;
         posl[3] = '\0';
         senddata (posl);
   } //konec vetr  
 }   // konec nekonecne smycky
}    // konec main

//****************************************F U N K C E*******************************************************//

//--------------------------------------měření směr větru------------------------------//
void natoceni()   
   {
        unsigned long long adc_value=0;
        set_adc_channel(1);
        delay_us(10);
        adc_value = read_adc();   //vyčtení hodnoty převodu
        adc_value = (adc_value*50000)/1023;  //přepočet slova na napětí
        
        if     ((adc_value<10853)&&(adc_value>10553)){natoc_id = 6; natoc2[0]='Z';natoc2[1]=' ';natoc2[2]=' ';} //Z
        else if((adc_value<25076)&&(adc_value>24776)){natoc_id = 0; natoc2[0]='S';natoc2[1]=' ';natoc2[2]=' ';} //S
        else if((adc_value<16963)&&(adc_value>16663)){natoc_id = 7; natoc2[0]='S';natoc2[1]='/';natoc2[2]='Z';} //S/Z
        else if((adc_value<40130)&&(adc_value>39830)){natoc_id = 1; natoc2[0]='S';natoc2[1]='/';natoc2[2]='V';} //S/V
        else if((adc_value<44822)&&(adc_value>44522)){natoc_id = 4; natoc2[0]='J';natoc2[1]=' ';natoc2[2]=' ';} //J
        else if((adc_value<47021)&&(adc_value>46721)){natoc_id = 3; natoc2[0]='J';natoc2[1]='/';natoc2[2]='V';} //J/V
        else if((adc_value<33727)&&(adc_value>33427)){natoc_id = 5; natoc2[0]='J';natoc2[1]='/';natoc2[2]='Z';} //J/Z
        else if((adc_value<48500)&&(adc_value>48334)){natoc_id = 2; natoc2[0]='V';natoc2[1]=' ';natoc2[2]=' ';} //V
        //else   { natoc2[0]='n';natoc2[1]='/';natoc2[2]='a';} // n/a
    
        if(natoc_id != natoc_id2)      //pokud se změnil směr větru
        {         
           natoc_id2=natoc_id;
           //------------výpis na displej----------------
           nokia_gotoxy(65,5);
           printf(nokia_printchar,"%s",natoc2);
           
           //-----------příprava dat k odeslání----------
           posl[0] = 'S';
           posl[1] = natoc_id;
           posl[2] = '\0'; //low byte
           crc = (natoc_id/2)+1;
           senddata (posl);
        }
  } //Konec natoceni
  
//----------------------------------měří teplotu a vlhkost------------------------------//
 void shtx () //funkce měřicí teplotu a relativní vlhkost vzduchu
   {  
       unsigned long long SOrh;
       unsigned long long temp1;
       unsigned long long Rh_res;
       signed long long rh_true;
       int16 moje;

        
       moje = measuretemp(); 
       if(moje > 4010)                                // pokud je teplota nad nulou
          { moje = moje * 1 - 4010; Ta[1] = ' '; 
           if(moje>Tamax){Tamax=moje,h_tep_max=hrs, m_tep_max=min;}  //testuje maxima
           if(moje<Tamin){Tamin=moje,h_tep_min=hrs, m_tep_min=min;}  //testuje minima
               
          }       
      else  {moje = 4010 - moje * 1; Ta[1] = '-';     // pokud je teplota pod nulou
            maxpom=(moje)*-1;
           if(maxpom>Tamax){Tamax=maxpom,h_tep_max=hrs, m_tep_max=min;}  //testuje maxima
           if(maxpom<Tamin){Tamin=maxpom,h_tep_min=hrs, m_tep_min=min;}  //testuje minima
       }
        
        //------------převod namerene hdonoty do řetězce-------------
        Ta[0] = ':';
        Ta[2] = moje % 10000 / 1000 + 48;           
        Ta[3] = moje % 1000 / 100 + 48; 
        Ta[4] = '.';
        Ta[5] = moje % 100 / 10 + 48;               
        Ta[6] = moje % 10 + 48; 
        Ta[7]='\0';
        //------------převod namerene hdonoty do řetězce-------------
        
        //------------výpis na displej------------
        nokia_gotoxy(0,1);
        printf(nokia_printchar,"Tep%s", Ta);
        nokia_print_degree();
        printf(nokia_printchar,"C");
        //------------výpis na displej----------------
        
        //-----------příprava dat k odeslání----------
        if(Ta[1] == '-')
        { moje = moje*-1;
        }
           high_byte = moje >> 8;
           low_byte = moje; 
           crc = ((high_byte /2) + (low_byte/2)+1);
           
           posl[0] = 'T';
           posl[1] = high_byte;
           posl[2] = low_byte;
           posl[3] = '\0';
           senddata (posl);
        //-----------příprava dat k odeslání----------
        
        
      //-----------------------------------------------------------------------------------
        
        delay_us(100);
        SOrh = measurehumid();
       
        temp1 = SOrh * SOrh * 28 / 100000;             // calculate humidity
        Rh_res = SOrh * 405 / 100 - temp1 - 400;         // calculate humidity
        
        rh_true=moje;  
        rh_true=rh_true-2500;
        rh_true=(rh_true*(1000+(8*SOrh)))/100000;
        rh_true= rh_true+Rh_res;
            
        if(rh_true>Rhmax){Rhmax=rh_true,h_vlh_max=hrs,m_vlh_max=min;}  //testuje maxima
        if(rh_true<Rhmin){Rhmin=rh_true,h_vlh_min=hrs,m_vlh_min=min; } //testuje minima
        
       
        //------------převod namerene hdonoty do řetězce-------------
        Rh[0] = ' ';
        Rh[1] = Rh_true % 10000 / 1000 + 48;           
        Rh[2] = Rh_true % 1000 / 100 + 48;   
        Rh[3] = '.';
        Rh[4] = Rh_true % 100 / 10 + 48;               
        Rh[5] = Rh_true % 10 + 48;  
        Rh[6]='\0';
        //------------převod namerene hdonoty do řetězce-------------
      
        //------------výpis na displej------------
        nokia_gotoxy(0,2);
        printf(nokia_printchar,"Vlh:%s%%", Rh);
        //------------výpis na displej------------
        
        //-----------příprava dat k odeslání----------
        high_byte = rh_true >> 8;
        low_byte = rh_true; 
        crc = ((high_byte /2) + (low_byte/2)+1);   
        posl[0] = 'R';
        posl[1] = high_byte;
        posl[2] = low_byte;
        posl[3] = '\0';
        senddata (posl);
        //-----------příprava dat k odeslání----------
        
  
   } //konec shtx
   
//--------------------------odesílá zakódované data přes uart------------------------------//  
 void senddata (char posli) //funkce odesila data
 {   
        char sos[];
        unsigned int f;
        sos  = send_char(posli,crc); // funkce zakoduje do manchesteru
           
           printf( "%c", 0xFF);
           printf( "%c", 0xFF);
       for(f=0;f<3;f++)
       {
           printf( "%c", 0xFF);
           printf( "%c", 0xFF);
           printf( "%c", 0xAA);
           printf( "%c", 0xA5);
           printf( "%s", sos);
           printf( "%c", 0xFF);
       }
 } //konec senddata
 
 //----------------------připravuje naměřené maxima a minima na odeslání--------------------------//  
 void odesilani_maxim (void)
 {
       char max_posl[8];
       int16 pomocna;
 
       max_posl[0] = 'A';     //Tamax
       pomocna=Tamax;
       high_byte = pomocna >> 8;
       low_byte = pomocna; 
       crc =  ((high_byte /2) + (low_byte/2)+1);
       max_posl[1] = high_byte;
       max_posl[2] = low_byte;
       max_posl[3] = '\0';
       senddata (max_posl);
       
       max_posl[0] = 'B';     //Tamin
       pomocna=Tamin;
       high_byte = pomocna >> 8;
       low_byte = pomocna;
       crc = ((high_byte /2) + (low_byte/2)+1);
       max_posl[1] = high_byte;
       max_posl[2] = low_byte;
       max_posl[3] = '\0';
       senddata (max_posl); 
       
       max_posl[0] = 'G';     //Rhmax
       pomocna=Rhmax;
       high_byte = pomocna >> 8;
       low_byte = pomocna; 
       crc = ((high_byte /2) + (low_byte/2)+1);
       max_posl[1] = high_byte;
       max_posl[2] = low_byte;
       max_posl[3] = '\0';
       senddata (max_posl);

       max_posl[0] = 'H';     //Rhmin
       pomocna=Rhmin;
       high_byte = pomocna >> 8;
       low_byte = pomocna;
       crc = ((high_byte /2) + (low_byte/2)+1);
       max_posl[1] = high_byte;
       max_posl[2] = low_byte;
       max_posl[3] = '\0';
       senddata (max_posl);
       
       max_posl[0]='K';     //Tlmax
       pomocna=Tlmax;
       high_byte = pomocna >> 8;
       low_byte = pomocna; 
       crc = ((high_byte /2) + (low_byte/2)+1);
       max_posl[1] = high_byte;
       max_posl[2] = low_byte;
       max_posl[3] = '\0';
       senddata (max_posl);
       
       max_posl[0]='L';     //Tlmin
       pomocna=Tlmin;
       high_byte = pomocna >> 8;
       low_byte = pomocna; 
       crc = ((high_byte /2) + (low_byte/2)+1);
       max_posl[1] = high_byte;
       max_posl[2] = low_byte;
       max_posl[3] = '\0';
       senddata (max_posl); 
       
       max_posl[0]='M';    //vetrmax
       v_pocet_imp2=Vetrmax;
       high_byte = v_pocet_imp2 >> 8;
       low_byte = v_pocet_imp2; 
       crc = ((high_byte /2) + (low_byte/2)+1);
       max_posl[1] = high_byte;
       max_posl[2] = low_byte;
       max_posl[3] = '\0';
       senddata (max_posl);
       
       max_posl[0]='N';   //cas t max
       high_byte = h_tep_max;
       low_byte = m_tep_max;
       crc = ((high_byte /2) + (low_byte/2)+1); 
       max_posl[1] = high_byte;
       max_posl[2] = low_byte;
       max_posl[3] = '\0';
       senddata (max_posl);
       
       max_posl[0]='O';   //cas t min
       high_byte = h_tep_min;
       low_byte = m_tep_min;
       crc = ((high_byte /2) + (low_byte/2)+1);      
       max_posl[1] = high_byte;
       max_posl[2] = low_byte;
       max_posl[3] = '\0';
       senddata (max_posl);
       
       max_posl[0]='E';   //vlh t max
       high_byte = h_vlh_max;
       low_byte = m_vlh_max;
       crc = ((high_byte /2) + (low_byte/2)+1);
       max_posl[1] = high_byte;
       max_posl[2] = low_byte;
       max_posl[3] = '\0';
       senddata (max_posl);
       
       max_posl[0]='F';   //vlh t max
       high_byte = h_vlh_min;
       low_byte = m_vlh_min;
       crc = ((high_byte /2) + (low_byte/2)+1);       
       max_posl[1] = high_byte;
       max_posl[2] = low_byte;
       max_posl[3] = '\0';
       senddata (max_posl);
       
       max_posl[0]='I';   //vlh t max
       high_byte = h_tlak_max;
       low_byte = m_tlak_max;
       crc = ((high_byte /2) + (low_byte/2)+1);
       max_posl[1] = high_byte;
       max_posl[2] = low_byte;
       max_posl[3] = '\0';
       senddata (max_posl);
       
       max_posl[0]='J';   //vlh t max
       high_byte = h_tlak_min;
       low_byte = m_tlak_min;
       crc = ((high_byte /2) + (low_byte/2)+1);
       max_posl[1] = high_byte;
       max_posl[2] = low_byte;
       max_posl[3] = '\0';
       senddata (max_posl);
       
       max_posl[0]='Z';   //srazky rok
       low_byte = srazky_rok;
       high_byte = srazky_rok>> 8;
       crc = ((high_byte /2) + (low_byte/2)+1);
       max_posl[1] = high_byte;
       max_posl[2] = low_byte;
       max_posl[3] = '\0';
       senddata (max_posl);
       
       max_posl[0]='C';   //vetr max cas
       high_byte = h_vetr_max;
       low_byte = m_vetr_max;
       crc = ((high_byte /2) + (low_byte/2)+1);      
       max_posl[1] = high_byte;
       max_posl[2] = low_byte;
       max_posl[3] = '\0';
       senddata (max_posl);
       
 } //konec odesilani_maxim

//--------------------------měří atmosférický tlak------------------------------//  
void mer_tlak (void)
{
       unsigned long long adc_value1=0;
       unsigned long long adc_value=0;
       
       adc_value1=0;
       adc_value = read_ADS1100();

       adc_value1=(32900*adc_value);  //+2
       adc_value= (adc_value1/32768)*100;        //prepocitano na napeti
         
       adc_value =((adc_value)+313500)/297;
       //adc_value =(adc_value*1031)/1000;       //hranice  265m.n.m//1031
       //adc_value =(adc_value*1024)/1000;       //brno     205m.n.m//1024
       adc_value =(adc_value*vys)/1000;
       if(adc_value>Tlmax){Tlmax=adc_value,h_tlak_max=hrs, m_tlak_max=min;}
       if(adc_value<Tlmin){Tlmin=adc_value,h_tlak_min=hrs, m_tlak_min=min;}
                      
       tlak[0]=':';
       tlak[1]= adc_value/10000 + 48;
       tlak[2]= (adc_value%10000)/1000 + 48;
       tlak[3]= ((adc_value%10000)%1000)/100 + 48;
       tlak[4]= ((adc_value%10000)%1000)%100/10 + 48;
       tlak[5]= ((adc_value%10000)%1000)%100%10 + 48;
       tlak[6] = '\0'; 
       tlak[6] = tlak[5];    //k vuli tecce
       tlak[5] = '.';
       tlak[7] = '\0';
       
       nokia_gotoxy(0,3);
       printf(nokia_printchar,"Tlak%shPa", tlak);
       
       high_byte = adc_value >> 8;
       low_byte = adc_value; 
       crc = ((high_byte /2) + (low_byte/2)+1);
       
       posl[0] = 'P';
       posl[1] = high_byte;
       posl[2] = low_byte;
       posl[3] = '\0';
       senddata (posl);
 
} //konec mer_tlak

//--------------------------vyčte datum a čas RTC------------------------------//  
void mer_datum (void)
{    
     ds1307_get_date(day,month,yr,dow);
     ds1307_get_time(hrs,min,sec);
     nokia_gotoxy(0,0);
     printf(nokia_printchar,"%02d/%02d ",day,month);  //  /20%02d     
     printf(nokia_printchar,"cas%02d:%02d", hrs,min);
} //konec mer_datum

//--------------------upravuje naměřené srážky do pole------------------------------//  
void mer_srazky (void)
{  
     srazky = (destpomoc*10)/3;
     sraz[0] = ':';
     sraz[1] = srazky % 10000 / 1000 + 48;
     sraz[2] = srazky % 1000 / 100 + 48;    
     sraz[3] = srazky % 100 / 10 + 48;
     sraz[4] ='.';
     sraz[5] = srazky % 10 + 48;
     sraz[6]='\0';
 
     
     if ((sraz[1]=='0') && (sraz[2]=='0'))
        { 
        //sraz[1]=' ', sraz[2]=' ';
        sraz[1] = sraz[3];
        sraz[2] = sraz[4];
        sraz[3] = sraz[5];
        sraz[4] = '\0';
        }
     else if (sraz[1]=='0') 
        {
        //sraz[1]=' ';
        sraz[1] = sraz[2];
        sraz[2] = sraz[3];
        sraz[3] = sraz[4];
        sraz[4] = sraz[5];
        sraz[5] = '\0';
        }
     nokia_gotoxy(0,4);
     printf(nokia_printchar,"Sraz%smm",sraz);
     
     high_byte = srazky >> 8;
     low_byte = srazky; 
     crc = ((high_byte /2) + (low_byte/2)+1);
         
     posl[0] = 'D';
     posl[1] = high_byte;
     posl[2] = low_byte;
     posl[3] = '\0';
     senddata (posl);
}// konec mer_srazky

//--------------------------nuluje maxima o půlnoci------------------------------//  
void nulovani_pulnoc (void)
{
   if ((hrs ==23) && (min == 59))  {   //nulovani pulnoc
     set_timer1(0);
     Tamax=-9900,Tamin=9000,Rhmax=0,Rhmin=9900,Tlmax=0,Tlmin=90000,Vetrmax=0;  //maze denni zaznamy
     
     if(srazky > 0)
     {
     srazky_rok = srazky + srazky_rok; 
     write_pamet(srazky_rok,0x02,0x03);
     }
     destpomoc =0;
     if((day == 31) && (month == 12)){srazky_rok = 0, write_pamet(srazky_rok,0x02,0x03);}  //mazani rocnich srazek
     }
} //konec nulovani_pulnoc

//-------------------vyčte data z EEPROM------------------------------//  
unsigned int16 read_pamet (BYTE high, BYTE low)
 {
  unsigned int16 temp;
  high_byte=read_eeprom(high);
  low_byte=read_eeprom(low);
  temp = high_byte<<8;
  temp = temp+low_byte;
  return temp;
 } //konec read_pamet

//-------------------zapíše data do EEPROM------------------------------// 
 void write_pamet(unsigned int16 vstup, BYTE high, BYTE low)
 {
 
  high_byte = vstup >> 8;
  low_byte = vstup; 
  write_eeprom(high,high_byte);
  write_eeprom(low,low_byte);
 } //konec write_pamet
 
 //-------------------tiskne na obrazovku------------------------------// 
 void cista_obrazovka(void)
 {
    mer_datum ();
    nokia_gotoxy(0,1);
    printf(nokia_printchar,"Tep: --.--");
    nokia_print_degree();
    printf(nokia_printchar,"C");
    nokia_gotoxy(0,2);
    printf(nokia_printchar,"Vlh: --.-%%");
    nokia_gotoxy(0,3);
    printf(nokia_printchar,"Tlak:----.-hPa");
    nokia_gotoxy(0,4);
    printf(nokia_printchar,"Sraz:-.-mm");
    nokia_gotoxy(0,5);
    printf(nokia_printchar,"V -.- m/s");
    nokia_gotoxy(65,5);
    printf(nokia_printchar,"n/a");
 } //konec cista_obrazovka
 
 //-------------------načte nastavení a data z EEPROM------------------------------// 
 void nacti_nastaveni(void)
 {
  high_byte=read_eeprom(0x00);       //načte hornich 8bitů nadmořske vyšky stanice z EEPROM
  low_byte=read_eeprom(0x01);        //načte spodních 8bitů nadmořske vyšky stanice z EEPROM
  vys = high_byte<<8;
  vys = vys+low_byte;                //převede dva int8 na jeden int16
  vys = ulozvyska();
 
  high_byte=read_eeprom(0x02);       //načte hornich 8bitů sročnich sražek stanice z EEPROM
  low_byte=read_eeprom(0x03);        //načte spodních 8bitů sročnich sražek stanice z EEPROM
  srazky_rok = high_byte<<8;
  srazky_rok = srazky_rok+low_byte;  //převede dva int8 na jeden int16
 } //konec nacti_nastaveni

//-------------------------------kóduje data do manchcester kódu------------------------------//
char send_char (char retez[],unsigned int kontrolni)
 {
      //funkce roydeli bajt na dva a yakoduje manchesterem
        char kodovane[9];
        int kod = 0;
        char poslat;
        unsigned char data_1;
        unsigned char data_2 = 0;
        int n = 0;
        int j, i, x = 0;
        int ii;
        
        for (ii = 0; ii < 3; ii++)
        {
        
        poslat = retez[ii];
        data_1 = poslat;

        for(j=0;j<2;j++) //dva bajty, dva cykly
        { 
              for (i=0; i<4; i++)
              {
                 data_1 = data_1  & 0x80;
                 if(data_1 == 0x80) data_2 = data_2 + 2;   //jestlize je jedna tak 10
                 else data_2 = data_2 + 1;               //jestlize je nula tak 01
                 if(i==3) x=2;
                 data_2 = data_2<<(2-x);      //posune vytvareny retez o dva bity 
                 data_1 = poslat<<(n+1);
                 n++;
                 x=0;
              }
              kodovane[kod] = data_2;  
              kod++;              
              data_2=0;
         }
              n=0;
        }
        kodovane[6] = kontrolni; //přidá kontrolní součet CRC
        kodovane[7] = 90;        //0x5A
        kodovane[8] = '\0';      //konec
         return (kodovane);
} //konec send_char

//--------------------------------hlavní menu centrály------------------------------//
void menu (void)
{
     unsigned int men=0;
     
     delay_ms( 500);
     nokia_clear_screen();
     nokia_gotoxy(0,0); 
     printf(nokia_printchar,"MENU");
     nokia_gotoxy(0,1); 
     printf(nokia_printchar,"<Time & Date >");
     nokia_gotoxy(11,2); 
     nokia_print_leftarrow();
     printf(nokia_printchar,"srazky      ");
     nokia_gotoxy(11,3);
     nokia_print_rightarrow();
     printf(nokia_printchar,"Nadm. vyska ");
     
     nokia_gotoxy(0,4);
     printf(nokia_printchar,"<-          ->");
     nokia_gotoxy(0,5);
     printf(nokia_printchar,"Zpet     Enter");
  
 do{
    
    if (!input(menu_pin))   //po zmáčknutí tlačítka menu se opustí
    {
      nokia_clear_screen();
      delay_ms( 500);
      break;
    }
    if (!input(sel_pin)) //při stisknutí tlačítka vybrat
    { 
      delay_ms( 500);
       
      switch(men)
      {
          case 0:  
                   Time();
                   break;
          case 1:  
                   Vyska();
                   break;
          case 2:  
                   Maxima();
                   break;    
          case 3:  
                   smaz();
                   break;  
          case 4:  
                   Srazky_m();
                   break; 
          
          default: break;
         
       } //konec switch
         break;  //opustí menu
    }  
    
    if (!input(up_pin)) //při stisknutí tlačítka další
      { 
      delay_ms( 500);
      if (men<4){men++;}
      else men = 0;
      switch(men)
         {
         case 0:  
                   nokia_erase_y(0); 
                   nokia_gotoxy(0,0); 
                   printf(nokia_printchar,"MENU");
                   nokia_gotoxy(0,1); 
                   printf(nokia_printchar,"<Time & Date >");
                   nokia_gotoxy(11,2); 
                   nokia_print_leftarrow();
                   printf(nokia_printchar,"srazky     ");
                   nokia_gotoxy(11,3);
                   nokia_print_rightarrow();
                   printf(nokia_printchar,"Nadm. vyska");
                   break;
         case 1:   
                   nokia_erase_y(0); 
                   nokia_gotoxy(0,0); 
                   printf(nokia_printchar,"MENU");
                   nokia_gotoxy(0,1); 
                   printf(nokia_printchar,"<Nadm. vyska >");
                   nokia_gotoxy(11,2); 
                   nokia_print_leftarrow();
                   printf(nokia_printchar,"Time & Date");
                   nokia_gotoxy(11,3); 
                   nokia_print_rightarrow();
                   printf(nokia_printchar,"den. maxima");
                   break;
         case 2:   
                   nokia_erase_y(0); 
                   nokia_gotoxy(0,0); 
                   printf(nokia_printchar,"MENU");
                   nokia_gotoxy(0,1); 
                   printf(nokia_printchar,"<den. maxima >");
                   nokia_gotoxy(11,2); 
                   nokia_print_leftarrow();
                   printf(nokia_printchar,"Nadm. vyska");
                   nokia_gotoxy(11,3); 
                   nokia_print_rightarrow();
                   printf(nokia_printchar,"smazat     ");
                   break;   
         case 3:   
                   nokia_erase_y(0); 
                   nokia_gotoxy(0,0); 
                   printf(nokia_printchar,"MENU");
                   nokia_gotoxy(0,1); 
                   printf(nokia_printchar,"<   smazat   >");
                   nokia_gotoxy(11,2); 
                   nokia_print_leftarrow();
                   printf(nokia_printchar,"den. maxima");
                   nokia_gotoxy(11,3); 
                   nokia_print_rightarrow();
                   printf(nokia_printchar,"srazky     ");
                   break; 
         case 4:   
                   nokia_erase_y(0); 
                   nokia_gotoxy(0,0); 
                   printf(nokia_printchar,"MENU");
                   nokia_gotoxy(0,1); 
                   printf(nokia_printchar,"<   srazky   >");
                   nokia_gotoxy(11,2); 
                   nokia_print_leftarrow();
                   printf(nokia_printchar,"smazat     ");
                   nokia_gotoxy(11,3); 
                   nokia_print_rightarrow();
                   printf(nokia_printchar,"Time & Date");
                   break; 
                   
         default: break;
             
         }
      } //konec tlačítko další
      if (!input(down_pin)) //při stisknutí tlačítka vzad
         { 
         delay_ms( 500);
         if (men>0){men--;}
         else men = 4;
         switch(men)
            {
               case 0:  
                         nokia_erase_y(0); 
                         nokia_gotoxy(0,0); 
                         printf(nokia_printchar,"MENU");
                         nokia_gotoxy(0,1); 
                         printf(nokia_printchar,"<Time & Date >");
                         nokia_gotoxy(11,2); 
                         nokia_print_leftarrow();
                         printf(nokia_printchar,"srazky     ");
                         nokia_gotoxy(11,3);
                         nokia_print_rightarrow();
                         printf(nokia_printchar,"Nadm. vyska");
                         break;
               case 1:   
                         nokia_erase_y(0); 
                         nokia_gotoxy(0,0); 
                         printf(nokia_printchar,"MENU");
                         nokia_gotoxy(0,1); 
                         printf(nokia_printchar,"<Nadm. vyska >");
                         nokia_gotoxy(11,2); 
                         nokia_print_leftarrow();
                         printf(nokia_printchar,"Time & Date");
                         nokia_gotoxy(11,3); 
                         nokia_print_rightarrow();
                         printf(nokia_printchar,"den. maxima");
                         break;
               case 2:   
                         nokia_erase_y(0); 
                         nokia_gotoxy(0,0); 
                         printf(nokia_printchar,"MENU");
                         nokia_gotoxy(0,1); 
                         printf(nokia_printchar,"<den. maxima >");
                         nokia_gotoxy(11,2); 
                         nokia_print_leftarrow();
                         printf(nokia_printchar,"Nadm. vyska");
                         nokia_gotoxy(11,3); 
                         nokia_print_rightarrow();
                         printf(nokia_printchar,"smazat     ");
                         break;   
               case 3:   
                         nokia_erase_y(0); 
                         nokia_gotoxy(0,0); 
                         printf(nokia_printchar,"MENU");
                         nokia_gotoxy(0,1); 
                         printf(nokia_printchar,"<   smazat   >");
                         nokia_gotoxy(11,2); 
                         nokia_print_leftarrow();
                         printf(nokia_printchar,"den. maxima");
                         nokia_gotoxy(11,3); 
                         nokia_print_rightarrow();
                         printf(nokia_printchar,"srazky     ");
                         break; 
               case 4:   
                         nokia_erase_y(0); 
                         nokia_gotoxy(0,0); 
                         printf(nokia_printchar,"MENU");
                         nokia_gotoxy(0,1); 
                         printf(nokia_printchar,"<   srazky   >");
                         nokia_gotoxy(11,2); 
                         nokia_print_leftarrow();
                         printf(nokia_printchar,"smazat     ");
                         nokia_gotoxy(11,3); 
                         nokia_print_rightarrow();
                         printf(nokia_printchar,"Time & Date");
                         break;
                         
               default: break;
            }          
         } //konec tlačítka vzad
    }while(true);
 
}//konec menu

//--------------------připravuje maxima teploty a vlhkosti do pole------------------//
char pocitej(signed int16 neco){
  
  if(neco < 0) {neco = neco * (-1); ret[0] = '-'; }
  else ret[0] = ' ';
  ret[1] = neco % 10000 / 1000 + 48;           
  ret[2] = neco % 1000 / 100 + 48;     
  ret[3] = '.';  
  ret[4] = neco % 100 / 10 + 48;               
  ret[5] = neco % 10 + 48;  
  //Rh[6] = '%';
  ret[6]='\0';
  return ret;
}//konec pocitej

//--------------------připravuje maxima atm. tlaku do pole------------------//
char pocitej2(signed int16 neco){
  
  ret[0] = neco % 100000 / 10000 + 48;
  ret[1] = neco % 10000 / 1000 + 48;
  ret[2] = neco % 1000 / 100 + 48;      
  ret[3] = neco % 100 / 10 + 48; 
  ret[4] = '.'; 
  ret[5] = neco % 10 + 48;  
  ret[6]='\0';
  return ret;
}//konec pocitej2

//--------------------připravuje maxima srážek do pole------------------//
char pocitej3(signed int16 neco){
  
  ret[0] = ' ';
  ret[1] = neco % 10000 / 1000 + 48;           
  ret[2] = neco % 1000 / 100 + 48;     
  ret[3] = neco % 100 / 10 + 48;  
  ret[4] = '.';  
  ret[5] = neco % 10 + 48;  
  //Rh[6] = '%';
  ret[6]='\0';
  
  if ((ret[1]=='0') && (ret[2]=='0')) ret[1]=' ', ret[2]=' ';
  else if (ret[1]=='0') ret[1]=' ';
  
  return ret;
} //konec pocitej3

//-------------------------maže roční srážky---------------------------//
void Smaz(void)
 {
      write_eeprom(0x02,0x00);
      write_eeprom(0x03,0x00);
      reset_cpu();
 } //konec smaz

//--------------------tiskne srážky na displej ------------------//
void Srazky_m(void){
     
     nokia_clear_screen();
     nokia_gotoxy(0,0);
     pocitej3(srazky_rok);
     printf(nokia_printchar,"Srazky rok:");
     nokia_gotoxy(0,1);
     printf(nokia_printchar,"%s mm",ret);
     
     nokia_gotoxy(0,2);
     pocitej3(srazky);
     printf(nokia_printchar,"Srazky den:");
     nokia_gotoxy(0,3);
     printf(nokia_printchar,"%s mm",ret );
     
     nokia_gotoxy(0,5);
     printf(nokia_printchar, "konec    konec");
     

    
    do
  {
    // Menu key pressed?
    if (!input(menu_pin)) {
    nokia_clear_screen();
    delay_ms( 500);
      break;
    };
    
    if (!input(sel_pin)) {
    nokia_clear_screen();
    delay_ms( 500);
      break;
    };
   
    
    Delay_ms( 50);
  } while(true);


}//konec srazky_m

//--------------------tiskne teplotní minima a maxima na displej------------------//
void Maxima(void)
{

     nokia_clear_screen();
     nokia_gotoxy(0,5);
     printf(nokia_printchar, "konec    dalsi");
     if(nacteno==1)
     {
        nokia_gotoxy(0,0);
        pocitej(Tamax);
        printf(nokia_printchar,"Tep. maximum:");
        nokia_gotoxy(0,1);
        printf(nokia_printchar,"%s",ret);
        nokia_print_degree();
        printf(nokia_printchar,"C %02u:%02u",h_tep_max, m_tep_max );
        
        nokia_gotoxy(0,2);
        pocitej(Tamin);
        printf(nokia_printchar,"Tep. minimum");
        nokia_gotoxy(0,3);
        printf(nokia_printchar,"%s",ret);
        nokia_print_degree();
        printf(nokia_printchar,"C %02u:%02u",h_tep_min, m_tep_min );
     } 
     else
     {
     nokia_gotoxy(0,0);
     printf(nokia_printchar,"Tep. maximum:");
     nokia_gotoxy(0,1);
     printf(nokia_printchar," N/A");
     nokia_gotoxy(0,2);
     printf(nokia_printchar,"Tep. minimum");
     nokia_gotoxy(0,3);
     printf(nokia_printchar," N/A");
     }
     
     
    do
  {
    // Menu key pressed?
    if (!input(menu_pin)) {
    nokia_clear_screen();
    delay_ms( 500);
      break;
    };
    
    if (!input(sel_pin)) {
    maxima2();
    delay_ms( 500);
      break;
    };
   
    
    Delay_ms( 50);
  } while(true);


}//konec maxima

//--------------------tiskne vlhkostní minima a maxima na displej------------------//
void Maxima2(void){
     while((!input(sel_pin))){}  //osetreni pri dlouhem stisknuti
     
     nokia_clear_screen();
     nokia_gotoxy(0,5);
     printf(nokia_printchar, "konec    dalsi");
     if(nacteno==1)
     {
        nokia_gotoxy(0,0);
        pocitej(Rhmax);
        printf(nokia_printchar,"Vlh. maximum:");
        nokia_gotoxy(0,1);
        printf(nokia_printchar,"%s%% %02u:%02u",ret,h_vlh_max, m_vlh_max );
        
        nokia_gotoxy(0,2);
        pocitej(Rhmin);
        printf(nokia_printchar,"Vlh. minimum");
        nokia_gotoxy(0,3);
        printf(nokia_printchar,"%s%% %02u:%02u",ret,h_vlh_min, m_vlh_min );
        
     }
     else
     {
        nokia_gotoxy(0,0);
        printf(nokia_printchar,"Vlh. maximum:");
        nokia_gotoxy(0,1);
        printf(nokia_printchar," N/A");
        nokia_gotoxy(0,2);
        printf(nokia_printchar,"Vlh. minimum");
        nokia_gotoxy(0,3);
        printf(nokia_printchar," N/A");
     }

    do
  {
    // Menu key pressed?
    if (!input(menu_pin)) {
    nokia_clear_screen();
    delay_ms( 500);
      break;
    };
    
    if (!input(sel_pin)) {
    Maxima3();
    delay_ms( 500);
      break;
    };
       
    Delay_ms( 50);
  } while(true);

  
}//konec maxima2

//--------------------tiskne maxmimu a minimum atm. tlaku na displej------------------//
void Maxima3(void){
     while((!input(sel_pin))){}  //osetreni pri dlouhem stisknuti
     
     nokia_clear_screen();
     nokia_gotoxy(0,5);
     printf(nokia_printchar, "konec  konec");
     if(nacteno==1)
     {
     nokia_gotoxy(0,0);
     pocitej2(Tlmax);
     printf(nokia_printchar,"Tlak. maximum:");
     nokia_gotoxy(0,1);
     printf(nokia_printchar,"%shPa%02u:%02u",ret,h_tlak_max, m_tlak_max );
     
     nokia_gotoxy(0,2);
     pocitej2(Tlmin);
     printf(nokia_printchar,"Tlak. minimum");
     nokia_gotoxy(0,3);
     printf(nokia_printchar,"%shPa%02u:%02u",ret,h_tlak_min, m_tlak_min );
     
     }
     else
     {
        nokia_gotoxy(0,0);
        printf(nokia_printchar,"Tlak. maximum:");
        nokia_gotoxy(0,1);
        printf(nokia_printchar," N/A");
        nokia_gotoxy(0,2);
        printf(nokia_printchar,"Tlak. minimum");
        nokia_gotoxy(0,3);
        printf(nokia_printchar," N/A");
     }
       
    do
  {
    // Menu key pressed?
    if (!input(menu_pin)) {
    nokia_clear_screen();
    delay_ms( 500);
      break;
    };
    
    if (!input(sel_pin)) {
    nokia_clear_screen();
    delay_ms( 500);
      break;
    };
      
    Delay_ms( 50);
  } while(true);
}//konec maxima3

//--------------------nastavení nadmořské výšky stanice------------------//
void Vyska(void){

    nokia_clear_screen();
    nokia_gotoxy(0,1); 
    printf(nokia_printchar,"<Nadm. vyska >");
    nokia_gotoxy(0,5);
    printf(nokia_printchar,"        Enter");
  
  Delay_ms( 500);
    high_byte=read_eeprom(0x00);
    low_byte=read_eeprom(0x01);
    vys= high_byte<<8;
    vys= vys+low_byte;
    
    sprintf(output, "\%04ld m.n.m", vys);
    nokia_gotoxy(7,2);
    printf(nokia_printchar,output);
    
  do
  {
    // Menu key pressed?
    if (!input(sel_pin)) {
      delay_ms( 500);
      break;
    };
    
    
    // Increment
    if(!input(up_pin)) {
      delay_ms( 50);
      vys++;
    if( vys > 2000)
    vys = 0;
    sprintf(output, "\%04ld", vys);
    nokia_gotoxy(7,2);
    printf(nokia_printchar,output);
    };

    // Decrement
    if(!input(down_pin)) {
      delay_ms( 50);
      if( vys > 0)
      vys--;
      else vys = 1999;
    sprintf(output, "\%04ld", vys);
    nokia_gotoxy(7,2);
    printf(nokia_printchar,output);  
    };
    
    Delay_ms( 50);
  } while(true);
  
  high_byte = vys >> 8;
  low_byte = vys; 
  write_eeprom(0x00,high_byte);
  write_eeprom(0x01,low_byte);
  
  vys = ulozvyska();
  nokia_clear_screen();
}//konec vyska

//--------------------nastavení času a data------------------//
void Time( void)
{
  unsigned char   Sig;
  Sig = 0;
  nokia_clear_screen();
  ds1307_get_date(day,month,yr,dow);
  ds1307_get_time(hrs,min,sec);

  Set_Position( Sig);
  Delay_ms( 500);
  nokia_gotoxy(0,0); 
  printf(nokia_printchar,"<Time & Date >");
  nokia_gotoxy(7,1);
  printf(nokia_printchar,"hh:mm:ss");
  nokia_gotoxy(7,3);
  printf(nokia_printchar,"dd/MM/yyyy");
  nokia_gotoxy(0,5);
  printf(nokia_printchar, "Uloz    dalsi");
  
  do
  {
    // Menu key pressed?
    if (!input(menu_pin)) {
      delay_ms( 500);
      break;
    };
   //select
    if(!input(sel_pin)) {
      delay_ms( 200);
      Sig++;
      if( Sig > 5)
        Sig = 0;
      Set_Position( Sig);
    };

    // Increment
    if(!input(up_pin)) {
      delay_ms( 200);
      IncDecSign( Sig, 0);
      Set_Position( Sig);
    };

    // Decrement
    if(!input(down_pin)) {
      delay_ms( 200);
      IncDecSign( Sig, 1);
      Set_Position( Sig);
    };

    Delay_ms( 100);
  } while(true);
  
   ds1307_set_date_time(day,month,yr,1,hrs,min,sec);
   nokia_clear_screen();
}//konec time


//--------------------nastavení pozice při nastavení data a času------------------//
void Set_Position( unsigned char Sign)
{
  switch( Sign)
  {
    case 0:  
             nokia_clear_screen();
             nokia_gotoxy(0,0);
             printf(nokia_printchar,"<Time & Date >");
             nokia_gotoxy(7,1);
             printf(nokia_printchar,"hh:mm:ss");
             nokia_gotoxy(7,3);
             printf(nokia_printchar,"dd/MM/yyyy");
             nokia_gotoxy(0,5);
             printf(nokia_printchar, "Uloz    dalsi");
  
             sprintf(output, "%02u", hrs);
             nokia_gotoxy(7,2);
             printf(nokia_printchar,output);
             break;
             
    case 1:  sprintf(output, ":%02u", min);
             nokia_gotoxy(19,2);
             printf(nokia_printchar,output);
             break;
             
    case 2:  sprintf(output, ":%02u", sec);
             nokia_gotoxy(36,2);
             printf(nokia_printchar,output);
             break;
             
    case 3:  sprintf(output, "%02u", day);
             nokia_gotoxy(7,4);
             printf(nokia_printchar,output);
             break;
             
    case 4:  sprintf(output, "/%02u", month);
             nokia_gotoxy(19,4);
             printf(nokia_printchar,output);
             break;
             
    case 5:  sprintf(output, "/20%02u", yr);
             nokia_gotoxy(36,4);
             printf(nokia_printchar,output);
             break;
  }//konec switch
}//konec set_position

//--------------------nastavení limitů při nastavení data a času------------------//
void IncDecSign( unsigned Sign, unsigned direct)
{
  switch( Sign)
  {
    case 0:  if( !direct)
             {
               hrs++;
               if( hrs > 23)
                 hrs = 0;
             } else {
               if( hrs > 0)
               hrs--;
               else hrs = 23;
             };
             break;
             
    case 1:  if( !direct)
             {
               min++;
               if( min > 59)
                 min = 0;
             } else {
               if( min > 0)
                 min--;
               else min = 59;
             };
             break;
             
    case 2:  if( !direct)
             {
               sec++;
               if( sec > 59)
                 sec = 0;
             } else {
               if( sec > 0)
                 sec--;
               else sec = 59;
             };
             break;
             
    case 3:  if( !direct)
             {
               day++;
               if( day > 31)
                 day = 0;
             } else {
               if( day > 0)
                 day--;
               else day = 31;
             };
             break;
             
    case 4:  if( !direct)
             {
               month++;
               if( month > 12)
                 month = 0;
             } else {
               if( month > 0)
                 month--;
               else month = 12;
             };
             break;
             
    case 5:  if( !direct)
             {
               yr++;
               if( yr > 99)
                 yr = 0;
             } else {
               if( yr > 0)
                 yr--;
               else yr = 99;
             };
             break;
  }//konec switch
}//konec IncDecSign

//--------------------přepočet atm. tlaku v zavisloti na vyšce------------------//
int16 ulozvyska(void){
  float pomoc;
  unsigned int16 vyskap;
  pomoc=exp((9.80665*vys)/(287*293));
  pomoc=pomoc*1000;
  vyskap=pomoc;
  return vyskap;
}//konec ulozvyska
