Главная » Ассемблер, Железо » Ввод информации с клавиатуры при помощи функций BIOS

0

Клавиатура является основным устройством ввода алфавитно-цифровой информации, а часто — и основным средством управления работой компьютера. Для ввода информации с клавиатуры можно использовать либо функции операционной системы, либо прямой опрос контроллера клавиатуры. Мы не будем рассматривать функции MS-DOS, используемые для ввода данных с клавиатуры, так как они достаточно подробно описаны в литературе [3, 10], но непригодны для сколько-нибудь серьезной работы. Функции DOS имеют два очень серьезных недостатка. Первый недостаток заключается в том, что они не позволяют полностью реализовать возможности функциональных клавиш. Второй недостаток — клавиатурные функции DOS предназначены для работы в режиме терминала (с построчным выводом информации сверху вниз и прокруткой изображения снизу вверх). В процессе считывания символа они выполняют ряд дополнительных операций, что делает весьма неудобным их использование в любом другом, не терминальном режиме.

Функции BIOS обладают гораздо более широкими возможностями, чем функции DOS. Этих возможностей вполне достаточно для выполнения любых операций реальном режиме работы процессора. Вызов клавиатурных функций BIOS выполняется по прерыванию Int 16h. Рассмотрим эти функции.

Прерывание Int 16h, функция 00h: прочитать символ с клавиатуры

Функция 00h считывает символ из буфера клавиатуры и выдает его ASCII-код и скан-код (символ после считывания будет удален из буфера клавиатуры).

Перед вызовом прерывания требуется записать в регистр АН значение 00h.

После выполнения функции в регистры будет помещена следующая информация:

•           в АН — скан-код символа;

•           в AL — ASCII-код символа.

При нажатии управляющих клавиш функция выдает ASCII-код со значением 0, благодаря чему их легко можно отличить от алфавитно-цифровых. Однако друг от друга управляющие клавиши, таким образом, отличаются только по скан-кодам.

Прерывание Int 16h, функция 01 h: получить состояние клавиатуры

Функция Olh проверяет наличие символа в буфере клавиатуры. Если символ присутствует в буфере, функция выдает его ASCII-код и скан-код (не удаляя символ из буфера).

Перед вызовом прерывания требуется записать в регистр АН значение Olh.

После выполнения функции при отсутствии символа в буфере будет установлен флаг ZF. При наличии символа в буфере флаг ZF будет сброшен и в регистры помещена следующая информация:

•           в АН — скан-код символа;

•           в AL — ASCII-код символа.

Данная функция применяется в тех случаях, когда для управления работой программы используется не только клавиатура, но и другие устройства. Простейший способ работы в этом случае — поочередный циклический опрос всех источников информации. Использовать функцию, аналогичную 00h, нельзя — она заблокирует опрос всех остальных устройств до тех пор, пока не будет введен какой- либо символ с клавиатуры. Поэтому в цикле осуществляется только контроль поступления новой информации, а считывание информации выполняется вне цикла.

Прерывание Int 16h, функция 02h: получить состояние флагов клавиатуры

Функция 02h выдает содержимое байта флагов BIOS. Перед вызовом прерывания требуется записать в регистр АН значение 02h.

После выполнения функции регистр AL содержит описание состояния флагов:

•            бит 0 — правая клавиша Shift (0 — не нажата, 1 — нажата);

•            бит 1 — левая клавиша Shift (0 — не нажата, 1 — нажата);

•            бит 2 — клавиша Ctrl (0 — не нажата, 1 — нажата);

•            бит 3 — клавиша Alt (0 — не нажата, 1 — нажата);

•            бит 4 — переключатель Scroll Lock (0 — выключен, 1 — включен);

•           бит 5 — переключатель Num Lock (0 — выключен, 1 — включен);

•           бит 6 — переключатель Caps Lock (0 — выключен, 1 — включен);

•            бит 7 — переключатель Insert (0 — выключен, 1 — включен). Функция 02h имеет один серьезный недостаток, который сильно ограничивает возможность ее использования совместно с функцией 00h: никак не фиксируется момент изменения состояния управляющих клавиш. Если было выполнено две операции, одна из которых изменила состояние алфавитно-цифровой клавиши, а другая — состояние управляющей клавиши, то далеко не всегда можно определить, какая из операций произошла раньше.

Прерывание Int 16h, функция 03h: управление режимом автоповтора

Функция 03h устанавливает характеристики режима автоповтора.

Перед вызовом прерывания требуется записать в регистры следующую информацию:

•            в АН — значение 03h;

•            в AL — значение 05h;

•           в ВН — код, задающий значение задержки автоповтора (табл. 1.4);

•           в BL — код, задающий скорость повторения (табл. 1.5).

Таблица 1.4. Коды задержки автоповтора

Код

Задержка, мс

 

 

0

250

 

 

1

500

 

 

2

750

 

 

3

1000

 

 

Таблица 1.5. Коды частоты автоповтора

Код

Скорость повторения,

Код

Скорость повторения,

скорости

символ/с

скорости

символ/с

00h

30,0

10h

7,5

01 h

26,7

11h

6,7

02h

24,0

12h

6,0

03h

21,8

13h

5,5

04h

20,0

14h

5,0

05h

18,5

15h

4,6

06 h

17,1

16h

4,3

07h

16,0

17h

4,0

08 h

15,0

18h

3,7

09h

13,3

19h

3,3

OAh

12,0

1Ah

3,0

OBh

10,9

1Bh

2,7

OCh

10,0

1Ch

2,5

ODh

9,2

1Dh

2,3

OEh

8,6

1Eh

2,1

OFh

8,0

1Fh

2,0

Прерывание Int 16h, функция 04h: включить/выключить звуковой сигнал клавиш

Функция 04h предназначена для включения и выключения звукового сигнала клавиш (щелчка).

Перед вызовом прерывания требуется записать в регистры следующую информацию:

• в АН — значение 04h;

•       в AL — код выполняемой операции (0 — отключить сигнал, 1 — включить сигнал).

Прерывание Int 16h, функция 05h: поместить символ в буфер клавиатуры

Функция 05h заносит ASCII-код и скан-код клавиши в буфер, имитируя ввод данных с клавиатуры.

Перед вызовом прерывания требуется записать в регистры следующую информацию:

•           в АН — значение 05h;

•           в СН — скан-код клавиши;

•           в CL — ASCII-код клавиши.

После выполнения функции имеет место следующая ситуация:

•       если функция выполнена успешно, флаг переноса сбрасывается, а в регистре AL находится значение 0;

•       если функция не выполнена (буфер переполнен), то флаг переноса установлен, а в регистре AL находится значение 1.

Применяется данная функция при отладке программ, осуществляющих ввод информации с клавиатуры, — ее можно использовать для имитации нажатия клавиш.

Прерывание Int 16h, функция 10h: прочитать символ с расширенной клавиатуры

Функция 10h — это усовершенствованный вариант функции 00h. Она позволяет получить скал-коды клавиш F11 и F12, а также клавиш управления курсором.

Перед вызовом прерывания требуется записать в регистр АН значение 10h.

После выполнения функции в регистры будет помещена следующая информация:

•           в АН —расширенный скан-код символа;

•           в AL — ASCII-код символа.

Функция 10h в качестве признака нажатия управляющей клавиши использует ASCII-коды 0, OAh, ODh, EOh. Отличия ее от функции 00h иллюстрирует табл. 1.6.

Таблица 1.6. Расширенные скан-коды, возвращаемые

функцией 10h для клавиш функциональной, дополнительной и цифровой групп

Скан- код

ASCII- код

Клавиша или

комбинация клавиш

Скан- код

ASCII- код

Клавиша или

комбинация клавиш

73h

0

Ctrl+4

90h

0

Ctrl++

 

EOh

Ctrl+<—

91 h

0

Ctrl+2

74h

0

Ctrl+6

 

EOh

Ctrl+?

 

EOh

Ctrl+—>

92h

0

Ctrl+0

75 h

0

Ctrl+1

 

EOh

Ctrl+lnsert

 

EOh

Ctrl+End

93h

0

Ctrl+.

76h

0

Ctrl+3

 

EOh

Ctrl+Delete

 

EOh

Ctrl+Page Down

94h

0

Ctrl+Tab

77h

0

Ctrl+7

95h

0

Ctrl+/

 

EOh

Ctrl+Home

96h

0

Ctrl+*

84h

0

Ctrl+9

97h

0

Alt+Home

 

OEh

Ctrl+Page Up

98 h

0

Alt+T

85h

0

F11

99h

0

Alt+Page Up

86h

0

F12

9Bh

0

Alt+<—

87h

0

Shift+F11

9Dh

0

Alt+->

88h

0

Shift+F12

9Fh

0

Alt+End

89h

0

Ctrl+F11

AOh

0

Alt+?

8Ah

0

Ctrl+F12

A1h

0

Alt+Page Down

8Bh

0

Alt+F11

A2h

0

Alt+lnsert

8Ch

0

Alt+F12

A3h

0

Alt+Delete

8Dh

0

Ctrl+8

A5h

0

Alt+Tab

 

OEh

Ctrl+T

EOh

OAh

Ctrl+Enter

8 Eh

0

Ctrl+-

 

ODh

Enter

8Fh

0

Ctrl+5

 

 

 

Прерывание Int 16h, функция 11 h: получить состояние расширенной клавиатуры

Функция llh — усовершенствованный вариант функции Olh. Данная функция позволяет получить скан-коды клавиш F11 и F12, а также клавиш управления курсором.

Перед вызовом прерывания требуется записать в регистр АН значение llh.

После выполнения функции при наличии символа в буфере клавиатуры должна иметь место следующая ситуация:

•       флаг нуля (ZF) сброшен;

•       в АН —расширенный скан-код символа;

•       в AL — ASCII-код символа.

При отсутствии символа в буфере флаг нуля будет установлен. Также как и функция Olh, данная функция только проверяет наличие символа, но не извлекает его, то есть не стирает из буфера.

Прерывание Int 16h, функция 12h: получить состояние флагов расширенной клавиатуры

Функция 12h — это усовершенствованный вариант функции 02h. Она позволяет получить состояние специальных клавиш расширенной клавиатуры.

Функция выдает содержимое байта флагов BIOS. Перед вызовом прерывания требуется записать в регистр АН значение I2h.

После выполнения функции регистр АХ содержит описание состояния флагов:

•       бит 0 — правая клавиша Shift (0 — не нажата, 1 — нажата);

•       бит 1 — левая клавиша Shift (0 — не нажата, 1 — нажата);

•       бит 2 — клавиши Ctrl (0 — не нажаты, 1 — нажата, по крайней мере, одна из клавиш);

•       бит 3 — клавиши Alt (0 — не нажаты, 1 — нажата, по крайней мере, одна из клавиш);

•       бит 4 — переключатель Scroll Lock (0 — выключен, 1 — включен);

•       бит 5 — переключатель Num Lock (0 — выключен, 1 — включен);

•       бит 6 — переключатель Caps Lock (0 — выключен, 1 — включен);

•       бит 7 — переключатель Insert (0 — выключен, 1 — включен);

•       бит 8 — левая клавиша Ctrl (0 — не нажата, 1 — нажата);

•       бит 9 – левая клавиша Alt (0 — не нажата, 1 — нажата);

•       бит 10 — правая клавиша Ctrl (0 — не нажата, 1 — нажата);

•           бит 11 — правая клавиша Alt (0 — не нажата, 1 — нажата);

•           бит 12 — клавиша Scroll Lock (0 — не нажата, 1 — нажата);

•           бит 13 — клавиша Num Lock (0 — не нажата, 1 — нажата);

•           бит 14 — клавиша Caps Lock (0 — не нажата, 1 — нажата);

•           бит 15 — клавиша SysReq (0 — не нажата, 1 — нажата). Функция 12h имеет тот же недостаток, что и функция 02h, — не всегда можно однозначно определить, какая из операций произошла раньше: переключение управляющей или алфавитно-цифровой клавиши.

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии