Hallo,

Zur Initialisierung ...
Code:
 lcd_init:
           rcall delay5ms
           ldi r16, 0b00110000        ;muss 3mal hintereinander gesendet
           out Portd, r16                 ;werden zur Initialisierung
           rcall lcd_enable             ;1
           rcall delay5ms
           rcall lcd_enable             ;2
           rcall delay5ms
           rcall lcd_enable             ;3
           rcall delay5ms
           ldi r16, 0b00100000        ;4bit-Modus einstellen
           out Portd, r16
           rcall lcd_enable
           rcall delay5ms
           ldi r16, 0b00101000        ;2 Zeilen einstellen...
           rcall lcd_command
           ldi r16, 0b00001100        ;Display an , Cursor u. Blinken aus
           rcall lcd_command
           ldi r16, 0b00000100        ;Increment ohne Display shift
           rcall lcd_command
ret
Lcd_enable mit 5 Nop's bei 4 Mhz ist OK.

Bei Lcd_data und Lcd Command, hast du einen Fehler drin.
Andi r16,0b00001111 setzt die oberen 4 Bits auf 0, nicht die unteren.

Die Warteschleifen kannst du entweder selbst ausrechnen oder mal nach
AVRdelayloop googeln. Das Programm erstellt aus der Quarzfrequenz und der Wartezeit den ASM Code.

Für 50µs bei 4 Mhz, mußt du 200 Takte warten. (1/4000000 = 0,25µs)

ldi r16,66
loop: dec r16
brne loop ; der Controller braucht 3 Takte pro Schleifendurchlauf