logo search
Периферийные устройства ПК / КЛАВИАТУРА

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

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

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

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

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

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

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

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

Приведем таблицу скан-кодов для клавиатуры IBM PC/XT:

----------T----------T------------T-------------T---------------¬

¦01 Esc ¦12 E ¦23 H ¦34 . > ¦45 NumLock ¦

¦02 1 ! ¦13 R ¦24 J ¦35 / ? ¦46 ScrollLock¦

¦03 2 @ ¦14 T ¦25 K ¦36 Shft(прав)¦47 Home [7] ¦

¦04 3 # ¦15 Y ¦26 L ¦37 * PrtSc ¦48 Up [8] ¦

¦05 4 $ ¦16 U ¦27 ; : ¦38 Alt ¦49 PgUp [9] ¦

¦06 5 % ¦17 I ¦28 " ' ¦39 Пробел ¦4a K - ¦

¦07 6 ^ ¦18 O ¦29 ` ~ ¦3a CapsLock¦4b <- [4] ¦

¦08 7 & ¦19 P ¦2a Shft(лев)¦3b F1 ¦4c [5] ¦

¦09 8 * ¦1a [ { ¦2b | ¦3c F2 ¦4d -> [6] ¦

¦0a 9 ( ¦1b ] } ¦2c Z ¦3d F3 ¦4e K + ¦

¦0b 0 ) ¦1c Enter¦2d X ¦3e F4 ¦4f End [1] ¦

¦0c - _ ¦1d Ctrl ¦2e C ¦3f F5 ¦50 Dn [2] ¦

¦0d + = ¦1e A ¦2f V ¦40 F6 ¦51 PgDn [3] ¦

¦0e Bksp¦1f S ¦30 B ¦41 F7 ¦52 Ins [0] ¦

¦0f Tab ¦20 D ¦31 N ¦42 F8 ¦53 Del [.] ¦

¦10 Q ¦21 F ¦32 M ¦43 F9 ¦ ¦

¦11 W ¦22 G ¦33 , < ¦44 F10 ¦ ¦

L---------¦----------¦------------¦-------------¦----------------

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

г--------T--------------T--------------T-------------¬

¦ F1 3b¦ Shift-F1 54¦ Ctrl-F1 5e ¦ Alt-F1 68 ¦

¦ F2 3c¦ Shift-F2 55¦ Ctrl-F2 5f ¦ Alt-F2 69 ¦

¦ F3 3d¦ Shift-F3 56¦ Ctrl-F3 60 ¦ Alt-F3 6a ¦

¦ F4 3e¦ Shift-F4 57¦ Ctrl-F4 61 ¦ Alt-F4 6b ¦

¦ F5 3f¦ Shift-F5 58¦ Ctrl-F5 62 ¦ Alt-F5 6c ¦

¦ F6 40¦ Shift-F6 59¦ Ctrl-F6 63 ¦ Alt-F6 6d ¦

¦ F7 41¦ Shift-F7 5a¦ Ctrl-F7 64 ¦ Alt-F7 6e ¦

¦ F8 42¦ Shift-F8 5b¦ Ctrl-F8 65 ¦ Alt-F8 6f ¦

¦ F9 43¦ Shift-F9 5c¦ Ctrl-F9 66 ¦ Alt-F9 70 ¦

¦ F10 44¦ Shift-F10 5d¦ Ctrl-F10 67 ¦ Alt-F10 71 ¦

L--------¦--------------¦--------------¦--------------

г----------T----------T-------------T-------------¬

¦ Alt-A 1e¦ Alt-P 19¦ Alt-3 7a¦ Down Dn 50¦

¦ Alt-B 30¦ Alt-Q 10¦ Alt-4 7b¦ Left <- 4b¦

¦ Alt-C 2e¦ Alt-R 13¦ Alt-5 7c¦ Right -> 4d¦

¦ Alt-D 20¦ Alt-S 1f¦ Alt-6 7d¦ Up Up 48¦

¦ Alt-E 12¦ Alt-T 14¦ Alt-7 7e¦ End 4f¦

¦ Alt-F 21¦ Alt-U 16¦ Alt-8 7f¦ Home 47¦

¦ Alt-G 22¦ Alt-V 2f¦ Alt-9 80¦ PgDn 51¦

¦ Alt-H 23¦ Alt-W 11¦ Alt-- 82¦ PgUp 49¦

¦ Alt-I 17¦ Alt-X 2d¦ Alt-= 83¦ ¦

¦ Alt-J 24¦ Alt-Y 15¦ ¦ ^Left 73¦

¦ Alt-K 25¦ Alt-Z 2c¦ ¦ ^Right 74¦

¦ Alt-L 26¦ ¦ Shift-Tab 0f¦ ^End 75¦

¦ Alt-M 32¦ Alt-0 81¦ Ins 52¦ ^Home 77¦

¦ Alt-N 31¦ Alt-1 78¦ Del 53¦ ^PgDn 76¦

¦ Alt-O 18¦ Alt-2 79¦ ^PrtSc 72¦ ^PgUp 84¦

L----------¦----------¦-------------¦--------------

В следующей таблице приведены скан-коды клавиш, имеющихся только на 101-клавишной клавиатуре:

г-------------T------------------T------------------¬

¦ F11 85¦ Alt-Bksp 0e ¦ Alt- Д / a4¦

¦ F12 86¦ Alt-Enter 1c ¦ Alt- Д * 37¦

¦ Shft-F11 87¦ Alt-Esc 01 ¦ Alt- Д - 4a¦

¦ Shft-F12 88¦ Alt-Tab a5 ¦ Alt- Д + 4e¦

¦ Ctrl-F11 89¦ Ctrl-Tab 94 ¦ Alt- Д Enter a6¦

¦ Ctrl-F12 8a¦ ¦ ¦

¦ Alt-F11 8b¦ Alt-up Up 98 ¦ Ctrl- Д / 95¦

¦ Alt-F12 8c¦ Alt-down Dn a0 ¦ Ctrl- Д * 96¦

¦ Alt-[ 1a¦ Alt-left <- 9b ¦ Ctrl- Д - 8e¦

¦ Alt-] 1b¦ Alt-right -> 9d ¦ Ctrl- Д + 90¦

¦ Alt-; 27¦ ¦ ¦

¦ Alt-' 28¦ Alt-Delete a3 ¦ Ctrl- Д Up [8] 8d¦

¦ Alt-` 29¦ Alt-End 9f ¦ Ctrl- Д 5 [5] 8f¦

¦ Alt- 2b¦ Alt-Home 97 ¦ Ctrl- Д Dn [2] 91¦

¦ Alt-, 33¦ Alt-Insert a2 ¦ Ctrl- Д Ins[0] 92¦

¦ Alt-. 34¦ Alt-PageUp 99 ¦ Ctrl- Д Del[.] 93¦

L-------------¦------------------¦-------------------

Буква "Д" в последней таблице обозначает дополнительную ("калькуляторную") клавиатуру.

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

#include <stdio.h>

#include <dos.h>

void main(void);

void main(void) {

union REGS rg;

printf("nОпределение скан-кода и ASCII-кода клавиш."

"nДля завершения работы нажмите клавишу ESC.nn");

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;

}

}