Közvetlen munka a billentyűzet

Közvetlen munka a billentyűzet

Mindenki tudja, mi a billentyűzet és mi az, de nem mindenki tudja, hogyan és mi történik, ha megnyom egy gombot.

Ebben a cikkben lesz szó az alacsony szintű munka a billentyűzet és példát végrehajtása egyszerű billentyűzet megszakítás kezelő valós módban (driver).

Ha rákattint bármelyik gombot, vagy a billentyűzet elektronika generál a leolvasó kódot a kulcs hossza 1-6 bájt, ami nyerhető olvasás IO port 0x60. Scan-kód - egy egyedi számot, amely egyedileg azonosítja a billentyűt nyom, de nem az ASCII kódot. Scan-kódok két típusa van: ha megnyomja a gombokat által generált úgynevezett Make-kódot, ha a szabadba, Break-kódot. Ezek csak annyiban különbözik, hogy a kód szünet szignifikáns bit minden egyes bájt állítva. Scan kódokat csoportokra osztjuk: a hagyományos, kiterjesztett, és a kiegészítő Szünet kulcskódot. Normál szkennelés kód áll egy byte fejlett - 2 bájt, amelyek közül az első - 0xE0. Kiegészítő kód hossza - 2-4 bájt. Azt is kezdődik 0xE0. Nagyon sokat ki a kerékvágásból, hogy kiütötte Szünet - ez az egyetlen kulcs, egy kód, amely áll 6 byte, és a Break-kód nem.

A kezelő két üzemmódban működnek: Közvéleménykutató és megszakítja. Én figyelembe véve csak a második mód, mivel az első kevésbé hatásos és könnyebb végrehajtás. Ha van olyan adat fordul elő, hogy a kérelem IRQ1 interrupt a beviteli billentyűzet puffer. Eltekintve a leolvasó kódok, a billentyűzet továbbítja számítógépes speciális kódokat, amikor parancsokat hajt végre (például megváltoztatja a status LED).

Ennek során a cikk feltételezi, hogy a billentyűzet „default” mód: meg egy sor szkennelési kódok HALMAZ2, a legtöbb kulcs működik az automatikus üzemmódban, stb ...

Táblázat billentyűzet leolvasó kódok:

Ha egy közelebbi pillantást a keycode kulcsok Pause (E1 1D 45 E1 9D C5), lehet észrevenni, hogy az első 3 bájt Make-kódot, a második szünet-kódot. Azaz billentyűzet, ha megnyomja azonnal generálja a kódot, majd lenyomja és szorította. A jövőben ez egy kicsit könnyebb az életünk.

Ha lenyomva tartja, akkor a beállított idő után, az úgynevezett idő automatikus ismétlés, szkennelés kód kulcsa meg kell ismételni a gyakorisága automatikus ismétlés. Autorepeat További vizsgálati kódokat tartalmaz két byte négy helyett. Például, bájtok sorozata, amikor tartására és elengedésére a kulcsokat Page Up (E0 2A E0 49) a következő: 2A E0 E0 E0 49 49 E0 49 49 E0 E0 E0 49 49 49 E0 E0 C9 E0 AA. Megjegyzés: ha a gomb elengedésekor egy további kódsor van vége - a jele extra kód (E0 AA) jön a végén, nem az elején.

A következő pozícióját a táblázat vizsgálat kódok egyedileg elfoglalt, és nem lehet használni más kulcsokat (és ennek megfelelően, elérhetőség):

  • normál leolvasó kódok: [0x01 - 0x53], [0x57 - 0x58]
  • fokozott: [0x1C - 0x1D], 0x35, 0x38, [0x5B - 0x5F], 0x63
  • Kiegészítő: 0x37, [0x47 - 0x49], 0x4B, 0x4D, [0x4F - 0x53]

Minden fokozott kulcskód megelőzi byte 0x0E, és további - bytesorozatot 0xE0, 0x2A, 0xE0.

Ha megoldjuk a problémát fejjel, akkor meg kell ellenőrizni minden bájt kapott a billentyűzetet. És mivel a byte egy sor közös kód átfedés az utolsó bájt a többi készlet (ugyanazt az értéket), további kódokat, amikor megjelent a felborult pár megszakítás történik oly sokszor, hány bájtot a leolvasó-kódot, még mindig a szünet, majd meghatározni, hogy mi a gomb meg lett nyomva, ez nem túl könnyű. Végső soron ezek a szempontok vezet a megvalósításához egy halom emészthetetlen ág.

Őszintén szólva, én el sem tudja képzelni, mi vezetett a fejlesztők, ami egy ilyen rendetlenség. Ebben a cikkben azt kifejezetten összpontosítson, hogy mindez hogyan rendetlenség a végeredmény egy egyszerűbb és szebb.

Arra figyelmeztet, hogy a leolvasó kód előrehaladott vagy választható, az értékek 0xE0, 0x2A / 0xAA és 0xE1 szünet. Ez a tény világosan jelzi, hogy ezek az értékek sem használja a kulcsok - más módon meghatározni préselt / facsart kulcsfontosságú lenne egyszerűen lehetetlen.

Bemutatjuk a koncepció egy virtuális gomb - egy szám, amely meghatározza a funkcióbillentyűk. Például: Ctrl végrehajtott formájában két fizikai gombok, de a virtuális kódot - ugyanazt.

Saját meghatározása virtuális billentyűk kissé eltérnek a Windowsban használt, bár nagyon hasonlít rájuk.

Hozzon létre egy fordítási táblázatot leolvasó kódok virtuális gombok, amely 256 elem 2 byte. Az első byte, akkor tárolja a virtuális gombot kódot is, míg a második - bizonyos attribútumok.

Ha az összes kód áll egy byte, akkor a junior soraiban a hét értéke ez a bájt lehet egyedileg azonosítani gombot. Azonban a legtöbb kulcs, ez a feltétel teljesül, és az átalakulás lehet csökkenteni a következő szabály: állítsa vissza a MSB, és a kapott értéket használjuk index a fordítás asztalt, amelyen a virtuális kulcs kód-e van nyomva, vagy préselt.

Ahogy nulla értékű bit, minden érték az a [128-255] A fordítás asztal áll a szükségletek. Virtuális szórási kódok és kiegészítő gombokat, akkor tartsa ebben a tartományban. Következőképpen járjon el: ha a vizsgálat kód további vagy fejlettebb (Felfüggesztés eldobjuk), a készülék beállítása az MSB, hogy az utolsó bájt.

Minden bonyolítja az a tény, hogy közben egy megszakítási kapunk csak egy byte leolvasó kódot, és így könnyen telepíthető vezető utolsó byte-mentesítés nem sikerül.

Kezdjük azzal, figyelembe véve további kulcsokat. Ők minden kezdődik egy byte 0xE0. Az előírt megváltoztassuk korábban szabály: ha a virtuális kódot kapott fordítási táblázatot nulla, akkor a virtuális kulcs kód nem áll készen, és a leolvasó kódot még nem teljesen érkezett. Elöntve a MSB származó 0xE0, kapunk egy értéket 0x60 (ami szintén nem használják ugyanazt a kulcsot), amelyeket fel lehet használni, mint egy index, amely tárolja a 0 értéket Amikor a következő megszakítás feldolgozását megkapjuk az utolsó bájt szkennelési kódot, és melyeket állítsa be az MSB. A legegyszerűbb módja ennek módosításával az átváltási szabály. Emlékezzünk arra, hogy már több, bájtok attribútumok a táblázatban, amely még mindig nem vesz részt. Az új szabály a következőképpen néz ki: minden alkalommal, amikor egy értéket a táblázatban tárolja egy változóban, és megalakult az index fogja használni bármilyen kategóriába tartozó byte attribútumok, tükrözve, hogy változtatni kell az MSB kapott bájt.

Most melyik kategóriába fogjuk használni, és hogyan kell használni, így az index. Mint mondtam, be kell állítani a legjelentősebb bit. Kiderült, minden nagyon egyszerű és szép: a MSB attribútumok kivett változót át az MSB kapott bájt.

Nézzük meg az összes fenti példaként Ctrl Jobb gombok (E0 1D):

Hívjuk olyan változó, amely tárolja a virtuális byte-kód és attribútum byte, KeyInfo. Inicializálása értéke 0. Az első bájt értéke kapott 0xE0. Nullázás MSB és szerezzen 0x60. Vegyük az MSB bájt attribútumok változó KeyInfo és mozgassa a legjelentősebb darabja a kapott index: (0xE0 0x7F) | ((KeyInfo >> 8) 0x80). Ennek eredményeképpen megkapjuk 0x60 index, amely az asztalon tárolt virtuális kód értéke nulla, és tulajdonságok a nagy mentesítés: KeyInfo = 0x8000. A következő bájt sorrendben 0x1D: KeyInfo = táblázat [(0x1D 0x7F) | ((KeyInfo >> 8) 0x80)] == 0x9D - így megkaptuk a végleges index, ahol a virtuális kód lesz a táblázatban.

Megyünk tovább - nagyságrendileg további kódokat. ők csak annyiban különbözik, hogy az első 2 bájt értéke 0xE0, 0x2A. A legegyszerűbb módja annak, hogy vétel nem is változtatni kell a szabályokat az index. Miután megkapta 0xE0 byte 0x2A vált 0xAA index, ahol fogjuk tárolni értéke 0, jelezve, hogy a virtuális kulcs kód nem áll készen, és módosíthatja a MSB a következő bájt nem szükséges (mintha ez a szekvencia, és nem volt egyáltalán). A következő 2-bájtsorozatba nem térnek el a kiterjesztett szkennelés kódot, és azok vétel minden készen áll.

Az összes fenti jól működik az előállítására 2 byte helyett 4 autorepeat és fordított sorrendben a párok, amikor megjelent. És ha kiadja az első 2 byte, így a virtuális gombot kódot megnyomja, az utolsó 2 (E0 AA) kerül átalakításra 0x0000 (figyelmen kívül hagyva).

De ahogy már valószínűleg elfelejtette, mi esett meg a Szünet gombot (E1 1D 45) - most nézzük megérteni vele. Ha megyünk az előző számra, és az index 0x61 (0xE1 0x7F) tárolja az értéke 0x8000, akkor megkapjuk a konfliktus joggal kapcsolatos Ctrl'om (E0 1D). Mit tegyünk ebben az esetben? Nos, akkor ismét módosítjuk a szabály, hogy az index: nézd meg a bináris ábrázolása 0x1D - 0001 1101-ben a konfliktusok elkerülésére, lehetséges például, hogy módosítsa az 5., 6., vagy mindkét mentesítés együtt, vagy 7- én és az 1., de ha egyszer elkezdtük, hogy módosítsa a nagy értékű bit, akkor menjünk tovább. Az új szabály lesz az index a következő: (Value 0x7F) | ((KeyInfo >> 8) 0xC0). De a szenvedés a Pause gomb nem ér véget. Szerint az index érték tárolásához 0x61 KeyInfo = 0x4000 (nem 0xC000, hogy nincs konfliktus Applications (E0 5D)), és kövesse az új szabály, kapjuk: (1D 0x7F) | ((KeyInfo >> 8) 0xC0) == 0x5D. De ahogy Szünet kód három bájt, akkor ez az index is kell valamilyen módosító - és az előny: ha Ön a 0x8000, akkor nincs ütközés nem fordul elő, és az index lesz 0xC5 virtuális kódot Szünet.

Annak ellenére, hogy KeyInfo után megváltozott minden fogadott byte, nem probléma, ha megkapta a következő keycode nem merül fel, mivel csak az attribútum byte-módosíthatja a kapott bájt. Ha a végén index kapott módosításával ez a tábla nem kisülések (nullázódik), és nem számít, hogy mi van az első bájt KeyInfo.

Fordítási táblázat:

Az index tárolt nulla értéket 0x7A hogy figyelmen kívül hagyja a választ a billentyűzeten a csapat vétel, de nem ez az egyetlen lehetséges válasz, és mindegyiket nem lehet figyelmen kívül hagyni, ha a táblázat segítségével. De ez a probléma megoldható nagyon egyszerűen, például akkor, ha küld egy paranccsal lehet letiltani megszakítások általában, és dolgozni a felmérés, illetve, hogy van egy változó, jelezve, hogy a parancsot küldte, és sugárzott leolvasó kódok nem kell használni.

Az adás vagyunk teljesen érthető, most nézzük alkalmazzák a még néhány bitet az attribútum byte. Például lesznek tárolva a 0-ik számjegygombhoz kiadás jele - ha elengedi egy lesz. Ahogy mondtam, a virtuális kódot pontosan meghatározza a funkcióbillentyűk, nem annak fizikai helyét. De elképzelhető, hogy ez az információ szükséges lehet, az 1. kategóriába lesz a jele, hogy a kulcs jobbra.

A vizsgálat például valósít billentyűzet megszakítás kezelő (nincs parancs), amely információkat jelenít meg, ha megnyomja, vagy meg egy gombot, hogy milyen volt a kulcs.

P. S. konstruktív kritikát, javítások és kiegészítések rendkívül szívesen.

Kapcsolódó cikkek