СРЕДСТВА BIOS ДЛЯ РАБОТЫ С КЛАВИАТУРОЙ
Набор функций для работы с клавиатурой, предоставляемый в распоряжение программиста прерыванием BIOS INT 16h, включает в себя функции для выработки кода нажатого символа из буфера с ожиданием нажатия, функции для проверки содержимого буфера и для управления содержимым буфера, функции для изменения скоростных характеристик клавиатуры. Прерывание типа 16 предусматривает операции, которые могут быть полезны для написания программы используемой независимо от ОС DOS.
Чтение символа с ожиданием
Функция 00h выполняет чтение кода символа из буфера клавиатуры, если он там есть. Если буфер клавиатуры пуст, программа переводится в состояние ожидания до тех пор, пока не будет нажата какая-нибудь клавиша. Скан-код и ASII-код нажатой клавиши передаются программе.
Приведем формат вызова функции:
На входе: АН = 00h
На выходе: AL = ASCII-код символа или 0, если АН содержит расширенный ASCII-код символа;
АН = скан-код или расширенный ASCII-код символа, если AL = 0.
Для остальных клавиш функция 00h прерывания INT 16h возвращает расширенный ASCII-код:
F1
| 3b
| Shift F1
|
| Ctrl F1
| 5e
| Alt F1
|
| F2
| 3c
| Shift F2
|
| Ctrl F2
| 5f
| Alt F2
|
| F3
| 3d
| Shift F3
|
| Ctrl F3
|
| Alt F3
| 6a
| F4
| 3e
| Shift F4
|
| Ctrl F4
|
| Alt F4
| 6b
| F5
| 3f
| Shift F5
|
| Ctrl F5
|
| Alt F5
| 6c
| F6
|
| Shift F6
|
| Ctrl F6
|
| Alt F6
| 6d
| F7
|
| Shift F7
| 5a
| Ctrl F7
|
| Alt F7
| 6e
| F8
|
| Shift F8
| 5b
| Ctrl F8
|
| Alt F8
| 6f
| F9
|
| Shift F9
| 5c
| Ctrl F9
|
| Alt F9
|
| F10
|
| Shift F10
| 5d
| Ctrl F10
|
| Alt F10
|
|
Alt A
| 1e
| Alt P
|
| Alt 3
| 7a
| Down Dn
|
| Alt B
|
| Alt Q
|
| Alt 4
| 7b
| Left <
| 4b
| Alt C
| 2E
| Alt R
|
| Alt 5
| 7c
| Right >
| 4d
| Alt D
|
| Alt S
| 1f
| Alt 6
| 7d
| Up
|
| Alt E
|
| Alt T
|
| Alt 7
| 7e
| End
| 4f
| Alt F
|
| Alt U
|
| Alt 8
| 7f
| Home
|
| Alt G
|
| Alt V
| 2f
| Alt 9
|
| PgDn
|
| Alt H
|
| Alt W
|
| Alt -
|
| PgUp
|
| Alt I
|
| Alt X
| 2d
| Alt =
|
|
|
| Alt J
|
| Alt Y
|
|
|
| ^Left
|
| Alt K
|
| Alt Z
| 2c
|
|
| ^Right
|
| Alt L
|
|
|
| Shift Tab
| Of
| ^End
|
| Alt M
|
| Alt 0
|
| Ins
|
| ^Home
|
| Alt N
|
| Alt 1
|
| Del
|
| ^PgDn
|
| Alt O
|
| Alt 2
|
| ^PrtSc
|
| ^PgUp
|
| В следующей таблице приведены ASCII-коды клавиш, имеющихся только на 101-клавишной клавиатуре:
F11
|
| Alt Bkksp
| 0e
| Alt Д /
| a4
| F12
|
| Alt Enter
| 1c
| Alt Д *
|
| Shift F11
|
| Alt Esc
|
| Alt Д
| 4a
| Shift F12
|
| Alt Tab
| a5
| Alt Д +
| 4e
| Ctrl F11
|
| Ctrl Tab
|
| Alt Д Enter
| ab
| Ctrl F12
| 8a
|
|
|
|
| Alt F11
| 8b
| Alt up Up
|
| Ctrl Д /
|
| Alt F12
| 8c
| Alt doun Dn
| a0
| Ctrl Д *
|
| Alt [
| 1a
| Alt left <
| 9b
| Ctrl Д
| 8e
| Alt ]
| 1b
| Alt right >
| 9d
| Ctrl Д +
|
| Alt ;
|
|
|
|
|
| Alt '
|
| Alt Delete
| a3
| Ctrl Д Up [8]
| 9d
| Alt `
|
| Alt End
| 9f
| Ctrl Д 5 [5]
| 8f
| Alt \
| 2b
| Alt Home
|
| Ctrl Д Dn [2]
|
| Alt ,
|
| Alt Insert
| a2
| Ctrl Д Ins[0]
|
| Alt .
|
| Alt PageUp
|
| Ctrl Д Del[.]
|
| Буква "Д" в последней таблице обозначает дополнительную ("калькуляторную") клавиатуру.
Для демонстрации использования функции 00h прерывания INT 16h мы подготовили программу, выводящую на экран скан-коды и ASC-коды нажимаемых клавиш:
#include <stdio.h>
#include <dos.h>
void main(void) {
union REGS rg;
printf("\nОпределение скан-кода и ASCII-кода клавиш." "\nДля завершения работы нажмите клавишу ESC.\n\n");
for(;;) {
// Вызываем прерывание INT 16h
rg.h.ah=0; int86(0x16,&rg,&rg);
// Выводим на экран содержимое регистров AH и AL.
// содержащих соответственно скан-код и ASCII-код
// нажатой клавиши.
printf("\nScan=%02.2x Ascii=%02.2x", rg.h.ah, rg.h.al);
// Если бы была нажата клавиша ESC, завершаем работу программы
if(rg.h.ah==1) break; }}
Проверка буфера на наличие в нем символа
На входе: AH = 01h.
На выходе: ZF = 0, если в буфере имеется код нажатой на клавиатуре клавиши;
ZF = 1, если буфер клавиатуры пуст;
AL = ASCII-код символа или 0, если AH содержит расширенный ASCII-код символа;
AH = скан-код или расширенный ASCII-код символа, если AL=0.
Функция 01h поможет проверить состояние буфера клавиатуры – есть там коды нажатых клавиш или нет. При этом программа не переводится в состояние ожидания, даже если буфер клавиатуры пуст. В этом случае в регистре флагов устанавливается в единицу флаг ZF и управление возвращается программе.
Эту функцию удобно использовать во время выполнения какого-либо длительного процесса (например, форматирования диска или передачи данных по линии связи) для прерывания этого процесса по запросу оператора.
Кроме того функцию можно использовать вместе с функцией 00h для сброса содержимого клавиатурного буфера. Для этого в цикле повторяют вызов функции 01h, вслед за которым идет вызов функции 00h при условии, что буфер клавиатуры не пуст. Сброс клавиатурного буфера полезно выполнять перед вводом ответственной информации, так как из-за случайного двойного или тройного нажатия на клавишу в буфере клавиатуры могут оказаться лишние символы.
Приведем текст программы, выводящей на экран в цикле символ '*'. При нажатии на любую клавишу, коме ESC, программа выводит на экран строку текста - инструкцию для завершения работы программы. Если нажать клавишу ESC, работа программы будет завершена.
#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.agh=0;
int 86(0x16,&rg,&rg);
//Если была нажата клавиша ESC, завершаем работу программы
if(rg.h.ah==1) {
//Выводим на экран содержимое регистров AH и AL.
//содержащих соответственно скан-код и ASCII-код
//нажатой клавиши.
printf("\nScan = %0.22x Ascii=%02.2x",
rg.h.ah,
rg.h.al);
break; }
else printf("\nДля завершения нажмите ESC\n"); } }}
Установка временных характеристик клавиатуры
На входе: AH = 03h;
AL = 05h;
BL = период автоповтора(количество повторов за одну секунду) 0 - 30.0; OAh - 10.0;
1 - 26.7; ODh - 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 декабря 1984 года, Вы можете воспользоваться этой функцией для ускорения (или замедления) работы клавиатуры.
В качестве примера приведем две программы. Первая увеличивает быстродействие клавиатуры до верхнего предела, вторая восстанавливает исходные значения временных характеристик.
#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;
itn86(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;
itn86(0x16, &rg, &rg);}
Запись символов в буфер клавиатуры
На входе: AH = 05h;
CL = ASCII-код записываемого символа;
CH = скан-код записываемого символа или 0.
На выходе: AL = 0 - запись выполнена успешно;
1 - буфер клавиатуры переполнен.
С помощью этой функции модно вставить символы в буфер клавиатуры, как будто они были введены оператором.
Приведенная программа записывает в буфер клавиатуры пять символов '*'. Запустите ее и посмотрите на системное приглашение. Вы увидите что-нибудь похожее на C:\*****.
include <stdio.h>
include <dos.h>
void main(void);
void main(void) {
union REGS rg;
int i;
for(i=5;i<5;i++) {
rg.h.ah=5; rg.h.cl='^'; rg.h.ch=9;
int 86(0x16,&rg,&rg); }}
Чтение символа с ожиданием для 101-клавишной клавиатуры
Функция 10h полностью аналогична функции 00h, но она предназначена для работы с клавиатурой, имеющей 101 клавишу.
Приведем формат вызова функции:
На входе: AH = 10h.
На выходе: AL = ASCII-код символа или 0, если AH содержит расширенный ASCII-код символа;
AH = скан-код или расширенный ASCII-код символа, если AL=0
Функция определена для BIOS, изготовленной не раньше 15 декабря 1985 года.
Проверка буфера на наличие в нем символов для 101-клавишной клавиатуры
На входе: AH = 11h.
На выходе: ZF = 0, если в буфере имеется код нажатой на клавиатуре клавиши;
ZF = 1, если буфер клавиатуры пуст;
AL = ASCII-код символа или 0, если AH содержит расширенный ASCII-код символа;
AH = скан-код или расширенный ASCII-код символа, если AL=0.
Функция 11h полностью аналогична функции 01h, но она предназначена для работы с клавиатурой, имеющей 101 клавишу. Эта функция определена для BIOS, изготовленной не раньше 15 декабря 1985 года.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|