- Labornetzteil AliExpress         
Ergebnis 1 bis 4 von 4

Thema: gedrückte Zahlen vom LCD auslesen und in Variable speichern

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.11.2006
    Ort
    Wendeburg
    Alter
    35
    Beiträge
    96

    gedrückte Zahlen vom LCD auslesen und in Variable speichern

    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:


    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    17.04.2006
    Beiträge
    2.193
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.03.2007
    Beiträge
    176

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    475
    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
    Chuck Norris kann Windows Vista auf einem Atmel in Assembler implementieren!
    Chuck Norris coded mit 3 Tasten:"1","0" und "compile"

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad