Скан-код клавиши
Скан-код клавиши (англ. scan code, keycode) — это цифровой код, присваиваемый каждой физической клавише клавиатуры компьютера или терминала, который генерируется при её нажатии или отпускании. В отличие от символов (ASCII-кодов), которые зависят от раскладки и нажатия модификаторов (Shift, Ctrl), скан-код жёстко привязан к конкретному положению клавиши на матрице клавиатуры и не меняется в зависимости от выбранного языка или регистра. Скан-коды являются первичным уровнем взаимодействия между аппаратной частью клавиатуры и операционной системой, служа основой для дальнейшей обработки ввода.
История возникновения
Эпоха терминалов и первых ПК
Концепция скан-кода возникла в эпоху электромеханических телетайпов и ранних компьютерных терминалов (1960–1970-е годы). В таких устройствах нажатие клавиши замыкало электрическую цепь, и контроллер преобразовывал положение клавиши в последовательный код. Одним из первых стандартов, заложивших принцип скан-кодов, стала система IBM 3270, где каждой клавише соответствовал уникальный код, передаваемый по кабелю.
IBM PC и стандартизация
С появлением IBM PC (1981) и IBM PC/AT (1984) были разработаны два основных набора скан-кодов, которые стали де-факто отраслевыми стандартами:
- Set 1 (XT-скан-коды) — использовался в клавиатурах IBM PC/XT. Каждой клавише соответствовал один байт (0x01–0x58). При нажатии генерировался код, при отпускании — тот же код, но с установленным старшим битом (0x80).
- Set 2 (AT-скан-коды) — введён с IBM PC/AT. Коды стали двухбайтовыми для некоторых клавиш (например, расширенных — F11, F12, Print Screen). Отпускание кодируется префиксом 0xF0 перед кодом нажатия. Этот набор используется в большинстве современных PS/2-клавиатур.
USB-клавиатуры и HID-протокол
С переходом на USB (конец 1990-х) был разработан стандарт HID (Human Interface Device), в котором скан-коды заменены на usage IDs (идентификаторы использования). Каждая клавиша получила 8-битный код, определённый в спецификации USB HID (например, 0x04 — клавиша A, 0x28 — Enter). Эти коды не зависят от производителя и передаются в отчётах (report descriptors) при каждом нажатии. Несмотря на изменение формата, термин «скан-код» продолжает использоваться для обозначения этих идентификаторов.
Классификация скан-кодов
По типу клавиатуры
- XT-скан-коды (Set 1) — устаревший набор, несовместимый с AT-клавиатурами. Используется в эмуляторах и старых BIOS.
- AT-скан-коды (Set 2) — основной набор для PS/2-клавиатур. Поддерживает все клавиши современных клавиатур, включая мультимедийные.
- USB HID-usage IDs — стандарт для USB-клавиатур. Не требует преобразования в драйвере, так как операционная система напрямую интерпретирует usage ID как виртуальный скан-код.
По механизму генерации
- Make-код — генерируется при нажатии клавиши.
- Break-код — генерируется при отпускании клавиши. В AT-наборе это префикс 0xF0, в XT — код с установленным старшим битом (0x80+).
- Повторный код (typematic) — при удержании клавиши контроллер клавиатуры периодически (с частотой ~10–30 Гц) повторяет make-код, пока клавиша не будет отпущена.
По физическому расположению
- Основные клавиши (буквы, цифры, пробел, Enter, Backspace) — имеют фиксированные скан-коды, одинаковые для всех клавиатур одного стандарта.
- Расширенные клавиши (F11, F12, Print Screen, Scroll Lock, Pause) — в AT-наборе кодируются двумя байтами (например, 0xE0 0x12 для Print Screen).
- Мультимедийные и специальные клавиши (громкость, браузер, калькулятор) — в USB HID имеют собственные usage IDs, но в PS/2 часто эмулируются через комбинации стандартных клавиш.
Устройство и принцип работы
Матрица клавиатуры
Внутри клавиатуры клавиши соединены в матрицу — строки и столбцы. Контроллер (микроконтроллер) последовательно опрашивает строки, подавая на них напряжение, и считывает сигнал со столбцов. При нажатии клавиши в определённой строке и столбце замыкается контакт, и контроллер определяет её координаты. По таблице соответствия (lookup table) эти координаты преобразуются в скан-код.
Передача кода
- PS/2-интерфейс: скан-код передаётся по двухпроводной шине (данные + тактовый сигнал) последовательно, по 11 бит (старт-бит, 8 бит данных, бит чётности, стоп-бит). Контроллер клавиатуры (i8042) на материнской плате принимает код и помещает его в буфер, откуда его забирает драйвер.
- USB-интерфейс: клавиатура отправляет 8-байтовый отчёт (report), в котором первые 2 байта — модификаторы (Ctrl, Shift, Alt, Win), а остальные 6 — скан-коды нажатых клавиш (usage IDs). Отчёт передаётся каждый раз, когда состояние клавиш меняется.
Обработка в операционной системе
Драйвер клавиатуры (например, i8042prt.sys в Windows или atkbd в Linux) преобразует аппаратный скан-код в виртуальный скан-код (VK-код) — логический код, понятный приложениям. Виртуальный код затем сопоставляется с символом через таблицу раскладки (layout) и с учётом состояния модификаторов. Например, нажатие клавиши с скан-кодом 0x1E (в AT-наборе — клавиша A) в русской раскладке без Shift даст символ «Ф», а с Shift — «А».
Применение
Идентификация клавиш в приложениях
Многие программы (игры, текстовые редакторы, графические пакеты) используют скан-коды для привязки действий к конкретным клавишам, игнорируя раскладку. Например, в компьютерных играх клавиша WASD всегда отвечает за движение, независимо от того, какая буква на ней напечатана. Это обеспечивается через считывание скан-кода, а не символа.
Макросы и перепрограммирование
Утилиты для настройки клавиатур (например, AutoHotkey, QMK) позволяют переназначать скан-коды. Пользователь может заставить клавишу Caps Lock работать как Ctrl, а клавишу F1 — как комбинацию Ctrl+Alt+Del. Это достигается путём перехвата скан-кода на уровне драйвера или прошивки.
Диагностика и ремонт
Скан-коды используются для тестирования клавиатур. Специальные программы (например, Keyboard Test Utility) отображают скан-код каждой нажатой клавиши, что помогает выявить неисправные контакты или залипшие клавиши.
Эмуляция и виртуализация
В эмуляторах старых компьютеров (например, DOSBox, эмуляторы ZX Spectrum) скан-коды генерируются программно, чтобы имитировать поведение оригинальной клавиатуры. Это позволяет запускать программы, написанные для конкретных аппаратных платформ.
Примеры скан-кодов
AT-скан-коды (Set 2) для основных клавиш
| Клавиша | Скан-код (нажатие) | Скан-код (отпускание) |
|---|---|---|
| A | 0x1C | 0xF0 0x1C |
| B | 0x32 | 0xF0 0x32 |
| Enter | 0x5A | 0xF0 0x5A |
| Пробел | 0x29 | 0xF0 0x29 |
| Shift (левый) | 0x12 | 0xF0 0x12 |
USB HID usage IDs для тех же клавиш
| Клавиша | Usage ID (hex) | Usage ID (dec) |
|---|---|---|
| A | 0x04 | 4 |
| B | 0x05 | 5 |
| Enter | 0x28 | 40 |
| Пробел | 0x2C | 44 |
| Shift (левый) | 0xE1 | 225 |
Интересные факты
- В клавиатурах IBM PC/XT при нажатии клавиши генерировался только make-код, а break-код отсутствовал. Это приводило к тому, что программа не могла определить, удерживается ли клавиша, пока не поступал следующий make-код (при повторном нажатии той же клавиши).
- Скан-код клавиши Pause (Break) в AT-наборе является исключением — он не имеет break-кода и генерирует только make-код при нажатии, что делает его «залипающим» в некоторых эмуляторах.
- В USB HID-протоколе максимальное количество одновременно нажатых клавиш, которое может передать стандартный отчёт, — 6 (без учёта модификаторов). Это ограничение известно как «6KRO» (6 Key Rollover). Для игровых клавиатур существуют расширенные протоколы (например, с 8 байтами данных), позволяющие передавать до 10–12 клавиш.
- В операционной системе Linux скан-коды можно просмотреть в реальном времени с помощью утилиты
showkey -s(для PS/2) илиevtest(для USB). В Windows — через программу KeyTweak или встроенный редактор реестра (разделHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout).
Критика и ограничения
Основной недостаток скан-кодов — их привязка к конкретному стандарту и типу клавиатуры. Например, AT-скан-коды несовместимы с USB HID-usage IDs, что требует преобразования в драйвере. Кроме того, на старых клавиатурах (XT) отсутствовала поддержка расширенных клавиш, что приводило к конфликтам при попытке использовать их в современных системах. В многозадачных средах возможна задержка обработки скан-кодов из-за буферизации, что критично для игр и приложений реального времени.
Источники
- IBM PC/AT Technical Reference (1984)
- USB HID Usage Tables (USB Implementers Forum, версия 1.12)
- «The Keyboard Scan Code Specification» (Microsoft, 1999)
- Документация ядра Linux:
Documentation/input/input.txtиdrivers/input/keyboard/atkbd.c - «PC 97 Hardware Design Guide» (Microsoft, 1997)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →