Tasten wir uns mal ran. Ich hab immer noch nicht verstanden, was im Datail unbefriedigend ist und hab einfach mal was gemacht. Kennst das, was von Planung über Entwicklung, Fabrikation, Lieferung und Montage am Ende übrig bleibt
?
Nicht getestet aber sollte so sein:
Auswahl Szenario wie gehabt.
Am Ende der Auswahl bei Taster loslassen werden die Relais(Leds) nicht abgeschaltet, aktuelles Szenario bleibt an.
Mit folgendem kurzem Tastendruck wird dann abgeschaltet.
Mit weiterem kurzen Tastendruck wird vorhergehendes Szenario wieder eingeschaltet.
Hab noch ein Case für den kuzen Tastendruck eingefügt und das Abschalten der LedX am Ende rausgenommen. - Dieses Case wieder entfallen nach Update. Kurzer Tastendruck wird am Ende abgefragt.
PS. Ohhh schon Fehler entdeckt - Update kommt später
Update gemacht 
Code:
'###################################
'### Bascom Demoversion V2.0.7.5 ###
'###################################
$regfile = "m168def.dat"
$framesize = 32
$swstack = 32
$hwstack = 34
$crystal = 16000000
Dim Hundertstelsekunden As Word 'enthält Tastendrucklänge in Hundertstel Sekunden
Dim Ledspeicher As Byte 'Speichert Zustand der LEDs in einzelnen Bits
Const Led_1 = 0 'Zum Adressieren der Bits in Ledspeicher
Const Led_2 = 1 'Zum Adressieren der Bits in Ledspeicher
Const Led_3 = 2 'Zum Adressieren der Bits in Ledspeicher
Portd.4 = 1 'Pullup an PD4 einschalten
Taster Alias Pind.4 'Taster an PD4
Led1 Alias Portc.0 'Anschluß für LED1 ?
Led2 Alias Portc.1 'Anschluß für LED2 ?
Led3 Alias Portb.3 'Anschluß für LED3 ?
Config Led1 = Output
Config Led2 = Output
Config Led3 = Output
Do 'Hauptschleife
Debounce Taster , 0 , Taste_gedrueckt , Sub 'Wenn Tasteranschluß auf 0 (low) -> Subroutine Taste_gedrueckt
'Debounce hat bei Aktivität auf dem PIN ca. 25ms Verzögerung
Loop 'Ende Hauptschleife
Taste_gedrueckt: 'Unterprogram wird angesprungen, wenn Taste gedrückt wurde
Hundertstelsekunden = 0 'initialisieren für Zeitmessung
While Taster = 0 'Solange Taster gedrückt ist...
Waitms 10 '0,01s Zeitmeßschritte
Incr Hundertstelsekunden 'alle 10ms erhöhen
Select Case Hundertstelsekunden 'Hundertstelsekunden enthält Länge des Tastendruckes in Hundertstelsekunden
Case 20 To 69 : Ledspeicher = Bits(led_1) 'Taste zwischen 200ms und <700ms gedrückt
Case 70 To 119 : Ledspeicher = Bits(led_2) 'Taste zwischen 700ms und <1200ms gedrückt
Case 120 To 169 : Ledspeicher = Bits(led_3)
Case 170 To 219 : Ledspeicher = Bits(led_1 , Led_2)
Case 220 To 269 : Ledspeicher = Bits(led_1 , Led_3)
Case 270 To 319 : Ledspeicher = Bits(led_2 , Led_3)
Case 320 To 369 : Ledspeicher = Bits(led_1 , Led_2 , Led_3)
Case 370 : Hundertstelsekunden = 19 'Taste 3,7s und länger gedrückt-> Auswahl Lichtszenario beginnt neu
End Select
if Hundertstelsekunden >= 20 then 'wenn Selektion, dann Leds entsprechend einschalten
Led1 = Ledspeicher.Led_1
Led2 = Ledspeicher.Led_2
Led3 = Ledspeicher.Led_3
end if
Wend
if Hundertstelsekunden < 20 then 'wenn Taste nur kurz gedrückt wurde ...
If Led1 = 1 or Led2 = 1 or Led3 = 1 then 'und irgendeine Led eingeschaltet ist
Led1 = 0 'dann alle ausschalten
Led2 = 0
Led3 = 0
else 'oder gespeichertes Szenario einschalten.
Led1 = Ledspeicher.Led_1
Led2 = Ledspeicher.Led_2
Led3 = Ledspeicher.Led_3
end if
end if
Return 'zurück zur Hauptschleife
End 'end program
Lesezeichen