allgemeine erklärungen zu abkürzungen:
VCC = BEtriebsspannung = plus 5V = Pluspol der batterie = logisch 1 = HIGH
GND = Masse = 0V = Minuspol der batterie = logisch 0 = LOW

also die ganzen abkürzungen (DDRxPORTx,PINx usw) sind die namen der register, in die man schreiben will.

DDRx ist das richtungsreigister. wenn hier eine 1 an z.B. die 2te stelle geschrieben wird, ist der 2. Pin vom Port x (zu ersetzen durch A,B,C oder D) ein ausgang. man kann dann mithilfe von PORTx entweder VCC oder GND, also 5V oder 0V, an diesem pin ausgeben. damit leuchtet zB eine LED wenn 5V angegeben sind, und eben nicht, wenn 0V angegeben sind.

wird in DDRD eine null geschrieben, dann ist der entsprechende pin ein Eingang. man kann also mithilfe des registers PINx herausfinden, ob von aussen strom an den pin geleitet wird, oder ob der pin von aussen mit der masse verbunden wurde.
Wenn jedoch der pin WEDER mit etwa 5v, NOCH mit der masse verbunden ist, ist er in einem sogenannten undefinierten zusatnd. dieser fall sollte eigentlich nach möglichkeit vermieden werden, da es dann absoluter zufall ist, ob der prozessor nun denkt ob 5V oder Masse(GND, 0V) anliegen.

nun stell dir mal vor, du würdest den taster einfach so an den pin anschliessen, und den anderen pol des tasters an die Masse (!). solange der taster nicht gedrückt ist, wäre der pin in einem undefinierten zustand (er ist ja weder mit masse noch mit VCC verbunden). man könnte alo nicht rausfinden, ob er gedrückt ist oder nicht - das ergebnis wäre zufällig, wenn er nicht gedrückt wäre, und null, wenn man ihn drückt. das hilft im allgemeinen nicht besonders bei der programmentwicklung, da man sich auf das ergebnis nicht verlassen kann.
jetzt stell dir mal die folgende konstruktion vor:

Masse --- Taster --- Prozessorport --- Widerstand --- VCC

wobei eben sowohl eine seite des tasters als auch der widerstand mit dem prozessor verbunden sind.

ist der taster nicht gedrückt, wird strom über den widerstand an den prozessorport gegeben. der prozessor meldet also bei einer entsprechenden abfrage ganz sicher eine 1 - schliesslich liegt ja strom an.
wird der taster gedrückt, fliesst der ganze strom richtung masse ab, der prozessor meldet also eine null für taster wurde gedrückt, da kaum strom bei ihm ankommt.

(einen solchen widerstand nennt man pullup-widerstand, da er den prozessorpin bei nicht gedrücktem schalter auf VCC "zieht".
im gegensatz dazu gibt es übrigens auch pulldown-widerstände, diese sind mit masse verbunden und ziehen den pin immer auf GND. der atmega8 hat jedoch solche nicht, und deshalb ist das nur eine nebenbei-info die nix mit dem eigentlichen thema zu tun hat. =) )

damit man jedoch nicht für jeden taster, oder ähnliches, den man verwenden will, einen eigenen widerstand auf die platine löten muss, hat der atmega eingebaute pullup-widerstände. diese lassen sich aktivieren oder deaktivieren.

wenn das richtungsregister DDRx (heisst übrigens "Data Direction Register") auf Eingang geschaltet ist, kann man mithilfe des dateneingangsregisters PINx ja den wert null oder eins auslesen, wie oben beschrieben. der datenausgangsregister PORTx wird also nicht benötigt, da er ja nur dafür da ist den spannungspegel zu definieren, der am entsprechenden pin ausgegeben werden soll - und der pin ist ja jetzt ein eingang. also wird der (oder das) register "missbraucht": schreibt man eine eins an die entsprechende stelle, werden intern pullup-widerstände aktiviert - man liest also mit PINx immer eine eins, bis der pin manuell, zum beispiel mithilfe eines tasters, auf GND gezogen wurde. dadurch wird also vermieden, dass der pin in einem undefinierten zustand ist.