Открыть сервис

Скан-код клавиши

Скан-код клавиши (англ. 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) для основных клавиш

КлавишаСкан-код (нажатие)Скан-код (отпускание)
A0x1C0xF0 0x1C
B0x320xF0 0x32
Enter0x5A0xF0 0x5A
Пробел0x290xF0 0x29
Shift (левый)0x120xF0 0x12

USB HID usage IDs для тех же клавиш

КлавишаUsage ID (hex)Usage ID (dec)
A0x044
B0x055
Enter0x2840
Пробел0x2C44
Shift (левый)0xE1225

Интересные факты

  • В клавиатурах 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 →