Code:
int lEffect = 0;
int lKeyReset = 0;
DDRB = _BV(DDB1); // PB1 als Ausgang, alles andere ist automatisch Eingang
while (1)
{
launch_effect(lEffect);
// Button?
if ( PINB & _BV(PB3) )
{
// Entprellung?
if ( !lKeyReset )
{
// Effekt erhöhen
lEffect = (lEffect+1) % 16;
// LED an
PORTB |= _BV(PB1);
// 16 Zyklen lang keine Tasten akzeptieren
lKeyReset = 16;
}
}
if ( lKeyReset )
lKeyReset--;
else
PORTB &= ~_BV(PB1);
}
Da du mit jedem Durchlauf die Taste abfragst und der MC nicht gerade langsam ist, dreht der Kilometer mit der Effektvariable bis du die Taste nach einer (für ihn) Ewigkeit wieder loslässt. Der Code macht das wie du es beschrieben hast, aber akzeptiert x Durchläufe (lKeyReset, derzeit 16) keinen erneuten Tastendruck. Dieser Wert wird gleichzeitig dafür genutzt die LED leuchten zu lassen, sonst sieht man nichts, weil der MC zu schnell ist. Wenn nach Ablauf dieser 16 Zyklen die Taste immernoch gedrück ist, dann erhöht erneut um 1 (bis max. 15, danach auf 0).