Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
90
Добавлен:
02.05.2014
Размер:
245.25 Кб
Скачать

2.4.3. Получение состояния переключающих клавиш

На входе: AH = 02h

На выходе: AL = Байт состояния переключающих клавиш

Функция возвращает в регистре AL состояние переключающих клавиш (Shift, Ctrl, Alt, ScrollLock, NumLock, CapsLock, Ins). Формат байта состояния соответствует формату байта, находящегося в области данных BIOS по адресу 0000h:0417h:

Биты Значение

0 Нажата правая клавиша Shift.

1 Нажата левая клавиша Shift.

2 Нажата комбинация клавиш Ctrl-Shift с любой

стороны.

3 Нажата комбинация клавиш Alt-Shift с любой

стороны.

4 Состояние клавиши ScrollLock.

5 Состояние клавиши NumLock.

6 Состояние клавиши CapsLock.

7 Состояние клавиши Insert.

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

Изменим текст предыдущей программы таким образом, чтобы завершение ее работы происходило лишь в том случае, если переключающая клавиша CapsLock находится в выключенном состоянии (соответствующий светодиод не горит):

#include <stdio.h>

#include <dos.h>

void main(void);

void main(void) {

union REGS rg;

int i, zflag;

for(;;) {

// Выводим в цикле символ '*'

putchar('*');

// Небольшая задержка во времени

for(i=0; i<1000; i++);

// Вызываем прерывание INT 16h для проверки буфера клавиатуры

// Устанавливаем флаг, который будет сброшен при нажатии на

// любую клавишу

zflag = 1;

_asm {

mov ax, 0100h

int 16h

// Если нажатия не было,

// продолжаем выполнение программы

jz nokey

// При нажатии на любую клавишу

// сбрасываем флаг

mov zflag, 0

nokey:

}

if(zflag == 0) {

// Если флаг сброшен, читаем код нажатой клавиши из буфера

// при помощи функции 01h прерывания INT 16h

rg.h.ah = 0;

int86(0x16, &rg, &rg);

// Если была нажата клавиша ESC, завершаем работу программы,

// при условии, что переключатель CapsLock выключен

if(rg.h.ah == 1) {

// Дополнительно проверяем состояние клавиши CapsLock,

// этой клавише соответствует бит 0x40 в слове состояния

rg.h.ah = 2;

int86(0x16, &rg, &rg);

if((rg.h.al & 0x40) == 0) break;

else printf("nДля завершения нажмите"

" ESC "

"при выключенной клавише CapsLock.n");

}

else printf("nДля завершения нажмите ESC "

"при выключенной клавише CapsLock.n");

}

}

}

2.4.4. Установка временных характеристик клавиатуры

На входе: AH = 03h;

AL = 05h;

BL = Период автоповтора (количество повторов

за одну секунду):

0 - 30.0; 0Ah - 10.0;

1 - 26.7; 0Dh - 9.2;

2 - 24.0; 10h - 7.5;

4 - 20.0; 14h - 5.0;

8 - 15.0; 1Fh - 2.0.

BH = Задержка включения режима автоповтора:

0 - 250 мс;

1 - 500 мс;

2 - 750 мс;

3 - 1000 мс.

На выходе: Не используются.

Мы уже рассказывали о возможности изменения временных характеристик клавиатуры. Если BIOS, установленная в вашей машине, изготовлена после 15 декабря 1985 года, вы можете воспользоваться этой функцией для ускорения (или замедления) работы клавиатуры.

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

#include <stdio.h>

#include <dos.h>

void main(void);

void main(void) {

union REGS rg;

rg.h.al = 5;

rg.h.ah = 3;

// Устанавливаем максимальное быстродействие клавиатуры

rg.h.bl = 0;

rg.h.bh = 0;

int86(0x16, &rg, &rg);

}

#include <stdio.h>

#include <dos.h>

void main(void);

void main(void) {

union REGS rg;

rg.h.al = 5;

rg.h.ah = 3;

// Восстанавливаем исходное быстродействие клавиатуры

rg.h.bl = 0xa;

rg.h.bh = 1;

int86(0x16, &rg, &rg);

}

Соседние файлы в папке Периферийные устройства ПК