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.