	/*
 * AVR_MENU.c
 *
 * Created: 18.03.2017 5:30:25
 * Author : User
 */ 
#define F_CPU 8000000UL
#include <avr/io.h>
//#include <avr/eeprom.h>
#include <util/delay.h>
#include <avr/interrupt.h>
//#include <util/twi.h>

#include "lcd.h"
#include "adc.h"
#include <stdio.h>
#include <avr/wdt.h> 
#include "I2C.h"
#include "EEPROM_V.h"
#define btn_plus (PINC&1<<2)
#define btn_minus (PINC&1<<7)
#define SLA_R_RTC_ADDR 0b10100001//макрос адреса +бит чтения
#define SLA_WR_RTC_ADDR   0b10100000//макрос адреса +бит записи

  volatile unsigned int  a,b,c,d;//
  volatile unsigned char  a1;//
volatile unsigned char  a2;//
 volatile unsigned char  b1;//

  volatile unsigned char  b2;//
 unsigned char  c1,d1;//
 unsigned char  c2,d2;//

volatile  unsigned int  r1,r2,r3;// переменная для прерывания по кнопке
volatile unsigned char menu=0;
volatile unsigned int n=0;
volatile unsigned char bit1=0;
volatile unsigned char bit2=1;
volatile unsigned char bit3=0;
//-Wl,-u,vfprintf -lprintf_flt -lm
//-lprintf_flt
char buf1[10];

char buf2[10];
 char buf3[10];
 char buf4[10];
 char buf5[10];
 char buf6[10];

    volatile unsigned char flag1=0;
    volatile unsigned char flag2=0;
    volatile unsigned char flag3=0;
    volatile unsigned char flag4=0;
    volatile unsigned char flag5=0;
    volatile unsigned char flag6=0;
    volatile unsigned char flag7=0;
    volatile unsigned char flag8=0;
    volatile unsigned char flag9=0;
    volatile unsigned char flag10=0;
    
	
	
	unsigned char data;
	
volatile unsigned int pauza=0;
volatile unsigned int pauza_x=0;
volatile unsigned int pauza_z=0;

 //volatile unsigned char flag1=0,flag7=0,flag8=0,flag9=0;
//char flag2=0;
//volatile unsigned char flag3=0;
//char flag4=0;
//volatile unsigned char flag5=0;
//volatile unsigned char flag6=0;

//uint16_t  save1 EEMEM;
//uint16_t save2  EEMEM;
//uint16_t  save3 EEMEM;
//uint16_t  save4 EEMEM;

ISR(INT0_vect)
{
	//r++;
	pauza=0;
	bit3=1;
	//TCNT2=0;
	//pauza_x=0;
	//flag5=0;
	
}
ISR(TIMER0_COMP_vect)
{
	TCNT0=0;
	pauza_x++;
	asm("wdr");
}
ISR(TIMER1_COMPB_vect)
{
	TCNT1H=0;
	TCNT1L=0;
	pauza_z++;
	 
}
ISR(TIMER2_COMP_vect)
{
	TCNT2=0;
	pauza++;
if (!(PINC&1<<3))
	 {
		  flag1=1;
	   pauza=0;
	}
	 if ((flag1==1)&&(PINC&1<<3))
	 {
		 if (pauza>2)
		 {
		   menu++;n++;flag1=0;
			 
		 }
		 
	 }

}
//void write_eeprom(void)
//{
//   I2C_START();
 //  I2C_TrasmitByte();
 //  I2C_STOP();

//}


void programa_write_eep(void)
{
 

  //I2C_Write_EEPROM(0b1010000);
  //I2C_Write_EEPROM(0);
  //I2C_Write_EEPROM(0);
  //I2C_Write_EEPROM(a);
  
  I2C_STOP();
}
void programa_2(void)
{
	  if (pauza_z>1200)
	  {
		  flag3=1;
	  }
	
	
		if (pauza_z>1280)
		{
		  flag3=0;
		  
		}
	    if (pauza_z>1400)
	   {
		   bit3=1;
	   }
	   if (flag3==1)
	   {
		PORTD|=(1<<5);
		
	   }
	   if (flag3==0)
	   {
		  PORTD&=~(1<<5);
		  
	   }
}
//unsigned int ADC_result(unsigned char adc_input)
//{
//	ADMUX=adc_input | (ADMUX & 0xF0);
	//задержка для стабилизации входного напряжения
//	_delay_us(10);
	//начинаем преобразование (ADSC = 1)

//	ADCSRA=ADCSRA|(1<<ADSC);
//	while(ADCSRA & (1<<ADSC));//ждем, пока АЦП закончит преобразование (ADIF = 0)
//	return ADCW;//ADC - содержит ADCH и ADCL
//}
void init_ports(void)
{
	 DDRA=0x00;
	 PORTA=0x00;
	 DDRC|=(0<<2)|(0<<3)|(0<<7);//настройка порта D на вход "0" и на выход "1"
	 PORTC|=(1<<2)|(1<<3)|(1<<7);//настройка порта D на вход "0" и на выход "1"
	 DDRB|=0xFF;//
	 PORTB|=0x00;//установка на  выводах портаB
	 DDRD|=(1<<0)|(0<<1)|(0<<2)|(0<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7);//настройка порта D на вход "0" и на выход "1"
	 PORTD|=(0<<0)|(1<<1)|(1<<2)|(1<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7);//установкана всех выводах порта D
}
void init_timers(void)
{
  TCCR1B=(1<<CS12)|(0<<CS11)|(1<<CS10);
   TCCR1A=0;
  TCCR0|=(1<<CS02)|(0<<CS01)|(1<<CS00);
  TCCR2|=(1<<CS22)|(0<<CS21)|(1<<CS20);
   TIMSK|=(1<<OCIE0)|(1<<OCIE1B)|(1<<OCIE2);
   TIFR|=(1<<OCF0)|(1<<OCF1B)|(1<<OCF2);
    TCNT0=0;
   TCNT1H=0;
   TCNT1L=0;

   TCNT2=0;
    OCR0=245;
   OCR1B=250;

     OCR2=250;	
}
void  INT_PIN()
{
    GICR|=(1<<INT0);
	MCUCR|=(1<<ISC01)|(1<<ISC00);
	GIFR|=(1<<INTF0);
	
}
//void  init_ADC()
//{
	// ADCSRA|=(1<<ADEN);
//	 ADCSRA|=(0<<ADIF)|(0<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
//	 ADMUX |=(0<<REFS1)|(1<<REFS0);
//	 ADCSRA |=(1<<ADSC);
//}
void init_wachdog_timer(void)
{
	WDTCR|=(0<<WDTOE)|(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(0<<WDP0);
}
 
 int main(void)
{
	 init_ports();
     init_I2C_M();
	 I2C_START();
	 I2C_SendByte(SLA_WR_RTC_ADDR);
	 I2C_SendByte(1);
	 I2C_SendByte(0);
	 I2C_START();
	 I2C_SendByte(SLA_R_RTC_ADDR);
	 a1=I2C_Readbyte_EEPROM();
	  a2=I2C_Readlastbyte_EEPROM();
	 I2C_STOP();
	// _delay_ms(5);
   // a=((unsigned int) a1<<8)|a2;
	I2C_START();
	I2C_SendByte(SLA_WR_RTC_ADDR);
	I2C_SendByte(3);
	I2C_SendByte(2);
	I2C_START();
	I2C_SendByte(SLA_R_RTC_ADDR);
	b1=I2C_Readbyte_EEPROM();
                b2=I2C_Readlastbyte_EEPROM();
	 I2C_STOP();
   //  I2C_START();
   // a=((unsigned int) a1<<8)|a2;
	
    //b=((unsigned int) b1<<8)|b2;
    
	//I2C_STOP();
	//_delay_ms()
   // b=((unsigned int) b1<<8)|b2;
             I2C_START();
	I2C_SendByte(SLA_WR_RTC_ADDR);
	I2C_SendByte(5);
	I2C_SendByte(4);
	I2C_START();
	I2C_SendByte(SLA_R_RTC_ADDR);
	c1=I2C_Readbyte_EEPROM();
    c2=I2C_Readbyte_EEPROM();
	I2C_STOP();
	
	// read_eeprom();// чтение 2 байт
	//a=TWDR;
   //  programa_read_eep();
	//a=eeprom_read_word(& save1);// чтение 2 байт
	//b=eeprom_read_word(& save2);// чтение 2 байт
	//c=eeprom_read_word(& save3);// чтение 2 байт
	//d=eeprom_read_word(& save4);// чтение 2 байт
	// _delay_us(5);
	
	//  I2C_START();
//	 I2C_SendByte(SLA_WR_RTC_ADDR);
//	 I2C_SendByte(3);
//	 I2C_SendByte(3);
	// I2C_START();
	// I2C_SendByte(SLA_R_RTC_ADDR);
	
	 
	// c=I2C_Readbyte_EEPROM();
	 
	// b=I2C_Readbyte_EEPROM();
	 
	// c=I2C_Readbyte_EEPROM();
	// b=I2C_Readlastbyte_EEPROM();
	 
	// I2C_STOP();
   // a=((unsigned int) a1<<8)|a2;
   // b=((unsigned int) b1<<8)|b2;
 //b=((unsigned int) b1<<8)|b2;
    //a=((unsigned int )a1<<8)|a2;
   // b=((unsigned int) b1<<8)|b2;
 
	init_timers();
                 INT_PIN();
	init_ADC();
	lcd_init(LCD_DISP_ON);
	lcd_clrscr();
      asm("sei") ;
	init_wachdog_timer();
    a=((unsigned int )a1<<8)|a2;
    b=((unsigned int) b1<<8)|b2;
    c=((unsigned int )c1<<8)|c2;
    
	                         
 while(1)
 {
		 PORTD|=(1<<4);
	 
        	if (bit3==1)
        	{
	        	TCCR1B=(0<<CS12)|(0<<CS11)|(0<<CS10);
        	}
        	
        	if (bit3==0)
        	{
	        	TCCR1B=(1<<CS12)|(0<<CS11)|(1<<CS10);
        	}
     
	 
		  
	     if (ADC_result(4)>825)
	    {
   
	    // flag2=0;
        asm("cli") ;                       
		   programa_2();
        asm("sei") ; 
			
	   }
	   else
	    {
			bit3=0;
		   //flag2=1; 
        asm("cli") ;                       
		   
		   pauza_z=0;
		   pauza=0;
		   
        asm("sei") ; 
		   
	  }
	  
	  
	   if (n==1)
	   {
		 PORTD|=(1<<5);
		
	   }
	   
	   if (n==5)
	   {
		   n=0;
		PORTD&=~(1<<5);
		
	   }
	   
	   
	   if (ADC_result(0)>a&&ADC_result(1)>b&&ADC_result(2)>c&&ADC_result(3)>825)
	   {
		    //PORTD|=(1<<7);
		   bit1=1;
		   // flag5=1;
	   }
	   
	   else
	   {
		  // PORTD&=~(1<<7);
		 
		   bit1=0;
	   }
	  if (bit1==1)
	  {
		    PORTD|=(1<<7);
		  
	  }
	  else
	  {
		   PORTD&=~(1<<7);
		  
	  }
	   
	   
	   
	   
	   //if (bit1==1&&bit2==1)
	   //{
		//   PORTD|=(1<<6);
	  // } 
	  // else
	   //{
		//	PORTD&=~(1<<6);
	 //  }
	   
   if (menu==1)
   {
	   asm("cli");
	   
	   if (btn_plus==0)
	   {
		   if (pauza>1)
		   {
			   pauza=0;
			   
			   if ( a==1023)
			   {
				   a=0;
			   }
			   a++;
		   }
	   }
	   if (btn_minus==0)
	   {
		   if (pauza>1)
		   {
			   pauza=0;
			   
			   if (a==0)
			   {
				   a=1023;
			   }
			   a--;
		   }
	   }
	   asm("sei");
   }
   if (menu==2)
   {
	   asm("cli");
	   if (btn_plus==0)
	   {
		   if (pauza>1)
		   {
			   pauza=0;
			   
			   if (b==1023)
			   {
				   b=0;
			   }
			   b++;
		   }
	   }
	   if (btn_minus==0)
	   {
		   if (pauza>1)
		   {
			   pauza=0;
			   if (b==0)
			   {
				   b=1023;
			   }
			   b--;
		   }
	   }
	   asm("sei");
   }
   if (menu==3)
   {
	   asm("cli");
	   
	   if (btn_plus==0)
	   {
		   if (pauza>1)
		   {
			   pauza=0;
			   c++;
			   
			   if (c==1023)
			   {
				   c=0;
			   }
		   }
	   }
	   if (btn_minus==0)
	   {
		   if (pauza>1)
		   {
			   pauza=0;
			   if (c==0)
			   {
				   c=1023;
			   }
			   c--;
		   }
	   }
	   asm("sei");
   }
   if (menu==4)
   {
	     asm("cli");
	     
	     if (btn_plus==0)
	     {
		     if (pauza>1)
		     {
			     pauza=0;
			     
			     if ( d==1023)
			     {
				     d=0;
			     }
			     d++;
		     }
	     }
	     if (btn_minus==0)
	     {
		     if (pauza>1)
		     {
			     pauza=0;
			     
			     if (d==0)
			     {
				     d=1023;
			     }
			     d--;
		     }
	     }
	     asm("sei");
   }
	  if (menu==0)
		{
         // a=((unsigned int )a1<<8)|a2;
         // b=((unsigned int) b1<<8)|b2;
    
		  asm("cli");
		      lcd_clrscr();
			  //sprintf(buf4);
			   lcd_puts("BobrAVR");
			  // sprintf(buf3,"i=%.2fa",result);
			  // lcd_gotoxy(9,0);
			  // lcd_puts(buf3);
			  
			   
					
				
				if (ADC_result(2)<c)
				{
					lcd_gotoxy(8,0);
					lcd_puts("OF");
				    
				} 
				else
				{
					lcd_gotoxy(8,0);
					lcd_puts("ON");
					
				}
				if (ADC_result(4)>800)
				{
					lcd_gotoxy(12,0);
					lcd_puts("X");
					
				} 
				else
				{
					lcd_gotoxy(12,0);
					lcd_puts("Z");
					
				}
				if (ADC_result(3)>800)
				{
					lcd_gotoxy(14,0);
					lcd_puts("X");
				} 
				else
				{
					lcd_gotoxy(14,0);
					lcd_puts("Z");
					
				}
			    _delay_ms(50);
	      asm("sei");
		  
		}
	   if (menu==1)
	   {
		   
	      asm("cli");
		  
		      lcd_clrscr();
	// a=((unsigned int )a1<<8)|a2;
	     sprintf(buf1,"a=%2d",a);
                               lcd_puts(buf1);
	            a1=a/256;
				a2=a%256;
	            //a2=a&0xFF;
			//	a1=a>>8;
				
	      if (!(PIND&1<<3))
			 {
				   flag2=1;
		   	    _delay_ms(20);
		   	    
			   }
			   if((flag2==1)&&(PIND&1<<3))
			   {
				   flag2=0;
	            //a1=a&0xFF;
				//a2=a>>8;
	           
                   I2C_START();
                   I2C_SendByte(SLA_WR_RTC_ADDR);
                   I2C_SendByte(1);
                   I2C_SendByte(0);
                    I2C_Write_EEPROM(a1);
                    I2C_Write_EEPROM(a2);
                    I2C_STOP();
                   // _delay_ms(5);
			   }
			   
			   if (ADC_result(0)>a)
			   {
				    lcd_gotoxy(0,9);
				    lcd_puts("P");
					
			   } 
			   else
			   {
				    lcd_gotoxy(0,9);
				    lcd_puts("R");
			   }
			     r1=ADC_result(0);
			     lcd_gotoxy(2,1);
			     sprintf(buf4,"a1=%2d",r1);
			     lcd_puts(buf4);
			     
			  _delay_ms(50);
			   
		 asm("sei");
	   }
	   
		if (menu==2)
		{
			
	            asm("cli");
		       lcd_clrscr();
		      sprintf(buf2,"b=%2d",b);
			  lcd_puts(buf2);
	              b1=b/256;
				  b2=b%256;  
	         //   asm("cli");
	            
			     if (!(PIND&1<<3))
			   {
				   flag2=1;
		   	    _delay_ms(20);
				   
			   }
			   if (flag2==1&&PIND&1<<3)
			   {
	             // b1=a/256;
				  // b2=a%256;
				   
				   flag2=0;
				   
				   I2C_START();
                   I2C_SendByte(SLA_WR_RTC_ADDR);
                     I2C_SendByte(3);
                    I2C_SendByte(2);
                    I2C_Write_EEPROM(b1);
                    I2C_Write_EEPROM(b2);
					
                    I2C_STOP();
   	   
                    
					
	           
	           
		   	    // eeprom_write_word (& save2,b);
			   }
			   
			   if (ADC_result(1)>b)
			   {
				    lcd_gotoxy(0,9);
				    lcd_puts("P");
				   
			   } 
			   else
			   {
				    lcd_gotoxy(0,9);
				    lcd_puts("R");
				   
			   }
			    r2=ADC_result(1);
			    lcd_gotoxy(2,1);
			    sprintf(buf5,"b1=%2d",r2);
			    lcd_puts(buf5);
			    
			  _delay_ms(50);
			   
	           asm("sei");
		}
		 if (menu==3)
		 {
			 
	           asm("cli");
		      lcd_clrscr();
		      sprintf(buf3,"c=%2d",c);
			  lcd_puts(buf3);
	              c1=c/256;
				  c2=c%256;
				  
			     if (!(PIND&1<<3))
			   {
				   flag2=1;
		   	    _delay_ms(20);
				   
			   }
			   if (flag2==1&&PIND&1<<3)
			   {
				   
				   flag2=0;
				   I2C_START();
                    I2C_SendByte(SLA_WR_RTC_ADDR);
                    I2C_SendByte(5);
                    I2C_SendByte(4);
                    I2C_Write_EEPROM(c1);
                    I2C_Write_EEPROM(c2);
                    
                    I2C_STOP();
		   	    //    _delay_ms(5);
					
		   	    // eeprom_write_word (& save3,c);
			   }
			   if (ADC_result(2)>c)
			   {
				    lcd_gotoxy(0,9);
				    lcd_puts("R");
				   
			   } 
			   else
			   {
				    lcd_gotoxy(0,9);
				    lcd_puts("ND");
				   
			   }
			       r3=ADC_result(2);
			       lcd_gotoxy(3,1);
			       sprintf(buf6,"c1=%2d",r3);
			       lcd_puts(buf6);
			       
			  _delay_ms(50);
			   
	         asm("sei");
		 }
		if (menu==4)
		 {
			 menu=0;
		 }
   }
}