Grundsätzlich ist dein Programm falsch aufgebaut. Du schreibst alles in die Headerdatei. Normalerweise hat man aber 2 Dateien, einer h-und einer c-Datei (abgesehen von der C-Datei mit der main). In die Headerdatei schreibt man die defines,... und in die c-Datei die einzelnen Funktionen.

Was mir aufgefallen das du immer nur 2ms als Pausen hast. Hier findest du mehr http://www.mikrocontroller.net/artic...-Tutorial:_LCD
Etwas genaueres zum Thema Init findest du hier: http://www.mikrocontroller.net/artic...g_des_Displays

Das ist meine Init-Routine
Code:
void LCD_Init(void)
{
    DDRC |= 0x0F;                    //PC0 - PC3 als Ausgang
    DDRB |= (1<<PB6) | (1<<PB7);    //RS und EN als Ausgang

    _delay_ms(15);
    LCD_Ctrl (0x28);

    _delay_ms(5);
    LCD_Ctrl (0x28);

    _delay_ms(1);
    LCD_Ctrl (0x28);

/*    0b00001DCB
        0        1
D:         Display
       aus     ein
C:         Cursor
       aus     ein
B:         Blinken
       aus     ein
0x0F: Display ein, Cursor sichtbar, Blinken ein
0x0E: Display ein, Cursor sichtbar, Blinken aus
0x0C: Display ein, Cursor unsichtbar, Blinken aus

*/
    _delay_ms(1);
    LCD_Ctrl (0x0C);

    _delay_ms(1);
    LCD_Ctrl (0x01);

    _delay_ms(1);
    LCD_Ctrl (0x02);

    _delay_ms(5);

}
Ich hoffe das ich dir helfen konnte.

MfG Hannes