русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Программирование клавиатуры


Дата добавления: 2015-06-12; просмотров: 821; Нарушение авторских прав


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

WriteLn(‘0’,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-клавишная).

В табл. 2 приводятся расширенные коды клавиш, возвращаемые функцией ord(ReadKey). Для режима ввода кириллицы приводятся коды, соответствующие альтернативному варианту кодировки.

Таблица 2Расширенные коды клавиш

Код Клавиша или комбинация клавиш Код Клавиша или комбинация клавиш
Первый байт Второй байт Первый байт Второй байт
Алфавитно-цифровые клавиши
- Backspace (Забой) - Tab (Табуляция)
- Enter - Пробел
- ! - "
- # - $
- % - &
- ' - (
- ) - *
- + - ,
- - - .
- / 4S...57 - 0...9
-   - ;
- < - =
- > - ?
- @ 65...90 - A...Z
- [ - \
- ] - ^
-   - '
97...122 - a...z - {
- l - }
- ~ 128...159 - А...Я
160... 175 - а...п 224...239 - р...я
Управляющие клавиши и их сочетания со сдвиговыми
Ctrl-2 Shift-Tab
16...25 Alt-Q...Alt-Р (верхний ряд букв) 30...38 Alt-A...Alt-L (средний ряд букв)
44...50 Alt-Z...Alt-М (нижний ряд букв) 59...68 F1...F10
- 71 Ноте Курсор вверх
PgUp Курсор влево
Курсор вправо End
Курсор вниз PgDn
Ins Del
84...93 Shift-Fl...Shift-F10 94...103 Ctrl-F1... Ctrl-F10
104...113 Alt-Fl...Alt-F10 Ctrl-PrtScr
Ctrl-курсор влево Ctrl-Курсор вправо
Ctrl-End Ctrl-PgDn
Ctrl-Home 120...131 Alt-1. ..Alt-= (верхний ряд клавиш)
Ctrl-PgUp      

Пример программы, с применением модуля CRT

 

Uses Crt;
Var
X, Y : Byte;
Stop : String;
Begin
TextBackGround(5);
ClrScr;
Randomize;
repeat
X:=Random (76);
Y:=Random (23);
GoToXY (X, Y);
TextColor (Random(15));
write('***');
X:=1;
Y:=24;
GoToXY (X, Y);
TextColor (0);
write ('Для остановки программы наберите “Стоп“');
write ('Для продолжения – любую клавишу ');
readln(Stop);
until (Stop='Стоп') or (Stop ='стоп');
readln;
End.

 

Uses CRT;

var

С: Char

begin

TextBackground(red) ;

ClrScr;{Заполняем экран красным цветом}

WriteLn('Нажмите любую клавишу...');

С := ReadKey; {Ждем нажатия любой клавиши}

TextBackground(Black) ;

ClrScr {Восстанавливаем черный фон экрана}

end.

 

Схема использования функции readKey для общего случая может выглядеть так:

Uses Crt;
Var Sym : Char;
Begin
ClrScr;
while true do
begin
write ('Нажмите клавишу');
Sym := readKey;
if Sym <> #0
then
begin {основной набор}
case Sym of
#8 : writeln ('Вы нажали BackSpace');
#9 : writeln ('Вы нажали Tab');
#13 : writeln ('Вы нажали Enter');
#27 : writeln ('Вы нажали Esc');
else
writeln ('Вы ввели символ ',Sym);
end;
if Sym = #27
Then
Exit
end
else
begin {расширенный набор}
Sym := readKey;{повт. чтение: берем расширенный код}
writeln ('Вы нажали клавишу с кодом ', Ord (Sym));
end
end
End.

В следующем примере иллюстрируется вывод достаточно длинного сообщения в двух разных окнах.

Uses CRT;

var

k: integer;

begin

{Создаем левое окно -желтые символы на синем фоне:}

TextBackground(Blue);

Window(5,2,35,17);

TextColor(Yellow);

for k := 1 to 100 do

Write(' Нажмите клавишу Enter...');

ReadLn; {Ждем нажатия Enter}

ClrScr; {Очищаем окно}

{Создаем правое окно - белые символы на красном фоне:}

TextBackground(Red);

TextColor(White);

Window(40,2,70,17);

for k := 1 to 100 do

Write(' Нажмите клавишу Enter...');

ReadLn;

TextMode(C080) {Сбрасываем все установки}

end.

 

Для генерации звукового сигнала обычно используется вызов описанных процедур по схеме Sound-Delay-NoSound. Следующая программа заставит ПК воспроизвести простую музыкальную гамму. Используемый в ней массив F содержит частоты всех полутонов в первой октаве от «до» до «си». При переходе от одной октавы к соседней частоты изменяются в два раза.

Uses CRT;

const

F: array [1..12] of Real =

(130.8, 138.6, 146.8, 155.6, 164.8, 174.6, 185.0, 196.0, 207.7, 220.0,

233.1, 246.9);{Массив частот 1-й октавы}

Temp = 100;{Темп исполнения}

var

k,n: Integer;

begin

{Восходящая гамма}

for k := 0 to 3 do for n := 1 to 12 do

begin

Sound(Round(F[n]*(1 shl k) )) ;

Delay(Temp);

NoSound

end ;

{Нисходящая гамма}

for k := 3 downto 0 do

for n := 12 downto 1 do

begin

Sound(Round(F[n]*(1 shl k)) ) ;

Delay(Temp);

NoSound

end

end.



<== предыдущая лекция | следующая лекция ==>
Модуль CRT в Turbo Pascal. | Модульное программирование в одном документе


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.035 сек.