/*
 * lcd_routines.c
 *
 * Created: 08.10.2011 14:32:41
 *  Author: Ruben
 */ 

#include "lcd_routines.h"


/**********************************************************************************************/
//	Initialisierung des Displays
/**********************************************************************************************/

void LCD_init(void)
{
	DDRD=0xff;					//Port D als Ausgang definieren
	_delay_ms(250);				
	
	LCD_PORT=((1<<LCD_DB5)|(1<<LCD_DB5));
	LCD_enable();
	LCD_enable();
	LCD_enable();
	LCD_PORT=0b00000010;		//4-Bit-Modus einstellen
	LCD_enable();
	_delay_ms(300);

	LCD_write(0b00101000,0);			// Function Set
	LCD_write(0b00001100,0);			// Display on
	LCD_write(0b00000001,0);			// Display clear
	LCD_write(0b00000110,0);			// Entry Mode
}

/**********************************************************************************************/
//	Übermittlung von Befehlen(k=0) oder Daten (k=1) an das Display (Controller)
/**********************************************************************************************/

void LCD_write(unsigned char Info, unsigned char k)
{
        unsigned char Byte;

//Wenn k=1 ist, wird RS auf 0 gesetzt und Befehle übertragen
        if (k==0) 
        {
                LCD_PORT &= ~(1<<LCD_RS);		//RS Bit löschen      
        }
        
//Wenn k=0 ist, wird RS auf 1 gesetzt und Daten übertragen
        else 
        {
                LCD_PORT |= (1<<LCD_RS);		//RS Bit setzen
        }
    
        LCD_busy();

// Erst der High-Teil

        Byte=(Info & 0xf0);
		LCD_PORT |= (Byte>>4);						// Die Information werden auf die Leitung gelegt
        LCD_enable();           				// Enable Strobbe wird ausgeführt

// Dann der Low-Teil

        Byte=(Info & 0x0f); 
        LCD_PORT |= Byte;        
        LCD_enable();           
}


/**********************************************************************************************/
//	Kleine Pause um sicher zu stellen, dass das Display fertig ist
/**********************************************************************************************/

void LCD_busy(void)
{
	_delay_ms(20);
}

/**********************************************************************************************/
//	Das Enable-Strobbe
/**********************************************************************************************/

void LCD_enable(void)
{
	LCD_busy();
	LCD_PORT |= (1<<LCD_EN);
	LCD_busy();
	LCD_PORT &= ~(1<<LCD_EN);
	LCD_busy();	
}