Forum: Mikrocontroller und Digitale Elektronik Taster mit Mehrfachfunktionen


von Frodo G. (frodo_g)


Lesenswert?

Schönen Dienstag Abend!

Ich möchte gerne ein aktuelles Projekt von mir mit einem Tastenfeld mit 
"Mehrfachfunktionen" für die Eingabe von alphanumerischen Werten 
ausstatten, ähnlich wie das Tastenfeld bei alten Handys.

Also zum Beispiel wenn man die Taste "7" einmal drückt wird "7" 
eingegeben, wenn man diese Taste zweimal drückt wird "A" eingegeben, bei 
dreimal drücken "B" ...

Das Tastenfeld hat 3 Spalten und 4 Reihen.

Ich weiß grundsätzlich wie man eine solche Tastenmatrix auslesen kann.
Ich weiß auch wie man Taster entprellt (wenn ein Taster direkt an einen 
Eingang angeschlossen ist).

Aber wie entprellt man eine solche Tastenmatrix?

Ich hätte genügend Eingänge zur Verfügung dass ich jeden Taster einzeln 
mit dem µC verbinden könnte, aber ich möchte die Anzahl der Drähte vom 
"Frontpanel" zum Board mit dem µC nicht "sinnlos" vergrößern.


Die Implementierung der "Mehrfachfunktionen" der Tasten ist dann einfach 
(denke ich):

(Mehrere Tasten gleichzeitig sollten nicht gedrückt werden können, das 
Verhalten in so einem Fall kann ruhig "undefiniert" sein)
1
char LetzteTaste;
2
char AktuelleTaste;
3
uint8_t Tastenzaehler = 0x00;
4
5
//Zeit zwischen Tastendrücken um zweiten Tastendruck als neue Eingabe zu sehen
6
const uint8_t Timeout = 0xF0;    //nur ein Beispiel
7
8
/*Einstellen des Timers und der Register überspringe ich, es geht ja nur um das Konzept der Mehrfachfunktionstastenauswertung
9
Der Zähler zählt "langsam" von 0 aufwärts sodass der Wert Timeout nach 500 ms erreicht wird. Genaue Zeit muss noch bestimmt werden, ist aber egal, es geht nur um das grobe Konzept
10
*/
11
12
13
main()
14
  {
15
    LetzteTaste = AktuelleTaste;
16
    
17
    //Taste 1 wurde gedrückt
18
    AktuelleTaste = '1';
19
20
    //Taste 2 wurde gedrückt
21
    AktuelleTaste = '2';
22
23
    //und so weiter ...
24
    
25
    
26
    if((LetzteTaste == AktuelleTaste) & (TCNT0 < Timeout))
27
      {
28
        //Taste wurde innerhalb der Zeit zweimal gedrückt
29
        
30
        if(Tastenzaehler == 0x05)
31
          {
32
            //Setzte Tastenzaehler zurück auf 1, jede Taste hat 4 Funktionen (z.B. '7', 'A', 'B', 'C')
33
            Tastenzaehler = 0x01;
34
          }
35
          else
36
            {
37
              Tastenzaehler++;
38
            }
39
      }
40
    
41
    //Auswertung
42
    if((AktuelleTaste == '7') & (Tastenzaehler == 0x01))
43
      {
44
        //Aktuelle Eingabe ist '7'
45
      }
46
    if((AktuelleTaste == '7') & (Tastenzaehler == 0x02))
47
      {
48
        //Aktuelle Eingabe ist 'A'
49
      }
50
    if((AktuelleTaste == '7') & (Tastenzaehler == 0x03))
51
      {
52
        //Aktuelle Eingabe ist 'B'
53
      }
54
    
55
    //und so weiter ...
56
    
57
  }


Ja, ich weiß dass die Anordnung der Buchstaben und Zahlen ungewöhnlich 
ist.
Normalerweise ist 1 links oben, 9 rechts unten und die Buchstaben sind 
aufsteigend angeordnet (also 1 -> ABC, 2 -> DEF, ...).

Das ist aber eine der vielen Dinge die aus bestimmten Gründen bei diesem 
Projekt eben so sein müssen.

Es wird ein µC für das "User Interface" (Tasten einlesen, Ausgabe auf 
LCD, ...) verwendet.
Ein zweiter µC kümmert sich um die eigentlichen Steuer - und 
Regelfunktionen.
Da die Implementierung in eigenständige "Module" unterteilt wird, ist es 
irrelevant was die genauen Anforderungen und Funktionen des fertigen 
Geräts sind.

von Gandalf (Gast)


Lesenswert?

Frodo G. schrieb:
> Normalerweise ist 1 links oben, 9 rechts unten und die Buchstaben sind
> aufsteigend angeordnet (also 1 -> ABC, 2 -> DEF, ...).

Das ist die Anordnung bei einem Telefon. Schon auf einer PC-Tastatur ist 
der Nummernblock gespiegelt.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Frodo G. schrieb:
> Aber wie entprellt man eine solche Tastenmatrix?

Es kann einfach reichen, zu prüfen, ob beim nächsten Durchlauf die 
gleiche Taste immer noch gedrückt ist. Von meinen Tastenmatrizen weiss 
ich aber, das das meistens unnötig ist, und nur bei Schrotttasten nötig 
werden kann.

Frodo G. schrieb:
> //Auswertung
>     if((AktuelleTaste == '7') & (Tastenzaehler == 0x01))

Überlege, ob ein switch()... case Konstrukt die Nummer übersichtlicher 
gestalten kann.

von Frodo G. (frodo_g)


Lesenswert?

Matthias S. schrieb:

> Frodo G. schrieb:
>> //Auswertung
>>     if((AktuelleTaste == '7') & (Tastenzaehler == 0x01))
>
> Überlege, ob ein switch()... case Konstrukt die Nummer übersichtlicher
> gestalten kann.

Nein, denn es gibt ja die Tasten 0 bis 9 und dann noch eine Taste für "- 
/ * =" und eine Taste für '.', ' ' und '''.
Ja, ich könnte eifach "Taste 10 und 11" zu denen sagen, aber für mich 
persönlich ist das mit den chars übersichtlicher.

Matthias S. schrieb:
> Es kann einfach reichen, zu prüfen, ob beim nächsten Durchlauf die
> gleiche Taste immer noch gedrückt ist. Von meinen Tastenmatrizen weiss
> ich aber, das das meistens unnötig ist, und nur bei Schrotttasten nötig
> werden kann.

Es handelt sich um eine selbstgebastelte Tastenmatrix.
Ja, es sind ziemlich billige Taster.
Genau gesagt diese hier:
https://www.digikey.at/de/products/detail/e-switch/TL1105F160Q/5794?s=N4IgTCBcDaIKIHECMAOMB2AtAOQCIgF0BfIA

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Frodo G. schrieb:
> Nein, denn es gibt ja die Tasten 0 bis 9 und dann noch eine Taste für "-
> / * =" und eine Taste für '.', ' ' und '''.
> Ja, ich könnte eifach "Taste 10 und 11" zu denen sagen, aber für mich
> persönlich ist das mit den chars übersichtlicher.

Dann mach dir doch #defines für die paar Tasten. Aber gut, mir wäre das 
eben viel zu unwartbar.

von MaWin (Gast)


Lesenswert?

Frodo G. schrieb:
> Aber wie entprellt man eine solche Tastenmatrix?

Ganz normal.

Das besondere kommt NACH der Erfassung der 7, die ja auch als 7 
angezeigt wird, aber noch ohne dass sich der Cursor weiter bewegt.

Drückt man innerhalb von 1 Sekunde dieselbe Taste nochmal, kommt als 
Code nicht A, sondern '++' aka Increment, d.h. das Zeichen unter dem 
Cursor wird weitergezählt  Aus 7 wird A und aus A wird B und aus B 
vielleicht wieder 7.

Wurde 1 Sekunde keine Taste gedrückt, wird der Cursor weitergerückt, 
genau so als wenn innerhalb 1 Sekunde eine andere Taste als zuletzt 
gedrückt wurde.

Ob das durch eigene Tastencodes erfolgt, oder durch Timercode, bleibt 
dir überlassen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.