- •Клавиатура
- •2.1. Принципы работы клавиатуры
- •2.2. Порты для работы с клавиатурой
- •2.3. Аппаратное прерывание клавиатуры
- •2.4. Средства bios для работы с клавиатурой
- •2.4.1. Чтение символа с ожиданием
- •2.4.2. Проверка буфера на наличие в нем символов
- •2.4.3. Получение состояния переключающих клавиш
- •2.4.4. Установка временных характеристик клавиатуры
- •2.4.5. Запись символов в буфер клавиатуры
- •2.4.6 Чтение символа с ожиданием для 101-клавишной клавиатуры
- •2.4.7. Проверка буфера на наличие в нем символов для 101-клавишной клавиатуры
- •2.4.8. Получение состояния переключающих клавиш для 101-клавишной клавиатуры
- •2.5. Средства ms-dos для работы с клавиатурой
- •2.5.1. Буферизованный ввод с эхо-выводом
- •2.5.2. Буферизованный ввод без эхо-вывода
- •2.5.3. Нефильтрованный ввод без эхо-вывода
- •2.5.4. Ввод/вывод на консоль
- •2.5.5. Ввод строки символов
- •2.5.6. Проверка состояния стандартного ввода
- •2.5.7. Сброс буфера клавиатуры
- •2.6. Клавиатурные функции библиотеки Microsoft c
- •2.6. Драйвера режима ядра для ps/2 клавиатуры Стек драйверов для системных устройств ввода
- •Стек драйверов для Plug and Play ps/2-клавиатуры
- •Стек устройств для Plug and Play ps/2-клавиатуры
- •Обработка клавиатурного ввода приложениями Поток необработанного ввода (получение данных от драйвера)
- •Обработка сообщений конкретным окном
- •Массивы состояния клавиш клавиатуры
- •Клавиатурные ловушки
- •Общая схема обработки
- •Модель прямого ввода (Raw Input)
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);
}