Ввод символов с клавиатуры

Рассмотрим внешний вид стандартной клавиатуры IBM PC (рис. 4.4).

Рис. 4.4. Стандартная клавиатура IBM PC.

Можно выделить три основные группы клавиш, которые могут обрабатываться программным путём (таблица 4.3).

Таблица 4.3. Группы клавиш.

Внешний вид Наименование Описание
обычные клавиши ASCII-код!=0, скан-код!=0
функциональные клавиши ASCII-код=0, скан-код!=0
управляющие клавиши ASCII-код и скан-код отсутствует, функцией getch() не определяется

Клавиши, которые обрабатываются функцией getch() (обычные и функциональные), имеют двухбайтовый код. Младший байт называется ASCII-кодом клавиши, а старший – скан-кодом. Если ASCII-код равен нулю, то это означает, что была нажата функциональная клавиша, и нужно считывать еще и скан-код.

Пример 4.4. Ввод с клавиатуры и отображение кодов клавиш в шестнадцатеричном виде.

#include <stdio.h>

#include <conio.h>

void main ()

{ char ascii,scan;

// цикл до нажатия ESC

while (ascii!= 27)

{ ascii=getch();

if (!ascii) scan=getch(); else scan=0;

// вывод ASCII-кода и скан-кода клавиши

printf("\nASCII = %2x Scan = %2x ",ascii,scan);

// если код нерасширенный, то вывести символ

if (ascii) printf(" simbol=%c",ascii); } }

Нажатие на управляющие клавиши не определяется стандартными функциями языка Си. Для этой группы клавиш следует использовать прерывание BIOS 16h, которое отвечает за сервис клавиатуры. Функция 12h этого прерывания считывает состояние расширенных shift-клавиш. После выполнения этой функции результат возвращается в регистр AX, где каждый бит имеет особое значение:

Младший байт AX (AL):

бит 7 =1 à режим вставки (Insert) включен

бит 6 =1 à режим CapsLock включен (горит светодиод)

бит 5 =1 à режим NumLock включен (горит светодиод)

бит 4 =1 à режим ScrollLock включен (горит светодиод)

бит 3 =1 à клавиша Alt нажата

бит 2 =1 à клавиша Ctrl нажата

бит 1 =1 à клавиша левый Shift нажата

бит 0 =1 à клавиша правый Shift нажата

Старший байт AX (AH):

бит 7 =1 à клавиша SysReq нажата (на современных компьютерах клавиша отсутствует)

бит 6 =1 à клавиша CapsLock нажата

бит 5 =1 à клавиша NumLock нажата

бит 4 =1 à клавиша ScrollLock нажата

бит 3 =1 à клавиша правый Alt нажата

бит 2 =1 à клавиша правый Ctrl нажата

бит 1 =1 à клавиша левый Alt нажата

бит 0 =1 à клавиша левый Ctrl нажата

Пример 4.5. Вывод состояния клавиатуры и отображение нажатия управляющих клавиш.

#include <conio.h>

#include <stdio.h>

#include <dos.h>

void main ()

{ clrscr();

char *status[8], *KeyPress[8];

status[0] ="Ins "; status[1] ="CapL";

status[2] ="NumL"; status[3] ="ScrL";

status[4] ="Alt "; status[5] ="Ctrl";

status[6] ="LSht"; status[7] ="RSht";

KeyPress[0]="SysR"; KeyPress[1]="CapL";

KeyPress[2]="NumL"; KeyPress[3]="ScrL";

KeyPress[4]="RAlt"; KeyPress[5]="RCtr";

KeyPress[6]="LAlt"; KeyPress[7]="LCtr";

char b1,b2;

int i,c;

clrscr();

do

{ asm mov ah,12h

asm int 16h

asm mov b1,al

asm mov b2,ah

for (i=7;i>=0;i--)

{

if (((b1 >> i) & 1)!=0) textcolor(WHITE);

else textcolor(DARKGRAY);

gotoxy((8-i)*8,2);

cprintf("%s ",status[7-i]);

if (((b2 >> i) & 1)!=0) textcolor(WHITE);

else textcolor(DARKGRAY);

gotoxy((8-i)*8,4);

cprintf("%s ",KeyPress[7-i]);

}

if (kbhit()) c=getch();

} while(c!=27);

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: