- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 9 von 9

Thema: Tastaturmatrix abfragen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    18.10.2004
    Ort
    Cottbus
    Beiträge
    38

    Tastaturmatrix abfragen

    Anzeige

    Praxistest und DIY Projekte
    Hallo

    Ich habe von Pollin das Display mit den 8 Tasten und möchte diese Tasten auch gerne nutzen.
    Lt. Anleitung sind sie folgendermaßen angeschloseen.

    SW1=K1+K2
    SW2=K1+K3
    SW3=K1+K4
    SW4=K1+K5

    SW5=K6+K2
    SW6=K6+K3
    SW7=K6+K4
    SW8=K6+K5

    Die Frage ist nun wie fragt man am besten und effektivsten ab , welche Taste gedrückt wurde.

    Irgendwo habe ich mal gelesen das man das wie folgt macht.

    Alles auf high
    dann die erste Zeile auf low und die Spalten abfragen ob einer auf high gegangen ist
    wenn nicht dann zeile wieder auf high und die nächste auf low
    so geht man alle zeilen durch bis irgenwann eine Spalte auf high geht, damit hat man dann die Spalte raus.
    danach folgt dann das spiel mit den Spalten und so bekommt man dann auch die entsprechende Zeile raus.

    Aber wie programmiert man das am besten.
    Ich habe einen ATMega 16 und die Tastenleitungen an port d angeschlossen
    pd2= K1
    pd3= K2
    pd4= K3
    pd5= K4
    pd6= K5
    pd7= K6

    Besten Dank erstmal

    Andreas

  2. #2
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    In der Bascom Hilfe ist ein gutes Beispiel für eine 4x4 Matrix.
    Ist eigendlich recht einfach ...
    CONFIG KBD = PORTx , DEBOUNCE = value , rows=6, row5=pinD.6, row6=pind.7
    < Spalten und Zeilen einstellen >
    VAR = GETKBD()
    < Tastatur abfragen >

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    18.10.2004
    Ort
    Cottbus
    Beiträge
    38
    Ja, das hab ich auch schon gelesen
    Aber ich habe doch 4x2
    desweiteren will ich am mega16 portd nehmen und muß pd0 und pd1 auf ausgang lassen wegen Rx,Tx
    der letzte teil von config kdb dient ja nur dazu um es auf 6 reihen zu erweitern

    Gruß Andreas

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    18.10.2004
    Ort
    Cottbus
    Beiträge
    38
    Ich habe es mittlerweile hinbekommen

    Bei Interesse kann ich den Code auch gerne Posten

    Vielen Dank nochmal

    Andreas

  5. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    >Aber ich habe doch 4x2
    Ist doch egal, es sind eh alle Kontakte offen, lass doch einfach 2 Reihen weg.

    >desweiteren will ich am mega16 portd nehmen und muß pd0 und pd1 auf ausgang lassen wegen Rx,Tx
    Ist doch auch egal, nimm mit Config einen anderen Port.

  6. #6
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    Sorry, ich sehe gerade unsere Posts haben sich überschnitten.
    Wie hast du es nun gemacht ? Würde mich interessieren

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    18.10.2004
    Ort
    Cottbus
    Beiträge
    38
    So sieht der Code dafür jetzt aus

    Code:
    Do
    Goto Taste
    Loop
    
    Taste:
    Dim Z As Integer
    Dim S As Integer
    
    Ddrd = &B10000110
    Portd = 255
    Do
       For S = 0 To 1
          If S = 0 Then Portd.2 = 0
          If S = 1 Then Portd.7 = 0
             If Pind.3 = 0 Then
                If S = 0 Then
                   Lcd "Taste 1 gedrueckt"
                Else
                   Lcd "Taste 5 gedrueckt"
                End If
             End If
             If Pind.4 = 0 Then
                If S = 0 Then
                   Lcd "Taste 2 gedrueckt"
                Else
                   Lcd "Taste 6 gedrueckt"
                End If
             End If
             If Pind.5 = 0 Then
                If S = 0 Then
                   Lcd "Taste 3 gedrueckt"
                Else
                   Lcd "Taste 7 gedrueckt"
                End If
             End If
             If Pind.6 = 0 Then
                If S = 0 Then
                   Lcd "Taste 4 gedrueckt"
                Else
                   Lcd "Taste 8 gedrueckt"
                End If
             End If
          If S = 0 Then
             Portd.2 = 1
          Else
             Portd.7 = 1
          End If
       Next
       Locate 1 , 7
    Loop
    End
    Immer wenn ich dann eine Taste drücke, steht im Display welche.

    Allerdings, was ich nicht so recht nachvollziehen kann ist, das es erst funktioniert wenn ich die Spalte auf 0 lege anstatt auf 1.
    Irgendwie hatte ich das andersrum gedacht, nähmlich mit portd.2=1 5V auf die Leitung geben(also High machen).

    Vielleicht habe ich die Systematik eines MicroCs doch noch nicht so richtig verstanden.

    Gruß Andreas

  8. #8
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    Hallo Andreas,
    Ich habe mir das mal angesehen und etwas vereinfacht.
    Ich hoffe durch die Kommentare, verstehst du jetzt, warum die Spalten auf "0" gesetzt werden müssen.

    Code:
    Ddrd = &B10000100
    Portd = &HFF
    'bei den Eingängen Pullup's ein und Ausgänge auf high
    
    Dim Spalte As Byte
    Dim Zeile As Byte
    Dim Taste As Byte
    'Jetzt sind alle Portpins "1". Wenn eine Taste gedrückt wird passiert nichts!
    
    Do
      For Spalte = 0 To 1
    
      'Deshalb wird jetzt jeweils 1 Spalte "0" gesetzt
        If Spalte = 0 Then Reset Portd.2
        If Spalte = 1 Then Reset Portd.7
        For Zeile = 3 To 6
          Select Case Zeile
          'ist jetzt eine Taste gedrückt,wird der entsprechende Eingang auch "0"
    
            Case 3 : If Pind.3 = 0 Then Taste = Spalte + 1
            'Portd.2=0 und Pind.3=0 => Taste1 / Portd.7=0 und Pind.3=0 => Taste2
    
            Case 4 : If Pind.4 = 0 Then Taste = Spalte + 3
            'Portd.2=0 und Pind.4=0 => Taste3 / Portd.7=0 und Pind.4=0 => Taste4
    
            Case 5 : If Pind.5 = 0 Then Taste = Spalte + 5
            Case 6 : If Pind.6 = 0 Then Taste = Spalte + 7
          End Select
        Next
        Portd = &HFF
      Next
    Locate 1 , 1
    Lcd "Taste " ; Taste ; " gedrueckt"
    Loop
    
    End

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    18.10.2004
    Ort
    Cottbus
    Beiträge
    38
    Diese For Schleife hatte ich am Anfang auch drin.Aber was mich daran stört ist, das das Programm 4x alle 4 Zeilen bei der selben Spalte abfragt. Und das ist doch eigentlich Zeitverschwendung,oder?

    Ich habe meine Code jetzt auch noch ein bißchen verändert, uzw in der Form das sobald eine Taste erkannt wurde die Schleifen ,also die For Schleife für die Spalten , und dann die Do-Loop Schleife verlassen werden.
    Das warten dient der entprellung

    Hier der Code

    Code:
    Taste:
    Dim Z As Integer
    Dim S As Integer
    
    Ddrd = &B10000110
    Portd = 255
    Taste = 0
    Do
       For S = 0 To 1
          If S = 0 Then Portd.2 = 0
          If S = 1 Then Portd.7 = 0
             If Pind.3 = 0 Then
                If S = 0 Then
                   Taste = 1
                Else
                   Taste = 5
                End If
             End If
             If Pind.4 = 0 Then
                If S = 0 Then
                   Taste = 2
                Else
                   Taste = 6
                End If
             End If
             If Pind.5 = 0 Then
                If S = 0 Then
                   Taste = 3
                Else
                   Taste = 7
                End If
             End If
             If Pind.6 = 0 Then
                If S = 0 Then
                   Taste = 4
                Else
                   Taste = 8
                End If
             End If
          If S = 0 Then
             Portd.2 = 1
          Else
             Portd.7 = 1
          End If
          If Taste > 0 Then Exit For
       Next
    Loop Until Taste > 0
    Waitms 100
    Return
    Ich denke mal schon das man das noch ein wenig optimieren kann, aber kommt Zeit kommt Rat.
    Ich habe ja auch erst damit angefangen mich mit MicroCs zu beschäftigen.
    Programmieren tue ich ja schon ein paar Jahre.
    Und mein Konzept ist eigentlich immer , erstmal das Grobschema so das es funktioniert und dann der Feinschliff ,Schritt für Schritt.

    Aber ich bin auf alle Fälle für jede Form der Hilfe dankbar.

    Gruß Andreas

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad