PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : gedrückte Zahlen vom LCD auslesen und in Variable speichern



timo1105
17.06.2007, 12:49
Hallo,

Ich beschäftige mich gerade damit, ein Programm zu schreiben, welches einen Schrittmotor bewegen kann.
Dieses Programm besteht daraus, dass auf einem LCD erst ein Begrüßungsbildschirm zu sehen ist, dann eine Erklärungen, was der Benutzer alles eingeben kann und dann sollte sich der Schrittmotor je nach Eingabe drehen.

Möglich sind bis jetzt nur die Zahlen 1 und 2, da ich nur 2 Taster angeschlossen habe. Dazu kommt noch ein dritter, der als Bestätigungstaster dient.

Meine Frage ist nun:
Der Benutzer hat die Möglichkeit 1,2,11,12,21,22 einzugeben. Wie kann ich nun z.B in eine Variable speichern, wie oft pind.0(taster1) oder pind.1(taster2) gedrückt wurde.
Die Variable taucht später in der passenden For/next schleife auf, die dann den Moter 1 oder 2 oder 11 oder 12 oder 21 oder 22 dreht.


Wie muss ich das umsetzen? Ich komm irgendwie nicht mehr weiter...

Hier mein bisheriger code:



$regfile = "m8def.dat"
$crystal = 16000000


Declare Sub Sub1
Declare Sub Sub2
Declare Sub Enter
Declare Sub Startlcd
Declare Sub Erklaerung
Declare Sub Eingabe
Declare Sub Warnung

Dim Lcdxpos As Byte





Config Lcdpin = Pin , E = Portb.4 , Rs = Portb.3 , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 4
Config Lcdbus = 4

Ddrd = &B11110000
Portd = &B00100111

Label1:
Cls
Call Startlcd
Lcdxpos = 0


Do
Debounce Pind.0 , 0 , Sub1 , Sub
Debounce Pind.1 , 0 , Sub2 , Sub
Debounce Pind.2 , 0 , Enter , Sub

If Lcdxpos > 2 Then
Gosub Warnung



End If

Loop



Sub Startlcd
Cls
Locate 1 , 1
Lcd "Willkommen bei:"
Locate 3 , 1
Lcd "*One-Two-Motion*"
Cursor Off
Wait 2
Cls
Gosub Erklaerung
End Sub




Sub Sub1
Incr Lcdxpos
Locate 3 , Lcdxpos
Lcd "1"
End Sub




Sub Sub2
Incr Lcdxpos
Locate 3 , Lcdxpos
Lcd "2"
End Sub



Sub Enter
End Sub





Sub Erklaerung
Cls
Locate 1 , 1
Lcd "Erklaerung:"
Locate 2 , 1
Lcd "Taster1 = 1"
Locate 3 , 1
Lcd "Taster2 = 2"
Locate 4 , 1
Lcd "Bestaetigen = B"
Cursor Off
Wait 4
Cls
Locate 1 , 1
Lcd "Das kannst du"
Locate 2 , 1
Lcd "eingeben:"
Locate 3 , 1
Lcd "1,11,12,2,21,22"
Wait 5
Cls

Call Eingabe
End Sub






Sub Eingabe
Locate 1 , 1
Lcd "Wie viele Umdr.?"
Locate 3 , 1
Cursor Blink
End Sub



Sub Warnung
Cls
Locate 2 , 1
Lcd "!!!Eingabe nicht"
Locate 3 , 1
Lcd "moeglich!!!"
Wait 1
Cls
Goto Label1

End Sub


Vielen Dank

Timo

shaun
17.06.2007, 17:00
Aus Deiner Fragestellung werd' ich nicht so recht schlau. Du kannst doch einfach eine Variablen jedes Mal, wenn der Taster betätigt wird, um eins erhöhen, dann hast Du gezählt, wie oft er gedrückt wurde. Das gibt aber keine Auskunft über die Reihenfolge der Betätigung der verschiedenen Taster.
Ausserdem reicht es natürlich nicht, den Pin abzufragen, ob der Taster gerade gedrückt ist, sondern Du darfst erst dann auf gedrückt befinden, wenn er bei der vorherigen Abfrage nicht gedrückt war, sonst rasen die Zähler mit der Verarbeitungsgeschwindigkeit der Schleife hoch. Ausserdem solltest Du abfragen, ob der Zustand "gedrückt" über eine hinreichende Anzahl von Schleifendurchläufen konstant war, um Prellen des Tasters zu eliminieren. Und auch sonst gibt es viel zu lernen, ich werde auch gleich den WinAVR anwerfen und mich etwas vergnügen :)

jar
17.06.2007, 17:18
eine tolle key lib

http://www.mikrocontroller.net/articles/Entprellung

The Man
19.06.2007, 19:32
Hi,
ich würde das so machen:

der taster der für die eins steht und der, der für die zwei steht haben jew. zugriff auf ein eigenes byte. wird z.B. taster eins gedrückt, wird auf das byte 1
ein logik shift links angewendet und dann die unteren vier BITS um 1 erhöht.

lsl Byte1 ;links shift
ori Byte1,0b00000001 ;um eins erhöhen

Das logik shift links muss auf jeden fall zuerst kommen! Der selbe Algorithmus gilt für taster zwei, Nur das der im Byte 2 auf die oberen vier Bits zugreift.

lsl Byte2 ;links shift
ori Byte2,0b00010000 ;um eins erhöhen

Außerdem ist darauf zu achten, dass die schleifen erst verlassen werden, wenn die taster losgelassen sind.
Wird der dritte Taster zum bestätigen gedrückt, werden byte 1 und 2 über eine logische UND Verknüpfung verknüpft. z.B. so

AND Byte1,Byte2

Das Ergebnis findet sich dann in Byte1. Anhand der kodierung der unteren und oberen vier Bits kannst du dann eine Fallunterscheidung der gewünschten Position machen.

Ich geb zu das ist jetzt an Assemblercode angelehnt, aber ich hoffe, die Idee ist klar.

Gruß,
The Man