ПОСИМВОЛЬНЫЙ ВВОД С КЛАВИАТУРЫ. АНАЛИЗ НАЖАТИЯ ФУНКЦИОНАЛЬНЫХ КЛАВИШ И КОМБИНАЦИЙ 



Теоретические сведения

DOS предоставляет ряд сервисных функций, обеспечивающих работу с клавиатурой. Для посимвольного ввода с клавиатуры наиболее часто используются следующие функции:

 

№ в AH Описание Вход Выход
1h Ввод символа из STDIN с ожиданием, с эхом, фильтрующий - AL = код символа
6h Ввод символа из STDIN без ожидания, без эха, нефильтрующий DL = 0FFh ZF = 0, если символ готов; AL = код символа
7h Ввод символа из STDIN с ожиданием, без эха, нефильтрующий - AL = код символа
8h Ввод символа из STDIN с ожиданием, без эха, фильтрующий - AL = код символа

 

Независимо от работы текущей программы вводимая с клавиатуры информация попадает в буфер клавиатуры — область размером 16 слов в оперативной памяти. Если работающая программа не обрабатывает поступающую информацию, буфер заполняется по мере ввода, и после 15-ти нажатий на клавиши дальнейший ввод блокируется. Благодаря такому буферированию пользователь может вводить данные еще до того, как их запросила программа.

Функции 1, 6, 7, 8 обеспечивают ввод одного символа с устройства стандартного ввода STDIN (его код возвращается в AL). В качестве STDIN обычно выступает клавиатура (также может быть файл, устройства, подключенные к коммуникационным портам). Функции 1, 7 и 8 ожидают ввода символа: функция, получив управление, проверяет буфер клавиатуры, и если там нет символа, ожидает, пока он там не появится. Функция 6 работает без ожидания: если в буфере нет символа, она сразу возвращает управление в вызвавшую программу, установив предварительно флаг нуля ZF; если же символ в буфере обнаружен, функция сбрасывает ZF и помещает в AL код символа, как и другие функции. Кроме того, при вводе с клавиатуры с помощью функции 1 происходит отображение на экране введенного символа (эхо), другие функции эха на экран не дают. В описании функций также указано, осуществляет ли функция фильтрацию ввода. В случае фильтрации функция реагирует на нажатие управляющих комбинаций Ctrl-Break и Ctrl-C, осуществляя аварийное завершение программы.

Анализ введенной информации как правило осуществляется путем сравнения кода введенного символа в AL с каким-либо предопределенным значением и переход на соответствующий участок программы командой условного перехода.

Если требуется ввести строку символов, необходимо организовать цикл, содержащий команды запроса символа и, возможно, его проверки, обработки, выхода по нажатию определенной клавиши и т. п. Можно также воспользоваться специальной функцией ввода строки 0Ah int 21h (см. след. работу) или функцией файлового ввода, указывая в качестве дескриптора файла 0 (стандартное устройство ввода).

При нажатии на любую алфавитно-цифровую клавишу в буфер записывается два байта: скан-код, закрепленный за каждой клавишей клавиатуры, и ASCII-код символа, соответствующего нажатой клавише. Ряд клавиш, а также комбинаций клавиш, не имеют соответствующих ASCII-кодов, вместо этого за ними закреплены так называемые расширенные коды. При нажатии таких клавиш в буфер клавиатуры вместо ASCII-кода записывается 0 — признак расширенной клавиши. Этот нуль возвращается также любой вышеперечисленной функцией в регистре AL. Для получения же самого расширенного кода необходимо вызвать функцию ввода с клавиатуры еще раз (причем необязательно ту же самую). При этом запроса с клавиатуры осуществлено не будет, вызванная функция поместит в AL расширенный код и тут же вернет управление в вызвавшую программу. Расширенные коды возвращаются функциональными клавишами и их комбинациями с Alt, Ctrl и Shift, а также всеми алфавитно-цифровыми клавишами, вводимыми в комбинации с клавишей Alt.

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

 

Клавиша Код (hex) Клавиша Код (hex) Клавиша Код (hex) Клавиша Код (hex) Клавиша Код (hex)
F1 3Bh Alt-B 30h Alt-O 18h Alt-1 78h left 4Bh
F2 3Ch Alt-C 2Eh Alt-P 19h Alt-2 79h right 4Dh
F3 3Dh Alt-D 20h Alt-Q 10h Alt-3 7Ah up 48h
F4 3Eh Alt-E 12h Alt-R 13h Alt-4 7Bh down 50h
F5 3Fh Alt-F 21h Alt-S 1fh Alt-5 7Ch Home 47h
F6 40h Alt-G 22h Alt-T 14h Alt-6 7Dh End 4Fh
F7 41h Alt-H 23h Alt-U 16h Alt-7 7Eh PgUp 49h
F8 42h Alt-I 17h Alt-V 2Fh Alt-8 7Fh PgDn 51h
F9 43h Alt-J 24h Alt-W 11h Alt-9 80h PgDn 51h
F10 44h Alt-K 25h Alt-X 2Dh Alt-- 82h Shift-F10 5Dh
F11 85h Alt-L 26h Alt-Y 15h Alt-= 83h Ctrl-F10 67h
F12 86h Alt-M 32h Alt-Z 2Ch Ins 52h Alt-F10 71h
Alt-A 1Eh Alt-N 31h Alt-0 81h Del 53h    

 

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

Ниже приведен пример, запрашивающий ввод в клавиатуры одного символа. Если этот символ – цифра (N = 0...9), на экран выдается сообщение ’Нажата цифра N’, после чего осуществляется выход из программы, иначе осуществляется повторный запрос символа. При нажатии F1 выводится справочное сообщение ’Нажимайте цифры’. Описание сегментов, команды инициализации DS и выхода из программы опущены для краткости.

 

; Данные

mes   db 13, 10, 'Нажата '

num   db ?, '$'   ; ячейка для ASCII-кода

helpmes db 13, 10, 'Нажимайте цифры!$'

; Код

again: mov ah, 1    ; ввод с клавиатуры символа с эхом

      int 21h

      cmp al, 0    ; расширенная клавиша?

      je function

      cmp al, '1'  ; проверка диапазона - нижняя граница

      jb less

      cmp al, '9'  ; верхняя граница

      ja greater

      mov [num], al ; заносим код в сообщение

      mov ah, 9    ; и выводим сообщение на экран

      lea dx, mes

      int 21h

      jmp exit     ; дело сделано - на выход

function: mov ah, 8    ; повторный вызов - получение расширенного кода

      int 21h     ; (8 - чтобы не засорять экран)

      cmp al, 3Bh  ; F1?

      je help

greater:

less: jmp again    ; если вышли за пределы диапазона – повторить

help: mov ah, 9    ; выводим помощь

      lea dx, helpmes

      int 21h

      jmp again    ; повторить ввод

exit:

 

Для простоты выход за верхнюю и нижнюю границы диапазона обрабатываются одинаково — повторно запрашивается ввод, поэтому метки greater и less указывают на одну и ту же команду (jmp again).

Задание

Организовать посимвольный ввод без эха в цикле и анализ определенной группы символов. При нажатии клавиши F1 вывести на экран справочное сообщение вида "Реагирование на клавиши... Выход -...). Обеспечить выход из программы при нажатии заданной клавиши. В протокол лабораторной работы включить блок-схему программы.

Варианты:

1. При вводе цифр выдавать с новой строки на экран сообщение "Нажата цифра <N>", а при вводе символов — сообщение "Нажат символ <S>" (<N> и <S> — соответствующие ASCII-символы). Выход — по F10.

2. При вводе цифр выдавать на экран знак 'Ц', а при вводе символов — знак 'С'. Обеспечить выход из программы при нажатии последовательно клавиш F9 и F10.

3. При вводе латинских символов в верхнем регистре выдавать на экран знак '█' (код 219), в нижнем регистре — знак '▄' (код 220). Выход — Shift-F10.

4. При нажатии функциональных клавиш F1...F10 выдавать на экран сообщение "Нажата F<n>" (<n> — номер функциональной клавиши). Выход — по Alt-X.

5. При нажатии алфавитно-цифровых клавиш (с Shift и без) выдавать с новой строки на экран сообщение "Введен символ 'x'" (x — соответствующий ASCII-символ). Выход — по Alt-Q.

6. При вводе цифр выдавать с новой строки на экран сообщение "Нажата цифра <N>" (<N> — соответствующий ASCII-символ). Выход — по F10. При нажатии пользователем функциональной клавиши F2...F9, выдать сообщение "Выход — F10".

7. При вводе символов с кодами 33...43 ('!'...'+') выдавать с новой строки на экран сообщение "Введен символ <х>" (<х> — соответствующий ASCII-символ). Выход — по F10. При нажатии клавиши выхода выдать сообщение "Вы уверены? Повторное нажатие — выход". При нажатии после этого клавиши, отличной от F10, стереть сообщение с экрана.

8. При вводе прописных латинских букв (в верхнем регистре) выдавать с новой строки на экран сообщение "Введен символ <X>", а при нажатии этих клавиш в комбинации с Alt — сообщение "Нажата комбинация Alt-<X>" (<X> — соответствующий ASCII-символ). Выход — Esc.

9. Обеспечить выход из программы при нажатии F10, а при нажатии F9 вывести на экран последовательность введенных ранее символов (не расширенных). Если за выводом этой последовательности не последовала клавиша выхода, обновить буфер вводимых символов в памяти.

10. При вводе цифр выдавать с новой строки на экран сообщение "Нажата цифра <N>" (<N> — соответствующий ASCII-символ). После ввода 5 клавиш, не являющихся цифровыми, выдать на экран справочное сообщение. Выход — по Ctrl-F10.

11. При вводе с клавиатуры шестнадцатеричных цифр (0...9, А...F) выдавать с новой строки на экран сообщение "Введена 16-ричная цифра <h>" (<h> — соответствующий ASCII-код). После нажатия Alt-F10 выдать предупредительное сообщение "Вы уверены?". Если затем введено 'y' или 'Y', завершить программу. Иначе повторить запрос.

12. При вводе цифр выдавать с новой строки на экран сообщение "Нажата цифра <N>" (<N> — соответствующий ASCII-символ). Обеспечить выход из программы при нажатии двух клавиш — F9 и F10 — в любой последовательности (например, F9 и F10, либо F10 и F9, но не F10, F8, F9).

13. При вводе цифр выдавать с новой строки на экран сообщение "Нажата цифра <N>" (<N> — соответствующий ASCII-символ). Если по мере ввода была введена определенная комбинация цифр (например, 194536), вывести с новой строки сообщение 'Доступ разрешен!'.

Лабораторная работа №5


Дата добавления: 2018-04-05; просмотров: 663; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!