[Home/Nieuws]  [Magazines]  [Meetings]  [Downloads]  [Redaktie]  [Geschiedenis]


Een duur toetsenbord
door Xavier & Illiac

In dit artikel beschrijven we een hoe een toetsenbord werkt en hoe deze te simuleren is via de parallele poort van een computer.

Werking van een toetsenbord
Het PC/AT toetsenbord verzend data in een serieel formaat bestaande uit een startbit 8 data bits(LSB first) en even parity check en een stopbit. Zoals te zien is in figuur 1. Naast de clock en data heeft de 5 pins connector (figuur 2) ook aansluitingen voor 5V voeding, een ground en niet gebruikte pin. Zowel de clock als de data lijn zijn geimplementeerd op het toetsenbord als een open-collector output met een pull-up weerstand naar +5V. OPM. het PS/2 toetsenbord is logisch equivalent maar gebruikt een andere connector (met een extra niet gebruikte pin).

keybtime.gif (5952 bytes)
Figuur 1. PC/AT Keyboard Timing (C) Philips

Als er op een toets gedrukt wordt , zend het PC/AT toetsenbord een 'make' code, en wanneer de toets los gelaten wordt een 'break' code. De 'break' code bestaat uit dezelfde 8-bit scan code voorafgegeaan door de speciale hexidecimale code : F0.


Figuur 2. Keyboard Connections (looking in male-connector). Original image is (C) by Philips

Een opmerkelijk verschil met een regulier ascii toetsenbord is de manier waarop CTLR,ALT,SHIFT, enz werken. Bij een ASCII toetsenbord wordt door deze control toetsen direct de output verandert. bijvoorbeeld : een 61H (ascii code voor 'a') is uitvoer als alleen op de 'A' toets gedrukt wordt. Terwijl 41H(ascii code voor 'A') de uitvoer is als zowel op SHIFT en 'A' gedrukt wordt. Bij een PC/AT toetsenbord werkt dit anders, een AT toetsenbord ziet zo'n combinatie als 2 aparte toetsindrukken : SHIFT-make, 'A'-make, SHIFT-break, 'A'-break. De 'A' scan code(1CH) is hetzelfde voor zowel de geshifte als niet geshifte toestand. Om nu onderscheid te maken tussen een 'a' of een 'A' als de 'A' scancode verstuurd wordt moet de pc dus bijhouden of er een SHIFT-make aan voorafgegaan is.

Verder zijn er nog berichten die van de computer naar het toetsenbord gaan. Bij een PC/AT toetsenbord is het mogelijk om control berichten van het systeem te ontvangen naast de te zenden scan code informatie naar de computer. Op deze manier kunnen de LED's en de keyboard typematic keyrate instellingen gewijzigd worden. Command transmissie naar het toetsenbord wordt geinitieerd door de CLOCK-line low te brengen voor een minimum van 60 uS. na de 60uS vertraging moet de data lijn omlaag gebraagd worden en de clock line weer hoog gemaaakt worden. Na een bepaalde tijd (max 10 milliseconden) moet het toetsenbord clock pulsen gaan genereren. Op elke hoog naar laag clock transitie neem het toetsenbord een nieuw bit aan. De data stream van het system op de data line moet conform het bovenstaande protocol verzonden worden. Nadat het pariteit bit ontvangen is, moet de computer de data line weer hoogmaken en wachten totdat het toetsenbord nog een clockpulse zendt, dit wordt het 10e hoog ->laag transistie, de initiele hoog->laag transitie geinitieerd door de host niet meegeteld.

Als de data lijn niet hoog gemaakt wordt nar de 10e clock bit dan blijft het toetsenbord clockpulsen sturen totdat de data-lijn vrijgegeven wordt. Mocht dit voorkomen dan wordt na een korte vertraging door het toetsenbord de data lijn laaggemaakt en een RESEND status byte (FEh) verzonden.

Commando's
Hieronder de commando's die de computer sturen kan naar het toetsenbord.

F5h Default disable. Reset het toetsenbord, retourneer een ACK en wacht met het uitlezen van toetsen, op een volgend commando. Wijzigt niet de status van de indicatie leds.
EEh Echo. Reageer met een ECHO code (EEh).
F4h Enable. Leegt alle output buffer, enabled kbd, retourneer een ACK.
F2h Read ID. Reageer met een ACK en 2 ID bytes (83h,ABh). Gaat verder met uitlezen van toetsen zelfs als voorheen uitgezet is.
FEh Resend. Verzend de laatst verzonden scan code opnieuw.
FFh Reset. Reset het keyboard CPU, start de power-on test. Reageer met een power-on-test byte.
F0h Select scan code set. Reageer met een ACK, dan wachten op de computer die een van de volgende bytes (01h,02h or 03h) stuurt, waarmee de te gebruiken scan code set wordt aangegeven. Als een 00h verzonden is, reageert het toetsenbord met een ACK en gebruik verder de aangeven set.
F7h 'Set all keys typematic'
F8h 'Set all keys make/break'
F9h 'Set all keys make'
FAh 'Set all keys typematic/make/break' Geen idee wat deze codes doen, vermoed wordt dat ze aangeven op wat voor manier het toetsenbord de scancodes moet verzenden. Alle bovenstaande commando's reageren met een ACK code.
F6h Set default. Reageer hetzelfde als de 'Default Disable', maar stop niet met uitlezen van toetsen. Wijzigt niet de led status.
FBh 'Set key type typematic'
FCh 'Set key type make/break'
FDh 'Set key type make' Nog steeds onzeker wat deze code doen. In tegenstelling tot de 'set all' commando's, werken deze commando's alleen op 1 enkele toets. Het toetsenbord verzend een ACK code, wacht dan op de toetsenbord scan code. ACK wordt gezet na elke ontvangen scan code. Het toetsenbord blijft in de 'set type' state totdat een nieuw commando's ontvangen is.
EDh Set/reset status indicators. Met dit commando worden de status leds op het toetsenbord gewijzigd. Het toetsenbord reageert met een ACK en wacht op de optie byte, als volgt samengesteld : b0-Scrollock, b1-Numlock, b2-Capslock, b3..7=0. een '1' bit zet de indicatie AAN.
F3h Set autorepeat rate/delay. Reageer met een ACK, wacht dan op een optie byte dat de autorepeat delay en de rate specificeerd, alsvolgt samengesteld: b7-unused. b6..5-Repeat delay (00=250 mS, 11=1000mS). b4..0-Repeat rate (00000=30x/sec, 11111=2x/sec). Toetsenbord reageert met een ACK na ontvangst van het option byte.

De Scan Codes
De toetsen op het toetsenbord zijn alsvolgt genummerd :

,-------,---,---,---,---,,---,---,---,---,,---,---,---,---,
|ESC    |F1 |F2 |F3 |F4 ||F5 |F6 |F7 |F8 ||F9 |F10|F11|F12|
|110    |112|113|114|115||116|117|118|119||120|121|122|123|
'-------'---'---'---'---''---'---'---'---''---'---'---'---'
,---,---,---,---,---,---,---,---,---,---,---,---,---,-----,
|~  |1  |2  |3  |4  |5  |6  |7  |8  |9  |0  |-  |=  |<-   |
|1  |2  |3  |4  |5  |6  |7  |8  |9  |10 |11 |12 |13 |15   |
|---',--',--',--',--',--',--',--',--',--',--',--',--',----|
|TAB |Q  |W  |E  |R  |T  |Y  |U  |I  |O  |P   |[  |]  |\   |
|16  |17 |18 |19 |20 |21 |22 |23 |24 |25 |26 |27 |28 |29  |
|----',--',--',--',--',--',--',--',--',--',--',--',--'----|
|CAPS |A  |S  |D  |F  |G  |H  |J  |K  |L  |;   |,  |ENTER  |
|30   |31 |32 |33 |34 |35 |36 |37 |38 |39 |40 |41 |43     |
|-----',--',--',--',--',--',--',--',--',--',--',----------|
|SHIFT |Z  |X  |C  |V  |B  |N  |M  |,  |.  |/   |SHIFT    |
|44    |46 |47 |48 |49 |50 |51 |52 |53 |54 |55  |57       |
|----,-',--'--,'---'---'---'---'---'---'--,'--,'-----,----|
|CTRL|  |ALT  |          SPACE            |ALT|      |CTRL|
|58  |  |60   |           61              |62 |      |64  |
'----'--'-----'---------------------------'---'------'----'

,-----,-----,-----,
|PSCRN|SLOCK|BREAK|
|124  |125  |126  |
'-----'-----'-----'
,-----,-----,-----,  ,-----,-----,-----,-----,
|INS  |HOME |PGUP |  |NLOCK|/    |*    |-    |
|75   |80   |85   |  |90   |95   |100  |105  |
|-----|-----|-----|  |-----|-----|-----|-----|
|DEL  |END  |PGDN |  |7    |8    |9    |+    |
|76   |81   |86   |  |91   |96   |101  |106  |
'-----'-----'-----'  |-----|-----|-----|-----|
                     |4    |5    |6    |     |
                     |92   |97   |102  |     |
      ,-----,        |-----|-----|-----|-----|
      |UP   |        |1    |2    |3    |ENTER|
      |83   |        |93   |98   |103  |108  |
,-----|-----|-----,  |-----------|-----|     |
|LEFT |DOWN |RIGHT|  |0          |.    |     |
|79   |84   |89   |  |99         |104  |     |
'-----'-----'-----'  '-----------'-----'-----'

Hieronder een tabel met de bijbehorende scancodes die de toetsen genereren.

1 0x0E 21 0x2C 41 0x52 61 0x29 81 0xE069 101 0x7D 121 0x09
2 0x16 22 0x35 42 -5 62 0xE011 82 -5 102 0x74 122 0x78
3 0x1E 23 0x3C 43 0x5A 63 -5 83 0xE075 103 0x7A 123 0x07
4 0x26 24 0x43 44 0x12 64 0xE014 84 0xE072 104 0x71 124 -2
5 0x25 25 0x44 45 -5 65 -5 85 0xE07D 105 0x7B 125 0x7E
6 0x2E 26 0x4D 46 0x1A 66 -5 86 0xE07A 106 0x79 126 -4
7 0x36 27 0x54 47 0x22 67 -5 87 -5 107 -5 127 -5
8 0x3D 28 0x5B 48 0x21 68 -5 88 -5 108 0xE05A 128 -5
9 0x3E 29 0x5D 49 0x2A 69 -5 89 0xE074 109 -5    
10 0x46 30 0x58 50 0x32 70 -5 90 0x77 110 0x76    
11 0x45 31 0x1C 51 0x31 71 -5 91 0x6C 111 -5    
12 0x4E 32 0x1B 52 0x3A 72 -5 92 0x6B 112 0x05    
13 0x55 33 0x23 53 0x41 73 -5 93 0x69 113 0x06    
14 -5 34 0x2B 54 0x49 74 -5 94 -5 114 0x04    
15 0x66 35 0x34 55 0x4A 75 0xE070 95 0xE04A 115 0x0C    
16 0x0D 36 0x33 56 -5 76 0xE071 96 0x75 116 0x03    
17 0x15 37 0x3B 57 0x59 77 -5 97 0x73 117 0x0B    
18 0x1D 38 0x42 58 0x14 78 -5 98 0x72 118 0x83    
19 0x24 39 0x4B 59 -5 79 0xE06B 99 0x70 119 0x0A    
20 0x2D 40 0x4C 60 0x11 80 0xE06C 100 0x7C 120 0x01    

In deze tabel staat voor:
-1 is E02AE037
-2 is E012E07C
-3 is E11D45E19DC5
-4 is E11477E1F014F077
-5 is een niet bestaande/gereserveerde toets..

keysim.gif (4290 bytes)
Figuur 3. KeySim Schema Keyboard (C) Xavier & Illiac



Keysim 1.0 - De simulator
De simulator gebruikt de parallele poort (25 pins D-connector) van een pc. Verder moet de hardware verbonden worden aan de 5 pins male keyboard connector. De software is geschreven in Borland C 3.1. De software draait onder dos. Gebruik in een dos-box onder Windows is niet aan te bevelen. De software haalt de te simuleren toetsen uit een woordenlijst. (RARA waar hebben we dit voor gebruikt ?) De software is natuurlijk aan te passen, zodat deze zelf woorden kan genereren.

Download hier de software & sourcecode.

Bekende bugs
- Als de simulator bij het opstarten er al in zit geeft de computer de melding dat er geen toetsenbord aanwezig is.
Opl.: De computer stuurt na het opstarten een reset naar het toetsenbord en wacht dan op antwoord. Krijgt hij deze niet, dan geeft hij de melding dat er geen toetsenbord aanwezig is. De software houd hier geen rekening met deze reset en zal dus geen antwoord geven. Bij het opstarten zal er dus een echt toetsenbord aan de pc moeten zitten. Na het opstarten kan op ieder gewenst moment eenvoudigweg het toetsenbord vervangen worden door de simulator.

Geraadpleegde Literatuur
- Philips Semiconductors Microcontroller products. AN434.
- PC Keyboard FAQ.

Disclaimer
De informatie op deze pagina's is alleen bedoeld voor educatieve doeleinden. Ik (Xavier) accepteer geen enkele verantwoordelijkheid met betrekking tot de informatie op deze pagina's. Eventuele schade die ontstaan is door informatie die op deze pagina's, is geheel eigen schuld omdat de informatie alleen voor educatieve doeleinden bedoeld is. Het is de verantwoordelijkheid van de gebruiker zelf te onderzoeken of hij/zij bij gebruik van informatie op deze pagina's niet handelt in strijd met de wet. De images op deze pagina's mogen alleen gebruikt worden in combinatie met deze pagina's. De pagina's mogen alleen elders op het internet gepubliseerd worden (gemirrord), mits ongewijzigd, volledig intact en onder vermelding van het originele adres. Elke andere vorm van publikatie of reproduktie is niet toegestaan zonder uitdrukkelijke schriftelijke toestemming van de auteur. Er mogen tevens geen delen van deze pagina's gepubliseerd worden zonder uitdrukkelijke schriftelijke toestemming van de auteur. De Keyboard simulator en de bijbehorende software zijn beide copyright van de auteurs. De software mag gebruikt en veranderd worden mits de juiste credits gegeven worden. Er is echter 1 uitzondering de software mag in zowel in originele als gewijzigde vorm niet commercieel gebruikt worden.

De informatie in 't Klaphek dient slechts een educatief doel. Gebruik van deze informatie zou strafbaar kunnen zijn. De redaktie wijst iedere verantwoordelijkheid voor gebruik door lezers van de in 't Klaphek opgenomen informatie af. De mening van een auteur weerspiegelt niet noodzakelijkerwijs de mening van de redaktie of uitgever.