- •1. Этапы создания программного обеспечения
- •1.1. Постановка задачи
- •1.2. Анализ, формальная постановка и выбор метода решения
- •1.3. Проектирование
- •8.1. Управление экраном в текстовом режиме.
- •8.2. Управление клавиатурой
- •8.3. Управление динамиком
- •8.5. Управление экраном в графическом режиме
- •8.7. Практикум. Создание движущихся изображений
- •Примеры Пример 8.7. Программа рисует человечка, делающего утреннюю зарядку.
- •Пример 8.10. Программа изображает планету, вращающуюся вокруг Солнца на фоне мерцающих звезд и расходящейся галактики.
- •Демонстрация
- •Создание иллюзии движения
8.2. Управление клавиатурой
Клавиатура - достаточно сложное устройство, в состав которого входит микропроцессор и память - буфер клавиатуры. При нажатии и отпускании любой клавиши в буфер клавиатуры записываются так называемые коды нажатия/отпускания, при этом микропроцессор клавиатуры отсекает дребезг клавиш - сигналы, полученные при неполном контакте в процессе нажатия и отпускания клавиши.
Клавиши клавиатуры делят на буквенно-цифровые, специальные и клавиши смещения.
К буквенно-цифровым относят клавиши букв, цифр, специальных знаков и пробела. Их используют для ввода информации.
Специальные клавиши - это клавиши управления курсором (←, ↑, →, ↓, Home, End, Tab, Page up. Page down), удаления (Del, Backspace), клавиши переключения режимов (Ins, Caps lock, Num lock, Scrool lock), функциональные клавиши (Esc, Break, Fl, F2, F3, ..., FI2) и т.д. Эти клавиши используют для выполнения вспомогательных операций во время работы с компьютером.
Клавиши смещения - это клавиши Shift, Ctrl и Alt. Их используют совместно с другими клавишами для изменения вводимых кодов. Так, если при нажатии клавиши «а» формируется код строчной буквы а латинского алфавита, то нажатие Shift-a приведет к вводу кода заглавной буквы А латинского алфавита.
Всего выделяют около 400 различных комбинаций, которые могут обрабатываться программой. Эти комбинации формируются на основании кодов нажатия/отпускания специальной программой BIOS (базовая система обработки ввода-вывода) и записываются в буфер BIOS клавиатуры.
Изначально считалось, что количество различных комбинаций не превысит 256, и, соответственно, для представления этой информации будет достаточно 1 байта (см. приложение 2), но со временем количество комбинаций возросло, и потребовалось использование второго байта.
В настоящее время для представления комбинаций, не вошедших в таблицу ASCII, используют расширенные коды, состоящие из двух байт: первый байт равен 0, а второй - содержит расширенный scan-код (см. приложение 3).
Ввод буквенно-цифровых данных с клавиатуры осуществляется процедурами Read и ReadLn, при этом реально происходит чтение кодов ASCII из буфера BIOS клавиатуры. Считанные символьные коды преобразуются во внутренний формат в соответствии с типом переменной.
Процедуры Read и ReadLn обрабатывают только комбинации, соответствующие буквам и цифрам, а также некоторые специальные комбинации, например, маркер конца строки (комбинация символов #13, #10).
Модуль crt содержит специальные функции управления клавиатурой, которые позволяют работать с расширенными кодами.
1. Функция KeyPressed: boolean - возвращает true, если нажата любая клавиша, false - если буфер BIOS клавиатуры пуст; функция не извлекает символы из буфера, не ожидает ввода;
2. Функция ReadKey:char - извлекает очередной код из буфера BIOS клавиатуры и возвращает его как результат операции, ожидает ввода, но не высвечивает вводимого символа.
Для чтения расширенного кода функцию ReadKey необходимо вызывать дважды: первый раз она вернет 0, а второй - расширенный scan-код:
chl:=ReadKey; {читаем код}
if chl=#0 then ch2:=ReadKey; {если код=0, то читаем второй байт}
Пример 8.2. Разработать программу определения кодов клавиш и их комбинаций. Выход из цикла осуществлять по нажатию клавиши Esc.
Program ex;
Uses crt;
Var c1,c2:char;
Begin
repeat c1:=ReadKey; {вводим код}
if c1=#0 then {если расширенный код}
begin
c2:=ReadKey; {то читаем расширенный scan-код}
WriteLn(ord(c1):5, ord(c2):5) {выводим расширенный код}
end
else WriteLn(ord(c1):5) {выводим код ASCII}
until c1 =#27;{до нажатия Esc}
End.
Таблица 8.2
Примечание. Функция ReadKey обрабатывает коды из буфера BIOS клавиатуры, поэтому с ее помощью нельзя получить коды нажатия/отпускания отдельных клавиш, не преобразуемых в расширенные scan-коды, например, клавиш смещения, клавиш переключения режимов.
Состояния клавиш смещения и клавиш переключения режимов BIOS фиксирует в байте состояния клавиатуры (табл. 8.2), который расположен в
оперативной памяти по адресу $0:$417.
Для прямого обращения к этому байту можно использовать стандартно объявленный массив Mem:array of byte, например: Mem[$0:$417], или наложить некоторую переменную на интересующий нас байт оперативной памяти:
Var KeyState:byte absolute $0:$417; … .
