Hallo inka,

key |= (PIND&LCD_KEY_RED); //PINB in PIND
das stimmt natürlich.

DDRD &= ~((0<<PD2)|(0<<PD6));
DDRB &= ~(0<<PB3);
Das stimmt so leider nicht. Zum löschen von Bits wird eine 1 an die entsprechende Stelle geschoben. Dann wird das ganze bitweise negiert und mit dem aktuellen Wert UND-verknüft.

Assonsten funtkioniert das Programm bei mir ganz gut (Wenn man die Wartezeit auf 100ms verkürzt).