ПОСИМВОЛЬНЫЙ ВВОД С КЛАВИАТУРЫ. АНАЛИЗ НАЖАТИЯ ФУНКЦИОНАЛЬНЫХ КЛАВИШ И КОМБИНАЦИЙ
Теоретические сведения
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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!