Глава 9. Подключение клавиатуры и мыши
125
9.3. Подключение клавиатуры
В далекие 1990-е годы мне пришлось разрабатывать клавиатуру XT/AT. От этого
времени осталось только воспоминание о множестве малопонятных последова-
тельностей байтов, отсылаемых из клавиатуры в компьютер. Было бы интересно,
насколько изменился протокол для клавиатуры PS/2. Изучение скудных материалов
по теме в Интернете, а также анализ полученных кодов из подключенной к Arduino
PS/2-клавиатуры позволил выявить следующее.
На каждую принятую от контроллера команду (или — проще сказать — на каждый
принятый байт) клавиатура должна обязательно ответить одним из следующих
байтов:
0xFA
— подтверждение об успешном приеме;
0xFE
— команда принята с ошибкой — вероятно, это ошибка циклической кон-
трольной суммы (CRC).
При получении от контроллера команды
0xFF
(начальная установка) клавиатура
отвечает
0xFA
, а затем сбрасывается и посылает в ответ байт
0xAA
.
В клавиатуру контроллер может послать следующие команды:
0xED
— зажечь или потушить светодиоды CAPS/NUM/SCROLL. Если клавиату-
ра принимает эту команду, то она не пошлет более никаких ответов до тех пор,
пока компьютер не пришлет следующий байт — параметр, который определяет
битовую маску: один бит — это один из светодиодов. Битовая маска для свето-
диодов клавиатуры определена так:
• #define KEYBOARD_CAPS_LOCK_ON 4
• #define KEYBOARD_NUM_LOCK_ON 2
• #define KEYBOARD_SCROLL_LOCK_ON 1
0xF3
—– это тоже двухбайтовая команда. После этой команды следует параметр,
определяющий частоту повтора кодов при нажатой клавише и интервал времени
между нажатием и началом повторов.
После подачи напряжения питания клавиатура посылает код
0xAA
и немедленно го-
това к работе. Она сразу, без дополнительного программирования, готова посылать
коды нажатых клавиш. По умолчанию клавиатура посылает на нажатие клавиши
один байт-код, а на отпускание клавиши два байта. Первый байт в кодах отпуска-
ния клавиши — это префикс отпускания
0xF0
. Например, если нажать и отпустить
клавишу <1>, то клавиатура пошлет последовательность кодов
0x16
,
0xF0
,
0x16
.
Существует еще так называемый
дополнительный код — это префикс
0хE0
. Он по-
сылается вместе с кодами дополнительных клавиш. Например, при нажатии кла-
виши (нецифрового блока) отправляется последовательность
0хE0
,
0x70
,
0хE0
, а при ее отпускании
0xF0
,
0x70
.
До сих пор все более или менее понятно, но, как оказалось позже (при написании
редактора текста — см.
разд. 9.4), это еще не все... Получив от контроллера коман-
ду зажечь светодиод — например, Num_Lock, клавиатура зажигает соответствую-
126
1> Do'stlaringiz bilan baham: |