Сделай Сам Свою Работу на 5

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





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

Модуль Graph.

Для работы с графикой из программы на Паскале в папке, откуда она запускается, должен присутствовать файл EGAVGA.BGI.



Кроме того, при компиляции такой программы должен быть доступен модуль GRAPH.TPU, содержащий подпрограммы отрисовки графических объектов.

Файлы *.BGI это графические адаптеры, отвечающие за работу с мониторами различных типов.

Библиотека GRAPH.TPU подключается стандартным способом с помощью USES в разделе описаний программ:

USES Graph;

В графическом режиме экран представляет собой матрицу точек (пикселов), причем имеется возможность высветить любой пиксель любым цветом. Координаты каждого пиксела определяются парой целых чисел:

координата X - номер пиксела в строке. Нумерация слева направо, начиная с 0;

координата Y- номер строки пикселов. Нумерация строк сверху вниз, начиная с 0.

Таким образом, координаты левого верхнего угла экрана (0,0). Любой объект, высвечиваемый на экране, представляет собой совокупность отдельных пикселов. При переходе в графический режим экран очищается. Количество воспроизводимых пикселов по горизонтали и вертикали зависит от типа монитора и установленного графического режима (каждый монитор может использовать несколько режимов, отличающихся количеством поддерживаемых цветов и разрешением графического экрана в пикселах):

монитор CGA - максимум 320*200 пикселов, монитор EGA – 640*350, монитор VGA – 640*480; Работу с более современными и мощными графическими режимами, относящимися к классу SuperVGA, Паскаль непосредственно не поддерживает, хотя существуют созданные независимыми разработчиками графические драйверы этих режимов.

Режим функционирования экрана, кроме количества пикселов, характеризуется определенной палитрой - набором видимых цветов. Каждая палитра состоит из четырех цветов для CGA или 16 цветов для EGA и VGA.

Установка графического режима осуществляется путем обращения к процедуре InitGraph:

InitGrapH(gd,gm,pt);

Целочисленные переменные gd и gm задают тип графического дисплея и режим работы графического адаптера, строковая переменная pt - путь к файлу графического адаптера (*.BGI). Пример:

USES Graph;

VAR gd,gm,error: integer;

BEGIN

gd:=VGA; {выбор адаптера VGA}

gm:=VGAHi; {режим 640 x 480 точек x 16 цветов }

InitGraph(gd,gm,'');

error:=GraphResult;

If error <> grOk Then Begin

Write ('Ошибка графики:', GraphErrorMsg(error));

readln;

halt;

End;

Line (0,0,getmaxx,getmaxy); Readln; Closegraph;

End.

Здесь устанавливается графический режим VGA 640*480 точек с 16 цветами, так как путь к файлу EGAVGA.BGI указан пустым, предполагается, что он находится в текущей папке, после перехода в графический режим процедурой Line рисуется линия из левого верхнего в правый нижний угол экрана, затем, после нажатия Enter, графический режим закрывается и происходит выход из программы.

Для автоматического выбора максимально возможного режима переменной gdнеобходимо присвоить значение detect, при этом переменные gm и pt не определяются, если в текущем каталоге, в котором находится система Турбо Паскаль, имеются файлы *.BGI. Пример:

USES Graph;

VAR gd,gm: integer;

BEGIN

gd:=Detect;

InitGraph(gd,gm,'');

. . .

Рассмотрим основные процедуры и функции модуля Graph.

CloseGraph; - завершает работу в графическом режиме. Необходимо выполнять эту процедуру перед завершением любой графической программы на Паскале.

ClearDevice; очищает графический экран. Обе этих процедуры не имеют параметров.

function GetMaxX:integer; - получает максимальную координату по оси X

function GetMaxY:integer; - получить максимальную координату по оси Y

 

SetColor(Color); - устанавливает цвет рисования линий, точек и текста (аналог "пера" в программах для рисования). Цвета кодируются так же, как в текстовом режиме. Для полноты картины перечислим их все:

Черный (BLACK) 8 - темно-серый (DARKGRAY)

Синий (BLUE) 9 - голубой (LIGHTBLUE)

Зеленый (GREEN) 10 - светло-зеленый (LIGHTGREEN)

Циановый (CYAN) 11 - светло-циановый (LIGHTCYAN)

Красный (RED) 12 - светло-красный (LIGHTRED)

Фиолетовый (MAGENTA) 13 - светло-фиолетовый (LIGHTMAGENTA)

Коричневый (BROWN) 14 - желтый (YELLOW)

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.