/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 13.11.2011
Author  : 
Company : 
Comments: 


Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 12,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega16.h>
#include <delay.h>
// I2C Bus functions
#asm
   .equ __i2c_port=0x12 ;PORTD
   .equ __sda_bit=0
   .equ __scl_bit=1
#endasm
#include <i2c.h>

// DS1307 Real Time Clock functions
#include <ds1307.h>

// 1 Wire Bus interface functions
#include <1wire.h>

// DS1820 Temperature Sensor functions
#include <ds18b20.h>

// Alphanumeric LCD Module functions
#include <alcd.h>
#define blue OCR0 //Определяем канал OCR0 для белого цвета
#define white OCR2 //Определяем канал OCR2 для синего цвета

// Declare your global variables here
unsigned char chas, min, sec, day, mes, god, m, temp, i, z, r, d = 0;
signed char m1 = 0;
eeprom unsigned char tvkl, tvikl, chasz, chasr, minz, minr, air, filter;
char ru4n[8] = {0x50,0x79,0xC0,0xBD,0x6F,0xB9};
char rezhim[8] = {0x70,0x65,0xB6,0xB8,0xBC};
char ustanov[8] = {0xA9,0x63,0xBF,0x61,0xBD,0x6F,0xB3};
char vrem[8] = {0xB3,0x70,0x65,0xBC,0x65,0xBD,0xB8};
char dati[8] = {0xE3,0x61,0xBF,0xC3};
char vech[8] = {0xB3,0x65,0xC0,0x65,0x70};
char nagreva[8] = {0xBD,0x61,0xB4,0x70,0x65,0xB3,0x61};
char chasov[8] = {0xA9,0x63,0xBF,0x2E,0xC0,0x61,0x63,0x61};
char datas[8] = {0xA9,0x63,0xBF,0x2E,0xE3,0x61,0xBF,0xC3};
char gods[8] = {0xA9,0x63,0xBF,0x2E,0xB4,0x6F,0xE3,0x61};
char utro[8] = {0x79,0xBF,0x70,0x6F};
char goda[8] = {0xB4,0x6F,0xE3,0x61};
char tvklvikl[8] = {0x42,0xBA,0xBB,0x2F,0x42,0xC3,0xBA,0xBB};
char nach_rassveta[8] = {0x50,0x61,0x63,0x63,0xB3,0x65,0xBF};
char nach_zakata[8] = {0xA4,0x61,0xBA,0x61,0xBF};

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here

}

// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
  TCNT1H=0;
  TCNT1L=0;
  d++;
  if (white==254) r=0;
  if (r==1 && d==30) 
  {
  white++;
  blue--;
  d=0;
  }
  if (blue==254) z=0;
  if (z==1 && d==30)
  {
  blue++;
  white--;
  d=0;
  } 
}

// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Place your code here

}

//процедура подачи звукового сигнала-------------------------------------
void signal()
{
PORTA.7=1;
delay_ms(125);
PORTA.7=0;
delay_ms(125);
};
//процедура установки времени заката-------------------------------------
void nach_vecher()
{
lcd_clear();
while(1)
{
      lcd_gotoxy(1,0);  
      lcd_puts(nach_zakata);
      lcd_gotoxy(0,1);
      lcd_putchar(' ');
      lcd_putchar(chasz/10+0x30);
      lcd_putchar(chasz%10+0x30);
      lcd_putchar(':');
      lcd_putchar(minz/10+0x30);
      lcd_putchar(minz%10+0x30);
      lcd_putchar(' ');
      lcd_putchar(' ');
      delay_ms(50);
    if (PIND.6==0){ 
    signal();
    chasz++;
    if (chasz==24) chasz=0; //установить час начала заката
    };
    if (PIND.2==0){ 
    signal();
    minz++;
    if (minz==60) minz=0; //установить минуты начала заката
    };
    if (PIND.4==0)
    {
    signal();
    lcd_clear();
    return;    
    };
};
};
//меню времени заката------------------------------------
void zakat()
{
lcd_clear();
while(1)
{
      lcd_gotoxy(0,0);  
      lcd_puts(ustanov);
      lcd_gotoxy(0,1);
      lcd_puts(vech);
      if (PIND.4==0) //условие перехода на процедуру установки времени заката
      {
      signal();
      nach_vecher();
      };
      if (PIND.3==0)//листаем меню вниз
      {
      signal();
      m1--;
      break;
      }
      if (PIND.5==0)//листаем меню вверх
      {
      signal();
      m1++;
      break;
      };
};
};
//процедура установки времени рассвета--------------------------------
void nach_utro()
{
lcd_clear();
while(1)
{
      lcd_gotoxy(0,0);  
      lcd_puts(nach_rassveta);
      lcd_gotoxy(0,1);
      lcd_putchar(' ');
      lcd_putchar(chasr/10+0x30);
      lcd_putchar(chasr%10+0x30);
      lcd_putchar(':');
      lcd_putchar(minr/10+0x30);
      lcd_putchar(minr%10+0x30);
      lcd_putchar(' ');
      lcd_putchar(' ');
      delay_ms(50);
    if (PIND.6==0){ 
    signal();
    chasr++;
    if (chasr==24) chasr=0; //установить час начала рассвета
    };
    if (PIND.2==0){ 
    signal();
    minr++;
    if (minr==60) minr=0; //установить минуты начала рассвета
    };
    if (PIND.4==0)
    {
    signal();
    lcd_clear();
    return;    
    };
};
};
//меню времени рассвета------------------------------------
void rassvet()
{
lcd_clear();
while(1)
{
      lcd_gotoxy(0,0);  
      lcd_puts(ustanov);
      lcd_gotoxy(0,1);
      lcd_puts(utro);
      if (PIND.4==0)//условие перехода в процедуру установки времени рассвета
      {
      signal();
      nach_utro();
      };
      if (PIND.3==0)//листаем меню вниз
      {
      signal();
      m1--;
      break;
      }
      if (PIND.5==0)//листаем меню вверх
      {
      signal();
      m1++;
      break;
      };
};
};
//процедура установки диапазона работы нагревателя-----------------------------------------
void vklvikl()
{
lcd_clear();
while(1)
{
      lcd_gotoxy(0,0);  
      lcd_puts(tvklvikl);
      lcd_gotoxy(0,1);
      lcd_putchar(' ');
      lcd_putchar(tvkl/10+0x30);
      lcd_putchar(tvkl%10+0x30);
      lcd_putchar(' ');
      lcd_putchar(' ');
      lcd_putchar(tvikl/10+0x30);
      lcd_putchar(tvikl%10+0x30);
      lcd_putchar(' ');
      delay_ms(50);
      if (PIND.6==0){ 
      signal();
      tvkl++;
      if (tvkl==29) tvkl=1;
      };
      if (PIND.2==0){ 
      signal();
      tvikl++;
      if (tvikl==29) tvikl=1;
      };
      if (PIND.4==0)
      {
      signal();
      lcd_clear();
      break;    
      };
      };
      };

//-------------------------------------------------------------------
void temper()
{
lcd_clear();
while(1)
{
      lcd_gotoxy(0,0);  
      lcd_puts(ustanov);
      lcd_gotoxy(0,1);
      lcd_puts(nagreva);
      if (PIND.4==0)
      {
      signal();
      vklvikl();
      };
      if (PIND.3==0)
      {
      signal();
      m1--;
      break;
      }
      if (PIND.5==0)
      {
      signal();
      m1++;
      break;
      };
};
};
//------------------------------------------------------------------
void ustgoda()
{
lcd_clear();
while(1)
{
      lcd_gotoxy(0,0);  
      lcd_puts(gods);
      lcd_gotoxy(0,1);
      lcd_putchar(' ');
      lcd_putchar(' ');
      lcd_putchar(' ');
      lcd_putchar(god/10+0x30);
      lcd_putchar(god%10+0x30);
      lcd_putchar(' ');
      lcd_putchar(' ');
      lcd_putchar(' ');
      delay_ms(50);
    if (PIND.2==0){ 
    signal();
    god++;
    if (god==99) god=0;
    rtc_set_date(0, day, mes, god); //установить дату: число, месяц, год 
    };
    if (PIND.4==0)
    {
    signal();
    lcd_clear();
    break;    
    };
};
};
//-------------------------------------------------------------------
void godi()
{
lcd_clear();
while(1)
{
      lcd_gotoxy(0,0);  
      lcd_puts(ustanov);
      lcd_gotoxy(0,1);
      lcd_puts(goda);
      if (PIND.4==0)
      {
      signal();
      ustgoda();
      };
      if (PIND.3==0)
      {
      signal();
      m1--;
      break;
      }
      if (PIND.5==0)
      {
      signal();
      m1++;
      break;
      };
      
}
}
//-------------------------------------------------------------------
void ustdata()
{
while(1)
{
      lcd_gotoxy(0,0);  
      lcd_puts(datas);
      lcd_gotoxy(0,1);
      lcd_putchar(' ');
      lcd_putchar(day/10+0x30);
      lcd_putchar(day%10+0x30);
      lcd_putchar('.');
      lcd_putchar(mes/10+0x30);
      lcd_putchar(mes%10+0x30);
      lcd_putchar(' ');
      lcd_putchar(' ');
      delay_ms(50);
    if (PIND.6==0){ 
    signal();
    day++;
    if (day==32) day=1;
    rtc_set_date(0, day, mes, god); //установить дату: число, месяц, год 
    };
    if (PIND.2==0){ 
    signal();
    mes++;
    if (mes==13) mes=1;
    rtc_set_date(0, day, mes, god); //установить дату: число, месяц, год
    };
    if (PIND.4==0)
    {
    signal();
    lcd_clear();
    break;    
    };
};
};
//-------------------------------------------------------------------
void data()
{
lcd_clear();
while(1)
{
      lcd_gotoxy(0,0);  
      lcd_puts(ustanov);
      lcd_gotoxy(0,1);
      lcd_puts(dati);
      if (PIND.4==0)
      {
      signal();
      ustdata();
      };
      if (PIND.3==0)
      {
      signal();
      m1--;
      break;
      }
      if (PIND.5==0)
      {
      signal();
      m1++;
      break;
      };
};
};
//-------------------------------------------------------------------
void ust4asa()
{
while(1)
{
      lcd_gotoxy(0,0);  
      lcd_puts(chasov);
      lcd_gotoxy(0,1);
      lcd_putchar(' ');
      lcd_putchar(chas/10+0x30);
      lcd_putchar(chas%10+0x30);
      lcd_putchar(':');
      lcd_putchar(min/10+0x30);
      lcd_putchar(min%10+0x30);
      lcd_putchar(' ');
      lcd_putchar(' ');
      delay_ms(50);
    if (PIND.6==0){ 
    signal();
    chas++;
    if (chas==24) chas=0;
    rtc_set_time(chas, min, 00); //установить время: часы, минуты, секунды 
    };
    if (PIND.2==0){ 
    signal();
    min++;
    if (min==60) min=0;
    rtc_set_time(chas, min, 00); //установить время: часы, минуты, секунды 
    };
    if (PIND.4==0)
    {
    signal();
    lcd_clear();
    return;    
    };
};
};
//-----------------------------------------------------------------
void vremya()
{
lcd_clear();
while(1)
{
      lcd_gotoxy(0,0);  
      lcd_puts(ustanov);
      lcd_gotoxy(0,1);
      lcd_puts(vrem);
      if (PIND.4==0)
      {
      signal();
      ust4asa();
      };
      
      if (PIND.3==0)
      {
      signal();
      m1--;
      break;
      };
      if (PIND.5==0)
      {
      signal();
      m1++;
      break;
      };
      
};
};
//------------------------------------------------------------------

//------------------------------------------------------------------
void ru4noi()
{
lcd_clear();
while(1)
{
      lcd_gotoxy(1,0);  
      lcd_puts(ru4n);
      lcd_gotoxy(1,1);
      lcd_puts(rezhim);
      if (PIND.4==0)
      {
      signal();
      m++;
      };
      if (m==2)
      {
      m=0;
      break; //Выход из ручного режима
      };
      if (PIND.5==0) //фильтр
      {
      signal();
      filter++;
      };
      if (filter==1) PORTB.1=1;//вкл фильтр
      if (filter==2) 
      {
      filter=0;
      PORTB.1=0; //выкл фильтр
      };
      if (PIND.6==0) //компрессор
      {
      signal();
      air++;
      };
      if (air==1) PORTB.2=1;//вкл компрессор
      if (air==2) 
      {
      air=0;
      PORTB.2=0; //выкл компрессор
      };
      };
};
//------------------------------------------------------------------    
void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=0 State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x80;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0 
PORTB=0x00;
DDRB=0x0F;

// 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=0x00;
DDRC=0x00;

// Port D initialization
// Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=0 State6=P State5=P State4=P State3=P State2=P State1=T State0=T 
PORTD=0x7C;
DDRD=0x80;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 12000,000 kHz
// Mode: Fast PWM top=0xFF
// OC0 output: Non-Inverted PWM
TCCR0=0x69;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 11,719 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x2D;
OCR1AL=0xC7;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 12000,000 kHz
// Mode: Fast PWM top=0xFF
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x69;
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x51;

// I2C Bus initialization
i2c_init();

// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(0,0,0);

// 1 Wire Bus initialization
// 1 Wire Data port: PORTC
// 1 Wire Data bit: 0
// Note: 1 Wire port settings must be specified in the
// Project|Configure|C Compiler|Libraries|1 Wire IDE menu.
w1_init();

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 3
// D5 - PORTA Bit 4
// D6 - PORTA Bit 5
// D7 - PORTA Bit 6
// Characters/line: 8
lcd_init(8);

// Global enable interrupts
#asm("sei")
rtc_get_time(&chas, &min, &sec);//получаем время из DS1307
rtc_get_date(0, &day, &mes, &god);//получаем дату из DS1307
if (chas > 8 && chas < 20) {  //определяем какое время суток
blue=0;
white=254;//если день, то вкл белый свет
}
else
{
blue=254;//если ночь, то вкл синий свет
white=0;
}
if (air==1) PORTB.2=1;//восстановление режимов работы
if (filter==1) PORTB.1=1;//после восстановления электроэнергии
while (1)
      {
      // Place your code here
      temp = ds18b20_temperature(0)-2;//получаем температуру
      if (temp <= tvkl) PORTB.0=1;//условие на включение нагрева
      if (temp >= tvikl) PORTB.0=0;//условие на выключение нагрева
      for (i=0; i<255; i++) {
      rtc_get_time(&chas, &min, &sec);//получаем время
      rtc_get_date(0, &day, &mes, &god); //получаем дату
      if (chasr==chas && minr==min && sec==0) r=1;//условие для начала рассвета
      if (chasz==chas && minz==min && sec==0) z=1;//условие для начала заката
      if (PIND.4==0)//условие перехода в ручной режим
      {
      signal();
      m++;
      };
      if (m==2) m=0;
      if (m==1) ru4noi();//переход в ручной режим
      if (m==0) {        
  //вывод основной информации на дисплей в автоматическом режиме
  lcd_gotoxy(0,0);  
  lcd_putchar(chas/10+0x30);
  lcd_putchar(chas%10+0x30);
  lcd_putchar(':');
  lcd_putchar(min/10+0x30);
  lcd_putchar(min%10+0x30);
  lcd_putchar(' ');
  lcd_putchar('t');
  lcd_putchar(' ');
  lcd_gotoxy(0,1);  
  lcd_putchar(day/10+0x30);
  lcd_putchar(day%10+0x30);
  lcd_putchar('.');
  lcd_putchar(mes/10+0x30);
  lcd_putchar(mes%10+0x30);
  lcd_putchar(' ');
  lcd_putchar(temp/10+0x30);
  lcd_putchar(temp%10+0x30);
        };
      if (PIND.3==0) //условие пролистывания меню вниз
      {
      signal();
      m1--;
      if (m1 < 0) m1=6;
      };
      if (PIND.5==0) //условие пролистывания меню вверх
      {
      signal();
      m1++;
      };
      if (m1==1) vremya();
      if (m1==2) data();
      if (m1==3) godi();
      if (m1==4) temper();
      if (m1==5) rassvet();
      if (m1==6) zakat();
      if (m1==7) m1=0;
      };
      }
}
