Программирование клавиатуры
Дополнительные возможности управления клавиатурой реализуются двумя функциями: KeyPressed и ReadKey.
Функция KeyPressed.
Возвращает значение типа Boolean, указывающее состояние буфера клавиатуры: False означает, что буфер пуст, a True - что в буфере есть хотя бы один символ, еще не прочитанный программой.
В MS-DOS реализуется так называемый асинхронный буферизованный ввод с клавиатуры. По мере нажатия на клавиши соответствующие коды помещаются в особый буфер, откуда они могут быть затем прочитаны программой. Стандартная длина буфера рассчитана на хранение до 16 кодов символов. Если программа достаточно долго не обращается к клавиатуре, а пользователь нажимает клавиши, буфер может оказаться переполненным. В этот момент раздается звуковой сигнал и «лишние» коды теряются. Чтение из буфера обеспечивается процедурами Read/ReadLn и функцией ReadKey. Замечу, что обращение к функции KeyPressed не задерживает исполнения программы: функция немедленно анализирует буфер и возвращает то или иное значение, не дожидаясь нажатия клавиши.
Функция ReadKey.
Возвращает значение типа Char. При обращении к этой функции анализируется буфер клавиатуры: если в нем есть хотя бы один не прочитанный символ, код этого символа берется из буфера и возвращается в качестве значения функции, в противном случае функция будет ожидать нажатия на любую клавишу. Ввод символа с помощью этой функции не сопровождается эхо-повтором и содержимое экрана не меняется.
Пусть, например, в какой-то точке программы необходимо игнорировать все ранее нажатые клавиши, коды которых еще не прочитаны из буфера, т.е. необходимо очистить буфер. Этого можно достичь следующим способом:
Uses CRT;
var
С: Char;
begin
while KeyPressed do
С := ReadKey;
.......
end.
При использовании процедуры ReadKey необходимо учесть, что в клавиатурный буфер помещаются так называемые расширенные коды нажатых клавиш. Если нажимается любая алфавитно-цифровая клавиша, расширенный код совпадает с ASCII-кодом соответствующего символа. Например, если нажимается клавиша с латинской буквой «а» (в нижнем регистре), функция ReadKey возвращает значение chr (97), а если «А» (в верхнем регистре) - значение chr (65). При нажатии функциональных клавиш F1...F10, клавиш управления курсором, клавиш Ins, Home, Del, End, PgUp, PgDn в буфер помещается двухбайтная последовательность: сначала символ #0, а затем расширенный код клавиши. Таким образом, значение #0, возвращаемое функцией ReadKey, используется исключительно для того, чтобы указать программе на генерацию расширенного кода. Получив это значение, программа должна еще раз обратиться к функции, чтобы прочитать расширенный код клавиши.
Т.е. код сканирования клавиши. Этот код определяется порядком, в соответствии с которым микропроцессор клавиатуры Intel 8042 периодически опрашивает (сканирует) состояние клавиш.
Следующая простая программа позволит Вам определить расширенный код любой клавиши. Для завершения работы программы нажмите клавишу Esc.
Uses CRT;
var
С: Char;
begin
repeat
С := ReadKey;
if C<>#0 then
WriteLn(ord(C))
else
WriteLnCO1 ,ord(ReadKey) :8)
until C=#27 {27 - расширенный код клавиши Esc}
end.
Если Вы воспользуетесь этой программой, то обнаружите, что нажатие на некоторые клавиши игнорируется функцией ReadKey. Это прежде всего так называемые сдвиговые клавиши - Shift, Ctrl, Alt. Сдвиговые клавиши в MS-DOS обычно используются для переключения регистров клавиатуры и нажимаются в сочетании с другими клавишами. Именно таким способом, например, различается ввод прописных и строчных букв. Кроме того, функция игнорирует переключающие клавиши Caps Lock, Num. Lock, Scroll Lock, а также «лишние» функциональные клавиши F11 и F12 клавиатуры IBM AT, не имеющие аналога на клавиатуре ранних моделей IBMPC/XT (в этих машинах использовалась 84-клавишная клавиатура, в то время как на IBM AT - 101-клавишная).
В табл. 13.1 приводятся расширенные коды клавиш, возвращаемые функцией ord(ReadKey). Для режима ввода кириллицы приводятся коды, соответствующие альтернативному варианту кодировки.
Таблица 13.1 Расширенные коды клавиш
Код | Клавиша или комбинация клавиш | Код | Клавиша или комбинация клавиш | ||
Первый байт | Второй байт | Первый байт | Второй байт | ||
Алфавитно-цифровые клавиши | |||||
8 | - | Backspace (Забой) | 9 | - | Tab (Табуляция) |
13 | - | Enter | 32 | - | Пробел |
33 | - | ! | 34 | - | " |
35 | - | # | 36 | - | $ |
37 | - | % | 38 | - | & |
39 | - | ' | 40 | - | ( |
41 | - | ) | 42 | - | * |
43 | - | + | 44 | - | , |
45 | - | - | 46 | - | . |
47 | - | / | 4S...57 | - | 0...9 |
58 | - | 59 | - | ; | |
60 | - | < | 61 | - | = |
62 | - | > | 63 | - | ? |
64 | - | @ | 65...90 | - | A...Z |
91 | - | [ | 92 | - | \ |
93 | - | ] | 94 | - | ^ |
95 | - | 96 | - | ' | |
97...122 | - | a...z | 123 | - | { |
124 | - | l | 125 | - | } |
126 | - | ~ | 128...159 | - | А...Я |
160... 175 | - | а...п | 224...239 | - | р...я |
Управляющие клавиши и их сочетания со сдвиговыми | |||||
0 | 3 | Ctrl-2 | 0 | 15 | Shift-Tab |
0 | 16...25 | Alt-Q...Alt-Р (верхний ряд букв) | 0 | 30...38 | Alt-A...Alt-L (средний ряд букв) |
0 | 44...50 | Alt-Z...Alt-М (нижний ряд букв) | 0 | 59...68 | F1...F10 |
0 | - 71 | Ноте | 0 | 72 | Курсор вверх |
0 | 73 | PgUp | 0 | 75 | Курсор влево |
0 | 77 | Курсор вправо | 0 | 79 | End |
0 | 80 | Курсор вниз | 0 | 81 | PgDn |
0 | 82 | Ins | 0 | 83 | Del |
0 | 84...93 | Shift-Fl...Shift-F10 | 0 | 94...103 | Ctrl-F1... Ctrl-F10 |
0 | 104...113 | Alt-Fl...Alt-F10 | 0 | 114 | Ctrl-PrtScr |
0 | 115 | Ctrl-курсор влево | 0 | 116 | Ctrl-Курсор вправо |
0 | 117 | Ctrl-End | 0 | 118 | Ctrl-PgDn |
0 | 119 | Ctrl-Home | 0 | 120...131 | Alt-1. ..Alt-= (верхний ряд клавиш) |
0 | 132 | Ctrl-PgUp |
Назад | Начало | Вперед |