Программирование работы с клавиатурой

При программировании работы с клавиатурой могут быть использованы прерывание 16Н BIOS и прерывание 21Н (AH = 1, 6, 7, 8, A, B, C) DOS.

Прерывание 16H BIOS предусматривает достаточно простые операции обмена данными с клавиатурой, полезные при написании программ, выполняемых независимо от операционной системы DOS. Так, при AH = 0 и 1 считываются из буфера клавиатуры scan-код клавиши в регистр AH и ASCII-код клавиши в регистр AL; при AH = 2 в AL возвращается байт состояния клавиатуры — состояние управляющих клавиш: Shift, Ctrl, Alt, Scroll Lock, Num Lock и Insert; при AH = 3 — устанавливаются режимы работы клавиатуры в IBM PCjr.

Ввод с клавиатуры по прерыванию 21H DOS предполагает.

9. Чтение символа с клавиатуры (с ожиданием ввода) и отображением символа на экране дисплея: AH = 1 или AH = 6 и DL = 0FFh; то же, но без эха-отображения символа на экране дисплея: AH = 7 или AH = 8. Считанный символ (ASCII-код) помещается в регистр AL (scan-код не передается). Если к моменту запроса на чтение символа клавиша еще не нажата, то управление прерванной программе не будет возвращено до тех пор, пока это не будет сделано. Если код клавиши расширенный (клавиши F1–F10, Alt, Ctrl и т. д.), необходимо повторное чтение. Пример фрагмента программы чтения символа:

mov AH, 1

int 21H

10. Чтение строки символов с буферизацией: AH = 0Ah. Для инициализации такого чтения необходимо:

l задать буфер, указав в нем число символов строки, подлежащих вводу, директивой: buf DB n, 0, 0, ... , 0, 0 (buf — имя поля, которое, в принципе, может быть и любым другим); количество нулей в директиве должно быть на 2 больше, чем n (n — максимальное количество вводимых символов), на место следующего нуля будет после ввода записано количество фактически введенных символов, на место последующих «0» будут введены ASCII-коды символов строки и еще один 0 для кода клавиши Enter — 13;

l занести в регистр DX адрес буфера.

При выполнении рассматриваемого прерывания управление прерванной (основной) программе не возвратится до тех пор, пока не нажаты все нужные клавиши и клавиша Enter. При нажатии каждой очередной клавиши ее код записывается в буфер клавиатуры и отображается на дисплее, но из буфера поступит в основную программу (в поле buf) только после нажатия клавиши Enter. Если до Enter клавиш нажато больше, чем указано в буфере, то раздастся звуковой сигнал и лишние символы восприняты не будут.

Пример фрагмента программы чтения строки символов:

buf DB 9,0,0,0,0,0,0,0,0,0,0,0

mov AH, 0AH

mov DX, offset buf

int 21H

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

11. Чтение состояния клавиатуры: AH = 0Bh. В регистр AL записывается 0, если в буфере клавиатуры содержится хотя бы один символ.

12. Очистка буфера клавиатуры и вызов функции: AH = 0Ch. Обнуляется буфер клавиатуры и инициируется выполнение одной из 5 функций прерывания 21H; в этом случае номер вызываемой функции должен быть записан не в регистре AH, а в регистре AL (AL = 1, 6, 7, 8 или 0Ah).

13. Ввод с клавиатуры (из файла через логический номер): AH = 3Fh. Используется функция расширенного управления файлами MS DOS по файловому указателю. Ниже приведен пример фрагмента программы для ввода с клавиатуры 50 байтов:

text db 50 dup(' ') ; задание поля памяти для ввода

...

mov AH, 3FH

mov BX, 0 ; указание устройства ввода

mov CX, 50 ; указание числа вводимых байт

mov DX, offset text ; указание начального адреса

; поля памяти для ввода

int 21H

Наши рекомендации