
Anschluss
Der Anschluss ist ein 37 poliger D-Sub Stecker. Die Analyse der Tastatur hat folgende Steckerbelegung ergeben:

Beschreibung der Signale
Die AC_Power Leitungen sind die Stromversorgung für die Tastatur. In der Tastatur ist ein Gleichrichter und ein 5V Spannungsregler verbaut. Die interne GND-Schiene ist am Stecker über die beiden GND-Leitungen herausgeführt, so dass Computer und Tastatur ein gemeinsames Massepotential besitzen.
Das BEEP-Signal (Eingang in die Tastatur) erzeugt beim Wechsel von 0 auf 1 in der Tastatur einen kurzen Piepton.
Die Col_Sel Signale (Eingänge in die tastatur) wählen eine Spalte auf der Tastatur aus, die abgefragt werden soll. Spalte 0 enthält z.B. die Tasten 1, 2, Q, W, A, S, Y und die Leertaste. Je nachdem welche Tasten gedrückt sind, liefern dann die ROW Signale (Ausgänge aus der Tastatur) bei gedrückter Taste eine 0, bei nicht gedrückter Taste eine 1. Ausnahme bildet ROW_8, das bei nicht gedrückter Taste immer eine 0 liefert und bei den meisten Tasten ebenfalls. Bei einigen Tasten wechselt es auf 1, zusätzlich zu einem der anderen ROW Signale. Dadurch können mehr als 8 Signale einer Zeile zugeordnet werden. Die Shift-Tasten haben eine eigene Leitung, die bei nicht gedrückter Shift-Taste eine 0 und bei gedrückter Shift-Taste eine 1 liefert. Die CTRL-Taste ist an ROW_8 angeschlossen und liefert bei gedrückter Taste eine 1, nicht gedrückt eine 0 an ROW_8, ohne dass ein weiteres der ROW Signale eine Änderung zeigt. Das Signal Col_En (Eingang in die Tastatur) aktiviert (1) bzw deaktiviert (0) den Spaltendecoder. Ist der Spaltendecoder deaktiviert, liefern nur die Shift-Tasten an SHIFT und die CTRL-Taste an ROW_8 ein Signal.
Im Folgenden ist die Codetabelle für die einzelnen Tasten dargestellt.
Tastaturcodes
| Eingangssignale |
Ausgangssignale | |||||||||||||
| Col_En | Col_Sel_2 | Col_Sel_1 | Col_Sel_0 | SHIFT | ROW_8 | ROW_7 | ROW_6 | ROW_5 | ROW_4 | ROW_3 | ROW_2 | ROW_1 | ROW_0 | Taste |
| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | s |
| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | w |
| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | y |
| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 2 |
| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | a |
| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | q |
| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | SPACE |
| 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | REP |
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | f |
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | r |
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | c |
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 4 |
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | d |
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | e |
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | x |
| 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 3 |
| 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | COR |
| 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | h |
| 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | z |
| 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | b |
| 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 6 |
| 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | g |
| 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | t |
| 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | v |
| 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 5 |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | k |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | i |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | m |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 8 |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | j |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | u |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | n |
| 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 7 |
| 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | ö |
| 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | p |
| 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | . |
| 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
| 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | l |
| 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | o |
| 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | , |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 9 |
| 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | DEL |
| 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | # |
| 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | + |
| 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | ^ |
| 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | ä |
| 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | ü |
| 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | - |
| 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ß |
| 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | → |
| 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | ↑ |
| 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | ESC |
| 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | ↓ |
| 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | ← |
| 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ↖ |
| 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | G |
| 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | F |
| 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | E |
| 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | D |
| 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | C |
| 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | B |
| 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | A |
| 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | NUM_7 |
| 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | NUM_6 |
| 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | NUM_5 |
| 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | NUM_4 |
| 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | NUM_3 |
| 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | NUM_2 |
| 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | NUM_1 |
| 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | NUM_0 |
| 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | ↲ |
| 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | H |
| 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | NUM_, |
| 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | NUM_8 |
| 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | NUM_9 |
| 0 | X | X | X | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | CTRL |
| 1 | X | X | X | 0 | 1 | X | X | X | X | X | X | X | X | CTRL* |
| X | X | X | X | 1 | X | X | X | X | X | X | X | X | X | SHIFT |
* CTRL setzt ROW_8 auf 1, wenn Col_En 1 ist und gleichzeitig andere Tasten gedrückt sind, können bereits belegte Kombinationen entstehen (z.B erzeugt CTRL-ä den gleichen Code wie ESC)
Schaltplan
Ich habe in KiCad einen Schaltplan der Tastatur erstellt. Die erste Version war etwas unübersichtlich, die zweite Version ist zwar auch noch nciht optimal, aber schon etwas besser, deshalb veröffentliche ich sier jetzt hier.
Das zugehörige KiCad-Projekt kann ebenfalls heruntergeladen werden: Tastatur2.zip
Timing
Beim Anschluss der Tastatur an einen Mikrocontroller musste ich feststellen, dass der Controller zu schnell ist für die Logik der Tastatur. Das Programm lief die Spalten der Tastatur durch und fragte die Zeilen ab. Im ersten Versuch wurde mir aber immer die entsprechende Zeile in der nächsten Spalte angezeigt. Das Oszilloskop zeigte mir dann, dass das Zeilensignal langsamer wechselte, als der Microcontroller bei 16 MHz abgefragt hat.

Die oberen drei Signale sind die Eingangssignale zur Auswahl der Spalte. Das untere (dunkelblaue) Signal ist das ROW0 Signal, das beim Drücken der Taste 's' entsteht. Die Verzögerung zwischen dem Einstellen des Spaltendecoders und der Ausgabe des Zeilensignals beträgt hier ungefähr 1,2μs. Mit etwas Sicherheit bei den Zeiten ergibt sich folgendes Timing-Diagramm:

Row Delay tRd = 1,2 μs
Row Setup Time tRsu = 4 μs
Ein Abfragen 4μs nach dem Anlegen der Spalte reicht also aus, um die Zeilen sicher einzulesen. Eigentlich sollten 2μs reichen, das führte aber bei meinen Tests mit einem ATMega32 zu Abstürzen.
Verbaute Taster:
Bezeichnung auf Unterseite: RAFI 4
Technologie: contactless Hall Effect Switches (Kontaktlose Hall Effekt Taster)
Hersteller: RAFI (Informationen über den Hersteller auf Telcontar.net)
Serie: vermutlich RS 76 C
Links zu weiteren Infos:
https://telcontar.net/KBK/RAFI/FTKS
https://telcontar.net/KBK/RAFI/#part_numbers
https://telcontar.net/KBK/Micro_Switch/