PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tastenerkennung



enats
08.07.2009, 15:10
Hey Leute hoffe ihr könnt mir helfen,
Möchte gerne eine Taste in der Hauptschleife erkennen und beim drücken in ein Untermenü springen. Mit dem Debounce Befehl bis dahin eigentlich kein Problem. Jetzt sollte aber ein Unterschied darin liegen, wie lange ich die Taste drücke:
Kurzer Druck -> Nichts passiert (später vielleicht Led odes so schalten).
Langer Druck -> Untermenü geht auf.

Habe schon so vieles versucht.
Wollte Timer1 ca. mit 2 Sekunden zum Überlauf voreinstellen. Falls es zum Überlauf kommt sollte ein Untermenü aufgehen, bis ich dieses wieder mit dem gleichen Taster quitiere und zur Hauptschleife zurück kehre. Falls es nicht zum Überlauf kommt (Taster also nicht 2 Sekunden gedrückt wurde) sollte dieses Untermenü nicht aufgehen, der Timer gestopt und wieder auf den "2 Sekunden Wert" zurück gestellte, eine Led getoggelt und in die Hauptschleife zurück gesprungen werden.

Ich hoffe Ihr könnt mir helfen, bitte bitte bitte:-)

Hier meine Bascom Datei



'************************************************* *********************************************
'************************************************* *********************************************
'************************ Variablen Festlegen ********************************************

Dim A As Byte

'************************************************* *********************************************
'************************************************* *********************************************
'************************ Hauptprogramm **********************************************

Stop Timer1
Sound Portd.4 , 800 , 150

Call Lcd_rs232 ' Rufe Unterprogramm "Lcd_RS232" auf


Do

If A = 1 Then Gosub Lcd_uhrzeit
'Wenn A =1 , also Taster länger als 2 Sekunden gedrückt, wechsele in Sub LCD_UHRZEIT

Debounce Pinc.1 , 0 , Ledein , Sub




Loop
End


'************************************************* *********************************************
'************************************************* *********************************************
'************************ Unterprogramme *********************************************

Sub Lcd_rs232: ' Sub Standardbildschirm

Cls
Locate 1 , 4
Lcd "RS232 Test"
End Sub

'------------------------------
Sub Lcd_uhrzeit:
Sound Portd.4 , 900 , 250
Cls
Locate 1 , 5
Lcd "Uhrzeit"
A = 0
'Variable A wieder auf 0 setzen
Do
Debounce Pinc.1 , 0 , Lcd_rs232
' Taster 1 nochmal drücken um wieder ins Hauptmenü zu wechseln
Loop
End Sub

'------------------------------

Sub Ledein:
Timer1 = 36736
'ca. 2 Sekunden bis zum Überlauf
Start Timer1
If Pinc.1 = 1 Then
Stop Timer1
'Wenn Taster wieder losgelassen wird stoppe den Timer1, ANNSONSTEN KOMMT ES ZUM ÜBERLAUF T1
Timer1 = 36736
' Timer wieder zurücksetzen auf ca. 2 Sekunden, falls es nicht zum Überlauf kam
Toggle Portd.7
' Falls kein Überlauf Toggle LED
End If
End Sub

'************************************************* *********************************************
'************************************************* *********************************************
'************************ Interrupts *********************************************

T1:
Stop Timer1
Incr A
Call Lcd_uhrzeit
Return

CPU_Heizer
08.07.2009, 16:47
Wenn du nichts zeitkritisches in der Hauptschleife machst, könntest du es auch einfach mit Waitms-Befehlen machen:


Do
'Wurde die Taste herruntergedrückt?
If PINC.1 = 1 Then

Waitms 500

'Ist die Taste nach 0.5 sek immernoch gedrückt?
If PINC.1 = 1 Then
'Wenn ja -> LangSub
LangSub

'Warten, bis Taste nicht mehr gedrückt ist
Do
Loop Until Not PINC.1
Waitms 50 'Entprellen
Else
'Wenn nein -> KurzSub
KurzSub
End If
End If
Loop

Nachdem die Taste herruntergedrückt wurde, wartet der Code 500 ms und prüft dann, ob die Taste immernoch gedrückt wird. Wenn ja wird LangSub ausgeführt und gewartet bis die Taste losgelassen wurde. Wenn ansonsten wird der Kurzsub ausgeführt.