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