Scan Codes

Tabella dei codici di scansione della tastiera

Ogni volta che si preme o si rilascia un tasto, l'hardware di controllo della tastiera memorizza, in un apposito buffer, lo Scan Code del tasto stesso; lo Scan Code è un codice formato in genere da 1 solo byte, che identifica univocamente il tasto appena premuto o rilasciato. Tale codice è uguale per tutti i PC, ed è quindi assolutamente indipendente dal simbolo stampato sul tasto.
Il bit più significativo dello Scan Code, vale 0 se il tasto è stato premuto, vale 1 se il tasto è stato rilasciato; ad esempio:

Scan Code [Esc] premuto = 00000001b = 01h
Scan Code [Esc] rilasciato = 10000001b = 81h


Ai nuovi tasti presenti sulle tastiere estese, viene associato uno Scan Code formato, in genere, da 2 byte; questa situazione è riconoscibile dal fatto che il primo byte vale E0h.

Per indicare alla CPU che l'utente ha premuto o rilasciato un tasto, l'hardware della tastiera genera un apposito segnale che viene inviato alla linea IRQ1 (interrupt request n. 1) del master PIC (Programmable Interrupt Controller principale); il master PIC invia una richiesta di interruzione alla CPU, la quale, dopo aver interrotto il programma in esecuzione, risponde con un segnale di via libera.
Il master PIC invia alla CPU una richiesta di chiamata alla ISR (Interrupt Service Routine) associata al vettore di interruzione n. 09h (INT 09h); questa ISR viene installata dal DOS, ed ha il compito di leggere, dalla porta 60h, lo Scan Code generato dalla tastiera.
Ai tasti su cui si trova stampato un numero, una lettera dell'alfabeto o un segno di punteggiatura, la ISR associa il corrispondente codice ASCII da 1 byte; ai tasti speciali (come i tasti freccia, il tasto [Canc], i tasti [PgUp] e [PgDown], etc), la ISR associa un apposito codice a 2 byte, che non ha niente a che vedere con i codici ASCII (in tal caso, il primo byte vale sempre 00h).
Una volta che la ISR ha terminato il proprio compito, restituisce il controllo alla CPU che può così ripristinare il programma precedentemente interrotto; a questo punto, tutte le informazioni relative al tasto premuto, sono disponibili per il programma in esecuzione.

La tabella seguente mostra gli Scan Codes e il codice in esadecimale associato ad ogni Scan Code per il tasto base e per le combinazioni tra tasto base e i tasti [Shift], [Ctrl], [Alt]; l'ultima colonna si riferisce al tastierino numerico ([Bloc Num] attivato).

Scan
Code
BaseShiftCtrlAltBloc Num
01 XX1BH = ESC XX1BH = ESC XX1BH = ESC N/A ----
02 XX31H = 1 XX21H = ! N/A 7800H = 1 ----
03 XX32H = 2 XX40H = @ 0300H = NUL 7900H = 2 ----
04 XX33H = 3 XX23H = # N/A 7A00H = 3 ----
05 XX34H = 4 XX24H = $ N/A 7B00H = 4 ----
06 XX35H = 5 XX25H = % N/A 7C00H = 5 ----
07 XX36H = 6 XX5EH = ^ XX1EH = RS 7D00H = 6 ----
08 XX37H = 7 XX26H = & N/A 7E00H = 7 ----
09 XX38H = 8 XX2AH = * N/A 7F00H = 8 ----
10 XX39H = 9 XX28H = ( N/A 8000H = 9 ----
11 XX30H = 0 XX29H = ) N/A 8100H = 0 ----
12 XX2DH = - XX5FH = _ XX1FH = US 8200H = - ----
13 XX3DH = = XX28H = + N/A 8300H = = ----
14 XX31H = BS XX08H = BS XX7FH = DEL N/A ----
15 XX09H = HT 0F00H = BT N/A N/A ----
16 XX71H = q XX51H = Q XX11H = DC1 1000H = Q ----
17 XX77H = w XX57H = W XX17H = ETB 1100H = W ----
18 XX65H = e XX45H = E XX05H = ENQ 1200H = E ----
19 XX72H = r XX52H = R XX12H = DC2 1300H = R ----
20 XX74H = t XX54H = T XX14H = DC4 1400H = T ----
21 XX79H = y XX59H = Y XX19H = EMB 1500H = Y ----
22 XX75H = u XX55H = U XX15H = NAK 1600H = U ----
23 XX69H = i XX49H = I XX09H = HT 1700H = I ----
24 XX6FH = o XX4FH = O XX0FH = SI 1800H = O ----
25 XX70H = p XX50H = P XX10H = DLE 1900H = P ----
26 XX5BH = [ XX7BH = { XX1BH = ESC N/A ----
27 XX5DH = ] XX7DH = } XX1DH = GS N/A ----
28 XX0AH = CR XX0AH = CR XX0AH = LF N/A ----
29 [Ctrl] ---- ---- ---- ----
30 XX61H = a XX41H = A XX01H = S0H 1E00H = A ----
31 XX73H = s XX53H = S XX13H = DC3 1F00H = S ----
32 XX64H = d XX44H = D XX04H = EOT 2000H = D ----
33 XX66H = f XX46H = F XX06H = ACK 2100H = F ----
34 XX67H = g XX47H = G XX07H = BEL 2200H = G ----
35 XX68H = h XX48H = H XX08H = BS 2300H = H ----
36 XX6AH = j XX4AH = J XX0AH = LF 2400H = J ----
37 XX6BH = k XX4BH = K XX0BH = VT 2500H = K ----
38 XX6CH = l XX4CH = L XX0CH = FF 2600H = L ----
39 XX3BH = ; XX3AH = : N/A N/A ----
40 XX27H = , XX22H = " N/A N/A ----
41 XX60H = ' XX7EH = ~ N/A N/A ----
42 [Shift sin] ---- ---- ---- ----
43 XX5CH = \ XX7CH = | XX1CH = FS3 N/A ----
44 XX7AH = z XX5AH = Z XX1AH = SUB 2C00H = Z ----
45 XX78H = x XX58H = X XX18H = CAN 2D00H = X ----
46 XX63H = c XX43H = C XX03H = ETX 2E00H = C ----
47 XX76H = v XX56H = V XX16H = SYN 2F00H = V ----
48 XX62H = b XX42H = B XX02H = STX 3000H = B ----
49 XX6EH = n XX4EH = N XX0EH = SON 3100H = N ----
50 XX6DH = m XX4DH = M XX0DH = CR 3200H = M ----
51 XX2CH = , N/A N/A N/A ----
52 XX2EH = . XX3EH = > N/A N/A ----
53 XX2FH = / XX3FH = ? N/A N/A ----
54 [Shift des] ---- ---- ---- ----
55 XX2AH = * [Stamp] 7200H = N/A ----
56 [Alt] N/A N/A N/A ----
57 XX20H = SP XX20H = SP XX20H = SP XX20H = SP ----
58 [Maiusc.] [Maiusc.] N/A [Maiusc.] ----
59 3B00H = F1 5400H = F1 5E00H = F1 6800H = F1 ----
60 3C00H = F2 5500H = F2 5F00H = F2 6900H = F2 ----
61 3D00H = F3 5600H = F3 6000H = F3 6A00H = F3 ----
62 3E00H = F4 5700H = F4 6100H = F4 6B00H = F4 ----
63 3F00H = F5 5800H = F5 6200H = F5 6C00H = F5 ----
64 4000H = F6 5900H = F6 6300H = F6 6D00H = F6 ----
65 4100H = F7 5A00H = F7 6400H = F7 6E00H = F7 ----
66 4200H = F8 5B00H = F8 6500H = F8 6F00H = F8 ----
67 4300H = F9 5C00H = F9 6600H = F9 7000H = F9 ----
68 4400H = F10 5D00H = F10 670FH = F10 7100H = F10 ----
69 [Bloc Num] [Bloc Num] [Pause] N/A ----
70 [Bloc Scorr]N/A 0000H = [Break] N/A ----
71 4700H = [Inizio] XX37H = 7 7700H = [ClrScr] N/A XX37H = 7
72 4800H = [Su] XX38H = 8 N/A N/A XX38H = 8
73 4900H = [Pg Su] XX39h = 9 8400H = [Inizio] N/A XX39H = 9
74 XX2DH = - XX2DH = - XX01H = N/A N/A XX2DH = -
71 4B00H = [Sinistra] XX34H = 4 7300H = [ParSin] N/A XX34H = 4
76 N/A XX35H = 5 N/A N/A XX35H = 5
77 4D00H = [Destra] XX36H = 6 7400H = [ParDes] N/A XX36H = 6
78 XX28H = + XX28H = + N/A N/A XX28H = +
79 4F00H = [Fine] XX31H = 1 7500H = [CancLin]N/A XX31H = 1
80 5000H = [Giù] XX32H = 2 N/A N/A XX32H = 2
81 5100H = [Pg Giù] XX33H = 3 7600H = [CancPar]N/A XX33H = 3
82 5200H = [Ins] XX30H = 0 N/A N/A XX30H = 0
83 5300H = [Canc] XX2EH = . Boot Boot XX2EH = .

Note: N/A = non disponibile, XX = byte non significativo del codice