#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <avr/interrupt.h>
#define E0 PORTC&=~(1<<0) //строб для записи в LED
#define E1 PORTC|=(1<<0)  //строб для записи в LED
#define RS0 PORTC&=~(1<<1)//режим записи команды в LED
#define RS1 PORTC|=(1<<1) //режим записи данных в LED

char ShowHum [16]; unsigned int bits[5], Hum, Temp; int flag1;
 
 uint8_t DHT11_ini()   //инициализация датчика DHT11
 {
	 cli(); 
	 _delay_ms(100);
	 DDRD|=1<<PORTD;
	 PORTD|=1<<PORTD;
	 _delay_ms(100);
	 PORTD&=~(1<<PORTD);
	 _delay_ms(18);
	 PORTD|=1<<PORTD;
	 _delay_us(50);
	 PORTD&=~(1<<PORTD);
	 if(PORTD2&0b00000100)//ответ уровня "0" от датчика
	 return 1;
	 _delay_us(80);
	 if(!(PORTD2&0b00000100))   //ответ уровня "1" от датчика
	 return 1;
	 _delay_us(80);
		for(uint8_t j=0; j<5; j++)
	{
			uint8_t result=0;													
		for(uint8_t i=0; i<8; i++)
		{
			while(!(PORTD2&0b00000100))//Если через 30мкс на ножке PORTC2 "1", то +1
			_delay_us(30);
			if(PORTD2&0b00000100)
			result|=(1<<(7-i));
		    while(PORTD2&0b00000100);//ожидание "0"
	sei();
		}
		bits[j]=result; 
	}
	DDRD|=1<<PORTD2;// Передача
	PORTD|=1<<PORTD2;	
	_delay_ms(100);
	if (bits[0]+bits[1]+bits[2]+bits[3]!=bits[4])
	return 2;
	Hum=bits[0];
	Temp=bits[2];
	return 0;
}
ISR(INT0_vect)
{
	flag1=0;
}
	void port_ini()        //инициализация порта МК
	{
		DDRC=0xFF;
		DDRB=0xFF;
		PORTC&=~(1<<0);
		PORTC&=~(1<<1);
		PORTB=0x00;
	}
	void command_LCD(unsigned char c)//вывод команды МК
	{
		RS0;
		PORTB&=~(0xFF); PORTB|=c;
		E1;
		_delay_ms(1);
		E0;
		_delay_ms(1);
	}	
	void LCD_ini()         //инициализация LCD
	{
		_delay_ms(20);
		command_LCD(0b00110000);//инициализация
		_delay_ms(5);
		command_LCD(0b00110000);//инициализация
		_delay_us(100);
		command_LCD(0b00110000);//инициализация
		_delay_us(1);
		command_LCD(0b00111000);//режим установки функций
		_delay_us(40);
		command_LCD(0b00011100);//движение курсора влево
		_delay_us(40);
		command_LCD(0b00001111);//дисплей включен, курсор мигает
		_delay_us(40);
		command_LCD(0b00000100);//направление движения курсора, запрет сдвига дисплея
		_delay_us(40);
		command_LCD(0b00000001);//очистка дисплея
		_delay_ms(1.6);
	}	
	void set_cursor(unsigned char x)//установка курсора
	{
		RS0; PORTB&=~(0xFF);
		PORTB|=x;
		E1;
		_delay_ms(1);
		E0;
		_delay_ms(1);
	}
	void data_LCD(unsigned char c)//вывод данных МК
	{		
		RS1; PORTB&=~(0xFF);
		PORTB|=c;
		E1;
		_delay_ms(1);
		E0;
		_delay_ms(1);
	}
	void send_a_string(char *string_of_characters)
	{
		while(*string_of_characters)
		{					
		data_LCD(*string_of_characters++);
		}
	}	
    int main(void)
{	
	    cli();
	    port_ini();
	    LCD_ini();
		 DHT11_ini();
		set_cursor(0b10000001);
		itoa(Hum/10, ShowHum, 10);
		//data_LCD(0b00110011);
		send_a_string(ShowHum);
		_delay_ms(100);
			    
		GICR=(1<<INT0);
		MCUCR=(1<<ISC00)|(1<<ISC01);
		sei();		
    while (1) 
   {	   	 
   }
}