Системное программное обеспечение персональных ЭВМ

Прерывание от клавиатуры и скан-коды


7.1. Прерывание от клавиатуры и скан-коды

Работа клавиатуры организована на базе собственного микропроцессора. При нажатии или отпускании любой клавиши генерируется код (скан-код), который записывается в собственную память (аппаратный буфер) клавиатуры. При этом в центральный процессор выдается прерывание 9, сигнализирующее о появлении очередного скан-кода. Программа обработки этого прерывания может теперь прочитать код из клавиатуры. Если она этого не сделает, то сканкоды будут накапливаться в аппаратном буфере и могут быть прочитаны позднее. Чтение скан-кода производится из однобайтного порта 0x60. При выполнении только чтения скан-код не удаляется из аппаратного буфера, и при следующем обращении к порту 0x60 будет прочитан тот же скан-код. Для того, чтобы удалить скан-код из аппаратного буфера, необходимо послать в клавиатуру сигнал подтверждения: на короткое время выставить единицу в старшем разряде однобайтного порта 0 x61 (не разрушая при этом остальных разрядов этого порта). Каждая клавиша имеет собственный уникальный скан-код, в том числе и на 101-клавишной клавиатуре AT, где некоторые клавиши дублируются - например, левая и правая клавиши Shift имеют разные скан-коды. Распределение значений скан-кодов примерно соответствует расположению клавиш на панели клавиатуры. Скан-коды не совпадают с кодировкой внутримашинного представления символов, для которой применяется код ASCII. Преобразование скан-кодов в коды ASCII происходит программными путем. В некоторых источниках имеются расплывчатые формулировки, которые можно трактовать таким образом, что некоторые клавиши или комбинации клавиш (PrintScrn, Ctrl +Break, etc) не имеют скан-кодов - это ни в коем случае не так! Каждая клавиша имеет скан-код, который считывается в компьютер вышеописанным образом, а уж программа обработки этого кода может распорядиться им специальным образом.

Выше упоминалось, что скан-код генерируется и при нажатии, и при отпускании клавиши. Для 84-клавишной клавиатуры XT скан-код отпускания совпадает со скан-кодом нажатия, но содержит дополнительную единицу в старшем разряде.
В источниках можно встретить информацию о том, что клавиатура AT генерирует двухбайтный скан-код при отпускании клавиши, в котором первый байт - 0xF0, а второй совпадает со скан-кодом нажатия. Это справедливо для 84-клавишной клавиатуры AT, но в настоящее время все AT комплектуется 101-клавишной клавиатурой, в которой код отпускания формируется по тем же прави- лам, что и в XT. Правда, в 101-клавишной клавиатуре некоторые дополнительные клавиши имеют скан-коды из 2 и более байт (и каждый байт сопровождается прерыванием 9).
Программный пример 7.1 позволяет определить скан-коды клавиш. Эта программа перехватывает прерывание 9. Обратите внимание на то, что обработчик прерывания представляет собой не дополнение к системному обработчику, а полностью его подменяет. При поступлении прерывания 9 обработчик читает скан-код из порта 0x60 и запоминает его в массиве SC, а затем посылает в клавиатуру сигнал подтверждения и сбрасывает контроллер прерываний. При поступлении скан-кода 1 (это клавиша Esc) обработчик взводит флаг окончания, по которому главная программа восстанавливает вектор и выводит на экран накопленные скан-коды.

Содержание раздела