    // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
    // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
    //

    #ifndef LCD_ROUTINES_H
    #define LCD_ROUTINES_H

    ////////////////////////////////////////////////////////////////////////////////
    // Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!

    #ifndef F_CPU
    #define F_CPU 3686400
    #endif

    ////////////////////////////////////////////////////////////////////////////////
    // Pinbelegung für das LCD, an verwendete Pins anpassen
    // Alle LCD Pins müssen an einem Port angeschlossen sein und die 4
    // Datenleitungen müssen auf aufeinanderfolgenden Pins liegen

    //  LCD DB4-DB7 <->  PORTD Bit PD0-PD3
    #define LCD_PORT      PORTD
    #define LCD_DDR       DDRD
    #define LCD_DB        PD0

    //  LCD RS      <->  PORTD Bit PD4     (RS: 0=Data, 1=Command)
    #define LCD_RS        PD4

    //  LCD EN      <->  PORTD Bit PD5     (EN: 1-Impuls für Daten)
    #define LCD_EN        PD5

    ////////////////////////////////////////////////////////////////////////////////
    // LCD Ausführungszeiten (MS=Millisekunden, US=Mikrosekunden)

    #define LCD_BOOTUP_MS           15
    #define LCD_ENABLE_US           1
    #define LCD_WRITEDATA_US        46
    #define LCD_COMMAND_US          42

    #define LCD_SOFT_RESET_MS1      5
    #define LCD_SOFT_RESET_MS2      1
    #define LCD_SOFT_RESET_MS3      1
    #define LCD_SET_4BITMODE_MS     5

    #define LCD_CLEAR_DISPLAY_MS    2
    #define LCD_CURSOR_HOME_MS      2

    ////////////////////////////////////////////////////////////////////////////////
    // Zeilendefinitionen des verwendeten LCD
    // Die Einträge hier sollten für ein LCD mit einer Zeilenlänge von 16 Zeichen passen
    // Bei anderen Zeilenlängen müssen diese Einträge angepasst werden

   #define LCD_DDADR_LINE1         0b00000000		//0x00 = 0			=	00000000
   #define LCD_DDADR_LINE2         0b01000000		//0x40 = 4x16=64	=	01000000
   #define LCD_DDADR_LINE3         0b00010000		//0x10 = 1x16=16	=	00010000
   #define LCD_DDADR_LINE4         0b01010000		//0x50 = 5x16=80	=	01010000


    ////////////////////////////////////////////////////////////////////////////////
    // Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
    void lcd_init( void );

    ////////////////////////////////////////////////////////////////////////////////
    // LCD löschen
    void lcd_clear( void );

    ////////////////////////////////////////////////////////////////////////////////
    // Cursor in die 1. Zeile, 0-te Spalte
    void lcd_home( void );

    ////////////////////////////////////////////////////////////////////////////////
    // Cursor an eine beliebige Position
    void lcd_setcursor( uint8_t spalte, uint8_t zeile );

    ////////////////////////////////////////////////////////////////////////////////
    // Ausgabe eines einzelnen Zeichens an der aktuellen Cursorposition
    void lcd_data( uint8_t data );

    ////////////////////////////////////////////////////////////////////////////////
    // Ausgabe eines Strings an der aktuellen Cursorposition
    void lcd_string( const char *data );

    ////////////////////////////////////////////////////////////////////////////////
    // Definition eines benutzerdefinierten Sonderzeichens.
    // data muss auf ein Array[5] mit den Spaltencodes des zu definierenden Zeichens
    // zeigen
    void lcd_generatechar( uint8_t code, const uint8_t *data );

    ////////////////////////////////////////////////////////////////////////////////
    // Ausgabe eines Kommandos an das LCD.
    void lcd_command( uint8_t data );

    ////////////////////////////////////////////////////////////////////////////////
    // LCD Befehle und Argumente.
    // Zur Verwendung in lcd_command

    // Clear Display ----- 0b00000001
    #define LCD_CLEAR_DISPLAY      	0b00000001		//0x01 = 1		=	00000001	

    // Cursor Home ----- 0b0000001x
    #define LCD_CURSOR_HOME         0b00000010		//0x02 = 2		=	00000010

    // Set Entry Mode ----- 0b000001xx
    #define LCD_SET_ENTRY           0b00000100		//0x04 = 4		=	00000100

    #define LCD_ENTRY_DECREASE      0b00000000		//0x00
    #define LCD_ENTRY_INCREASE      0b00000010		//0x02
    #define LCD_ENTRY_NOSHIFT       0b00000000		//0x00
    #define LCD_ENTRY_SHIFT         0b00000001		//0x01

    // Set Display ------ 0b00001xxx
    #define LCD_SET_DISPLAY         0b00001000		//0x08

    #define LCD_DISPLAY_OFF         0b00000000		//0x00
    #define LCD_DISPLAY_ON          0b00000100		//0x04
    #define LCD_CURSOR_OFF          0b00000000		//0x00
    #define LCD_CURSOR_ON           0b00000010		//0x02
    #define LCD_BLINKING_OFF        0b00000000		//0x00
    #define LCD_BLINKING_ON         0b00000001		//0x01

    // Set Shift ----- 0b0001xxxx
    #define LCD_SET_SHIFT           0b00010000		//0x10 = 16		=	00010000

    #define LCD_CURSOR_MOVE         0b00000000		//0x00
    #define LCD_DISPLAY_SHIFT       0b00001000		//0x08
    #define LCD_SHIFT_LEFT          0b00000000		//0x00
    #define LCD_SHIFT_RIGHT         0b00000001		//0x01

    // Set Function ----- 0b001xxxxx
    #define LCD_SET_FUNCTION        0b00100000		//0x20 = 2x16=32	=	00100000

    #define LCD_FUNCTION_4BIT       0b00000000		//0x00
    #define LCD_FUNCTION_8BIT       0b00010000		//0x10
    #define LCD_FUNCTION_1LINE      0b00000000		//0x00
    #define LCD_FUNCTION_2LINE      0b00001000		//0x08
    #define LCD_FUNCTION_5X7        0b00000000		//0x00
    #define LCD_FUNCTION_5X10       0b00000100		//0x04

    #define LCD_SOFT_RESET          0b00110000		//0x30 = 3x16=48	=	00110000

    // Set CG RAM Address --- 0b01xxxxxx  (Character Generator RAM)
    #define LCD_SET_CGADR           0b01000000		//0x40 = 4x16=64	=	01000000

    #define LCD_GC_CHAR0            0
    #define LCD_GC_CHAR1            1
    #define LCD_GC_CHAR2            2
    #define LCD_GC_CHAR3            3
    #define LCD_GC_CHAR4            4
    #define LCD_GC_CHAR5            5
    #define LCD_GC_CHAR6            6
    #define LCD_GC_CHAR7            7

    // Set DD RAM Address --- 0b1xxxxxxx  (Display Data RAM)
    #define LCD_SET_DDADR           0b10000000		//0x80 = 8x16=128	=	10000000

    #endif
