Avatar billede gobbles Nybegynder
21. maj 2006 - 00:23 Der er 4 kommentarer

Hvorfor sendes der 3 bytes med et PS/2 keyboard?

Hej

Dette spørgsmål er mest af nysgerrighed...

Jeg har skrevet en PS/2 driver så jeg kan bruge et "almindeligt" keyboard sammen med min Z8 microcontroller.
Jeg læste lidt op på teorien bag PS/2 protokollen og lurede signalet af med et oscilliscop og det virker fint for alle de gængse taster.

Mit spørgsmål er nu:

Keyboardet sender ved tryk, en kode for hvilken tast der er trykket, derefter sendes en "tast sluppet" kode og tilsidst sendes koden for hvilken tast igen.

Jeg skal have implementeret shift, ctrl osv. og tror bedre jeg kan gøre dette hvis jeg forstår hvorfor keyboardet sender de 3 koder og ikke bare scankoden(tastens ID) og en "tast sluppet" kode.

Håber ikke det var for kryptisk :)
Tak..
Avatar billede t-bee Novice
21. maj 2006 - 10:40 #1
Hvis du holder en knap inde, sender den så kun tastekoden en gang, eller gentages den mange gange, ellers kan forklaringen vel være denne (bare et gæt).
Eks. Alt + Tab burde så se således ud:
AltVærdi-TabVærdi-TastSluppet-TabVærdi-TastSluppet-AltVærdi

Man kan på den måde også se at f.eks. en piletase holdes nede uden at belaste processoren, for man ved den er trykket ned til man modtager TastSluppet-PilVærdi.

Stemmer dette med hvad du kan måle?
Avatar billede gobbles Nybegynder
21. maj 2006 - 14:45 #2
Jeg kan godt li processor vinklen :)

Men hvis jeg holder en tast nede bliver denne tast sendt gentagende gange indtil den slippes og så sendes tast sluppet og værdien igen.
Frekvensens for keyboards ligger mellem 10 og 30 KHz så der ryger ret mange værdier afsted hvis man holder en tast inden 2 sek.

Alt+tab bliver feks : alt alt alt alt alt tab tab tab tab tast sluppet tab alt alt alt tast sluppet alt .... hvis man gør det i et "normalt*" tempo.

Piletasterne er endnu værre.. alle taster til højre for det egentlige keyboard (delete, pageUp, pageDown, piletaster og numpaden) har specielle scankoder(værdier) på op til 4 bytes.. feks. 0xE0 0x16 0x3A 0x13 ... så skal man diagonalt op til højre ryger der ret mange koder afsted...
Avatar billede t-bee Novice
21. maj 2006 - 14:58 #3
Men derfor burde det vel heller ikke være så galt at implementere, hvis du kører det interruptdrevet og laver en sammenligning mellem forrige og modtagne værdi, så kan du smide alle dem væk der er ens, og behandle data bagefter. Dette er bare en idé, har ikke prøvet det, men du kan vel så lave en struct eller noget for 'Ctrl' kombinationer, og deri indbygge en struct for 'Ctrl+Alt' koder hvis du også har brug for det, osv. så tror jeg du kan lave nogle hurtige opslag, men der er jo altid mange løsninger, skriv gerne hvordan du gør hvis du finder på en god måde!
Avatar billede gobbles Nybegynder
21. maj 2006 - 16:04 #4
Nej jeg tror som ikke det bliver alt for svært, men scankoden kan jeg jo ikke skrive ud.. den skal oversættes til en ASCII kode før det giver mening.. så jeg har alle scankoderne sat ind i et array, de er sat ind således at deres plads svarer til ASCII koden..

feks. står scankoden for 'r' på plads 114 ...så:

void print_char(char value)
{
    for(i=0;i<=127;i++)
    {
        if(scan_array[i] == value)
        {
            printf("%c",i);
            break;
        }
    }
}
hvor scan_array er alle scankoderne..

Jeg har så fundet ud af at i ASCII tabellen ligger alle special tegnene på 1,2,3,4 -osv. tasterne starter fra 0x41 og selve 1,2,3 osv. starrter ved 0x61 .. det samme gælder store og små bogstaver... så hvis shift eller caps lock er blevet trykket kan jeg nøjes med at & med 0x20 ....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester