Hallo!
Nach langer Recherche im Internet fand ich keine fertige Lösung, den Highlevel-Befehl Debounce mit gleichzeitiger Erkennung von langen und kurzen Tastendrücken zu kombinieren. Also stellte ich kurzerhand selbst Versuche in diese Richtung an. Das ist das Ergebnis:
Der Quelltext sollte selbsterklärend sein. Vielleicht sucht ja jemand nach genau dieser Funktion und kann meine Routine verwenden.Code:'######### '## EDT ## '######### '--------- 'Debouncetimer 'V1.0.0 '22.09.2012 'BASCOM 2.0.7.5 '--------- '- '--------- 'Tasterentprellung mit Debounce-Befehl und Zeitauswertung 'Bei Erkennung eines Tastendruckes wird 5ms gewartet, bleibt der Taster gedrückt 'wird D0_active angesprungen. Dort wird ein Flag gesetzt und wieder zur Hauptschleife 'zurückgekehrt. Der Timer0 erzeugt ca. alle 10ms einen Interrupt; wenn das Flag 'gesetzt ist wird die Variable Count hochgezählt. Wird der Taster losgelassen 'und Count hat den Wert 51 noch nicht erreicht, wird ein kurzer Tastendruck gezählt. 'Erreicht Count den Wert 51 wird ein langer Tastendruck gezählt. 'Kurzer Tastendruck: <500ms 'Langer Tastendruck: 510ms '--------- $regfile = "m32def.dat" $crystal = 1000000 $hwstack = 32 $swstack = 8 $framesize = 32 'KONFIGURATION PORTS Config Pind.0 = Input Portd.0 = 1 'KONFIGURATION TIMER0 (10ms) Config Timer0 = Timer , Prescale = 64 On Timer0 Isr_timer0 Timer0 = 100 Enable Timer0 Start Timer0 'KONFIGURATION DEBOUNCE Config Debounce = 5 '5ms Auswertedauer des Tasters 'VARIABLEN Dim Flag As Bit Dim Count As Byte Dim Pressed_short As Byte 'Zähler für kurze Tastendrücke Dim Pressed_long As Byte 'Zähler für lange Tastendrücke Enable Interrupts '### HAUPTSCHLEIFE ### Do Debounce Pind.0 , 0 , D0_active , Sub If Flag = 1 Then If Pind.0 = 1 And Count < 50 Then 'Auswertung des kurzen Tastendrucks Pressed_short = Pressed_short + 1 'Zählen des kurzen Tastendrucks Flag = 0 Count = 0 End If If Count > 50 Then 'Auswertung des langen Tastendrucks Pressed_long = Pressed_long + 1 'Zählen des langen Tastendrucks Flag = 0 Count = 0 End If End If Loop '### ISR ### Isr_timer0: Timer0 = 100 If Flag = 1 Then Count = Count + 1 Return '### SUB ### D0_active: Set Flag Return End







 
			
			 
			 
					
					
					
						 Zitieren
Zitieren 
			

Lesezeichen