Очистку буферу клавітури
можна виконати декількома способами:
безпосередньо змінити значення покажчиків „голови” та
„хвоста”, зробившиїх рівними (найбільш швидкий
спосіб);
використати функцію MS-DOS AH=0Ch. Значення AL задає
операцію вводу з клавіатури. Перед виконанням вводу MS-DOS виконує очистку
буферу;
використовуючи функції Turbo
C bioskey(1) або kbhit(), перевірити чи пустий буфер клавіатури. Якщо в буфері
є будь-які символи, виконати функцію bioskey(0) або getch(). Циклічне
повторення перевірки-читання очистить буфер. При цьому можна підрахувати число
знищених з буферу символів. Саме так очищалась клавіатура в програмі L7_7.C.
Приведемо приклад функції cllear_kb(),
що максимально швидко виконує очистку буферу клавіатури, приводячи до рівності
покажчики „голови” та „хвоста”:
/*L7_8.C*/
#include<dos.h>
# include”kb.h”
void clear_kb(void)
{char register
_es * tail=TAIL_PTR,
_es * head=HEAD_PTR;
_ES=0x40;
disable(); *tail=* head; enable();
}
Часто очистку буферу клавіатури зручно суміщати з
операцією читання клавіатури. Так, наприклад, має сенс виконати самий перший ввод в програмі або введення відповіді користувача на
відповідальні запрошення: підтвердження знищення файлів або іх перевизначення,
завершення роботи програми і т.д. Це не дозволить прогрмі
спрацювати від випадкового натиснення клавіші до появи запрошення.
Приведемо приклад функції getc_kb(),
котра вводить символ з клавіатури з попередньою очисткою буферу. Функція
використовує підфункцію AL=01h функції MS-DOS AH=0Ch:
введення символу з затримкою, „луною” на екран і збереженням реакції на
натиснення комбінації клавішCtrl-Break. Повертає двобайтовий BIOS-код клавіші.
/*L7_9.C*/
#include<dos.h>
unsigned int getc_kb(void)
{ register ret_ax=0;
_AX=0x0C01;
geninterrupt(0x21);
ret_ax=_AL;
If(!ret_ax)/*якщо не натиснута клавіша*/
{_AX=0x0C01; geninterrupt(0x21);
ret_ax=_AL; return
ret_ax<<8;}
return ret_ax;
}
![]() |
![]() |
![]() |