Und noch ein Hinweis.
An dieser Stelle kann man die Schiebe-Operation als eine Art
Multiplikation auffassen. Tatsächlich ist links schieben um 1 Stelle
identisch zu einer Multiplikation mit 2 (um 2 Stellen schieben wäre 'mal
4', um 3 Stellen wäre 'mal 8' etc.)
PD5, PB3 und wie sie alle heißen sind einfach nur Zahlenkonstanten. PD5
ist nur eine andere Schreibweise für 5. Mehr steckt da nicht dahinter.
Man möchte einfach mit einem Namen etwas besser ausdrücken, dass man vom
Pin 5 redet und die 5 in
1 << 5
nicht einfach irgendwo aus der dünnen Luft gekommen ist, sondern mit
einem Port-Pin zu tun hat.
Wenn du als schreibst
0 << PD5
dann kann man das auch als
0 mal (2 hoch 5)
auffassen. Also eine Multiplikation. Und mit 0 kann man multiplizieren
was man will, das Ergebnis ist immer .....
In a nutshell.
Auch wenn es naheliegend erscheint, dass wenn man mittels
DDRD = 1<<PD5;
das Bit 5 auf 1 setzt (und alle anderen auf 0), dass man dann auch
mittels
DDRC = 0<<PC3
das Bit 3 auf 0 setzt. In einem gewissen Sinne stimmt das schon, auch
wenn es nicht beabsichtigt ist (und bei der PIN Abfrage fällt es dir
dann auf den Kopf). Hier setzt du DDRC auf 0. Aber nicht deswegen, weil
du 0<<PC3 geschrieben hast, sondern weil man mit einer Zuweisung einer
glatten 0 alle Bits im Register auf jeden Fall auf 0 gesetzt hat. Was du
hier geschrieben hast, ist nichts anderes als ein komplizierter Weg für
DDRC = 0;
nicht mehr und nicht weniger. Denn 0 mal irgendeine andere Zahl ergibt
wieder 0. Egal was diese andere Zahl ist.
Bitmanipulation
AVR-GCC-Tutorial