Warteschleifen sind ebenfalls nicht einsteigerfreundlich. Sie sind in den allermeisten Fällen weder für Einsteiger noch für Profis geeignet. Die Möglichkeit von Warteschleifen in einer Programmiersprache führt dazu, dass Einsteiger diese pauschal für alle zeitabhängigen Aufgaben einsetzen wollen. Das ist schlechter Programmierstil und führt oft in Sackgassen.

Warteschleifen haben den Nachteil, dass man immer nur eine Sache gleichzeitig machen kann, und das reicht eigentlich nie aus (schon bei einer simplen Sache wie deinem Lauflicht). Die einzige Berechtigung für Warteschleifen sind ganz kurze Verzögerungen von einigen Mikro-bis Milisekunden, wie man sie zb für LCDs braucht. In der delay.h der avr-libc sind ja auch nur wenige Milisekunden Wartezeit möglich. Das hat natürlich vor allem technische Gründe, wird aber auch ein Stück weit so gewollt sein. Alles, was über ein paar Milisekunden hinausgeht, sollte besser per Timer gemacht werden.

In meinen Programmen lasse ich immer einen Timer mit einen Zyklus von einigen Milisekunden laufen. In dessen ISR stehen dann alle Aufgaben, die regelmäßig erledigt werden müssen. Also LEDs ansteuern (Blinkfunktion), Taster abfragen,...