Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Anfängerproblem Tastenauswertung
Thomas U.
08.06.2004, 06:38
Hallo,
ich will eine Byte-Variable per Tastendruck um jeweils 1 erhöhen. Also muss ich, um den Wert um 100 zu erhöhen 100 mal den Taster drücken – das will ich aber nicht.
Nun möchte ich zusätzlich, dass, wenn der Taster länger als z.B. 3 sec gedrückt bleibt, sich die Variable in z.B. 10er-Schritten erhöht. Mein Problem liegt in der Auswertung des 3 sec – Tastendruck.
Da ich den einfachen Tastendruck mit Debounce auswerte, werde ich die 3 sec-Auswertung
wohl innerhalb der Debounce-Sub machen müssen. Nur wie mache ich die Anweisung, daß Port.x für min. 3 sec auf low sein soll, um in 10er Schritten zu erhöhen.
Gruss, Thomas
Hi
$regfile = "4433def.dat"
$crystal = 7372800
const inter1=1
const inter2=10
Dim Intervall As Word , Temp As Byte
Do
intervall=inter1
gosub buttons
While Button = 1
gosub buttons
Incr Temp
If Temp > 3 Then Intervall = Inter2
for i = 1 to intervall
incr bytevariable
next
Waitms 1000
Wend
Loop
butan:
Button=1
return
butaus:
Button=0
return
buttons:
Debounce M , 0 , butan , Sub
Debounce M , 1 , butaus , Sub
Return
Inter1=Konstante, mit der du die Schritte bis zum umschalten auf zwei einstellen kannst (in deinem Beipiel 1 Schritt pro Sek.)
Inter2=Konstante, mit der du die Schritte nach dem umschalten einstellen kannst (in deinem Beipiel 10 Schritte pro Sek.)
Ich hoffe dir konnte das helfen...
Habs zwar nicht getestet, müsste aber funktionieren 8-[
MfG
Martin
Hallo
Falls es jemand interessiert ;-)
Habe obigen Code ausprobiert.
Funktioniert aber nicht so ganz .
Habe mich damit ein bisschen gespielt und das ist jetzt rausgekommen:
Eine Taste zaehlt mit Debounce rauf und beim länger halten, ab einen Wert von 10* Einer, zaehlt er dann die Zehner statt die Einer rauf..
(Ausgabe auf einem LCD)
'-------- Debounce und Zählen mit verschiedenen Längen --------------
'-------- zaehlt bei zweiter Stelle schneller --------------
$regfile = "m8def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4
Config Lcdmode = Port
Config Pind.7 = Input
Config Pind.6 = Input
Portd = 255 ' Port d auf High
Config Debounce = 30 ' Tastenentbrellung mit 30ms
Dim Zaehler As Word
Dim Taste As Byte
Dim Zaehlweite As Byte
Dim Mitzaehlen As Byte
Dim I As Byte
Const Normalzaehlen = 1
Const Schnellerzaehlen = 10
Const Nochschnellerzaehlen = 100
Zaehlweite = Normalzaehlen
Zaehler = 0
Mitzaehlen = 0
Cls
Do
Gosub Lesen
While Taste = 1
Incr Mitzaehlen 'Mitzaehler +1
If Mitzaehlen > 10 Then Zaehlweite = Zaehlweite + 10
For I = 1 To Zaehlweite
Incr Zaehler
Next
Waitms 200
Cls
Locate 1 , 1
Lcd Zaehler
Gosub Lesen
Wend
Mitzaehlen = 0
Zaehlweite = Normalzaehlen
Locate 1 , 1
Lcd Zaehler
Loop
End
Ein:
Taste = 1
Return
Aus:
Taste = 0
Return
Lesen:
Debounce Pind.7 , 0 , Ein , Sub
Debounce Pind.7 , 1 , Aus , Sub
Return
und hier eine Verison, wo er die Zaehner und dann die Hunderter schneller zaehlt.
'-------- Debounce und Zählen mit verschiedenen Längen --------------
'-------- zaehlt 2 und dann 3 Stellen schneller. --------------
$regfile = "m8def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4
Config Lcdmode = Port
Config Pind.7 = Input
Config Pind.6 = Input
Portd = 255 ' Port d auf High
Config Debounce = 30 ' Tastenentbrellung mit 30ms
Dim Zaehler As Word
Dim Taste As Byte
Dim Zaehlweite As Byte
Dim Mitzaehlen As Byte
Dim I As Byte
Const Normalzaehlen = 1
Const Schnellerzaehlen = 10
Const Nochschnellerzaehlen = 100
Zaehlweite = Normalzaehlen
Zaehler = 0
Mitzaehlen = 0
Cls
Do
Gosub Lesen
While Taste = 1
Incr Mitzaehlen 'Mitzaehler +1
If Mitzaehlen > 10 And Mitzaehlen < 101 Then
Zaehlweite = Schnellerzaehlen
Mitzaehlen = Mitzaehlen + 10
End If
If Mitzaehlen > 100 Then Zaehlweite = Nochschnellerzaehlen
For I = 1 To Zaehlweite
Incr Zaehler
Next
Waitms 200
Cls
Locate 1 , 1
Lcd Zaehler
Gosub Lesen
Wend
Mitzaehlen = 0
Zaehlweite = Normalzaehlen
Locate 1 , 1
Lcd Zaehler
Loop
End
Ein:
Taste = 1
Return
Aus:
Taste = 0
Return
Lesen:
Debounce Pind.7 , 0 , Ein , Sub
Debounce Pind.7 , 1 , Aus , Sub
Return
Ich will mich nicht einmischen, aber in der Hilfe zu Debounce steht:
"When DEBOUNCE is executed again, the state of the switch must have gone back in the original position before it can perform another branch. So if you are waiting for a pin to go low, and the pin goes low, the pin must change to high, before a new low level will result in another branch."
Somit scheidet ein längeres betätigen der Taste mit Debounce wohl aus.
die position wird in meinem proggi ja gespeichert und ab dem sprung ins hauptprogramm ist es erstmal egal was für eine stellung der switch hat BIS DER SCHALTER WIEDER LOSGELASSEN WIRD (siehe butaus)
im übrigen funktioniert mein code eigentlich wunderbar
Martin
Hallo albundy
Ja, so dachte ich zuerst auch, bis ich den Code von x-ryder probiert habe :-)
Aber in der Hilfe steht auch, dass Debounce das Programm nicht anhält..
@x-ryder
Sorry, wollte dich nicht blosstellen ;-)
Ohne deinen Code hätte ich es nicht gekonnt..
Bei dir sind aber die Variablen nicht alle definiert (dim...
und darum funktionierte auch dein Code bei mir nicht richtig.
und bei mir habe ich nach WEND die Variable wieder zurückgesetzt, damit man wieder mit Einer zählen kann.
Erst beim länger drücken, zählt er dann wieder mit den Zehner.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.