Also in DDRD legst du fest, ob es sich bei dem Port um einen Ausgang (0xFF) oder einen Eingang (0x00) handelt.
Wenn der Port als Ausgang deklariert ist, kann man über PORTD die Ausgänge schalten, z.B. mit 0xFF alle auf High.
Wenn PortD ein Eingang ist, kann man die anliegenden Pegel über PIND auslesen. Bei Eingängen ist es dabei wichtig die internen Pullup-Widerstände zu aktivieren. Dies geschieht indem man dann PortD auf High setzt.

Hier einmal ein kleiner Codeausschnitt:
Code:
ldi temp1, 0x00
out DDRC, temp1        ;PortC als Eingang

ldi temp1, 0xFF 
out DDRD, temp1        ;PortD als Ausgang
out DDRB, temp1        ;PortB als Ausgang
out PORTC, temp1      ;Pullups von PortC aktivieren.

;--------------------

out PortB, r16            ;gibt an PortB das Byte r16

in r16, PinC               ;schreibt in r16 das Byte, das anliegt !

;--------------------

Beispiel für deine Anwendung:

ldi r16, 0X00
out DDRD, r16           ;PortD als Eingang

ldi r16, 0xFF
out PortD, r16           ;Pullups
out DDRB, r16           ;PortB als Ausgang

main:
           sbis PinD, 2    Liegt an D.2 high an ?
           sbi  PortB, 2   dann setze B.2
rjmp main: