Lucrarea nr. 3
 

Tastatura


Introducere

Schema generală a unei tastaturi mecanice
Tastatura la calculatoarele PC

Tema de laborator


 

1. Introducere

Cel mai răspândit dispozitiv de introducere a textului pe calculator este tastatura. La începuturile calculatoarelor, când s-a simțit nevoia existenței unui dispozitiv pentru introducerea textului în calculator, a fost folosit modelul mașinii de scris, datorită largii sale răspândiri (cu alte cuvinte aceasta a fost preferința utilizatorilor la momentul respectiv). De atunci tastatura QWERTY a fost considerată ca dispozitiv standard de intrare pentru un calculator, iar în 1971 a fost declarată oficial ca tastatura calculatorului. 

2. Schema generală a unei tastaturi mecanice

În acest subcapitol vom intra puțin în detaliile de construcție ale tastaturii.

În figura 1 este prezentată la nivel de principiu schema bloc a unei porțiuni din tastatură, care cuprinde 16 taste împărțite în patru linii și patru coloane, și două LED-uri. Tastatura cuprinde următoarele părți mari componente: matricea de comutatoare, registrul pentru selectarea liniei și aprinderea/stingerea LED-urilor, un tampon pentru citirea comutatorului acționat de pe o anumită linie. Fiecare tastă este un comutator, poziționat pe o anumită linie și o anumită coloană. Pe lângă aceste elemente pasive mai există un controller care monitorizează continuu matricea de comutatoare, iar la acționarea unui comutator, transmite calculatorului codul de scanare (asupra codurilor de scanare vom reveni) asociat tastei apăsate. Această monitorizare se concretizează în executarea repetitivă a următoarelor operații:

Când nu este apăsată nici o tastă de pe linia care se monitorizează, pe toate coloanele este valoarea 1 logic. Când este apăsată o anumită tastă, se închide contactul corespunzător tastei din matricea de comutatoare, iar pe coloana corespunzătoare comutatorului acționat vom avea o valoare de 0 logic. Valorile liniei și coloanei corespunzătoare tastei apăsate intră într-un codificator care returnează codul de scanare al tastei. Când trebuie aprins un LED, se încarcă în registrul de linie valoarea 0 pe poziția corespunzătoare LED-ului.

fig-03-01.gif (5050 bytes)

Figura 3.1 Schema generală a unei tastaturi

3. Tastatura la calculatoarele PC

3.1 Interfața tastatură-calculator

Tastatura IBM este conectată la calculator printr-o interfață serială similară unui port COM. Calculatorul compatibil IBM AT folosește ca interfață un connector DIN cu 5 pini cu următoarele semnale (figura 2):

  1. CLK(Clock)/CTS(Clear To Send) (open-collector);
  2. RxD/TxD/RTS(Request To Send) (open-collector);
  3. Neconectat sau RESET;
  4. GND;
  5. +5V.
fig-03-02.jpg (2552 bytes)Figura 3.2

La calculatorul AT, spre deosebire de XT, interfața cu tastatura este bidirecțională: calculatorul poate trimite comenzi tastaturii, iar tastatura poate trimite date sau starea curentă. Pentru sincronizare se folosește linia de tact CLK, tastatura fiind cea care generează tactul. Frecvența de tact este de aproximativ 10-20 kHz, dar variază de la tastatură la tastatură. Un cuvânt transmis sau recepționat conține 11 biți: 1 bit de start (0 logic), 8 biți de date (începând cu bitul mai puțin semnificativ), 1 bit de paritate (paritate impară) și 1 bit de stop (1 logic). Cei 8 biți de date reprezintă cod de scanare (scan code) asociat unei taste, din care cei mai puțin semnificativi 7 biți identifică tasta apăsată, iar cel mai semnificativ al acestui octet specifică ce anume s-a întâmplat: 0 - s-a apăsat o tastă; 1 - s-a ridicat tasta.

Interfața calculatorului PC/AT cu tastatura are la bază microcontroller-ul 8042.

Transfer sistem-tastatură: Când calculatorul dorește să trimită un octet de comandă tastaturii, activează RTS și dezactivează CTS. Tastatura, dacă nu are un octet de trimis calculatorului, răspunde prin generarea impulsurilor de tact pe linia CLK. Calculatorul trimite comanda serial pe linia TxD pe fiecare front descrescător al impulsului de tact iar informația este preluată de către tastatură pe următorul front crescător. După ce a fost transmis bitul de paritate, controller-ul deconectează linia TxD (este pusă pe 1 logic) și așteaptă încă un impuls de tact.

Transfer tastatură-sistem: Atunci când este apăsată sau ridicată o tastă, tastatura va iniția transferul dacă liniile RTS și CTS sunt inactive (1 logic). Dacă linia CTS este pe 0 logic, octetul de date se va salva într-un buffer intern până când este posibilă transmiterea lui.

Un alt tip de interfață folosită la calculatoarele actuale este PS2. Acest tip de interfață a fost dezvoltat de IBM pentru tastaturi și mouse-ri. Interfața PS2 folosește pentru comunicația cu tastatura un protocol serial sincron folosind semnale TTL. Comunicația este bidirecțională, și este controlată de liniile de tact și date așa cum este prezentat în figura 3.3:

ps2-f1.gif (2072 bytes)

Figura 3.3 Transferul tastatură-sistem

  1. Date
  2. Rezervat
  3. GND
  4. +5V
  5. CLK
  6. Rezervat
ps2f.gif (605 bytes)

Figura 3.4

3.2 Programarea tastaturii

Circuit 8042 are asociate următoarele două adrese de porturi: portul 60H și portul 64H. Portul 60H este pentru scrierea datelor, dar și pentru menținerea compatibilității cu modelele de tastaturi mai vechi. Portul 64H este folosit pentru scrierea de comenzi și date, dar și pentru citirea stării tastaturii. Înainte de a trimite o comandă tastaturii, BIOS-ul îi testează starea (in al,64h) și se asigură dacă nu este apăsată nici o tastă sau dacă tamponul intern nu este plin. Pentru o comandă compusă din mai multe cuvinte este recomandabil ca aceasta să se facă introducând o mică întârziere între două scrieri succesive.

În continuare sunt prezentate o parte din comenzile lui 8042:

În cazul comenzilor pe un singur octet, acestea se transmit tastaturii prin următoarea secvență de cod:

mov al, cmd_code
out 64h, al

fig-03-03.gif (2283 bytes)

Întârzierea:

Cod

Valoare

00

250ms

01

500ms

10

750ms

11

1000ms

Rata de repetiție:

Cod

Valoare

Cod

Valoare

0

30.0

0aH

10.0

1

26.7

0dH

9.2

2

24.0

10H

7.5

4

20.0

14H

5.0

8

15.0

1fH

2.0

Tastatura este setată inițial să înceapă repetiția după 500ms și rata de repetiție e de 10 caractere/sec.

Pentru comenzile care necesită un octet de date se folosește următoarea secvență de cod:

mov al, cmd_code
out 64h, al
mov cx, 2000h ; aproximativ 10ms
loop $
mov al, data_value
out 64h, al

fig-03-04.gif (2338 bytes)

 

3.3 Zona de date ROM-BIOS

În zona de date ROM-BIOS, se mențin datele și variabilele importante pentru rutinele BIOS. Pentru tastatură avem următoarele locații mai importante:

0:0417H – Starea tastaturii

fig-03-05.gif (3991 bytes)

 

0:0418H – Starea tastaturii

fig-03-06.gif (3878 bytes)

0:041aH – adresa de început a buffer-ului de tastatură (indică spre 0:041eH)

0:041cH – adresa de sfârșit a buffer-ului de tastatură (indică până la maxim 0:043dH)

0:041eH – buffer-ul de tastatură. Aici sunt introduse codurile ASCII ale tastelor apăsate. Se pot stoca până la 32 de caractere.

0:0497H – indicatorul pentru LED-uril de lock (fig 7)

3.4 Funcționarea tastaturii

La apăsarea oricărei taste se generează întreruperea hard 09H; rutina de tratare pentru întreruperea 09H citește codul de scanare al tastei apăsate, se decodifică acest cod și, în funcție de tipul tastei, se efectuează operațiile:

Dacă se ține tasta mai mult timp apăsată, după un anumit timp de întârziere (programabil prin comanda 0f3H), se generează întreruperea 09H cu o anumită rată de repetiție (programabilă tot prin comanda 0f3H).

Fiecare tastă din tastatură are asociat un cod de scanare (scan code), care este conținut în cei mai puțin semnificativi 7 biți ai unui octet furnizat de controller-ul de tastatură.

Pentru citirea unui caracter din buffer-ul de tastatură se folosește întreruperea soft 16H. Aceasta, la fiecare apel returnează următorul caracter din buffer-ul de tastatură, deplasând și conținutul buffer-ului cu un caracter la stânga.

 

Tema de laborator

Să se implementeze o aplicație ce realizează:

Exemplu:

Tema 2