Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
33_Metodicheskie_ukazania_po_laboratornym_rabot...doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
706.56 Кб
Скачать

Средства bios для работы с клавиатурой

Набор функций для работы с клавиатурой, предоставляемый в распоряжение программиста прерыванием BIOS INT 16h, включает в себя функции для выборки кода нажатого символа из буфера с ожиданием нажатия, функции для проверки содержимого буфера и для управления содержимым буфера, функции для изменения скоростных характеристик клавиатуры.

Чтение символа с ожиданием

Функция 00h выполняет чтение кода символа из буфера клавиатуры, если он там есть. Если буфер клавиатуры пуст, программа переводится в состояние ожидания до тех пор, пока не будет нажата какая-нибудь клавиша. Скан-код и ASCII-код нажатой клавиши передаются программе.

Приведем формат вызова функции:

На входе: AH = 00h

На выходе: AL = ASCII-код символа или 0, если AH содержит

расширенный ASCII-код символа;

AH = скан-код или расширенный ASCII-код

символа, если AL=0;

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

#include <stdio.h>

#include <dos.h>

void main(void);

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.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("\nДля завершения нажмите ESC\n");

}

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]