/*****************************************************
Chip type           : ATmega16
Program type        : Application
Clock frequency     : 8,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega16.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>
#include <ds18b20.h>
#include <n3310lcd.c>




#asm
   .equ __w1_port=0x12 ;PORTD
   .equ __w1_bit=7
#endasm
#include <1wire.h>
 
 bit a; //указывает на нахождение в меню
 
 bit b; //для определения текущего выделенного пункта меню 
 
 signed char c=0;; //для определения выделения в меню настройки даты/времени
 
 char n_d_hour=0;//
 char n_hour=0;  //
 char n_d_min=0; //для хранения времени между вводом с клавиатуры и применением
 char n_min=0;   //
 char n_d_sek=0; //
 char n_sek=0;   //
 
 char d=0; // 
 char e=0; //
 char f=0; // для отдельного ввода единиц десятков даты
 char g=0; //
 char h=0; //
 char i=0; //
 
 char sek=0;    //
 char min=0;    //
 char hour=0;   //
 char d_sek=0;  //
 char d_min=0;  //время/дата в "рабочем" режиме
 char d_hour=0; //
 char devices;  //
 char den=26;   //
 char mes=8;    //
 int god=2012;  //
 
 char max_den;  //максимальное количество дней в текущем месяце
 
 signed int Tnew; //измеренная температура


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
 sek++;                        //
                               //
                               //
 if(sek>9)                     //
  {                            //
   sek=0;                      //
   d_sek++;                    //
  }                            //
 if(d_sek>5)                   //
  {                            //
   sek=0;                      //
   d_sek=0;                    //
   min++;                      //
  }                            //
 if(min>9)                     //
  {                            //
   sek=0;                      //
   d_sek=0;                    //
   min=0;                      //
   d_min++;                    //
  }                            //
 if(d_min>5)                   //
  {                            //считаем часы, минуты, секунды
   sek=0;                      //
   d_sek=0;                    //
   min=0;                      //
   d_min=0;                    //
   hour++;                     //
   }                           //
 if(hour>9)                    //
   {                           //
    sek=0;                     //
    d_sek=0;                   //
    min=0;                     //
    d_min=0;                   //
    hour=0;                    //
    d_hour++;                  //
   }                           //
  if((d_hour==2)&&(hour>3))    //
   {                           //
    sek=0;                     //
    d_sek=0;                   //
    min=0;                     //при необходимости переходим на следующий день
    d_min=0;                   //
    hour=0;                    //
    d_hour=0;                  //
    den++;                     //
   }                           
   
   if((mes==1)||(mes==3)||(mes==5)||(mes==7)||(mes==8)||(mes==10)||(mes==12))  //если в месяце 31 день, то устанавливаем макс. количество дней 31
     {                                                                         //
      max_den=31;                                                              //
     }                                                                         //
   
   if((mes==4)||(mes==6)||(mes==9)||(mes==11)) //если в месяце 30 день, то устанавливаем макс. количество дней 30
     {                                         //
      max_den=30;                              //
     }                                         //
   
   if(mes==2)     //если в месяце 28 день, то устанавливаем макс. количество дней 28
     {            //
      max_den=28; //
     }            //
   
   if(den>max_den) //если дней становиться больше, чем дней в текущем месяце, то ставим первое число и переходим на следующий месяц
     {             //
      den=1;       //
      mes++;       //
     }             //
   
   if(mes>12)  //если месяцев становиться больше 12, то ставим первое число, первый месяц и переходим на следующий год
     {
      den=1;
      mes=1;
      god++;
     }
   
   
   
  if(a==0)  //если мы не в меню, то:
    {  
     
     devices=w1_init();  //ищем датчик
     
     ds18b20_init(0,-50,50,1); //ставим границы "аварии", и разрешение 9бит
     
      if(devices>0)
        {      
         Tnew=ds18b20_temperature(0);  //читаем температуру  
        }     
   
      if(Tnew>1000)       //если датчик выдаёт больше 1000
        {                   
         Tnew=4096-Tnew;  //отнимаем от данных 4096
         Tnew=-Tnew;      //и ставим знак "минус"
        }
          
 
   LcdClear(); //чистим экран
   
   sprintf (lcd_buf, "%u", d_hour);  //заносим в буфер время
   LcdStringBold(2,2);               //
                                     //
   sprintf (lcd_buf, "%u", hour);    //
   LcdStringBold(4,2);               //
                                     //
   sprintf (lcd_buf, ":");           //
   LcdStringBold(6,2);               //
                                     //
   sprintf (lcd_buf, "%u", d_min);   //
   LcdStringBold(8,2);               //
                                     //
   sprintf (lcd_buf, "%u", min);     //
   LcdStringBold(10,2);              //
                                     //
   sprintf (lcd_buf, ":");           //
   LcdString(12,2);                  //
                                     //
   sprintf (lcd_buf, "%u", d_sek);   //
   LcdString(13,2);                  //
                                     //
   sprintf (lcd_buf, "%u", sek);     //
   LcdString(14,2);                  //
                                     
                                     
 
   if((den<9)&&(mes<=9))             //заносим в буфер дату в зависимости от количества цифр в ней
     {                               //
      sprintf (lcd_buf, "%u", den);  //
      LcdString(3,5);                //
                                     //
      sprintf (lcd_buf, "/");        //
      LcdString(4,5);                //
                                     //
      sprintf (lcd_buf, "%u", mes);  //
      LcdString(5,5);                //
                                     //
      sprintf (lcd_buf, "/");        //
      LcdString(6,5);                //
                                     //
      sprintf (lcd_buf, "%u", god);  //
      LcdString(7,5);                //
     }                               //
                                     //
   if(den>9)                         //
     {                               //
      sprintf (lcd_buf, "%u", den);  //
      LcdString(3,5);                //
                                     //
      sprintf (lcd_buf, "/");        //
      LcdString(5,5);                //
                                     //
      sprintf (lcd_buf, "%u", mes);  //
      LcdString(6,5);                //
                                     //
      sprintf (lcd_buf, "/");        //
      LcdString(7,5);                //
                                     //
      sprintf (lcd_buf, "%u", god);  //
      LcdString(8,5);                //
     }                               //
                                     //
   if(mes>9)                         //
     {                               //
      sprintf (lcd_buf, "%u", den);  //
      LcdString(3,5);                //
                                     //
      sprintf (lcd_buf, "/");        //
      LcdString(4,5);                //
                                     //
      sprintf (lcd_buf, "%u", mes);  //
      LcdString(5,5);                //
                                     //
      sprintf (lcd_buf, "/");        //
      LcdString(7,5);                //
                                     //
      sprintf (lcd_buf, "%u", god);  //
      LcdString(8,5);                //
     }                               //
                                     //
   if((den>9)&&(mes>9))              //
     {                               //
      sprintf (lcd_buf, "%u", den);  //
      LcdString(3,5);                //
                                     //
      sprintf (lcd_buf, "/");        //
      LcdString(5,5);                //
                                     //
      sprintf (lcd_buf, "%u", mes);  //
      LcdString(6,5);                //
                                     //
      sprintf (lcd_buf, "/");        //
      LcdString(8,5);                //
                                     //
      sprintf (lcd_buf, "%u", god);  //
      LcdString(9,5);                //
     }                               //
                                     //
 
 
   if(Tnew>=0)                       //заносим в буфер температуру
     {                               //
      sprintf (lcd_buf, "%u", Tnew); //
      LcdString(6,6);                //
     }                               //
   else                              //
     {                               //
      sprintf (lcd_buf, "%u", Tnew); //
      LcdString(5,6);                //
     }                               //
                                     //
                                     //
     sprintf (lcd_buf, "@C");        //
     LcdString(8,6);                 //
                                     
                                     
     LcdUpdate();                    //выводим всё это на экран
    }
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
 void vremja(void)   //функция настройки времени
 {
 
  n_d_hour=0;//
  n_hour=0;  //
  n_d_min=0; //обнуляем переменные для хранения времени между вводом с клавиатуры и применением
  n_min=0;   //
  n_d_sek=0; //
  n_sek=0;   //
  
  c=0;       //
      
  while(PIND.1==1)   //функция уходит в бесконечный цикл до нажатия на кнопку "Назад"
       { 
  
        if(PIND.6==0)  //инкремент/декремент переменной для определения выделения в меню настройки времени(циклично)
          {            //
           c++;        //
          }            //
                       //
        delay_ms(75);  //
                       //
        if(PIND.2==0)  //
          {            //
           c--;        //
          }            //
                       //
        delay_ms(75);  //
                       //
        if(c>5)        //
          {            //
           c=0;        //
          }            //
                       //
        if(c<0)        //
          {            //
           c=5;        //
          }            //
                       
        if(c==0)                                //подставляем в регистр десятков часов значение, соответствующее нажатой кнопки и выводим всё на экран, 
          {                                     //предварительно очистив
                                                //+ надпись "Применить" возле соответствующей кнопки
           if(PIND.3==0)                        //
             {                                  //
              n_d_hour=1;                       //
             }                                  //
           if(PIND.4==0)                        //
             {                                  //
              n_d_hour=2;                       //
             }                                  //
           if(PINA.7==0)                        //
             {                                  //
              n_d_hour=0;                       //
             }                                  //
                                                //
           LcdClear();                          //
                                                //
           sprintf (lcd_buf, "%u", n_d_hour);   //
           LcdStringBold(2,2);                  //
                                                //
           sprintf (lcd_buf, "^");              //
           LcdStringBold(2,4);                  //
                                                //
           sprintf (lcd_buf, "%u", n_hour);     //
           LcdStringBold(4,2);                  //
                                                //
           sprintf (lcd_buf, ":");              //
           LcdStringBold(6,2);                  //
                                                // 
           sprintf (lcd_buf, "%u", n_d_min);    //
           LcdStringBold(8,2);                  //
                                                //
           sprintf (lcd_buf, "%u", n_min);      //
           LcdStringBold(10,2);                 //
                                                //
           sprintf (lcd_buf, ":");              //
           LcdString(12,2);                     //
                                                //
           sprintf (lcd_buf, "%u", n_d_sek);    //
           LcdString(13,2);                     //
                                                //
           sprintf (lcd_buf, "%u", n_sek);      //
           LcdString(14,2);                     //
                                                //
           sprintf (lcd_buf, "Применить");      //
           LcdString(4,6);                      //
                                                //
           LcdUpdate();                         //
                                                
          }
  
        if(c==1)                                //подставляем в регистр единиц часов значение, соответствующее нажатой кнопки и выводим всё на экран, 
          {                                     //предварительно очистив
                                                //+ надпись "Применить" возле соответствующей кнопки
           if(PIND.3==0)                        //
             {                                  //
              n_hour=1;                         //
             }                                  //
           if(PIND.4==0)                        //
             {                                  //
              n_hour=2;                         //
             }                                  //
           if(PINC.1==0)                        //
             {                                  //
              n_hour=3;                         //
             }                                  //
           if(PINA.0==0)                        //
             {                                  //
              n_hour=4;                         //
             }                                  //
           if(PINA.3==0)                        //
             {                                  //
              n_hour=5;                         //
             }                                  //
           if(PINC.0==0)                        //
             {                                  //
              n_hour=6;                         //
             }                                  //
           if(PINA.1==0)                        //
             {                                  //
              n_hour=7;                         //
             }                                  //
           if(PINA.2==0)                        //
             {                                  //
              n_hour=8;                         //
             }                                  //
           if(PINA.5==0)                        //
             {                                  //
              n_hour=9;                         //
             }                                  //
           if(PINA.7==0)                        //
             {                                  //
              n_hour=0;                         //
             }                                  //
                                                //
           LcdClear();                          //
                                                //
           sprintf (lcd_buf, "%u", n_d_hour);   //
           LcdStringBold(2,2);                  //
                                                //
           sprintf (lcd_buf, "^");              //
           LcdStringBold(4,4);                  //
                                                //
           sprintf (lcd_buf, "%u", n_hour);     //
           LcdStringBold(4,2);                  //
                                                //
           sprintf (lcd_buf, ":");              //
           LcdStringBold(6,2);                  //
                                                //
           sprintf (lcd_buf, "%u", n_d_min);    //
           LcdStringBold(8,2);                  //
                                                //
           sprintf (lcd_buf, "%u", n_min);      //
           LcdStringBold(10,2);                 //
                                                //
           sprintf (lcd_buf, ":");              //
           LcdString(12,2);                     //
                                                //
           sprintf (lcd_buf, "%u", n_d_sek);    //
           LcdString(13,2);                     //
                                                //
           sprintf (lcd_buf, "%u", n_sek);      //
           LcdString(14,2);                     //
                                                //
           sprintf (lcd_buf, "Применить");      //
           LcdString(4,6);                      //
                                                //
           LcdUpdate();                         //
                                               
          }                                     
                                               
        if(c==2)                                //подставляем в регистр десятков минут значение, соответствующее нажатой кнопки и выводим всё на экран, 
          {                                     //предварительно очистив
                                                //+ надпись "Применить" возле соответствующей кнопки
           if(PIND.3==0)                        //
             {                                  //
              n_d_min=1;                        //
             }                                  //
           if(PIND.4==0)                        //
             {                                  //
              n_d_min=2;                        //
             }                                  //
           if(PINC.1==0)                        //
             {                                  //
              n_d_min=3;                        //
             }                                  //
           if(PINA.0==0)                        //
             {                                  //
              n_d_min=4;                        //
             }                                  //
           if(PINA.3==0)                        //
             {                                  //
              n_d_min=5;                        //
             }                                  //
           if(PINA.7==0)                        //
             {                                  //
              n_d_min=0;                        //
             }                                  //
                                                //
           LcdClear();                          //
                                                //
           sprintf (lcd_buf, "%u", n_d_hour);   //
           LcdStringBold(2,2);                  //
                                                //
           sprintf (lcd_buf, "^");              //
           LcdStringBold(8,4);                  //
                                                //
           sprintf (lcd_buf, "%u", n_hour);     //
           LcdStringBold(4,2);                  //
                                                //
           sprintf (lcd_buf, ":");              //
           LcdStringBold(6,2);                  //
                                                //
           sprintf (lcd_buf, "%u", n_d_min);    //
           LcdStringBold(8,2);                  //
                                                //
           sprintf (lcd_buf, "%u", n_min);      //
           LcdStringBold(10,2);                 //
                                                //
           sprintf (lcd_buf, ":");              //
           LcdString(12,2);                     //
                                                //
           sprintf (lcd_buf, "%u", n_d_sek);    //
           LcdString(13,2);                     //
                                                //
           sprintf (lcd_buf, "%u", n_sek);      //
           LcdString(14,2);                     //
                                                //
           sprintf (lcd_buf, "Применить");      //
           LcdString(4,6);                      //
                                                //
           LcdUpdate();                         //
                                                
          }                                     
                                                
        if(c==3)                                //подставляем в регистр единиц минут значение, соответствующее нажатой кнопки и выводим всё на экран, 
          {                                     //предварительно очистив
                                                //+ надпись "Применить" возле соответствующей кнопки
           if(PIND.3==0)                        //
             {                                  //
              n_min=1;                          //
             }                                  //
           if(PIND.4==0)                        //
             {                                  //
              n_min=2;                          //
             }                                  //
           if(PINC.1==0)                        //
             {                                  //
              n_min=3;                          //
             }                                  //
           if(PINA.0==0)                        //
             {                                  //
              n_min=4;                          //
             }                                  //
           if(PINA.3==0)                        //
             {                                  //
              n_min=5;                          //
             }                                  //
           if(PINC.0==0)                        //
             {                                  //
              n_min=6;                          //
             }                                  //
           if(PINA.1==0)                        //
             {                                  //
              n_min=7;                          //
             }                                  //
           if(PINA.2==0)                        //
             {                                  //
              n_min=8;                          //
             }                                  //
           if(PINA.5==0)                        //
             {                                  //
              n_min=9;                          //
             }                                  //
           if(PINA.7==0)                        //
             {                                  //
              n_min=0;                          //
             }                                  //
                                                //
           LcdClear();                          //
                                                //
           sprintf (lcd_buf, "%u", n_d_hour);   //
           LcdStringBold(2,2);                  //
                                                //
           sprintf (lcd_buf, "^");              //
           LcdStringBold(10,4);                 //
                                                //
           sprintf (lcd_buf, "%u", n_hour);     //
           LcdStringBold(4,2);                  //
                                                //
           sprintf (lcd_buf, ":");              //
           LcdStringBold(6,2);                  //
                                                //
           sprintf (lcd_buf, "%u", n_d_min);    //
           LcdStringBold(8,2);                  //
                                                //
           sprintf (lcd_buf, "%u", n_min);      //
           LcdStringBold(10,2);                 //
                                                //
           sprintf (lcd_buf, ":");              //
           LcdString(12,2);                     //
                                                //
           sprintf (lcd_buf, "%u", n_d_sek);    //
           LcdString(13,2);                     //
                                                //
           sprintf (lcd_buf, "%u", n_sek);      //
           LcdString(14,2);                     //
                                                //
           sprintf (lcd_buf, "Применить");      //
           LcdString(4,6);                      //
                                                //
           LcdUpdate();                         //
                                                
          }                                    
                                                
        if(c==4)                                //подставляем в регистр десятков секунд значение, соответствующее нажатой кнопки и выводим всё на экран, 
          {                                     //предварительно очистив
                                                //+ надпись "Применить" возле соответствующей кнопки
           if(PIND.3==0)                        //
             {                                  //
              n_d_sek=1;                        //
             }                                  //
           if(PIND.4==0)                        //
             {                                  //
              n_d_sek=2;                        //
             }                                  //
           if(PINC.1==0)                        //
             {                                  //
              n_d_sek=3;                        //
             }                                  //
           if(PINA.0==0)                        //
             {                                  //
              n_d_sek=4;                        //
             }                                  //
           if(PINA.3==0)                        //
             {                                  //
              n_d_sek=5;                        //
             }                                  //
           if(PINA.7==0)                        //
             {                                  //
              n_d_sek=0;                        //
             }                                  //
                                                //
           LcdClear();                          //
                                                //
           sprintf (lcd_buf, "%u", n_d_hour);   //
           LcdStringBold(2,2);                  //
                                                //
           sprintf (lcd_buf, "^");              //
           LcdString(13,3);                     //
                                                //
           sprintf (lcd_buf, "%u", n_hour);     //
           LcdStringBold(4,2);                  //
                                                //
           sprintf (lcd_buf, ":");              //
           LcdStringBold(6,2);                  //
                                                //
           sprintf (lcd_buf, "%u", n_d_min);    //
           LcdStringBold(8,2);                  //
                                                //
           sprintf (lcd_buf, "%u", n_min);      //
           LcdStringBold(10,2);                 //
                                                //
           sprintf (lcd_buf, ":");              //
           LcdString(12,2);                     //
                                                //
           sprintf (lcd_buf, "%u", n_d_sek);    //
           LcdString(13,2);                     //
                                                //
           sprintf (lcd_buf, "%u", n_sek);      //
           LcdString(14,2);                     //
                                                //
           sprintf (lcd_buf, "Применить");      //
           LcdString(4,6);                      //
                                                //
           LcdUpdate();                         //
                                                
          }                                     
                                               
        if(c==5)                                //подставляем в регистр единицсекунд значение, соответствующее нажатой кнопки и выводим всё на экран, 
          {                                     //предварительно очистив
                                                //+ надпись "Применить" возле соответствующей кнопки
           if(PIND.3==0)                        //
             {                                  //
              n_sek=1;                          //
             }                                  //
           if(PIND.4==0)                        //
             {                                  //
              n_sek=2;                          //
             }                                  //
           if(PINC.1==0)                        //
             {                                  //
              n_sek=3;                          //
             }                                  //
           if(PINA.0==0)                        //
             {                                  //
              n_sek=4;                          //
             }                                  //
           if(PINA.3==0)                        //
             {                                  //
              n_sek=5;                          //
             }                                  //
           if(PINC.0==0)                        //
             {                                  //
              n_sek=6;                          //
             }                                  //
           if(PINA.1==0)                        //
             {                                  //
              n_sek=7;                          //
             }                                  //
           if(PINA.2==0)                        //
             {                                  //
              n_sek=8;                          //
             }                                  //
           if(PINA.5==0)                        //
             {                                  //
              n_sek=9;                          //
             }                                  //
           if(PINA.7==0)                        //
             {                                  //
              n_sek=0;                          //
             }                                  //
                                                //
           LcdClear();                          //
                                                //
           sprintf (lcd_buf, "%u", n_d_hour);   //
           LcdStringBold(2,2);                  //
                                                //
           sprintf (lcd_buf, "^");              //
           LcdString(14,3);                     //
                                                //
           sprintf (lcd_buf, "%u", n_hour);     //
           LcdStringBold(4,2);                  //
                                                //
           sprintf (lcd_buf, ":");              //
           LcdStringBold(6,2);                  //
                                                //
           sprintf (lcd_buf, "%u", n_d_min);    //
           LcdStringBold(8,2);                  //
                                                //
           sprintf (lcd_buf, "%u", n_min);      //
           LcdStringBold(10,2);                 //
                                                //
           sprintf (lcd_buf, ":");              //
           LcdString(12,2);                     //
                                                //
           sprintf (lcd_buf, "%u", n_d_sek);    //
           LcdString(13,2);                     //
                                                //
           sprintf (lcd_buf, "%u", n_sek);      //
           LcdString(14,2);                     //
                                                //
           sprintf (lcd_buf, "Применить");      //
           LcdString(4,6);                      //
                                                //
           LcdUpdate();                         //
                                               
          }                                    
                                               
        if(PIND.5==0)                           //если была нажата кнопка, условно сответствующая функции "Применить"
          {                                     //
           #asm("cli")                          //запрещаем прерывания
           sek=n_sek;                           //записываем временные переменные настройки времени в текущие значения
           min=n_min;                           //
           hour=n_hour;                         //
           d_sek=n_d_sek;                       //
           d_min=n_d_min;                       //
           d_hour=n_d_hour;                     //
           TCNT2=0x00;                          //обнуляем текущее значение счетчика
           #asm("sei")                          //резрешаем прерывания
          }                                     
                                                
                                                
      }                                         
                                                
      delay_ms(250); 
      
 }
 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 
 
 void data(void) //функция настройки даты
 {
  d=0; // 
  e=0; //
  f=0; // 
  g=0; //
  h=0; //
  i=0; //
  
  c=0; //
  
  
  while(PIND.1==1)   //функция уходит в бесконечный цикл до нажатия на кнопку "Назад"
       { 
  
        if(PIND.6==0)  //инкремент/декремент переменной для определения выделения в меню настройки даты(циклично)
          {            //
           c++;        //
          }            //
                       //
        delay_ms(75);  //
                       //
        if(PIND.2==0)  //
          {            //
           c--;        //
          }            //
                       //
        delay_ms(75);  //
                       //
        if(c>5)        //
          {            //
           c=0;        //
          }            //
                       //
        if(c<0)        //
          {            //
           c=5;        //
          }            //
                       
        if(c==0)                                //подставляем в регистр десятка дней значение, соответствующее нажатой кнопки и выводим всё на экран, 
          {                                     //предварительно очистив
                                                //+ надпись "Применить" возле соответствующей кнопки
           if(PIND.3==0)                        //
             {                                  //
              d=1;                              //
             }                                  //
           if(PIND.4==0)                        //
             {                                  //
              d=2;                              //
             }                                  //
            if(PINC.1==0)                       //
             {                                  //
              d=3;                              //
             }                                  //
                                                //
           if(PINA.7==0)                        //
             {                                  //
              d=0;                              //
             }                                  //
                                                //
           LcdClear();                          //
                                                //
           sprintf (lcd_buf, "%u", d);          //
           LcdString(3,3);                      //
                                                //
           sprintf (lcd_buf, "^");              //
           LcdString(3,4);                      //
                                                //
           sprintf (lcd_buf, "%u", e);          //
           LcdString(4,3);                      //
                                                //
           sprintf (lcd_buf, "/");              //
           LcdString(5,3);                      //
                                                // 
           sprintf (lcd_buf, "%u", f);          //
           LcdString(6,3);                      //
                                                //
           sprintf (lcd_buf, "%u", g);          //
           LcdString(7,3);                      //
                                                //
           sprintf (lcd_buf, "/");              //
           LcdString(8,3);                      //
                                                //
           sprintf (lcd_buf, "20");             //
           LcdString(9,3);                      //
                                                //
           sprintf (lcd_buf, "%u", h);          //
           LcdString(11,3);                     //
                                                // 
           sprintf (lcd_buf, "%u", i);          //
           LcdString(12,3);                     //
                                                //
           sprintf (lcd_buf, "Применить");      //
           LcdString(4,6);                      //
                                                //
           LcdUpdate();                         //
                                                
          }
  
        if(c==1)                                //подставляем в регистр единиц дней значение, соответствующее нажатой кнопки и выводим всё на экран, 
          {                                     //предварительно очистив
                                                //+ надпись "Применить" возле соответствующей кнопки
           if(PIND.3==0)                        //
             {                                  //
              e=1;                              //
             }                                  //
           if(PIND.4==0)                        //
             {                                  //
              e=2;                              //
             }                                  //
           if(PINC.1==0)                        //
             {                                  //
              e=3;                              //
             }                                  //
           if(PINA.0==0)                        //
             {                                  //
              e=4;                              //
             }                                  //
           if(PINA.3==0)                        //
             {                                  //
              e=5;                              //
             }                                  //
           if(PINC.0==0)                        //
             {                                  //
              e=6;                              //
             }                                  //
           if(PINA.1==0)                        //
             {                                  //
              e=7;                              //
             }                                  //
           if(PINA.2==0)                        //
             {                                  //
              e=8;                              //
             }                                  //
           if(PINA.5==0)                        //
             {                                  //
              e=9;                              //
             }                                  //
           if(PINA.7==0)                        //
             {                                  //
              e=0;                              //
             }                                  //
                                                //
           LcdClear();                          //
                                                //
           sprintf (lcd_buf, "%u", d);          //
           LcdString(3,3);                      //
                                                //
           sprintf (lcd_buf, "^");              //
           LcdString(4,4);                      //
                                                //
           sprintf (lcd_buf, "%u", e);          //
           LcdString(4,3);                      //
                                                //
           sprintf (lcd_buf, "/");              //
           LcdString(5,3);                      //
                                                // 
           sprintf (lcd_buf, "%u", f);          //
           LcdString(6,3);                      //
                                                //
           sprintf (lcd_buf, "%u", g);          //
           LcdString(7,3);                      //
                                                //
           sprintf (lcd_buf, "/");              //
           LcdString(8,3);                      //
                                                //
           sprintf (lcd_buf, "20");             //
           LcdString(9,3);                      //
                                                //
           sprintf (lcd_buf, "%u", h);          //
           LcdString(11,3);                     //
                                                // 
           sprintf (lcd_buf, "%u", i);          //
           LcdString(12,3);                     //
                                                //
           sprintf (lcd_buf, "Применить");      //
           LcdString(4,6);                      //
                                                //
           LcdUpdate();                         //
                                               
          }                                     
                                               
        if(c==2)                                //подставляем в регистр десятка месяца значение, соответствующее нажатой кнопки и выводим всё на экран, 
          {                                     //предварительно очистив
                                                //+ надпись "Применить" возле соответствующей кнопки
           if(PIND.3==0)                        //
             {                                  //
              f=1;                              //
             }                                  //
           if(PINA.7==0)                        //
             {                                  //
              f=0;                              //
             }                                  //
                                                //
           LcdClear();                          //
                                                //
           sprintf (lcd_buf, "%u", d);          //
           LcdString(3,3);                      //
                                                //
           sprintf (lcd_buf, "^");              //
           LcdString(6,4);                      //
                                                //
           sprintf (lcd_buf, "%u", e);          //
           LcdString(4,3);                      //
                                                //
           sprintf (lcd_buf, "/");              //
           LcdString(5,3);                      //
                                                // 
           sprintf (lcd_buf, "%u", f);          //
           LcdString(6,3);                      //
                                                //
           sprintf (lcd_buf, "%u", g);          //
           LcdString(7,3);                      //
                                                //
           sprintf (lcd_buf, "/");              //
           LcdString(8,3);                      //
                                                //
           sprintf (lcd_buf, "20");             //
           LcdString(9,3);                      //
                                                //
           sprintf (lcd_buf, "%u", h);          //
           LcdString(11,3);                     //
                                                // 
           sprintf (lcd_buf, "%u", i);          //
           LcdString(12,3);                     //
                                                //
           sprintf (lcd_buf, "Применить");      //
           LcdString(4,6);                      //
                                                //
           LcdUpdate();                         //
                                                
          }                                     
                                                
        if(c==3)                                //подставляем в регистр единиц месяца значение, соответствующее нажатой кнопки и выводим всё на экран, 
          {                                     //предварительно очистив
                                                //+ надпись "Применить" возле соответствующей кнопки
           if(PIND.3==0)                        //
             {                                  //
              g=1;                              //
             }                                  //
           if(PIND.4==0)                        //
             {                                  //
              g=2;                              //
             }                                  //
           if(PINC.1==0)                        //
             {                                  //
              g=3;                              //
             }                                  //
           if(PINA.0==0)                        //
             {                                  //
              g=4;                              //
             }                                  //
           if(PINA.3==0)                        //
             {                                  //
              g=5;                              //
             }                                  //
           if(PINC.0==0)                        //
             {                                  //
              g=6;                              //
             }                                  //
           if(PINA.1==0)                        //
             {                                  //
              g=7;                              //
             }                                  //
           if(PINA.2==0)                        //
             {                                  //
              g=8;                              //
             }                                  //
           if(PINA.5==0)                        //
             {                                  //
              g=9;                              //
             }                                  //
           if(PINA.7==0)                        //
             {                                  //
              g=0;                              //
             }                                  //
                                                //
           LcdClear();                          //
                                                //
           sprintf (lcd_buf, "%u", d);          //
           LcdString(3,3);                      //
                                                //
           sprintf (lcd_buf, "^");              //
           LcdString(7,4);                      //
                                                //
           sprintf (lcd_buf, "%u", e);          //
           LcdString(4,3);                      //
                                                //
           sprintf (lcd_buf, "/");              //
           LcdString(5,3);                      //
                                                // 
           sprintf (lcd_buf, "%u", f);          //
           LcdString(6,3);                      //
                                                //
           sprintf (lcd_buf, "%u", g);          //
           LcdString(7,3);                      //
                                                //
           sprintf (lcd_buf, "/");              //
           LcdString(8,3);                      //
                                                //
           sprintf (lcd_buf, "20");             //
           LcdString(9,3);                      //
                                                //
           sprintf (lcd_buf, "%u", h);          //
           LcdString(11,3);                     //
                                                // 
           sprintf (lcd_buf, "%u", i);          //
           LcdString(12,3);                     //
                                                //
           sprintf (lcd_buf, "Применить");      //
           LcdString(4,6);                      //
                                                //
           LcdUpdate();                         //
                                                
          }                                    
                                                
        if(c==4)                                //подставляем в регистр десятков лет значение, соответствующее нажатой кнопки и выводим всё на экран, 
          {                                     //предварительно очистив
                                                //+ надпись "Применить" возле соответствующей кнопки
           if(PIND.3==0)                        //
             {                                  //
              h=1;                              //
             }                                  //
           if(PIND.4==0)                        //
             {                                  //
              h=2;                              //
             }                                  //
           if(PINC.1==0)                        //
             {                                  //
              h=3;                              //
             }                                  //
           if(PINA.0==0)                        //
             {                                  //
              h=4;                              //
             }                                  //
           if(PINA.3==0)                        //
             {                                  //
              h=5;                              //
             }                                  //
           if(PINC.0==0)                        //
             {                                  //
              h=6;                              //
             }                                  //
           if(PINA.1==0)                        //
             {                                  //
              h=7;                              //
             }                                  //
           if(PINA.2==0)                        //
             {                                  //
              h=8;                              //
             }                                  //
           if(PINA.5==0)                        //
             {                                  //
              h=9;                              //
             }                                  //
           if(PINA.7==0)                        //
             {                                  //
              h=0;                              //
             }                                  //
                                                //
           LcdClear();                          //
                                                //
           sprintf (lcd_buf, "%u", d);          //
           LcdString(3,3);                      //
                                                //
           sprintf (lcd_buf, "^");              //
           LcdString(11,4);                     //
                                                //
           sprintf (lcd_buf, "%u", e);          //
           LcdString(4,3);                      //
                                                //
           sprintf (lcd_buf, "/");              //
           LcdString(5,3);                      //
                                                // 
           sprintf (lcd_buf, "%u", f);          //
           LcdString(6,3);                      //
                                                //
           sprintf (lcd_buf, "%u", g);          //
           LcdString(7,3);                      //
                                                //
           sprintf (lcd_buf, "/");              //
           LcdString(8,3);                      //
                                                //
           sprintf (lcd_buf, "20");             //
           LcdString(9,3);                      //
                                                //
           sprintf (lcd_buf, "%u", h);          //
           LcdString(11,3);                     //
                                                // 
           sprintf (lcd_buf, "%u", i);          //
           LcdString(12,3);                     //
                                                //
           sprintf (lcd_buf, "Применить");      //
           LcdString(4,6);                      //                                             
                                                //
           LcdUpdate();                         //
                                                
          }                                     
                                               
        if(c==5)                                //подставляем в регистр единицсекунд значение, соответствующее нажатой кнопки и выводим всё на экран, 
          {                                     //предварительно очистив
                                                //+ надпись "Применить" возле соответствующей кнопки
           if(PIND.3==0)                        //
             {                                  //
              i=1;                              //
             }                                  //
           if(PIND.4==0)                        //
             {                                  //
              i=2;                              //
             }                                  //
           if(PINC.1==0)                        //
             {                                  //
              i=3;                              //
             }                                  //
           if(PINA.0==0)                        //
             {                                  //
              i=4;                              //
             }                                  //
           if(PINA.3==0)                        //
             {                                  //
              i=5;                              //
             }                                  //
           if(PINC.0==0)                        //
             {                                  //
              i=6;                              //
             }                                  //
           if(PINA.1==0)                        //
             {                                  //
              i=7;                              //
             }                                  //
           if(PINA.2==0)                        //
             {                                  //
              i=8;                              //
             }                                  //
           if(PINA.5==0)                        //
             {                                  //
              i=9;                              //
             }                                  //
           if(PINA.7==0)                        //
             {                                  //
              i=0;                              //
             }                                  //
                                                //
           LcdClear();                          //
                                                //
           sprintf (lcd_buf, "%u", d);          //
           LcdString(3,3);                      //
                                                //
           sprintf (lcd_buf, "^");              //
           LcdString(12,4);                     //
                                                //
           sprintf (lcd_buf, "%u", e);          //
           LcdString(4,3);                      //
                                                //
           sprintf (lcd_buf, "/");              //
           LcdString(5,3);                      //
                                                // 
           sprintf (lcd_buf, "%u", f);          //
           LcdString(6,3);                      //
                                                //
           sprintf (lcd_buf, "%u", g);          //
           LcdString(7,3);                      //
                                                //
           sprintf (lcd_buf, "/");              //
           LcdString(8,3);                      //
                                                //
           sprintf (lcd_buf, "20");             //
           LcdString(9,3);                      //
                                                //
           sprintf (lcd_buf, "%u", h);          //
           LcdString(11,3);                     //
                                                // 
           sprintf (lcd_buf, "%u", i);          //
           LcdString(12,3);                     //
                                                //
           sprintf (lcd_buf, "Применить");      //
           LcdString(4,6);                      //
                                                //
           LcdUpdate();                         //
                                               
          }                                    
            
          
            
            
                                               
        if(PIND.5==0)              //если была нажата кнопка, условно сответствующая функции "Применить"
          {                       
           den=10*d + e;           //переводим в нормальный вид и записываем в текущее значение даты
           mes=10*f + g;           //
           god=2000 + (10*h + i);  //
          }                                     
                                                
                                                
      }                                         
                                                
      delay_ms(250);
  
   
 } 
 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

void menu(void) //функция "Меню"
 {
  
  while(PIND.1==1)
       {
        while(PIND.1==1)
             {
          
              if((PIND.6==0)||(PIND.2==0))
                {
                 b=~b;
                }
          
              delay_ms(150); 
          
              LcdClear();

              if(b==0)
                {
                 sprintf (lcd_buf, "1.Время <-");
                 LcdString(2,2);
                 sprintf (lcd_buf, "2.Дата");
                 LcdString(2,4); 
                }
          
              if(b==1)
                {
                 sprintf (lcd_buf, "1.Время");
                 LcdString(2,2);
                 sprintf (lcd_buf, "2.Дата <-");
                 LcdString(2,4); 
                } 
                  
              LcdUpdate();  
                                    
              if((PIND.5==0)&&(b==0))
                {
                 delay_ms(100);
                 vremja();
                }
                         
              if((PIND.5==0)&&(b==1))
                {
                 delay_ms(100);
                 data();
                }
             }   
                 
       }
     
  b=0;

 }

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

void main(void)
{
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P 
PORTA=0xFF;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=Out Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=0 State3=0 State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x18;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0xFF;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=P State5=P State4=P State3=P State2=P State1=P State0=P 
PORTD=0x7F;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: TOSC1 pin
// Clock value: PCK2/128
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x08;
TCCR2=0x05;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// 1 Wire Bus initialization
w1_init();

LcdInit();

// Global enable interrupts
#asm("sei")

while(1)
     {
       
      if(PIND.5==0)     //если нажата кнопка "Меню"
        {               //
         a=1;           //не отображаем "основной режим" и не читаем температуру
         delay_ms(50);  //
         menu();        //уходим в функцию "Меню"
         a=0;           //после возврата снова отображаем "основной режим" и читаем температуру
        }               //
                        
      if(PINA.4==0)     //если нажата "*" - включаем подсветку
        {               //
         PORTB.3=1;     //
         delay_ms(150); //
        }               //

      if(PINA.6==0)     //если нажата "#" - выключаем подсветку
        {               //
         PORTB.3=0;     //
         delay_ms(150); //
        }               //
     };  
      
}
