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

ПрограммаKbdscan

Для демонстрации использования функции 00h прерывания INT 16h мы подготовили программу, выводящую на экран скан-коды и коды ASCII нажимаемых клавиш (листинг 2.2).

Листинг 2.2. Файлkbdscan\kbdscan.c

// =====================================================

// Просмотр клавиатурных скан-кодов и кодов ASCII

//

// (C) Фролов А.В, 1997

//

// E-mail: frolov@glas.apc.org

// WWW: http://www.glasnet.ru/~frolov

// или

// http://www.dials.ccas.ru/frolov

// =====================================================

#include <stdio.h>

#include <dos.h>

int main(void)

{

union REGS rg;

printf("KBDSCAN, (c) A. Frolov, 1997\n"

"Press <ESC> to exit\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;

}

return 0;

}

Проверка буфера на наличие в нем символов

Функция 01h поможет вам проверить состояние буфера клавиатуры - есть там коды нажатых клавиш или нет. При этом программа не переводится в состояние ожидания, даже если буфер клавиатуры пуст. В этом случае в регистре флагов флаг ZF устанавливается в единицу и управление возвращается программе.

Формат вызова функции представлен ниже:

Регистры на входе:

AH = 01h

Регистры на выходе:

ZF = 0, если в буфере имеется код нажатой клавиши;

ZF = 1, если буфер клавиатуры пуст;

AL = код ASCII символа или 0, если AH содержит расширенный код ASCII символа;

AH = скан-код или расширенный код ASCII символа, если AL=0

Эту функцию удобно использовать во время выполнения какого-либо длительного процесса (например, форматирования диска или передачи данных по линии связи) для прерывания этого процесса по запросу пользователя.

Кроме того, функцию 01h можно применять вместе с функцией 00h для сброса содержимого клавиатурного буфера. Для этого в цикле повторяют вызов функции 01h, вслед за которым идет вызов функции 00h при условии, что буфер клавиатуры не пуст.

Сброс буфера клавиатуры полезно выполнять перед вводом ответственной информации, так как если пользователь случайно нажмет одну и ту же клавишу несколько раз, в буфере клавиатуры могут оказаться лишние символы.

ПрограммаChkbuf

Приведем исходный текст программы CHKBUF, выводящей на экран в цикле символ '*' (листинг 2.3). Если нажать любую клавишу, кроме<Esc>, программа выводит на экран строку текста - инструкцию для завершения работы программы. Если же нажать на клавишу<Esc>, работа программы будет завершена.

Листинг 2.3. Файлchkbuf\chkbuf.c

// =====================================================

// Демонстрация способа проверки буфера клавиатуры

//

// (C) Фролов А.В, 1997

//

// E-mail: frolov@glas.apc.org

// WWW: http://www.glasnet.ru/~frolov

// или

// http://www.dials.ccas.ru/frolov

// =====================================================

#include <stdio.h>

#include <dos.h>

int main(void)

{

union REGS rg;

int i, zflag;

printf("CHKBUF, (c) A. Frolov, 1997\n");

for(;;)

{

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

putchar('*');

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

for(i=0; i<30000; 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>,

// завершаем работу программы

if(rg.h.ah == 1)

{

// Выводим на экран содержимое регистров AH и AL,

// содержащих, соответственно, скан-код и код ASCII

// нажатой клавиши

printf("\nScan = %02.2X Ascii = %02.2X",

rg.h.ah, rg.h.al);

break;

}

else

printf("\nPress <ESC> to exit\n");

}

}

return 0;

}

Соседние файлы в папке несколько программ