5.4.2.
Принцип действия клавиатуры
После рассмотрения кодирования символов в ПЭВМ и клавиатур становится очевидным следующее:
1) каждому расширенному коду ASCII не может быть поставлена в соответствие определенная клавиша на клавиатуре, так как количество клавиш намного меньше;
2) не каждая комбинация клавиш может быть представлена в расширенном коде ASCII в связи с тем, что этих комбинаций может быть достаточно много (существенно больше 256).
Более того, многим одиночным клавишам, не входящим в группу клавиш пишущей машинки, в большинстве случаев не ставится в соответствие какой-либо расширенный код ASCII. Тем не менее эти клавиши и комбинации клавиш полезно задействовать в создаваемых программных продуктах, чтобы облегчить работу пользователя за клавиатурой путем уменьшения объема вводимой информации. Ведь различным комбинациям клавиш можно поставить в соответствие множество различных вариантов действий DOS, программы и ПЭВМ.
Исходя из сказанного возникают вопросы о том, как обеспечить ввод с клавиатуры любого расширенного кода ASCII, и о том, как в общем случае фиксируются в ПЭВМ результаты нажатий клавиш и их комбинаций. Ответ на первый вопрос будет дан в следующем пункте, а в рамках данного пункта мы получим ответ на второй вопрос, рассмотрев принцип действия клавиатуры.
Вначале остановимся на клавиатуре ПЭВМ IBM PC XT, а затем разберем особенности функционирования клавиатур компьютера IBM PC AT.
Каждой клавише на клавиатуре XT соответствует семиразрядный код сканирования, или опроса клавиши (scan-код). Перечень этих кодов приведен в табл. 5.10. Буква М в ней предваряет наименования клавиш на малой цифровой клавиатуре, если это не следует из контекста. Подчеркнем, что приведенные коды не совпадают с ASCII-кодами.
При нажатии клавиши аппаратура клавиатуры генерирует однобайтный код нажатия, а при отпускании — также однобайтный код отпускания. Код нажатия совпадает с кодом сканирования. Код же отпускания отличается от кода сканирования наличием единицы в старшем разряде байта.
Таблица 5.10
Коды сканирования клавиш клавиатуры IBM PC
XT
Клавиша |
Код сканирования |
Клавиша |
Код сканирования |
||
16 -й |
10 - й |
16 -й |
10 - й |
||
Esc 1 ! 2 3 # 4 S 5 % 6 ^ 7 & 8 * 9 ( 0 ) - _ = + BS Tab Q W E R T Y U I O P [ { ] } Enter Ctrl A S D F G H J K L ; ; ‘ “ ` ~ Shift (левая) |
01 02 03 04 05 06 07 08 09 0A 0B 0D 0E 10 11 12 13 14 15 16 17 18 19 1A 1B 1D 1E 20 21 22 23 24 25 26 27 28 29 2A |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
\ | Z X C V B N M , < . > / ? Shift (правая) * PrtSc Alt Space Caps Lock F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 Num Lock Scroll Lock Home 7 ↑ 8 PgUp
9 (M)- ←
4 (M)5 →
6 (M)+ End 1 ↓ 2 PgDn 3 Ins 0 |
2B 2D 2E 30 31 32 33 34 35 36 37 38 39 3A 3B 3D 3E 40 41 42 43 44 45 46 47 48 49 4A 4B 4D 4E 50 51 52 53 |
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
(т.е. он больше кода сканирования на 128, или 80Н). Если клавиша остается нажатой дольше, чем 0,5 с, то автоматически начинают генерироваться ее коды нажатия с частотой 10 раз в секунду, что имитирует серию быстрых нажатий на эту клавишу. Такой принцип очень удобен при необходимости многократного ввода одного и того же символа. Автоматическая регенерация кода нажатия прекращается при отпускании клавиши или нажатии другой клавиши. Поэтому в случае, когда клавиша «залипла», для устранения нежелательных последствий этого достаточно нажать любую другую клавишу. Код нажатия/отпускания выдается в порт 60Н.
Одновременно с записью кода нажатия/отпускания в порт 60Н оборудование клавиатуры выдает аппаратное прерывание 09Н. При этом МП немедленно приостанавливает свою текущую работу и переходит к обработке возникшего прерывания по программе-драйверу клавиатуры. Драйвер клавиатуры считывает из порта 60Н код нажатия/отпускания, а дальнейшие его действия зависят от типа кода (нажатие или отпускание) и от типа клавиши, соответствующей этому коду.
Драйвер клавиатуры различает следующие типы клавиш:
1) клавиши-переключатели;
2) кодовые клавиши.
Клавиши-переключатели служат для изменения состояния клавиатуры (переключения регистров). На каждом регистре нажатие кодовых клавиш интерпретируется по-разному. К клавишам-переключателям (на клавиатуре IBM PC XT) относятся клавиши Ins, Caps Lock, Num Lock, Scroll Lock, Alt, Ctrl, левая и правая клавиши Shift, а также комбинация клавиш Ctrl-Num Lock. Для хранения статуса (состояния) клавиш-переключателей в области данных BIOS, находящейся в ОЗУ, зарезервировано два байта.
Если драйвер клавиатуры получил код нажатия (отпускания) клавиш-переключателя, то соответствующий бит статуса устанавливается в единицу (нуль). В результате появляется возможность распознать одновременное нажатие клавиш-переключателя и какой-либо другой клавиши. Дополнительно к этому за каждой логически фиксирующейся клавишей-переключателем (Ins, Caps Lock и Num Lock) закреплен еще один бит в статусе, содержимое которого определяет состояние соответствующего режима (вставки, ввода прописных букв и фиксации цифр). При включении режима указанный бит устанавливается драйвером клавиатуры в единицу, а при выключении — сбрасывается.
Нажатие комбинации клавиш Ctrl-Num Lock обрабатывается несколько иначе, однако конечный результат будет совпадать с описанным в предыдущем абзаце.
Кодовые клавиши (к которым относятся все остальные клавиши) служат для непосредственного ввода символов в ПЭВМ, т.е. при нажатии любой из них в ОЗУ компьютера передается соответствующий ей код, который может использоваться выполняемыми программами.
При считывании драйвером клавиатуры кода нажатия такой клавиши осуществляется анализ байтов статуса и с учетом их содержимого код нажатия преобразуется (транслируется) в двухбайтовый код символа. Структура этого кода определяется тем, есть или нет в расширенном коде ASCII соответствие нажатой клавише (комбинации клавиш).
Бели была нажата клавиша на клавиатуре пишущей машинки и клавиатура находится только на нижнем или верхнем регистре, а также если была нажата клавиша на малой цифровой клавиатуре (только в режиме фиксации цифр), то первым (младшим) байтом двухбайтового кода символа будет расширенный код ASCII соответствующего символа, а вторым (старшим) — код сканирования соответствующей клавиши. Код сканирования не является принципиально необходимым, однако он все же фиксируется для того, чтобы в программе можно было определить, какая же все-таки из одноименных клавиш нажата (например, клавиша + на малой цифровой клавиатуре или на клавиатуре пишущей машинки).
Допустим, что клавиатура находится на нижнем регистре и нажата клавиша А. При этом драйвер клавиатуры считывает код нажатия 1ЕН (так как код сканирования клавиши А равен 1ЕН), а выдает двухбайтовый код 1Е61Н (в связи с тем, что расширенный код ASCII буквы «а» равен 61Н).
Нажатие некоторых служебных клавиш, не являющихся переключателями, также приводит к формированию двухбайтового кода описанной структуры. Это клавиши Esc, BS, Tab и Enter. Они определяют расширенные коды ASCII 27, 8, 9 и 13 соответственно. Символы с этими кодами являются управляющими в ASCII и обозначаются соответственно ESC, BS, НТ (TAB) и CR (см. табл. 5.2).
В противном случае, т.е. когда нажатой клавише или комбинации клавиш не соответствует никакой расширенный код ASCII (с учетом состояния клавиатуры — регистра), будет сформирован двухбайтовый код, называемый расширенным кодом клавиши. Расширенный код клавиши в первом (младшем) байте содержит нулевой код (ASCII-код символа NUL), а во втором (старшем) — двоичное число, однозначно определяющее нажатую клавишу (или комбинацию клавиш). Последнее число часто совпадает с кодом сканирования клавиши. К клавишам, после обработки нажатий которых выдается расширенный код клавиши, относятся функциональные клавиши, клавиши малой цифровой клавиатуры в режиме управления курсором, а также комбинации различных клавиш с Alt, Shift и Ctrl (однако многие комбинации с Ctrl используются для ввода управляющих символов кода ASCII, а с Shift — символов пишущей машинки на верхнем регистре). Кодировка клавиш и их комбинаций в расширенных кодах клавиш сведена в табл. 5.11, где представлены только вторые байты кодов.
Отметим следующее:
— клавиша-переключатель Scroll Lock драйвером клавиатуры пока не используется. Чтобы применить ее для ввода новых расширенных кодов клавиш, необходимо заменить обработчик прерывания 09Н или программно анализировать соответствующий бит байтов статуса и осуществлять дополнительное перекодирование;
— клавиша Del не соответствует управляющему символу DEL из ASCII;
— клавиша Ins на самом деле выполняет роль не только клавиши-переключателя, но и роль кодовой клавиши (при обработке ее нажатия драйвер выдает расширенный код клавиши);
— расширенные коды клавиш жестко привязаны к конкретным клавишам, а не к их обозначениям;
— комбинации Alt-цифра и Alt--обозначают клавиши на основной (но не на малой) клавиатуре;
— состояние логически фиксирующих клавиш Caps Lock, Num Lock и Scroll Lock на генерацию расширенных кодов клавиш не влияет,
— состояние логически фиксирующей клавиши Num Lock влияет только на интерпретацию нажатий одиночных клавиш на малой цифровой клавиатуре (генерируются либо расширенные коды ASCII, либо расширенные коды клавиш).
Например, двухбайтовый код 1Е00Н представляет комбинацию клавиш Alt-A (1ЕН — код сканирования клавиши А).
Наличие нулевого кода в младшем байте двухбайтового кода символа позволяет программным способом отличать расширенный код ASCII от расширенного кода клавиши.
Считывание драйвером клавиатуры кода отпускания кодовой клавиши ни к каким действиям не приводит.
Двухуровневая кодировка символов при вводе с клавиатуры (в кодах сканирования и двухбайтовых кодах) обеспечивает возможность перепрограммирования клавиш.
Таблица
5.11
Расширенные
коды клавиш клавиатуры IBM PC XT
Клавиши |
Код |
Клавиши |
Код |
|||
16-й |
16-А |
16-й |
18-й |
|||
Fl F2 F3 F4 F5 F6 F7 F8 Г9 F10 |
ЗВ 3D ЗЕ 40 41 42 43 44 |
59 60 61 62 63 64 65 66 67 68 |
Alt-A Alt-B Ait-C Ait-D Alt-E Alt-F Alt-G Alt-H AIt-I Alt-J Alt K Alt-L Ait-M Ait-N Alt-0 Alt-P Alt-Q Alt-R Alt-S Ait-T Alt-U Alt-U Alt-U Alt-X Alt-Y Ait-Z |
1E 30 2E 20 1Z 21 22 23 17 24 25 26 32 31 18 19 10 13 14 16 11 2D 15 |
30 48 46 32 18 33 34 35 23 36 37 38 50 49 24 25 16 19 31 20 22 47 17 45 21 44 |
|
Shift-Fl Shift-F2 Shift-F3 Shift-F4 Shift-F5 Shift-F6 SMft-F7 Shift-F8 Shift-F9 Shift-F16 |
54 55 56 57 58 59 5А 5В 5С 5D |
84 85 86 87 88 89 98 91 92 93 |
||||
Ctrl-Fl Ctrl-F2 Ctrl-F3 Ctrl-F4 Ctrl-F5 Ctrl-F6 Ctrl-F7 Ctrl-F8 Ctrl-ГЭ Ctrl-F16 |
5Е 68 61 62 63 64 65 66 67 |
94 95 % 97 98 99 108 101 102 103 |
||||
Alt-0 Alt-1 Alt-2 Alt-3 Alt-4 Alt-5 Alt-6 Alt-7 Alt-8 Alt-9 Alt-- Alt-= |
81 78 79 7A 7B 7D 7E 80 82 83 |
129 120 121 122 123 124 125 126 127 128 130 131 |
||||
Alt-Fl Alt-F2 Alt-F3 Alt-F4 Alt-F5 Alt-F6 Alt-F7 Alt-F8 Alt-FS Alt-FlO |
68 69 6А 6В 6С 6D 6Е 70 71 |
104 105 106 107 108 109 110 111 112 113 |
||||
Ctrl-G Shift-Tab Ins Ctrl-PrtSc |
03 52 53 72 |
3 15 82 83 114 |
||||
↑ ← → ↓ End Hone PgDn PgUp |
50 4В 4D 4E 47 51 49 |
80 75 77 72 79 71 81 73 |
||||
Ctrl-← Ctrl-→ Ctrl-End Ctrl-Home Ctrl-PgDn Ctrl-PgUp |
73 74 75 77 76 84 |
115 116 117 119 118 132 |
Сформированный двухбайтовый код символа помещается драйвером клавиатуры в буфер клавиатуры, расположенный в области данных BIOS в ОЗУ. На этом обработка нажатия клавиши завершается, и МП продолжает выполнять отложенную работу. Буфер рассчитан на хранение 15 двухбайтовых кодов клавиш и логически организован в виде циклического списка-очереди. Двухбайтовый код только что нажатой клавиши (комбинации клавиш) размещается в конце списка, если он не пуст. Асинхронно по запросу из программы на ввод символа (конечно, по прерыванию) осуществляется выдача из буфера первого двухбайтового кода списка с одновременным удалением этого кода из буфера. Если на момент запроса буфер пуст, то программа переходит в состояние ожидания реального ввода символа с клавиатуры. Наличие буфера и описанная техника организации ввода позволяют нажимать клавиши на клавиатуре с упреждением (заранее), что несколько ускоряет работу на ПЭВМ. В случае, когда буфер в результате этого оказывается заполненным, нажатие следующей клавиши сопровождается звуковым сигналом, а двухбайтовый код отвергается (его просто некуда помещать).
Непосредственный доступ к клавиатуре за двухбайтовым кодом клавиши осуществляется прикладной программой или системой по прерыванию 16Н, обработчик которого составляет вторую важную часть драйвера клавиатуры.
DOS содержит и высокоуровневые средства для считывания из буфера целой строки. Но все они обращаются к обработчику прерывания 16Н.
Любая функция DOS, осуществляющая ввод (а реально — считывание из буфера) одного символа, возвращает либо расширенный код ASCII, либо нулевой код. В последнем случае необходимо повторить программный запрос для выдачи другого (старшего) байта расширенного кода клавиши. Программисты на языке Ассемблера могут в первом случае получить и код сканирования клавиши.
Языки программирования для ПЭВМ зачастую также располагают аналогичными низкоуровневыми средствами.
Заметим, что один лишь ввод каких-либо (управляющих) символов еще не обеспечивает автоматического выполнения ПЭВМ определенных действий. Последние нужно программировать, либо они уже запрограммированы в DOS или другой выполняемой в данный момент программе. Исключение составляют следующие специальные комбинации клавиш, при нажатии которых никакой код в буфер клавиатуры не записывается, но выполняются предопределенные действия после их распознавания обработчиком прерывания 09Н:
Ctrl-Alt-Del — рестарт ОС;
Ctrl-Break — принудительное завершение выполнения программы;
Ctrl-Num Lock — приостановка выполнения программы до нажатия какой-либо клавиши на клавиатуре, за исключением клавиши Num Lock;
Shift-PrtSc — печать экрана.
Все эти функции реализуются путем выдачи драйвером клавиатуры соответствующих прерываний.
Коды нажатия и отпускания клавиш на 84-клавишной клавиатуре ПЭВМ IBM PC AT совпадают, но последние предваряются однобайтовым кодом FOH.
В остальном принципы работы 84-клавишной клавиатуры и ввода символов аналогичны описанным выше. Единственное отличие связано с наличием клавиши Sys Req, код сканирования которой равен 84 (54Н). Клавиша Sys Req уникальна по своей функции. При Обнаружении ее нажатия или отпускания драйвер клавиатуры генерирует прерывание 15Н, обработчику которого через регистр АХ МП передается информация о том, что прерывание инициировано от клавиши Sys Req, а также о том, нажата эта клавиша или отпущена. Обработчик прерывания 15Н пока не выполняет никаких действий, а просто осуществляет возврат. Клавишу Sys Req можно задействовать в программе, подменив вектор прерывания 15Н. Нажатие или отпускание этой клавиши не приводит к записи какого-либо кода в буфер клавиатуры.
101 -клавишная клавиатура обладает большей гибкостью, допуская, в частности, программирование интервала времени, в течение которого необходимо удерживать клавишу до начала периодической регенерации ее кода нажатия, а также частоты регенерации. Принципы работы этой клавиатуры существенно отличаются от рассмотренных. Так, 101-клавишная клавиатура имеет три различных варианта соответствия кодов сканирования клавишам. Требуемый вариант выбирается путем выдачи соответствующей информации в порт 64Н. Если вариант явно не задавался, то действует вариант с номером 2. Этот вариант сильно отличается от кодов сканирования 84-клавишной клавиатуры. Но аппаратные средства клавиатуры транслируют коды сканирования в такие, которые совместимы с кодами сканирования 84-клавишной клавиатуры, прежде чем они становятся доступными выполняемым программам.
Благодаря этому все коды сканирования 84-клавишной клавиатуры совпадают с кодами сканирования соответствующих клавиш 101-клавишной клавиатуры. Дополнительные коды сканирования для новых клавиш приведены в табл. 5.12. Отметим, что 101-клавишная клавиатура генерирует не только коды сканирования одиночных клавиш, но и некоторых комбинаций клавиш, а также не только одиночные коды, но и их последовательности. Подчеркнем, что все указанные в таблице клавиши при наличии альтернативы уникальны именно для этой клавиатуры. Например, Ins означает не клавишу на малой цифровой клавиатуре, а дополнительную клавишу вне малой цифровой клавиатуры (см. рис. 5.11). Единственное расхождение по кодам сканирования между 84- и 101-клавишными клавиатурами состоит в интерпретации клавиши PrtSc. Оно связано с тем, что на рассматриваемой клавиатуре эта клавиша не предназначена для ввода символа *, а совмещена с клавишей Sys Req. Код сканирования клавиши * на малой цифровой клавиатуре 101-клавишной клавиатуры совпадает с кодом сканирования клавиши PrtSc на 84-клавишной клавиатуре. Если у Вас 101-клавишная клавиатура, то для печати содержимого экрана достаточно нажать единственную клавишу PrtSc. В тех случаях, когда дополнительная клавиша на 101-клавишной клавиатуре имеет то же наименование, что и заимствованная из 84-клавишной клавиатуры, второй байт кода сканирования совпадает со старым кодом.
В байтах статуса клавиатуры отведено дополнительно по одному биту для левых клавиш Ctrl и Alt, а уже задействованные биты взводятся как при нажатии левых, так и при нажатии правых клавиш Ctrl и Alt. Таким образом, например, если бит для Ctrl установлен в единицу, а бит для левой Ctrl сброшен, то, значит, нажата правая Ctrl. Такой, на первый взгляд странный, подход тем не менее позволяет обеспечить совместимость с 84-клавишной клавиатурой и распознать.
Таблица 5.12
Дополнительные коды сканирования клавиш
101-клавиатуры IBM PC AT
Клавиши |
Код сканирования |
|||||
|
16-й |
10-й |
||||
F11 |
57 |
|
|
|
87 |
|
F12 |
58 |
|
|
|
88 |
|
Alt (правая) |
Е0 |
38 |
|
|
224 |
56 |
Ctrl (правая) |
Е0 |
1D |
|
|
224 |
29 |
PrtSc |
Е0 |
2А |
Ев |
37 |
224 |
42 224 55 |
Shift-PrtSc (Sys Req) |
Е0 |
37 |
|
|
224 |
55 |
Ctrl-FrtSc (Sys Req) |
Е0 |
37 |
|
|
224 |
55 |
Alt-PrtSc |
54 |
|
|
|
84 |
|
Pause |
Е1 |
1D |
45 |
E1 9D С5 |
225 |
29 69 225 157 197 |
Ctrl-Pause (Break) |
Е0 |
46 |
Ев |
С6 |
224 |
76 224 198 |
Ins |
Е0 |
52 |
|
|
224 |
82 |
Shift-Ins |
Е0 |
АА |
Ев |
52 |
224 |
176 224 82 |
Del |
Е0 |
53 |
|
|
224 |
83 |
Shift-Del |
Е0 |
АА |
Ев |
53 |
224 |
176 224 83 |
← |
Е0 |
4В |
|
|
224 |
75 |
Shift-← |
Е0 |
АА |
Ев |
4В |
224 |
176 224 75 |
Номе |
Е0 |
47 |
|
|
224 |
71 |
Shift-Номе |
Е0 |
АА |
Ев |
47 |
224 |
176 224 71 |
End |
Е0 |
|
|
|
224 |
79 |
Shift-End |
Е0 |
АА |
Ев |
|
224 |
176 224 79 |
↑ |
Е0 |
48 |
|
|
224 |
72 |
Shift-↑ |
Е0 |
АА |
Ев |
48 |
224 |
176 224 72 |
↓ |
Е0 |
5в |
|
|
224 |
86 |
Shift-↓ |
Е0 |
АА |
Ев |
56 |
224 |
176 224 86 |
PgUp |
Е0 |
49 |
|
|
224 |
73 |
Shift-PgUp |
Е0 |
АА |
Ев |
49 |
224 |
176 224 73 |
PgDn |
Е0 |
51 |
|
|
224 |
81 |
Shift-PgDn |
Е0 |
АА |
Ев |
51 |
224 |
176 224 81 |
→ |
Е0 |
4D |
|
|
224 |
77 |
Shift-→ |
Е0 |
АА |
Ев |
4D |
224 |
176 224 77 |
(H)Enter |
Е0 |
1С |
|
|
224 |
28 |
(M)/ |
Е0 |
35 |
|
|
224 |
53 |
Shift-(M)/ |
Е0 |
АА |
Ев |
35 |
224 |
176 224 53 |
нажатие левой (правой) клавиши Ctrl (Alt). Еще один бит в статусе зарезервирован для клавиши Sys Req, вследствие чего она может использоваться в качестве переключателя, но такая возможность стандартно не реализована. Дополнительно к комбинации клавиш Ctrl-Num Lock соответствующий бит статуса переключает и клавиша Pause, в связи с чем она действует так же, вызывая паузу в обработке.
Драйвер 101-клавишной клавиатуры обеспечивает выдачу дополнительных расширенных кодов клавиш, вторые байты которых сведены в табл. 5.13. Отметим, что дополнения связаны не только с наличием новых клавиш, но и с задействованием других комбинаций уже имеющихся клавиш. Как и раньше, для устранения неоднозначности клавиши малой цифровой клавиатуры помечены буквой М в скобках. Но здесь явно выделены все такие клавиши, так как они на клавиатуре продублированы. Если признак (М) не указан, то клавиша находится вне малой цифровой клавиатуры. Как и в случае кодов сканирования, от этого зависит значение расширенного кода клавиши..
К сожалению, не всегда в BIOS прошит драйвер 101-клавишной клавиатуры: зачастую имеющийся драйвер эмулирует работу только 84-клавишного пульта.
Обобщим все рассмотренные в данном пункте сведения, необходимые пользователю при работе на клавиатуре, а также программисту, не интересующемуся вводом символов из порта, в табл. 5.14. Такая необходимость вызвана тем, что эта информация была разрозненной, а просто запомнить ее невозможно. В таблице имеются и дополнительные сведения, касающиеся комбинаций с клавишей Ctrl, обеспечивающих ввод управляющих символов ASCII.
Табл. 5.14 позволяет определить, какой код вводится при нажатии клавиши или допустимой комбинации клавиш на клавиатуре. Возможно и диаметрально противоположное ее использование: определение того, как ввести требуемый код. Коды комбинаций клавиш делятся на две группы:
— расширенные коды ASCII, которые представлены их обозначениями;
— расширенные коды клавиш, которые обозначены через n;m, где n -первый, а m — второй байт в десятичной системе счисления.
Если клавиша или комбинация клавиш не обеспечивает ввод какого-либо кода, то соответствующее поле содержит запись н_д, что означает «не действует». Запись «спец» указана для комбинаций, которые входят в состав специальных комбинаций клавиш или непосредственно являются таковыми.
Таблица применима к любой из рассмотренных клавиатур. Пометка (—) указывает на то, что данная запись (клавиша или код) соответствует только 83- и/или 84-клавишным клавиатурам;
Таблица 5.12
Дополнительные коды сканирования клавиш 101-клавиатуры 1ВМ РС АТ
Клавиши |
Код |
Клавиши |
Код |
||
16-й |
10-й |
16-й |
10-й |
||
F11 F12 |
85 86 |
133 134 |
Alt-↑ Alt-↓ Alt-← Alt-→ |
98 A0 9B 9D |
152 160 155 157 |
Shift-F11 Shift-F12 |
87 88 |
135 136 |
|||
Ctrl-F11 Ctrl-F12 |
89 8A |
137 138 |
Alt-Del Alt-End Alt-Home Alt-Ins Alt-PgUp Alt-PgDn |
A3 97 A2 99 A1 |
163 159 151 162 153 161 |
Alt-F11 Alt-F12 |
8B |
139 140 |
|||
Alt-[ Alt-] Alt-; Alt-¸ Alt-´ Alt-\ Alt-, Alt-. Alt-/ |
1A 1B 27 28 29 2B 33 34 35 |
26 27 39 40 41 43 51 52 53 |
Alt-(M)∕ Alt-(M)* Alt-(M)- Alt-(M)+ Alt-(M)Enter |
A4 37 4A 4E A6 |
164 55 74 78 166 |
Alt-BS Alt-Enter Alt-Esc Alt-Tab Ctrl-Tab |
0E 01 A5 94 |
14 28 1 165 148 |
Ctrl-(M)∕ Ctrl-(M)* Ctrl-(M)- Ctrl-(M)+ Ctrl-(M)↑ Ctrl-(M)5 Ctrl-(M)↓ Ctrl-(M)Ins Ctrl-(M) |
95 96 8E 90 8D 91 92 93 |
149 150 142 144 141 143 145 146 147 |
пометка же ( + ) выделяет записи, относящиеся только к 101-клавишной клавиатуре. Записи, ничем не помеченные, относятся к любой клавиатуре.
В первом столбце перечислены клавиши всех клавиатур. Содержимое таблицы соответствует выключенным режимам Caps Lock и Num Lock. Это ни в коей мере не ограничивает ее значимость, так как фиксация данных клавиш имитируется удержанием клавиши Shift в нажатом состоянии (имеются в виду только буквенные клавиши и клавиши малой цифровой клавиатуры; интерпретация нажатия других клавиш от состояния режимов Caps Lock и Num Lock не зависит). Второй столбец таблицы определяет коды клавиш на основном регистре, т.е. коды одиночных клавиш. Остальные столбцы задают коды комбинаций клавиш с Shift, Ctrl и Alt.
На некоторых клавиатурах имеется клавиша Null, обеспечивающая ввод расширенного кода клавиши 0;3.
В зависимости от производимого эффекта при нажатии клавиши и их комбинации можно подразделить на следующие группы:
1) клавиши и их комбинации, обеспечивающие ввод символов расширенного кода ASCII;
2) клавиши и их комбинации, при нажатии которых вводятся расширенные коды клавиш;
3) специальные комбинации клавиш, при нажатии которых ПЭВМ выполняет предопределенные действия;
4) клавиши-переключатели, нажатие которых не приводит к вводу какого-либо кода, но обеспечивает изменение статуса клавиатуры;
5) комбинации клавиш, не приводящие к какому-либо эффекту;
6) комбинации клавиш, сводимые к другим комбинациям на основании приоритетов клавиш-переключателей.
Дело в том, что из одновременно нажатых клавиш-переключателей Shift, Ctrl и Alt только одна остается активной, а именно та, которая имеет наиболее высокий приоритет. В порядке убывания приоритета эти клавиши располагаются следующим образом: Alt, Ctrl, Shift.
Детальный анализ табл. 5.14 показывает следующее:
1) с клавиатуры можно ввести практически все символы ASCII (но не расширенного), за исключением символа NUL, что достигается путем нажатия одиночной клавиши или комбинации клавиши Ctrl с одной из кодовых клавиш;
2) имеется 5 символов ASCII, которые можно ввести двумя способами:
BS — нажатием клавиши BS или комбинации Ctrl-H;
НТ (TAB) — нажатием клавиши Tab или комбинации Ctrl-I;
CR — нажатием клавиши Enter или комбинации Ctrl-M;
ESC — нажатием клавиши Esc или комбинации Ctrl- {;
LF — нажатием комбинаций Ctrl-Enter или Ctrl-J.
Символ NUL без ухищрений ввести не удастся, так как его код используется в качестве идентификатора расширенных кодов клавиш. Решить проблему ввода символа NUL можно следующими способами:
1) использовать в программе специальное представление этого символа последовательностью других символов;
2) использовать для ввода NUL какую-нибудь комбинацию клавиш, генерирующую расширенный код клавиши, или множество таких комбинаций.
В последнем случае программа должна после считывания первого (нулевого) байта расширенного кода клавиши (т.е. символа NUL) дополнительно ввести второй байт и проанализировать его. По результатам анализа можно отбросить второй байт, и тогда останется код символа NUL. Обычно для этого используется комбинация Ctrl-@.
Оба эти способа имеют следующие недостатки: исключается возможность использования зарезервированных для представления символа NUL символов (комбинаций клавиш) по своему прямому назначению; необходимо осуществлять определенный анализ в программе.
Представлять же символ NUL в программе в качестве константы, как правило, труда не составляет.
Смысл использования клавиши Ctrl для ввода управляющих символов ASCII, а также техника ввода символов, образующих расширение ASCII, будут описаны в следующем пункте.
Таблица 5.14
Коды клавиш
Клавиши |
Основной регистр |
Shift- |
Ctrl- |
Alt- |
Пишущей машинки: 1 ! 2 @ 3 # 4 $ 5 % 6 ^ 7 & 8 * 9 ( 0 ) - _ = + Q W E R T Y U I O P [ { ] } A S D F G H J K L ; : ‚ „ ` ~ \ ¦ Z X C V B N M ,
< .
> ∕ ? Space |
1 2 3 4 5 6 7 8 9 0 - = q w e r t y u i o p [ ] a s d f g h j k l ; ‘ ` \ z x c v b n m , . / SP |
! @ # $ % ^ & * ( ) - + Q W E R T Y U I O P { } A S D F G H J K L : „ ~ ¦ Z X C V B N M < > ? SP |
н_д 0:3 н_д н_д н_д RS н_д н_д н_д н_д US н_д DC1 ETB EMQ DC2 DC4 EM
NAK HT (TAB) SI
DLE
ESC GS
SOH
DC3
EOT
ACK
BEL BS LF VT FF н_д н_д н_д FS SUB CAN
ETX
SYN
STX S0 CR н_д н_д н_д SP |
0;120 0;121 0;122 0;123 0;124 0;125 0;126 0;127 0;128 0;129 0;130 0;131 0;16 0;17 0;18 0;19 0;20 0;21 0;22 0;23 0;24 0;25 (+)0;26 (+)0;27 0;30 0;31 0;32 0;33 0;34 0;35 0;36 0;37 0;38 (+)0;39 (+)0;40 (+)0;41 (+)0;43 0;44 0;45 0;46 0;47 0;48 0;49 0;50 (+)0;51 (+)0;52 (+)0;53 SP |
Служебные: Esc BS Tab Enter Ctrl Shift (-)* PrtSc (+)PrtSc Alt Caps Lock Num Lock Scroll Lock (+)Pause |
ESC BS HT (TAB) CR н_д н_д (-)* (+)спец н_д н_д н_д н_д (+)спец |
ESC BS 0;15 CR н_д н_д спец спец (как без Shift) н_д н_д н_д н_д (+)спец (как без Shift) |
ESC (+)0;148 LF н_д н_д 0;144 0;144 н_д н_д спец (-)спец (+)спец |
(+)0;1 (+)0;14 (+)0;165 (+)0;28 н_д н_д н_д н_д н_д н_д н_д н_д (+)спец (как без Alt) |
Функциональные: F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 (+)F11 (+)F12 |
0;59 0;60 0;61 0;62 0;63 0;64 0;65 0:66 0;67 0;68 (+)0;133 (+)0;134 |
0;84 0;85 0;86 0;87 0;88 0;89 0;90 0;91 0;92 0;93 (+)0;135 (+)0;136 |
0;94 0;95 0;96 0;97 0;98 0;99 0;100 0;101 0;102 0;103 (+)0;137 (+)0;138 |
0;104 0;105 0;106 0;107 0;108 0;109 0;110 0;111 0;112 0;113 (+)0;139 (+)0;140 |
Малой цифровой клавиатуры: Home 7 ↑ 8 PgUp 9 - ←
4 5 →
6 + End 1 ↓
2 PgDn
3 Ins 0 Sys Req (+)* (+)/ (+)Enter |
0;71 0;72 0;73 - 0;75 н_д 0;77 + 0;79 0;80 0;81 0;82 0;83 н_д (+)* (+)/ (+)CR |
7 8 9 - 4 5 6 + 1 2 3 0 . н_д (+)* (+)/ (+)CR |
0;119 (+)0;141 0;132 (+)0;142 0;115 (+)0;143 0;116 (+)0;144 0;117 (+)0;145 0;118 (+)0;146 (+)0;147 н_д (+)0;150 (+)0;149 (+)LF |
н_д н_д н_д (+)0;74 н_д н_д н_д (+)0;78 н_д н_д н_д н_д спец н_д (+)0;55 (+)0;164 (+)0;28 |
Управления курсором: (+)Ins (+) (+)Home (+)End (+)PgUp (+)PgDn (+)↑ (+)← (+)→ (+)↓ |
(+)0;82 (+)0;83 (+)0;71 (+)0;79 (+)0;73 (+)0;81 (+)0;72 (+)0;75 (+)0;77 (+)0;80 |
(+)0;82 (+)0;83 (+)0;71 (+)0;79 (+)0;73 (+)0;81 (+)0;72 (+)0;75 (+)0;77 (+)0;80 |
(+)0;146 (+)0;147 (+)0;119 (+)0;117 (+)0;132 (+)0;118 (+)0;141 (+)0;115 (+)0;116 (+)0;145 |
(+)0;162 (+)0;163 (+)0;151 (+)0;159 (+)0;153 (+)0;161 (+)0;152 (+)0;155 (+)0;157 (+)0;160 |