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