Здесь приводятся выдержки из файла kbd.def.
Основой послужила книга «Руководство по архитектуре IBM PС AT» / Ж.К. Голенкова, А.В. Заболоцкий, М.Л. Мархасин и др.; Под общ. ред. М.Л. Мархасина. — Минск: ООО «Консул», 1992. — 949 c.: ил.
Структура контроллера клавиатуры 8042, установленного на материнской плате приведена ниже
Выходной буфер (8-разрядный регистр) доступен системе только как читаемый порт с адресом 60h, он используется для передачи системе полученных от клавиатуры кодов сканирования и прочитанных по команде системы байтов данных. Выходной буфер должен быть прочитан только после того, как установлен признак "буфер полон" (Разряд 0 регистра состояния).
Входной буфер (8-разрядный регистр) доступен системе только как записываемый порт с адресом 60h (устанавливается флажок, указывающий на последующую запись данных) или 64h (устанавливает флажок, указывающий на последующую запись команды). Данные, записанные в порт 60h, отсылаются клавиатуре, если не являются командой контроллера. Данные должны быть записаны во входной буфер только после того, как сброшен признак "буфер полон" (разряд 1 регистра состояния).
Регистр состояния клавиатуры (8 разрядов) доступен системе только как читаемый порт с адресом 64h. Назначение разрядов приведено ниже.
Разряд | Назначение |
---|---|
0 | 0 — В выходном буфере нет новых данных; 1 — Контроллер поместил новые данные в выходной буфер, но система ещё не приняла их, когда система прочитает значение порта 60h, разряд станет нулевым. |
1 | 0 — входной буфер пуст (порт 60h или 64h) 1 — система поместила данные во входной буфер, но контроллер их ещё не принял. После того, как контроллер их прочитает этот разряд станет нулевым. |
2 | 0 — сброс по включению питания (холодный пуск); 1 — программный сброс (горячий пуск). |
3 | 0 — во входном буфере данные (запись производилась по адресу 60h) 1 — во входном буфере команда (запись производилась по адресу 64h) |
4 | 0 — защитный замок закрыт; 1 — защитный замок открыт |
5 | 1 — Тайм-аут передачи. Передача данных, начатая контроллером не завершена |
6 | 1 — Тайм-аут приёма. Передача данных, начата клавиатурой, но не завершена в запрограммированный промежуток времени (2 мс) |
7 | 1 — Ошибка паритета. Последний байт данных был получен от клавиатуры с чётным паритетом. Клавиатура должна посылать байт с нечётным паритетом. |
В приведённой ниже таблице указаны причины ошибки при различных комбинациях пятого, шестого и седьмого битов регистра состояния.
Разряды | Причина ошибки | ||
7 | 6 | 5 | |
0 | 0 | 1 | Нет синхроимпульса |
0 | 1 | 1 | Есть синхроимпульс, нет отклика |
1 | 0 | 1 | Есть синхроимпульс, ошибка паритета |
В файле kbd.def определены следующие константы для портов:
QKBDState equ 64h ; Порт состояния контроллера клавиатуры (только читаемый) QKBDIn equ 64h ; Адрес входного буфера (только записываемый) QKBDOutp equ 60h ; Адрес выходного буфера (только читаемый) QeKBDCtrl1 equ 64h ; Командный порт контроллера клавиатуры 1. В него ; помещается первый командный байт QeKBDCtrl2 equ 60h ; Командный порт контроллера клавиатуры 2. В него ; помещается второй командный байт
Макросы в kbd.def проверяют следующие биты регистра состояния (Cm… — маска, F… — номер бита).
CmKBDOutFull equ 00000001b ; Выходной буфер полон, FKBDOutFull equ 0 ; если бит установлен CmKBDInpFull equ 00000010b ; Входной буфер полон, FKBDInpFull equ 1 ; если бит установлен CmKBDErr equ 11100000b ; Ошибка данных работы с клавиатурой FKBDErr equ 5
Для работы с контроллером клавиатуры в файле kbd.def определены следующие макросы.
KBDInpBufFree BufFull
— проверяет, свободен ли входной буфер
(возможна ли запись в него), Если нет, то выход по метке BufFull. Портит CF.
В AL помещается байт состояния контроллера клавиатуры.
KBDInpBufFree macro BufFull
KBDWtInpBufFree
— ждёт, когда выходной буфер станет свободным.
Портит CF, AL. В AL помещается байт состояния контроллера клавиатуры
KBDWtInpBufFree
KBDOutpBufFull ExErr
—
проверяет, есть ли данные в выходном буфере. Если данных нет, то выход по метке ExErr.
Портит AL.
KBDOutpBufFull macro ExErr
KBDOutpBufFree
— освобождает выходной буфер.
KBDOutpBufFree
KBDWtOuputBufFull
— ждёт, когда во входной буфер поступят данные.
Портит AL.
KBDWtOuputBufFull
OutputBufFree ExErr
— проверяет, есть ли данные в выходном буфере.
Если данные есть, то выход по метке ExErr.
Портит AL.
OutputBufFree ExErr
KBDInterfaceError ExErr
— проверяет, произошла ли ошибка при работе с
клавиатурой. Если да, то выход по метке ExErr. Портит AL.
KBDInterfaceError ExErr
Разряд | Назначение |
---|---|
0 | Резерв изготовителя (состояние перемычки) |
1 | Резерв изготовителя |
2 | Резерв изготовителя |
3 | Резерв изготовителя |
4 | Объём ОЗУ на системной плате |
5 | Резерв изготовителя |
6 | Тип первичного монитора (0 — цветной, 1 — черно-белый) |
7 | Замок клавиатуры (0 — заблокирована, 1 — разблокирована) |
Разряд | Назначение |
---|---|
0 | Системный сброс |
1 | Gate A20 |
2 | Резерв изготовителя |
3 | Резерв изготовителя |
4 | Выходной буфер полон |
5 | Входной буфер пуст |
6 | Синхросигнал клавиатуры (выход) |
7 | Данные клавиатуры (выход) |
Наиболее важны следующие разряды выходного порта, определённые в kbd.def:
FKBDPCReset equ 0h ; Системный сброс (флаг сброшен), до 486. FKBDGateA20 equ 1h ; Разрешить A20 (флаг установлен)
На процессорах, начиная с 586, бит 0 к системному сбросу уже не подключён.
Для управления контроллером клавиатуры используются следующие команды
Код | Функция |
---|---|
20h | Поместить текущий командный байт в порт 60h |
60h | Загрузить новый командный байт, это часть двухбайтовой операции. Чтобы записать новый командный байт необходимо: а) в порт 64h поместить 60h, б) записать в порт 60h командный байт. Командный байт определет режим работы контроллера клавиатуры. |
A5h | Специальное чтение. 8042 помещает в выходной буфер истинное значение выходного порта 2 за исключением разрядов 4 и 5, которым даётся следующее определение 5: =0 - клавиатура XT, =1 - клавиатура AT; 4: =0 - запрещено прерывание по заполнению выходного буфера, =1 - разрешено прерывание. |
AAh | Инициализация. 8042 инициализирует порты 1 и 2, запрещает клавиатуру и очищает указатели буфера. После этого, помещает в выходной буфер 55h |
ABh | Контроль интерфейса клавиатуры. Выходной буфер после тестирования будет содержать: 00h — нет ошибок; 01h — линии синхронизации клавиатуры остаётся нулевой; 02h — линия синхронизации клавиатуры остаётся единичной; 03h — линия данных клавиатуры остаётся нулевой; 04h — линия данных клавиатуры остаётся единичной. |
ACh | Резерв для диагностики |
ADh | Запретить клавиатуру (устанавливает разряд 4 командного байта 8042, который запрещает интерфейс клавиатуры). До разрешения клавиатуры данные не передаются и не принимаются. |
AEh | Разрешить клавиатуру. Сбрасывает разряд 4 командного байта, который разрешает клавиатуру |
C0h | Прочитать входной порт. Передаёт содержимое входного порта в выходной буфер (порт 60h), использовать только при пустом выходном буфере |
D0h | Прочитать выходной порт. Передаёт содержимое выходного порта в выходной буфер (порт 60h), использовать только при пустом выходном буфере |
D1h | Поместить байт, записанный по адресу 60h в выходной порт, разряд 0 не должен быть нулевым, т. к. иначе система перезагрузится. |
E0h | Прочитать входы TEST0 и TEST1. После выполнения 0-ой бит порта 60h содержит TEST0, а 1-ый бит — TEST1 |
F0h–FFh | Пульсация разрядов выходного порта. Может быть вызвана пульсация разрядов 0–3 выходного порта (перевод в нулевое состояние на 2–6 мкс). Разряды 0—3 в этой команде указывают, какой разряд выходного порта должен пульсировать. |
Константы команд управления контроллером клавиатуры, определённые в kbd.def:
CeqKBDGetCmd equ 020h ; Читать командный байт из клавиатуры CeqKBDSetCmd equ 060h ; Послать команду в контроллер клавиатуры CeqKBDRdOutBuf equ 0a5h ; Читает выходной порт за исключением битов 4 и 5, которые ; трактуются иначе (см. табл.) CeqKBDCtrlIni equ 0aah ; Инициализация портов, запрет клавиатуры, очистка указателей ; буферов, затем в выходной буфер помещается 55h CeqKBDChkIntrf equ 0abh ; Контроль интерфейса 00h - ошибок нет CeqKBDDumpRes equ 0ach ; Резерв диагностирования CeqKBDIntrfDes equ 0adh ; Запрет интерфейса клавиатуры CeqKBDIntrfEna equ 0aeh ; Разрешение клавиатуры CeqKBDRdInpPort equ 0c0h ; Читать входной порт CeqKBDRdOutPort equ 0d0h ; Читать выходной порт CeqKBDWrOutPort equ 0d1h ; Записать в выходной порт CeqKBDRdTestPort equ 0e0h ; Читать выходы клавиатуры CeqKBDPulsOutBuf equ 0f0h ; Пульсация разрядов 0-3 выходного порта F0h-FFh, последние ; четыре бита указывают какой разряд должен пульсировать
Коды ответов контроллера клавиатуры
KBDEndOfInit equ 055h ; Окончание инициализации клавиатуры
Для записи в выходной порт необходимо ввести команду D1h по адресу 64h, затем ввести нужное значение данных для выходного порта по адресу 60h.
Чтобы прочитать значение выходного порта необходимо ввести команду D0h по адресу 64h, затем прочитать данные по адресу 60h. Команда должна вводиться только когда выходной буфер пуст. При изменении состояния бита, управляющего адресной линией A20, программа, чтобы нормально продолжать работу, должна быть уверена, что бит установлен правильно. Для этого рекомендуется в контроллер выдавать холостую команду после последовательности записи в порт нужного значения. После выполнения этой холостой команды программа может быть уверена, что предыдущая команда выполнена и разряд адреса A20 установлен аппаратно на требуемое значение. Нельзя использовать команду D1 для изменения любого разряда, кроме первого.
Данные в выходном буфере (порт 60h) — это данные клавиатуры, только если контроллер не получил определённую команду.
В kbd.def определены следующие макросы работы с контроллером клавиатуры
KBDPCReset
осуществляет сброс системы, путём подачи
команды пульсации нулевого разряда выходного порта. Работает до 486.
KBDPCReset
KBDDesable
запрещает клавиатуру. Макрос должен вызываться
при пустом входном буфере. Портит al.
KBDDesable
KBDEnable
разрешает клавиатуру. Макрос должен вызываться при
пустом входном буфере. Портит al.
KBDEnable
KBDSetA20 JGateA20AlreadySet
устанавливает линию GateA20.
Необязательный параметр JGateA20AlreadySet — метка, по которой выполняется переход,
если A20 была установлена до выполнения макроса. Портит ax.
KBDSetA20 JGateA20AlreadySet
KBDResetA20 JGateA20AlreadyReset
сбрасывает линию GateA20
Необязательный параметр JGateA20AlreadyReset — метка, по которой выполняется
переход, если A20 была сброшена до выполнения макроса. Портит ax.
KBDResetA20 JGateA20AlreadyReset
KBDResetSystem
— дожидается, когда входной
буфер будет пуст, и сбрасываеть систему. Только для ПК не старше 486 и не под управлением windows.
KBDResetSystem
Режимы работы контроллера клавиатуры определяются разрядами, установленными командой 60h.
Разряд | Назначение |
---|---|
0 | 0 — не генерировать прерывание по заполнению выходного буфера, 1 — генерировать; |
1 | Резерв, должен быть равным нулю; |
2 | Системный флажок. Записывается во второй разряд регистра состояния. |
3 | 0 — подчиниться защитному замку; 1 — игнорировать защитный замок |
4 | 0 — разрешить интерфейс клавиатуры; 1 — запретить. |
5 | 0 — использовать 11-разрядные коды клавиатуры (PC AT); 1 — использовать коды клавиатуры, совместимые с PC XT |
6 | 0 — не преобразовывать коды клавиатуры в IBM PC совместимый; 1 — преобразовывать коды клавиатуры в совместимые с XT. |
7 | Резерв, должен быть равным нулю |
CmKBDIntEn equ 00000001b ; Разрешить прерывания CmKBDLockIgnore equ 00001000b ; Отменить блокировку замка CmKBDIntrfDes equ 00010000b ; Запретить интерфейс клавиатуры CmKBDKeybXT equ 00100000b ; Работать с XT клавиатурой CmKBDModeXT equ 01000000b ; Работать в режиме совместимости с XT клавиатурой и ; преобразовывать коды
Макрос KBDRdCmdByte
читает командный байт контороллера клавиатуры в AL.
KBDRdCmdByte
Макрос KBDWrCmdByte CmdByte
записывает командный байт контороллера
клавиатуры. CmdByte
— значение командного байта, не должно быть
регистром AL.
KBDWrCmdByte CmdByte
При каждой передаче команды или данных от системы на клавиатуру система требует подтверждения от клавиатуры. Если только система не запретит вывод данных с клавиатуры, последняя даёт ответ в течение 20 мс. Если ответ клавиатуры недействителен или содержит ошибку паритета, система повторно посылает ей команду или данные. Двухбайтовые команды требуют особой обработки. Если переданы и подтверждены команды команды F3h, F0h или EDh, а также передан байт данных, но ответ оказался недействительным или с ошибкой паритета, то система передаст повторно и команду и байт данных.
Клавиатура AT имеет 3 режима работы:
Здесь будет рассматриваться в основном режим 3. В этом режиме должно быть запрещено преобразование кодов у контроллера клавиатуры, т. к. он не может обрабатывать этот набор кодов сканирования. BIOS также не может обрабатывать этот код сканирования, поэтому прикладная система, использующая этот режим, должна обрабатывать их сама. Каждой клавише присвоен свой уникальный 8-разрядный код нажатия, который передаётся при нажатии клавиши. Код отжатия состоит из двух байтов первый — префикс отжатия (F0h), а второй идентичен коду нажатия данной клавиши. В этом наборе кодов каждая клавиша посылает только один код сканирования и состояние любой клавиши не зависит от состояния других.
За исключением клавиши Pause все клавиши работают на нажатие/отжатие и являются повторяемыми (т.е. при нажатой и удерживаемой клавише через определённые промежутки клавиатура посылает код нажатия этой клавиши). Если нажаты и удерживаются несколько клавиш, то повторяется код только той клавиши, которая была нажата последней. После её отпускания коды повторений перестают пересылаться, даже если ещё остаются нажатые клавиши. Если клавиша нажата во время запрета клавиатуры, то в буфер клавиатуры поступает только первый код нажатия.
Общение с клавиатурой происходит черз порт 60h.
QKEYB equ 60h ; Порт обмена с клавиатурой
Макрос KEYBReceive
ждёт ответ от клавиатуры. Ответ клавиатуры в регистре al.
Используется просто:
KEYBReceive macro
Макрос KEYBWtACK
ждёт подтверждения от клавиатуры. У него два параметра:
обязательный JNotACK
и необязательный JResend
.
Если ответ от клавиатуры отличен от ACK, осуществляется переход по метке JNotACK
Если указан параметр JResend, то если от клавиатуры поступает ответ Resend, выполняется
переход по метке JResend. Выход: al — ответ клавиатуры.
KEYBWtACK macro JNotACK:req, JResend
Макрос KEYBsend
послает команду клавиатуре. Команда может содержать до трёх байт.
Команды задаются параметрами CMD, CMD1 и CMD2. Коды команд клавиатуры см. ниже.
Если параметр DontWaitACK пустой, то перед посылкой очередного байта (CMD1 или CMD2)
ожидается приём подтверждения от клавиатуры. (После посылки CMD2 подтверждения не ожидается)
Если DontWaitACK не пустой (любое значение), то ответ от клавиатуры не ожидается.
KEYBsend macro CMD:req, CMD1, CMD2, DontWaitACK
CeqKEYBSetLEDs equ 0edh ; Установить индикаторы состояния. После получения ; команды возвращает ACK и ждёт байт конфигурации ; светодиодных индикаторов. После получения ; байта выдаёт ACK и возобновляет сканирование. ; Двухбайтная команда. CmKEYBScrollLock equ 00000001b ; Зажечь ScrollLock FKEYBScrollLock = 0 CmKEYBNumLock equ 00000010b ; Зажечь NumLock FKEYBNumLock = 1 CmKEYBCapsLock equ 00000100b ; Зажечь CapsLock FKEYBCapsLock = 2 MKEYBLeds equ 00000111b ; Маска светодиодов CeqKEYBecho equ 0eeh ; После получения этой команды клавиатура выдаёт echo. ; Используется для диагностики. Однобайтная команда. CeqKEYBMode equ 0f0h ; Выбрать альтернативный режим работы клавиатуры или указать ; текущий. Клавиатура подтверждает полученную команду ACK, ; сбрасывает выходные буферы и повторения клавиш и готовится ; к приёму байта конфигурации и устанавливает новый режим ; или возвращает текущий. ACK возвращает? Двухбайтная команда. CKEYBCurMode equ 00h ; Выдать текущий режим CKEYBXTMode equ 01h ; Эмуляция XT CKEYBATMode equ 02h ; Режим по умочанию CKEYBATExtMode equ 03h ; Расширенный режим
Байт команды в диапазоне от EF до F1 — резервные. Это холостые однобайтные команды, которые клавиатура принимает и выдаёт ответ CeqKEYBResend, никаких других действий не предпринимается.
CeqKEYBNop equ 0f1h ;EF-F1- резерв - холостые команды CeqKEYBExtKBD equ 0f2h ; Идентификатор расширенной клавиатуры. Передаётся при включении клавиатуры, ; клавиатура отвечает ACK и передаёт идентификатор клавиатуры KAnsExt ; (двухбайтный ответ), начиная с младшего байта. Однобайтная команда. CeqKEYBSetDelay equ 0f3h ; Установить частоту повторения клавиш. Клавиатура возвращает ACK и ждёт ; байт частоты повторения и времени задержки. Двухбайтная команда. ; Время задержки (вермя, в течение которого клавиша должна быть удержана нажатой прежде, чем начнётся ; функция повторения) CKEYBWait250 equ 00000000b ; 250 мс CKEYBWait500 equ 00100000b ; 500 мс CKEYBWait750 equ 01000000b ; 750 мс CKEYBWait1000 equ 01100000b ; 1 000 мс ; Частота повторения (показывает, сколько раз в секунду клавиша повторяется) CKEYBRep30_0 equ 00000000b ; 30,0 CKEYBRep26_6 equ 00000001b ; 26,6 CKEYBRep24_0 equ 00000010b ; 24,0 CKEYBRep21_8 equ 00000011b ; 21,8 CKEYBRep20_0 equ 00000100b ; 20,0 CKEYBRep18_4 equ 00000101b ; 18,4 CKEYBRep17_1 equ 00000110b ; 17,1 CKEYBRep16_0 equ 00000111b ; 16,0 CKEYBRep15_0 equ 00001000b ; 15,0 CKEYBRep13_3 equ 00001001b ; 13,3 CKEYBRep12_0 equ 00001010b ; 12,0 CKEYBRep10_9 equ 00001011b ; 10,9 CKEYBRep10_0 equ 00001100b ; 10,0 CKEYBRep09_2 equ 00001101b ; 9,2 CKEYBRep08_6 equ 00001110b ; 8,6 CKEYBRep08_0 equ 00001111b ; 8,0 CKEYBRep07_5 equ 00010000b ; 7,5 CKEYBRep06_7 equ 00010001b ; 6,7 CKEYBRep06_0 equ 00010010b ; 6,0 CKEYBRep05_5 equ 00010011b ; 5,5 CKEYBRep05_0 equ 00010100b ; 5,0 CKEYBRep04_6 equ 00010101b ; 4,6 CKEYBRep04_3 equ 00010110b ; 4,3 CKEYBRep04_0 equ 00010111b ; 4,0 CKEYBRep03_7 equ 00011000b ; 3,7 CKEYBRep03_3 equ 00011001b ; 3,3 CKEYBRep03_0 equ 00011010b ; 3,0 CKEYBRep02_7 equ 00011011b ; 2,7 CKEYBRep02_5 equ 00011100b ; 2,5 CKEYBRep02_3 equ 00011101b ; 2,3 CKEYBRep02_1 equ 00011110b ; 2,1 CKEYBRep02_0 equ 00011111b ; 2,0 CeqKEYBEnable equ 0f4h ; Разрешить клавиатуру. Возвращает код ACK, сбрасывает выходной буфер ; и начинает сканирование. Однобайтная команда. CeqKEYBDesable equ 0f5h ; Запрет по умолчанию. Всё сбрасывает, включая повторения клавиш, сбрасывает ; последнюю повторяемую клавишу, возвращает ACK, ожидает дальнейших команд. ; Однобайтная команда. CeqKEYBSetDefault equ 0f6h ; Установить условия по умолчанию. Клавиатура посылает ACK, всё ; сбрасывает и продолжает сканирование Однобайтная команда.
Однобайтные команды
CeqKEYBSetKAR equ 0F7h ; Установить все клавиши только повторение CeqKEYBSetKAPF equ 0F8h ; Установить все клавиши только нажатие\отжатие CeqKEYBSetKAP equ 0F9h ; Установить все клавиши только нажатие CeqKEYBSetKAPFR equ 0FAh ; Установить все клавиши повторение\нажатие\отжатие
После получения подтверждает KACK, очищает выходной буфер и продолжает сканирование (если оно было разрешено ранее). используется только в режиме 3.
Следующие команды установливают отдельные клавиши только повторение, только нажатие\отжатие, только нажатие. Клавиатура получает первый байт, посылает KACK, очищает выходной буфер, ждёт код клавиши (ScanCode), подтверждает его и ждёт следующей команды. Сканирование не возобновляется до тех пор, пока клавиатура не получит команду CeqKEYBEnable. Устанавливать можно несколько клавиш одновременно. Это многобайтные команды.
CeqKEYBSetK1R equ 0fbh ; установить отдельные клавиши только повторение CeqKEYBSetK1PF equ 0fch ; установить отдельные клавиши только нажатие\отжатие CeqKEYBSetK1P equ 0fdh ; установить отдельные клавиши нажатие CeqKEYBResend equ 0feh ; Послать данные повторно. Клавиатура посылает последний байт, переданный системе. ; Если предыдущим был CeqKEYBResend, то передаётся байт переданный перед ним. ; Однобайтная команда CeqKEYBReset equ 0ffh ; Сброс. Клавиатура возвращает системе код ACK, и запрещается до получения ; следующей команды или принятия системой KACK. Однобайтная команда
; KOverFlow и KOverFlowXT - коды переполнения буфера клавиатуры или ошибки (если не удаётся идентифицировать ; замыкание контактов на клавиатуре) при работе в режимах 2,3 и режиме 1. Однобайтовый ответ. CKEYBOverflow equ 00h ; Переполнение в режимах 2,3 CKEYBOverFlowXT equ 0ffh ; Переполнение в режиме 1 CKEYBACK equ 0fah ; Подтверждение правильности команды (ACK). Передаётся в ответ на любую ; правильную команду за исключением echo и resend. Если клавиатура прерывается ; во время передачи KACK, то KACK отменяется и начинается приём новой команды. ; Однобайтовый ответ. CKEYBPower equ 0aah ; При включении питания клавиатура передаёт этот код системе. Передача ; любого другого указывает на неисправность клавиатуры. Однобайтовый ответ. CKEYBecho equ 0eeh ; Однобайтовый ответ на команду echo. CKEYBAnsExt equ 83abh ; Ответ на команду CeqKEYBExtKBD Первым передаётся младший байт. Двухбайтный ответ. CKEYBReSend equ 0feh ; После получения неправильных входных данных или данных с ошибкой паритета. ; Однобайтовый ответ.
Макрос KBDEndOfInterrupt
завершает обработку прерывания клваиатуры. Используется он так:
KBDEndOfInterrupt
Сканкоды клавиш при работе клавиатуры в режиме 2 (с отключённой перекодировкой).
Обозначение | Код в режиме 3 | Клавиша | Лат. shift | Русск. shift | Обозначение | Код в режиме 2 |
---|---|---|---|---|---|---|
CKBD3_0 | 45h | 0 | ) | ) | CKBD2_0 | 45h |
CKBD3_1 | 16h | 1 | ! | ! | CKBD2_1 | 16h |
CKBD3_2 | 1eh | 2 | @ | " | CKBD2_2 | 1eh |
CKBD3_3 | 26h | 3 | # | № | CKBD2_3 | 26h |
CKBD3_4 | 25h | 4 | $ | ; | CKBD2_4 | 25h |
CKBD3_5 | 2eh | 5 | % | : | CKBD2_5 | 2eh |
CKBD3_6 | 36h | 6 | ^ | , | CKBD2_6 | 36h |
CKBD3_7 | 3dh | 7 | & | . | CKBD2_7 | 3dh |
CKBD3_8 | 3eh | 8 | * | * | CKBD2_8 | 3eh |
CKBD3_9 | 46h | 9 | ( | ( | CKBD2_9 | 46h |
Обозначение | Код режима 3 | Клавиша | . | Русск. | Обозначение | Код режима 3 |
---|---|---|---|---|---|---|
CKBD3_tilde | 0eh | ` | ~ | CKBD2_tilde | 0eh | |
CKBD3_minus | 4eh | - | _ | CKBD2_minus | 4eh | |
CKBD3_equal | 55h | = | + | CKBD2_equal | 55h | |
CKBD3_OpenBrace | 54h | [ | { | Х | CKBD2_OpenBrace | 54h |
CKBD3_CloseBrace | 5bh | ] | } | Ъ | CKBD2_CloseBrace | 5bh |
CKBD3_Semicolon | 4ch | ; | : | Ж | CKBD2_Semicolon | 4ch |
CKBD3_Apostophe | 52h | ' | " | Э | CKBD2_Apostophe | 52h |
CKBD3_Zapyataya | 41h | , | < | Б | CKBD2_Zapyataya | 41h |
CKBD3_dot | 49h | . | > | Ю | CKBD2_dot | 49h |
CKBD3_Slash | 4ah | / | ? | ё | CKBD2_Slash | 4ah |
CKBD3_BackSlash | 5ch | \ | | | CKBD2_BackSlash | 5dh | |
CKBD3_q | 15h | q | Q | й | CKBD2_q | 15h |
CKBD3_w | 1dh | w | W | ц | CKBD2_w | 1dh |
CKBD3_e | 24h | e | E | у | CKBD2_e | 24h |
CKBD3_r | 2dh | r | R | к | CKBD2_r | 2dh |
CKBD3_t | 2ch | t | T | е | CKBD2_t | 2ch |
CKBD3_y | 35h | y | Y | н | CKBD2_y | 35h |
CKBD3_u | 3ch | u | U | г | CKBD2_u | 3ch |
CKBD3_i | 43h | i | I | ш | CKBD2_i | 43h |
CKBD3_o | 44h | o | O | щ | CKBD2_o | 44h |
CKBD3_p | 4dh | p | P | з | CKBD2_p | 4dh |
CKBD3_a | 1ch | a | A | ф | CKBD2_a | 1ch |
CKBD3_s | 1bh | s | S | ы | CKBD2_s | 1bh |
CKBD3_d | 23h | d | D | в | CKBD2_d | 23h |
CKBD3_f | 2bh | f | f | а | CKBD2_f | 2bh |
CKBD3_g | 34h | g | G | п | CKBD2_g | 34h |
CKBD3_h | 33h | h | H | р | CKBD2_h | 33h |
CKBD3_j | 3bh | j | J | о | CKBD2_j | 3bh |
CKBD3_k | 42h | k | K | л | CKBD2_k | 42h |
CKBD3_l | 4bh | l | L | д | CKBD2_l | 4bh |
CKBD3_z | 1ah | z | Z | я | CKBD2_z | 1ah |
CKBD3_x | 22h | x | X | ч | CKBD2_x | 22h |
CKBD3_c | 21h | c | C | с | CKBD2_c | 21h |
CKBD3_v | 2ah | v | V | м | CKBD2_v | 2ah |
CKBD3_b | 32h | b | B | и | CKBD2_b | 32h |
CKBD3_n | 31h | n | N | т | CKBD2_n | 31h |
CKBD3_m | 3ah | m | M | ь | CKBD2_m | 3ah |
CKBD3_Space | 29h | CKBD2_Space | 29h |
Обозначение | Код в режиме 3 | Клавиша | Обозначение | Код в режиме 2 |
---|---|---|---|---|
CKBD3_Esc | 08h | Escape | CKBD2_Esc | 76h |
CKBD3_F1 | 07h | F1 | CKBD2_F1 | 05h |
CKBD3_F2 | 0fh | F2 | CKBD2_F2 | 06h |
CKBD3_F3 | 17h | F3 | CKBD2_F3 | 04h |
CKBD3_F4 | 1fh | F4 | CKBD2_F4 | 0ch |
CKBD3_F5 | 27h | F5 | CKBD2_F5 | 03h |
CKBD3_F6 | 2fh | F6 | CKBD2_F6 | 0bh |
CKBD3_F7 | 37h | F7 | CKBD2_F7 | 83h |
CKBD3_F8 | 3fh | F8 | CKBD2_F8 | 0ah |
CKBD3_F9 | 47h | F9 | CKBD2_F9 | 01h |
CKBD3_F10 | 4fh | F10 | CKBD2_F10 | 09h |
CKBD3_F11 | 56h | F11 | CKBD2_F11 | 78h |
CKBD3_F12 | 5eh | F12 | CKBD2_F12 | 07h |
CKBD3_PrScr | 57h | Print Screen | CKBD2_PrScr | 0e012e07ch |
CKBD3_Pause | 62h | Pause | CKBD2_Pause | 0e11477h |
Примечание. Согласно [1] клавиша Pause работает только на нажатие. На моей клавиатуре в режиме 3 она программируется также, как и остальные клавиши (т. е. нажатие, нажатие/отжатие, нажатие/отжатие/повторение и т. д.)
Обозначение | Код в режиме 3 | Клавиша | Обозначение | Код в режиме 2 |
---|---|---|---|---|
CKBD3_NumLck | 76h | Num Lock | CKBD2_NumLck | 77h |
CKBD3_ScrlLck | 5fh | Scroll Lock | CKBD2_ScrlLck | 7eh |
CKBD3_CapsLck | 14h | Caps Lock | CKBD2_CapsLck | 58h |
CKBD3_LShift | 12h | Левый Shift | CKBD2_LShift | 12h |
CKBD3_LAlt | 19h | Левый Alt | CKBD2_LAlt | 11h |
CKBD3_LCtrl | 11h | Левый Ctrl | CKBD2_LCtrl | 14h |
CKBD3_RShift | 59h | Правый Shift | CKBD2_RShift | 59h |
CKBD3_RAlt | 38h | Правый Alt | CKBD2_RAlt | 0e011h |
CKBD3_RCtrl | 58h | Правый Ctrl | CKBD2_RCtrl | 0e014h |
CKBD3_Enter | 5ah | Enter | CKBD2_Enter | 5ah |
CKBD3_Tab | 0dh | Tab | CKBD2_Tab | 0dh |
CKBD3_Backspace | 66h | Backspace | CKBD2_Backspace | 66h |
CKBD3_Insert | 70h | Вставка | CKBD2_Insert | 0e070h |
CKBD3_Delete | 71h | Удалить | CKBD2_Delete | 0e071h |
CKBD3_Left | 6bh | Стрелка влево | CKBD2_Left | 0e06bh |
CKBD3_Right | 74h | Стрелка вправо | CKBD2_Right | 0e074h |
CKBD3_Up | 75h | Стрелка вверх | CKBD2_Up | 0e075h |
CKBD3_Down | 72h | Стрелка вниз | CKBD2_Down | 0e072h |
CKBD3_PgUp | 7dh | Страница вверх | CKBD2_PgUp | 0e07dh |
CKBD3_PgDown | 7ah | Страница вниз | CKBD2_PgDown | 0e07ah |
CKBD3_Home | 6ch | В начало | CKBD2_Home | 0e06ch |
CKBD3_End | 69h | В конец | CKBD2_End | 0e069h |
CKBD3_GrLeft | 61h | Стрелка влево на серой клавиатуре 4 | CKBD2_GrLeft | 6bh |
CKBD3_GrRight | 6ah | Стрелка вправо на серой клавиатуре 6 | CKBD2_GrRight | 74h |
CKBD3_GrUp | 63h | Стрелка вверх на серой клавиатуре 8 | CKBD2_GrUp | 75h |
CKBD3_GrDown | 60h | Стрелка вниз на серой клавиатуре 2 | CKBD2_GrDown | 72h |
CKBD3_GrPgUp | 6fh | Страница вверх на серой клавиатуре 9 | CKBD2_GrPgUp | 7dh |
CKBD3_GrPgDown | 6dh | Страница вниз на серой клавиатуре 3 | CKBD2_GrPgDown | 7ah |
CKBD3_GrHome | 6eh | Вначало на серой клавиатуре 7 | CKBD2_GrHome | 6ch |
CKBD3_GrEnd | 65h | Вконец на серой клавиатуре 1 | CKBD2_GrEnd | 69h |
CKBD3_GrInsert | 67h | Вставка на серой клавиатуре 0 | CKBD2_GrInsert | 70h |
CKBD3_GrDelete | 64h | Удалить на серой клавиатуре . | CKBD2_GrDelete | 71h |
CKBD3_Gr5 | 73h | центральная клавиша 5 | CKBD2_Gr5 | 73h |
CKBD3_GrEnter | 79h | серый "ВК" | CKBD2_GrEnter | 0e05ah |
CKBD3_GrPlus | 7ch | серый + | CKBD2_GrPlus | 79h |
CKBD3_GrMinus | 84h | серый - (предположительно, необходимо уточнить) | CKBD2_GrMinus | 7bh |
CKBD3_GrMultiply | 7eh | серый * | CKBD2_GrMultiply | 7ch |
CKBD3_GrDivide | 77h | серый / | CKBD2_GrDivide | 0e04ah |
Коды клавиш в режиме 3
Обозначение | Код в режиме 3 | Клавиша | Обозначение | Код в режиме 2 |
---|---|---|---|---|
CKBD3_Lwin | 8bh | Левая клавиша Windows | CKBD2_LWin | 0e01fh |
CKBD3_Rwin | 8ch | Правая клавиша Windows | CKBD2_RWin | 0e027h |
CKBD3_WinMenu | 8dh | Клавиша меню Windows | CKBD2_WinMenu | 0e02fh |
Клавиши WakeUp, Sleep
и Power в режиме 3 на моей клавиатуре не опознаются | Клавиша WakeUp | CKBD2_WakeUp | 0e05eh | |
Клавиша Sleep | CKBD2_Sleep | 0e03fh | ||
Клавиша Power | CKBD2_Power | 0e037h |
Дополнительные коды, возвращаемые клавиатурой при нажатии и отпускании клавиш.
Обозначение | Код в режиме 3 | Назначение кода | Обозначение | Код в режиме 2 |
---|---|---|---|---|
CKBD3_Unpress | 0f0h | Код отпускания клавиши | CKBD2_Unpress | 0f0h |
В режиме 3 не нужны дополнительные коды | Код дополнительной клавиши | CKBD2_ExtCode | 0e0h | |
Дополнительный код, выдаваемый только при нажатии клавиши Pause. | CKBD2_ExtCode1 | 0e1h |
© Жуков И. Б.
e-mail: ibzh@yandex.ru
При использовании материалов, пожалуйста,
ставьте индексируемую ссылку на сайт http://ibzh.eko3.ru/
Число посетителей | |||
| Число посетителей |