Hallo zusammen,
ich habe die SAMWELL-Tastatur von Pollin etwas umgearbeitet, so dass ich
sie als 'normale' 3x4 Matrixtastatur nutzen kann. Nun habe ich die
Tastatur an Port D gehängt (siehe angehängte Grafik) und versuche sie
gemäß dem folgenden C-Code abzufragen:
1 | void init_ports(void) {
|
2 | // PD0-PD6 als Eingänge schalten.
|
3 | DDRD &= ~((1<<PD0) | (1<<PD1) | (1<<PD2) | (1<<PD3) | (1<<PD4) | (1<<PD5) | (1<<PD6));
|
4 | // PD0-PD2 mit internen Pullups, da diese dauerhaft Eingänge sind.
|
5 | PORTD |= ((1<<PD0) | (1<<PD1) | (1<<PD2));
|
6 | // PD3-PD6 ohne interne Pullups, da diese nacheinander als Ausgänge geschaltet werden.
|
7 | PORTD &= ~((1<<PD3) | (1<<PD4) | (1<<PD5) | (1<<PD6));
|
8 | }
|
9 |
|
10 | int8_t getKeyInput() {
|
11 | for (int col=3; col<7; col++) {
|
12 | // nacheinander die Eingänge PD3-PD6 als Ausgang schalten
|
13 | DDRD |= (1 << col);
|
14 | for (int row=0; row<3; row++) {
|
15 | // nacheinander die Eingänge überprüfen
|
16 | // falls low => Taste gedrückt
|
17 | // falls high => Taste nicht gedrückt
|
18 | if (!(PIND & (1 << row))) {
|
19 | return (row + 1) + ((col-3) * 3);
|
20 | }
|
21 | }
|
22 | // Ausgang wieder auf Eingang schalten
|
23 | DDRD &= ~(1 << col);
|
24 | }
|
25 | }
|
Die Funktion init_ports() wird am Anfang aufgerufen, die Funktion
getKeyInput() jede Sekunde einmal.
Funktionsweise von getKeyInput():
- PD3 als Ausgang schalten
- nacheinander PD0-PD2 abprüfen, ob diese low sind => wenn ja, dann
Taste 1, 2 oder 3 gedrückt
- PD3 wieder als Eingang
- PD4 als Ausgang schalten
- nacheinander PD0-PD2 abprüfen, ob diese low sind => wenn ja, dann
Taste 4, 5 oder 6 gedrückt
- PD4 wieder als Eingang
Und das ganze dann noch mit PD5-PD6, so dass die Tasten 7-9, 0 und down
& up abgeprüft werden.
Das ganze funktioniert, aber wenn ich eine Taste länger gedrückt lasse,
dann habe ich ein interessanten Effekt. Z. B. wird die Taste 5 länger
als 1 Sekunde gedrückt. Dann gibt mir die Funktion zuerst 5 zurück und
anschließend immer wieder eine 2. Das gleiche gilt für die Taste 8 & 0.
Bei der Taste 7 wird zuerst die 7 und anschließend immer die 1
zurückgegeben.
Man kommt relativ schnell drauf, dass anschließend der Wert der Taste
zurückgegeben wird, die sich in der gleichen Reihe wie die gedrückte
Taste befindet, aber halt in der ersten abgefragten Spalte (für die
Zahlen 1, 2 & 3).
Kann mir das jemand bitte erklären?