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
charLetzteTaste;
2
charAktuelleTaste;
3
uint8_tTastenzaehler=0x00;
4
5
//Zeit zwischen Tastendrücken um zweiten Tastendruck als neue Eingabe zu sehen
6
constuint8_tTimeout=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.
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.
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.
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
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.
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.