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:

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
Der Quelltext sollte selbsterklärend sein. Vielleicht sucht ja jemand nach genau dieser Funktion und kann meine Routine verwenden.