Иллюстрированный самоучитель по Турбо Паскалю
Программирование клавиатуры
Дополнительные возможности управления клавиатурой реализуются двумя
функциями: 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 |
|
|
|