Скан-код
Скан-код (англ. scan code) — в IBM-совместимых компьютерах код, присвоенный каждой клавише, с помощью которого драйвер клавиатуры распознает, какая клавиша была нажата. При нажатии любой клавиши контроллер клавиатуры распознаёт клавишу и посылает её скан-код в порт 60h. При отпускании клавиши контроллер клавиатуры устаревшего формата IBM PC/XT посылает в тот же порт скан-код, увеличенный на 80h, а более нового формата IBM PC/AT — два байта: F0h и скан-код (скан-коды клавиатуры AT также отличаются от XT, см. таблицу). Некоторые клавиши генерируют не один, а несколько скан-кодов (так, правые Alt, Ctrl, ↵ Enter, обе ⊞ Win, а также ≣ Menu, Insert, Delete, Page Up, Page Down, Home, End, стрелки и все ACPI- и мультимедиа-клавиши генерируют два скан-кода, первый из которых — E0, клавиша PrtScr генерирует 4 скан-кода, а клавиша Pause — даже 6 скан-кодов). Каждый байт, записанный в порт 60h, генерирует аппаратное прерывание int 09h.
Скан-коды жёстко привязаны к каждой клавише на аппаратном уровне и не зависят ни от состояния индикаторов ⇪ Caps Lock, Num Lock и Scroll Lock, ни от состояния управляющих клавиш (⇧ Shift, Alt, Ctrl).
Скан-коды клавиш
Все скан-коды ниже даются в шестнадцатеричной системе.
Большинство скан-кодов на XT-клавиатуре соответствуют физическому местоположению клавиш, начиная с клавиш Esc (код 01) и цифровых клавиш 1-9 (коды 02-0A). К примеру, клавиши второго ряда (Tab ↹ Q W E R T Y U I O P [ ] ↵ Enter) имеют последовательные скан-коды 0F-1C (15-28 в десятичной системе).
На клавиатурах другой раскладки (например, AZERTY) скан-коды соответствуют расположению клавиш: так, у французского A скан-код как у американского Q. Преобразованием скан-кодов в коды нажатых клавиш занимается ОС или BIOS.
Во всех операционных системах фирмы Microsoft, скан коды из набора 2 (AT) преобразуются в скан-коды набора 1 (XT), и все приложения получают уже скан-коды набора 1.
Клавиша | Код нажатия XT | Код отпускания XT | Код нажатия AT | Код отпускания AT |
---|---|---|---|---|
Основная клавиатура | ||||
A | 1E | 9E | 1C | F0,1C |
B | 30 | B0 | 32 | F0,32 |
C | 2E | AE | 21 | F0,21 |
D | 20 | A0 | 23 | F0,23 |
E | 12 | 92 | 24 | F0,24 |
F | 21 | A1 | 2B | F0,2B |
G | 22 | A2 | 34 | F0,34 |
H | 23 | A3 | 33 | F0,33 |
I | 17 | 97 | 43 | F0,43 |
J | 24 | A4 | 3B | F0,3B |
K | 25 | A5 | 42 | F0,42 |
L | 26 | A6 | 4B | F0,4B |
M | 32 | B2 | 3A | F0,3A |
N | 31 | B1 | 31 | F0,31 |
O | 18 | 98 | 44 | F0,44 |
P | 19 | 99 | 4D | F0,4D |
Q | 10 | 90 | 15 | F0,15 |
R | 13 | 93 | 2D | F0,2D |
S | 1F | 9F | 1B | F0,1B |
T | 14 | 94 | 2C | F0,2C |
U | 16 | 96 | 3C | F0,3C |
V | 2F | AF | 2A | F0,2A |
W | 11 | 91 | 1D | F0,1D |
X | 2D | AD | 22 | F0,22 |
Y | 15 | 95 | 35 | F0,35 |
Z | 2C | AC | 1A | F0,1A |
0 | 0B | 8B | 45 | F0,45 |
1 | 02 | 82 | 16 | F0,16 |
2 | 03 | 83 | 1E | F0,1E |
3 | 04 | 84 | 26 | F0,26 |
4 | 05 | 85 | 25 | F0,25 |
5 | 06 | 86 | 2E | F0,2E |
6 | 07 | 87 | 36 | F0,36 |
7 | 08 | 88 | 3D | F0,3D |
8 | 09 | 89 | 3E | F0,3E |
9 | 0A | 8A | 46 | F0,46 |
~ | 29 | 89 | 0E | F0,0E |
- | 0C | 8C | 4E | F0,4E |
= | 0D | 82 | 55 | F0,55 |
\ | 2B | AB | 5D | F0,5D |
[ | 1A | 9A | 54 | F0,54 |
] | 1B | 9B | 5B | F0,5B |
; | 27 | A7 | 4C | F0,4C |
' | 28 | A8 | 52 | F0,52 |
, | 33 | B3 | 41 | F0,41 |
. | 34 | B4 | 49 | F0,49 |
/ | 35 | B5 | 4A | F0,4A |
BS | 0E | 8E | 66 | F0,66 |
Space | 39 | B9 | 29 | F0,29 |
Tab ↹ | 0F | 8F | 0D | F0,0D |
⇪ Caps Lock | 3A | BA | 58 | F0,58 |
Левый ⇧ Shift | 2A | AA | 12 | F0,12 |
Левый Ctrl | 1D | 9D | 14 | F0,14 |
Левый Alt | 38 | B8 | 11 | F0,11 |
Левый ⊞ Win | E0,5B | E0,DB | E0,1F | E0,F0,1F |
Правый ⇧ Shift | 36 | B6 | 59 | F0,59 |
Правый Ctrl | E0,1D | E0,9D | E0,14 | E0,F0,14 |
Правый Alt | E0,38 | E0,B8 | E0,11 | E0,F0,11 |
Правый ⊞ Win | E0,5C | E0,DC | E0,27 | E0,F0,27 |
≣ Menu | E0,5D | E0,DD | E0,2F | E0,F0,2F |
↵ Enter | 1C | 9C | 5A | F0,5A |
Esc | 01 | 81 | 76 | F0,76 |
F1 | 3B | BB | 05 | F0,05 |
F2 | 3C | BC | 06 | F0,06 |
F3 | 3D | BD | 04 | F0,04 |
F4 | 3E | BE | 0C | F0,0C |
F5 | 3F | BF | 03 | F0,03 |
F6 | 40 | C0 | 0B | F0,0B |
F7 | 41 | C1 | 83 | F0,83 |
F8 | 42 | C2 | 0A | F0,0A |
F9 | 43 | C3 | 01 | F0,01 |
F10 | 44 | C4 | 09 | F0,09 |
F11 | 57 | D7 | 78 | F0,78 |
F12 | 58 | D8 | 07 | F0,07 |
PrtScr | E0,2A,E0,37 | E0,B7,E0,AA | E0,12,E0,7C | E0,F0,7C,E0,F0,12 |
Alt+PrtScr | 54 (вместо PrtScr,
код для клавиши Alt генерируется отдельно) |
D4 (вместо PrtScr,
код для клавиши Alt генерируется отдельно) |
? | ? |
Ctrl+PrtScr,
⇧ Shift+PrtScr (SysReq) |
E0,37 (вместо PrtScr,
код для Ctrl или ⇧ Shift генерируется отдельно) |
E0,B7 (вместо PrtScr,
код для Ctrl или ⇧ Shift генерируется отдельно) |
? | ? |
Scroll Lock | 46 | C6 | 7E | F0,7E |
Pause | E1,1D,45, E1,9D,C5 | — | E1,14,77, E1,F0,14,F0,77 | — |
Ctrl+Break
(Ctrl+Pause) |
E0,46 (вместо Break,
код для клавиши Ctrl генерируется отдельно) |
E0,C6 (вместо Break,
код для клавиши Ctrl генерируется отдельно) |
? | ? |
Insert | E0,52 | E0,D2 | E0,70 | E0,F0,70 |
Home | E0,47 | E0,C7 | E0,6C | E0,F0,6C |
End | E0,4F | E0,CF | E0,69 | E0,F0,69 |
Page Up | E0,49 | E0,C9 | E0,7D | E0,F0,7D |
Page Down | E0,51 | E0,D1 | E0,7A | E0,F0,7A |
Delete | E0,53 | E0,D3 | E0,71 | E0,F0,71 |
↑ | E0,48 | E0,C8 | E0,75 | E0,F0,75 |
← | E0,4B | E0,CB | E0,6B | E0,F0,6B |
↓ | E0,50 | E0,D0 | E0,72 | E0,F0,72 |
→ | E0,4D | E0,CD | E0,74 | E0,F0,74 |
Цифровая клавиатура | ||||
Num Lock | 45 | C5 | 77 | F0,77 |
/ | E0,35 | E0,B5 | E0,4A | E0,F0,4A |
* | 37 | B7 | 7C | F0,7C |
- | 4A | CA | 7B | F0,7B |
+ | 4E | CE | 79 | F0,79 |
↵ Enter | E0,1C | E0,9C | E0,5A | E0,F0,5A |
. | 53 | D3 | 71 | F0,71 |
0 | 52 | D2 | 70 | F0,70 |
1 | 4F | CF | 69 | F0,69 |
2 | 50 | D0 | 72 | F0,72 |
3 | 51 | D1 | 7A | F0,7A |
4 | 4B | CB | 6B | F0,6B |
5 | 4C | CC | 73 | F0,73 |
6 | 4D | CD | 74 | F0,74 |
7 | 47 | C7 | 6C | F0,6C |
8 | 48 | C8 | 75 | F0,75 |
9 | 49 | C9 | 7D | F0,7D |
Клавиши ACPI | ||||
Power | E0,5E | E0,DE | E0,37 | E0,F0,37 |
Sleep | E0,5F | E0,DF | E0,3F | E0,F0,3F |
Wake | E0,63 | E0,E3 | E0,5E | E0,F0,5E |
Мультимедиа клавиши | ||||
Управление проигрывателем | ||||
Следующий трек | E0,19 | E0, 99 | E0, 4D | E0,F0,4D |
Предыдущий трек | E0,10 | E0, 90 | E0,15 | E0,F0,15 |
Остановить | E0,24 | E0,A4 | E0,3B | E0,F0,3B |
Проигрывать/пауза | E0,22 | E0,A2 | E0,34 | E0,F0,34 |
Звук вкл/откл | E0,20 | E0,A0 | E0,23 | E0,F0,23 |
Увеличить громкость | E0,30 | E0,B0 | E0,32 | E0,F0,32 |
Уменьшить громкость | E0,2E | E0,AE | E0,21 | E0,F0,21 |
Управление браузером | ||||
Поиск | E0,65 | E0,E5 | E0,10 | E0,F0,10 |
Домашняя страница | E0,32 | E0,B2 | E0,3A | E0,F0,3A |
Назад | E0,6A | E0,EA | E0,38 | E0,F0,38 |
Вперед | E0,69 | E0,E9 | E0,30 | E0,F0,30 |
Стоп | E0,68 | E0, E8 | E0,28 | E0,F0,28 |
Обновить | E0,67 | E0,E7 | E0,20 | E0,F0,20 |
Закладки | E0,66 | E0, E6 | E0,18 | E0,F0,18 |
Управление приложениями | ||||
Media Select | E0,6D | E0,ED | E0,50 | E0,F0,50 |
Электронная почта | E0,6C | E0,EC | E0,48 | E0,F0,48 |
Калькулятор | E0,21 | E0,A1 | E0,2B | E0,F0,2B |
Мой компьютер | E0,6B | E0,EB | E0,40 | E0,F0,40 |
В чистом DOS клавиша Pause генерирует 6 скан-кодов при нажатии и не генерирует скан-кодов при удержании и отпускании. Под Windows же (в том числе и в VMware и DOSBox) клавиша Pause работает так же, как и любая другая: при нажатии и удержании генерирует скан-коды E1,1D,45, а при отпускании — E1,9D,C5.
Коды клавиш ↓ , ↑ , ← , → , Home , End , Page Up , Page Down , Insert , Delete могут содержать кроме указанных в таблице дополнительно: E0,2A — при нажатии (до основного кода), E0,AA — при отпускании (после основного кода). А при удержании клавиши ⇧ Shift наоборот: E0,AA — при нажатии (до основного кода), E0,2A — при отпускании (после основного кода), код клавиши ⇧ Shift при этом генерируется отдельно.
См. также
- ASCII код
Ссылки
- Keyboard Scan Codes (XT) Архивная копия от 27 января 2012 на Wayback Machine
- Keyboard Scan Codes (AT) Архивная копия от 21 января 2012 на Wayback Machine
- Документация по USB HID, включая скан-коды клавиш