Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Ввод информации с клавиатуры терминала



Работой клавиатуры управляет специальная электронная схема – контроллер клавиатуры. В его функции входит распознавание нажатой клавиши и помещение закрепленного за ней кода в свой выходной регистр (порт), обычно с номером 60h. Код клавиши, поступающий в порт, называется скэн-кодом и является, по существу, порядковым номером клавиши. При этом каждой клавише присвоены как бы два скэн-кода, отличающиеся друг от друга на 80h. Один скэн-код (меньший, код нажатия) засылается контроллером в порт 60h при нажатии клавиши, другой (больший, код отпускания) – при ее отпускании.

Скэн-код однозначно указывает на нажатую клавишу, однако по нему нельзя определить, работает ли пользователь на нижнем или верхнем регистре, а также вводит ли он латинские или русские буквы. С другой стороны, скэн-коды присвоены всем клавишам клавиатуры, в том числе управляющим клавишам. Таким образом, очевидно, что определение введенного символа должно включать в себя не только считывание скэн-кода нажатой клавиши, но и выяснение того, не были ли перед этим нажаты управляющие клавиши. Всем этим анализом занимается программа обработки прерываний от клавиатуры.

Нажатие (а также отпускание) любой клавиши вызывает сигнал аппаратного прерывания, заставляющего процессор прервать выполняемую программу и перейти на программу обработки прерывания от клавиатуры. Процессор вместе с сигналом прерывания получает еще и номер вектора прерывания. За клавиатурой закреплен вектор с номером 9h. Адрес программы обработки прерываний от клавиатуры располагается, таким образом, в векторе 9h, занимающем слова с адресами 4h и 6h. Поскольку программа обработки прерываний от клавиатуры вызывается через вектор 9h, ее иногда называют программой INT 9h. Эта программа, помимо порта 60h, работает еще с двумя областями оперативной памяти: кольцевым буфером ввода, располагаемым по адресам от 40h:1Eh до 40h:3Dh, куда, в конце концов, помещаются коды ASCII нажатых клавиш, и словом состояния клавиатуры, находящимся по адресу 40h:17h, где фиксируется состояние нажатых клавиш.

Операционная система предоставляет несколько способов ввода данных с клавиатуры:

- обращение к клавиатуре, как к файлу, с помощью прерывания DOS INT 21h с функцией 3Fh;

- использование группы функций DOS INT 21h из диапазона 1 – Ch, обеспечивающих посимвольный ввод с клавиатуры;

- посимвольный ввод путем обращения непосредственно к драйверу BIOS с помощью прерывания INT 16h.

Ввод с клавиатуры средствами файловой системы использует предопределенный дескриптор, закрепленный за стандартным устройством ввода. Например:

MOV  AH,3Fh                     ; номер функции

MOV  BX,0                         ; номер дескриптора файла

LEA   DX,STR_BUFER  ; указатель на буфер ввода строки

MOV  CX,80                       ; максимальная длина строки

INT  21h                       ; вызов прерывания

Адрес, по которому должна вводиться строка, должен находиться в DS:DX, а в CX - максимальная длина строки в байтах. Ввод строки завершается нажатием клавиши «Enter» и DOS добавляет в конец строки два символа: возврат каретки и перевод строки. Длина введенной строки возвращается в AX, и это значение включает два символа-ограничителя.

Для ввода с клавиатуры можно использовать 7 функций прерывания INT 21h:

01h - ввод символа с эхом;

06h - прямой ввод - вывод через консоль;

07h - ввод символа без эха и без отработки Ctrl/C;

08h - ввод символа без эха и с отработкой Ctrl/C;

0Ah - буферизованный ввод строки с эхом;

0Bh - проверка состояния клавиатуры;

0Ch - сброс входного буфера и ввод.

Функции 01h, 06h, 07h и 08h при каждом вызове вводят в программу один символ из кольцевого буфера клавиатуры. Для ввода строки символов функции следует использовать в цикле. Кроме того, эти функции позволяют вводить расширенные коды ASCII. Для этого, обнаружив, что введенный код равен нулю, следует выполнить функцию повторно. Это дает возможность управления прикладными программами с помощью функциональных клавиш, а также сочетаний клавиши Alt с цифрами и буквами.

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

MOV AH,7     ; номер функции

INT 21h          ; ожидание ввода символа

CMP AL,0      ; проверка на расширенный код

JE EXT_COD  ; если да, то на особую процедуру

; процедура обработки расширенных кодов

EXT_COD:              INT 21h          ; берется второй байт кода

CMP AL,75             ; проверка на «стрелку-влево»

JNE C_R        ; если нет, то следующая проверка

JMP C_L        ; если да, то на процедуру

C_R:               CMP AL,77             ; следующее сравнение и т.д.

Работа с клавиатурой на уровне BIOS (INT 16h) позволяет считывать двухбайтовые коды, поступающие в кольцевой буфер ввода (код ASCII + скэн-код) и анализировать слово состояния клавиатуры. Для ввода используются следующие функции прерывания INT 16h:

00h - чтение двухбайтового кода из входного буфера;

01h - чтение состояния клавиатуры и двухбайтового кода без извлечения его из буфера;

02h - чтение флагов клавиатуры.

Функция 00h позволяет в одном действии получить полный двухбайтовый код нажатой клавиши или комбинации клавиш, буфер ввода при этом очищается. Эта функция ожидает нажатие клавиши.

Функция 01h относится к числу асинхронных: определив состояние буфера ввода, она возвращает управление программе. Состояние буфера определяется по флагу ZF, если ZF = 0, то в буфере есть ожидающие ввода в программу символы, если же буфер пуст, ZF=1. При наличии в буфере кода символа его можно проанализировать, так как он копируется функцией в регистре AX.

Функция 02h передает в программу содержимое слова флагов (ячейка 417h). Она может использоваться для определения состояния клавиш Shift, Caps Lock и др.


Поделиться:



Последнее изменение этой страницы: 2019-05-07; Просмотров: 169; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.017 с.)
Главная | Случайная страница | Обратная связь