#define F_CPU 1000000UL  // 1 MHz
#define CLEAR 0x1

void lcd_en(void) // Enable
{
  _delay_us(100);
  
  PORTA |= (1<<PA5);
  
  _delay_ms(1);
  PORTA &= ~(1<<PA5);
}

void lcd_write(uint8_t com, char string[17])
{
  if (com != 0)
    {
      uint8_t high_nibble = com>>4;
      uint8_t low_nibble = com<<4;
      low_nibble = low_nibble>>4;
      
      PORTA = high_nibble;
      lcd_en();
      PORTA = low_nibble;
      lcd_en();
      
      _delay_ms(2);
    }
  
  else
    {
      for (int8_t i = 0; i < 16; i++)
	{
	  PORTA |= (1<<PA4); // RS - Bit setzen
  
	  uint8_t high_nibble = (uint8_t)string[i]>>4;
	  uint8_t low_nibble = (uint8_t)string[i]<<4;
	  low_nibble = low_nibble>>4;
	  
	  PORTA = high_nibble;
	  lcd_en();
	  PORTA = low_nibble;
	  lcd_en();
	  _delay_us(50);
	  
	  PORTA &= ~(1<<PA4); // RS - Bit löschen
	}
    }
}

lcd_init(void)
{
  // Port A Pins 0-5 auf Ausgang setzen
  DDRA |= ((1<<DDA0)|(1<<DDA1)|(1<<DDA2)|(1<<DDA3)|(1<<DDA4)|(1<<DDA5));

  PORTA &= ~((1<<PA0)|(1<<PA1)|(1<<PA2)|(1<<PA3)|(1<<PA4)|(1<<PA5));
  _delay_ms(15);
  PORTA |= ((1<<PA0)|(1<<PB1)); // 3 mal 00110000 
  lcd_en();      
  _delay_ms(5);
  lcd_en();      
  _delay_us(100);
  lcd_en();
  _delay_ms(5);

  PORTA &= ~((1<<PA0)|(1<<PA1)); // 0010 = 4-Bit Modus

  lcd_write(0x37, "");
  lcd_write(0x3c, "");
  lcd_write(CLEAR, "");
  _delay_ms(2);
  lcd_write(0x05, "");

  lcd_write(0, "     BEREIT     ");
}
