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