logo search
несколько программ / bsp33

Программа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;

}