In C hat der Operator ! laut Doku eine höhere Priorität als &&.
In Python hat dein Konstrukt funktioniert.
Probier's mal mit:
while ( (!(PINC & (1 << PC0))) && (i < 2) ){
Gruß klatschnass
Edit: Ok, das war Quatsch.
Der while-Ausdruck funktioniert so, wie er ist.
Das Problem liegt wohl eher daran, dass die Taste in der delay-Pause
gedrückt und wieder losgelassen wird. Das bekommt die Schleife dann
natürlich nicht mit. Deswegen hattest du auch den Eindruck, dass du die
Taste langsam loslassen musst, damit es funktioniert. Da musst du wohl
statt der Pause mit Interrupts arbeiten.