#include <avr/io.h>
#include <util/delay.h>
 
 
// LCD Befehle
 
#define CLEAR_DISPLAY 0x01
#define CURSOR_HOME   0x02
 
 
// Pinbelegung für das 2x16 LCD DEM16216
 
#define PORT_LCD			PORTD
#define LCD_RS				2
#define	LCD_EN				3
#define LCD_DDR       		DDRD 
 


void lcd_data(unsigned char temp1);
void lcd_command(unsigned char temp1);
void lcd_enable(void);
void lcd_init(void);
void lcd_home(void);
void lcd_out(char *s);
void set_cursor(uint8_t x, uint8_t y);
void lcd_out_var(int16_t var);




// sendet ein Datenbyte an das LCD
void lcd_data(unsigned char temp1)
{
   PORT_LCD |= (1<<LCD_RS);     	 // set RS

   PORT_LCD &= 0x0F;
   PORT_LCD |= temp1;   			// Oberes Nibble setzen
   lcd_enable();

   PORT_LCD &= 0x0F;
   PORT_LCD |= (temp1<<4);          // Unteres Nibble setzen
   lcd_enable();

   _delay_us(50);
}
 
// sendet einen Befehl an das LCD
// wie lcd_data, nur ohne RS zu setzen
void lcd_command(unsigned char temp1)
{
   PORT_LCD &= ~(1<<LCD_RS);      	 // clear RS
	
   PORT_LCD &= 0x0F;
   PORT_LCD |= temp1;   			// Oberes Nibble setzen
   lcd_enable();

   PORT_LCD &= 0x0F;
   PORT_LCD |= (temp1<<4);          // Unteres Nibble setzen
   lcd_enable();

   _delay_us(50);
}
 
// erzeugt den Enable-Puls
void lcd_enable(void)
{
   PORT_LCD |= (1<<LCD_EN);
  _delay_us(1);
   PORT_LCD &= ~(1<<LCD_EN);
}
 
// Initialisierung: 
void lcd_init(void)
{
   LCD_DDR = LCD_DDR | 0xF0 | (1<<LCD_RS) | (1<<LCD_EN);
  
   delay_ms(15);
   
   PORT_LCD &= 0xF0;
   PORT_LCD |= 0x03;
   PORT_LCD &= ~(1<<LCD_RS);    // clear RS

   lcd_enable();
 
   _delay_ms(5);
   lcd_enable();
 
   _delay_ms(1);
   lcd_enable();
   _delay_ms(1);

   
    // 4 Bit Modus aktivieren 
   PORT_LCD &= 0x0F;
   PORT_LCD |= 0x20;
   lcd_enable();
   _delay_ms(1);
 
   
	lcd_command(0x28);		// Funktion Set
	delay_ms(1);
	lcd_command(0x0C);		// Display On
	delay_ms(1);
	lcd_clear();
	delay_ms(3);
	lcd_command(0x06);	// Entery Mode Set
	lcd_command(0x01);
	delay_ms(1);
} 
// Sendet den Befehl zur Löschung des Displays
void lcd_clear(void)
{
   lcd_command(CLEAR_DISPLAY);
    _delay_ms(7);
}
 

void lcd_out(char *s)
{
    int count = 0;
	
	while (*s)						//so lange *s != '\0' also ungleich dem "String-Endezeichen"
    {
        if(count<16){
		lcd_data(*s);				//Zeichen ausgeben
        s++;
		count++;
		}
		
		else{
		set_cursor(0,2);
			while (*s){
			lcd_data(*s);
			s++;
			}
		
		}



    }
}



void lcd_out_var(int16_t var)
{

char s[7];
lcd_out(itoa( var, s, 10 ));


}
