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;
}
}
- Клавиатура
- 2.1. Принципы работы клавиатуры
- 2.2. Порты для работы с клавиатурой
- 2.3. Аппаратное прерывание клавиатуры
- 2.4. Средства bios для работы с клавиатурой
- 2.4.1. Чтение символа с ожиданием
- 2.4.2. Проверка буфера на наличие в нем символов
- 2.4.3. Получение состояния переключающих клавиш
- 2.4.4. Установка временных характеристик клавиатуры
- 2.4.5. Запись символов в буфер клавиатуры
- 2.4.6 Чтение символа с ожиданием для 101-клавишной клавиатуры
- 2.4.7. Проверка буфера на наличие в нем символов для 101-клавишной клавиатуры
- 2.4.8. Получение состояния переключающих клавиш для 101-клавишной клавиатуры
- 2.5. Средства ms-dos для работы с клавиатурой
- 2.5.1. Буферизованный ввод с эхо-выводом
- 2.5.2. Буферизованный ввод без эхо-вывода
- 2.5.3. Нефильтрованный ввод без эхо-вывода
- 2.5.4. Ввод/вывод на консоль
- 2.5.5. Ввод строки символов
- 2.5.6. Проверка состояния стандартного ввода
- 2.5.7. Сброс буфера клавиатуры
- 2.6. Клавиатурные функции библиотеки Microsoft c
- 2.6. Драйвера режима ядра для ps/2 клавиатуры Стек драйверов для системных устройств ввода
- Стек драйверов для Plug and Play ps/2-клавиатуры
- Стек устройств для Plug and Play ps/2-клавиатуры
- Обработка клавиатурного ввода приложениями Поток необработанного ввода (получение данных от драйвера)
- Обработка сообщений конкретным окном
- Массивы состояния клавиш клавиатуры
- Клавиатурные ловушки
- Общая схема обработки
- Модель прямого ввода (Raw Input)