Mit den verschachtelten If {} else {} Strukturen wird das nichts.
Wenn ich dein Programm richtig verstehe soll die Routine den Code der
gedrückten Taste zurückgeben. Wenn in der Schleife nun bei PD0..3 =0111
an PD4..7 ein Wert <> 1111 anliegt (zB. 1101) ist eine Taste gedrückt
und Du gibst dann in Taste einfach den Wert 01111101 (aktueller Wert von
PortD) zurück.
Über eine Tabelle kannst du dann diesem Wert einer bestimmten Taste
zuordnen.
Etwas schwieriger wird es, wenn mehrere Tasten gleichzeitig gedrückt
werden (können) müssen.
Noch mal zu PORTD=PORTD<<1 entweder wird immer nur eine 0 nachgeschoben
oder PORTD wird komplett rotiert ich kenn mich nicht so 100%-ig in C
aus, da ich in Assembler programmiere.
Wenn generell eine 0 nachgeschoben wird, dann funktioniert das nicht, da
ja immer nur eine Zeile 0 sein soll. So wird aus Bit0..3 1110, 1100,
1000, 0000.
MfG
Steffe