Сделай Сам Свою Работу на 5

СРЕДСТВА 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- 2017 stydopedia.ru Все материалы защищены законодательством РФ.