Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ 4 / LAB_4_otchet.docx
Скачиваний:
80
Добавлен:
04.11.2020
Размер:
125.09 Кб
Скачать

Ввод информации с клавиатуры средствами bios

Интерфейсом программ в персональном компьютере с клавиатурой является прерывание 16h BIOS. Далее приводится описание его функций.

АН = 00h - чтение с ожиданием двухбайтового кода из буфера клавиатуры. Прочитанный код возвращается в регистре АХ: младший байт - в регистре AL, старший - в АН. Если нажата ASCII-клавиша, в AL помещается ASCII-код символа, в АН - скэн-код. При нажатии специальных клавиш AL равен 0, а в АН возвращается расширенный скэн-код.

АН = 0lh - чтение без ожидания двухбайтового кода из буфера клавиатуры. Если буфер пуст, в 1 выставляется флаг нуля ZF. В противном случае в АХ возвращается двухбайтовый код из буфера клавиатуры, но продвижение указателя "головы" буфера не производится, т.е. код "остается" в буфере.

АН = 02h - определение состояния шифт- и триггерных клавиш. В регистре AL возвращается содержимое байта по адресу 40:17h (см. табл. 4.1).

Функция АН = 05h не имеет аналогов в библиотеке Turbo С и может использоваться для имитации нажатии клавиш в демонстрационных программах, программах переноса текста и т.д.

Функции АН = 10 - 12h являются аналогами функций 00 - 02h, но предназначены для использования в компьютерах с клавиатурой 101 /102 клавиши.

Функции АН = 00 - 02h прерывания 16h BIOS положены в основу функции bioskey() библиотеки Turbo С. Далее следует описание этой функции.

int bioskey(int cmd)

Обращается в зависимости от значения в cmd к функциям АН = 00 - 02h прерывания 16h. Возвращаемое функцией значение повторяет значение регистра АХ при выходе из прерывания

Алгоритмы

Для того, чтобы движение символа было постоянным используется два вложенных цикла while (с конструкцией switch-case): первая, чтобы программа выполнялась до нажатия кнопки ESC, вторая – для непрерывного движения символа ('*') с условием нажатия кнопки, определяющая противоположное направление.

while(c != 27) // пока не нажали ESC

{

switch(c) // от нажатой клавиши

{

case 75: // <-

case 61: // F3

while(c != 77 || c != 61)

{

// сдвиг во одну сторону

}

break;

case 77: // ->

case 62: // F4

while(c != 75 || c != 62)

{

//сдвиг в другую сторону

}

break;

default:

break;

}

В программе кроме функциональных клавиш F3 и F4, предусмотрена управление символом клавишами из набора "стрелка вправо" и "стрелка влево".

Для улавливания нажатия кнопок в первой части лабораторной работы была использована функция bioskey() из библиотеки dos.h. Данная функция при аргументе 0 возвращает ASCII код нажатой клавиши, а при аргументе 1, проверяет на нажатие кнопок вообще и возвращает 0 при бездействии клавиатуры.

Во второй части лабораторной работы была использована собственная реализация проверки на нажатие и возвращение ASCII кода нажатой клавиши.

Ниже представлена реализация вышеупамянутой функции

char keyIsPressed(int x) {

union REGS r;

if (x==1) { // какая кнопка нажата

r.h.ah = 0x0B;

int86(0x21, &r, &r);

return r.h.al;

}

if(x==0) { // проверка на нажатие кнопок вообще

r.h.ah = 0x7

int86(0x21, &r, &r);//int86(номер прерывания,откуда,куда)

return r.h.al;

}

return 0;

}

Соседние файлы в папке ЛАБ 4