Du nimmst einen Timer und lässt ihn periodisch Interrupts auslösen (zb alle 10ms).
Dann fragst du in der ISR den Taster ab (da kannst du gleich die Entprellung einbauen) und taktest gleichzeitig das Lauflicht. Also je nach gewünschter Geschwindigkeit alle x ISRs das Lauflicht einen Stand weiterschalten (Tabelle usw.).
Wenn jetzt der Taster gedrückt wird, wird eine globale Variable gesetzt, die der Lauflichtfunktion mittelt, was nun zu tun ist. Also zb "stop", "weiter", andersrum", "schneller" etc.
[mit einfachen Warteschleifen ist hier jedenfallls nichts mehr zu machen!]