- •Санкт-Петербург
- •Краткие сведения о подсистеме ввода информации с клавиатуры, используемых прерываниях, буфере клавиатуры и функциях обслуживания ввода с клавиатуры.
- •Буфер клавиатуры
- •Функции прерывания 21h ms-dos для ввода информации с клавиатуры
- •Ввод информации с клавиатуры средствами bios
- •Алгоритмы
- •Текст программы №1
- •Текст программы №2
Ввод информации с клавиатуры средствами 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;
}