Hallo Bow-Hunter,
ich habe mal versucht bisherige Vorschläge in einem ungetesteten Entwurf für direkte Reaktion auf Tastendruck und Vermeidung von WAITs unterzubringen. Das Debounce Kommando fragt die Taste ab und entprellt auch gleich.

Gruß
Searcher

Code:
'### hwstack vergrößern. Wichtig bei Verwendung von Interrupts

$hwstack = 34                                            


'### Alle Variablen können als Byte deklariert werden (spart Speicher im kleinen Tiny13)

'### Der Timer0 wird für die Blink- bzw. Schaltfrequenz konfiguriert

Compare0a = 116                                             '99,84ms Interruptperiode bei 1,2MHz µC-Takt
Config Timer0 = Timer , Prescale = 1024 , Clear_timer = 1   'Timer0 im Clear Timer on Comparematch

On Compare0a Isr_blink                                      'ISR wird bei Compare Match A aufgerufen

'### In der Haupschleife steht nur die Tastenabfrage inclusive Tastenentprellung

Do                                                          'Beginn Hauptschleife
  Debounce Pinb.0 , 1 , Changemodus , Sub                   'Führt Unterprogramm aus, wenn Pinb.0 auf 1 wechselt
Loop                                                        'Ende Hauptschleife



'### Nach Tastendruck wird dieses Unterprogramm ausgeführt, daß den Lichteffekt weiterschaltet und
'### die nötigen Parameter für die Interruptserviceroutine setzt.

Changemodus:                                                'Unterprogramm setzt Werte für Lichteffekt nach Tastendruck
  Disable Compare0a                                         'Vermeidet Inkonsistenzen in der ISR
  If Modus < Anzahlmodi Then Incr Modus Else Modus = 1
  Select Case Modus
    Case 1 : Anzahlphasen = 0                               'Muß Anzahl der Daten in den DATA-Zeilen entsprechen
    Case 2 : Anzahlphasen = 5                               'Wert von 0 = ein Eintrag, 5 = sechs Einträge bei DATA
    Case 3 : Anzahlphasen = 1                               '.
  End Select
  Phase = 0
  Enable Compare0a
Return


'### In der Interruptserviceroutine wird alle 100ms das neue Schaltmuster für die LEDs gelesen und
'### die LEDs geschaltet.

Isr_blink:                                                  'wird alle ca. 100ms aufgerufen und schaltet die LEDs
  If Phase < Anzahlphasen Then Incr Phase Else Phase = 0    'setzt die nächste Effektphase
  Select Case Modus                                         'entsprechend dem Modus wird das Bitmuster für LEDs geholt
    Case 1 : Pattern = Lookup(phase , Lichteffekt1)
    Case 2 : Pattern = Lookup(phase , Lichteffekt2)
    Case 3 : Pattern = Lookup(phase , Lichteffekt3)
  End Select
  Portb.1 = Pattern.3                                       'LED wird geschaltet
  Portb.2 = Pattern.2                                       'LED wird geschaltet
  Portb.3 = Pattern.1                                       'LED wird geschaltet
  Portb.4 = Pattern.0                                       'LED wird geschaltet
Return
End                                                         'end program


'### Hier sind die Schaltmuster abgelegt.

Lichteffekt1:
Data &B0000

Lichteffekt2:
Data &B1010 , &B1001 , &B1010 , &B0101 , &B0110 , &B0101

Lichteffekt3:
Data &B1111 , &B0000