В.А. Авдеев, В.Ф. Гузик
Компьютеры: шины, контроллеры, периферийные устройства
Учебное пособие. Таганрог: ТРТУ, 2001. - 536 с.
8. Устройство и работа клавиатуры
8.3. Клавиатура PC/XT
Информация,
вводимая с клавиатуры при нажатии клавиши, подвергается нескольким преобразованиям
до получения ее соответствующей программой. Рассмотрим вопросы ввода, синхронизации
и преобразования информации клавиш на программном и аппаратном уровнях.
При
нажатии или отпускании клавиши клавиатурой формируется и передается байтный
код, называемый скэн-кодом. В скэн-коде нажатия 7 разряд равен 0, а в скэн-коде
отпускания 7 разряд равен 1. Младшие 7 бит (разряды 0–6) скэн-кода определяют
номер, присвоенный каждой клавише. Клавиша символа А имеет порядковый номер 30
(16-ричное значение 1Е), поэтому скэн-код нажатия этой клавиши равен 00011110,
а скэн-код отпускания – 10011110. В ПК IBM AT принят другой формат
представления скэн-кода клавиши. Если клавиша выполняет отжатие, то перед
скэн-кодом передается код F0H. Рассмотрим принцип работы клавиатуры РС/ХТ.
Из
клавиатуры скэн-код клавиши выводится последовательным кодом в адаптер клавиатуры,
который преобразует его в параллельный код и передает в порт А (адрес 60Н, где
Н – 16-ричное значение) микросхемы Intel 8255 (КР580 ВВ55), содержащей три
порта: А, В и С. Одновременно с передачей кода в порт А адаптер клавиатуры
формирует сигнал прерывания IRQ1 (второй по приоритетности сигнал прерывания),
поступающий в программируемый контроллер прерывания, в микросхему Intel 8259
(КР1810 ВН59А). Наивысший по приоритету сигнал прерывания IRQ0 формирует
таймер, чтобы сохранить верными показания системных часов.
Контроллер
прерывания передает в процессор код типа (номера) прерывания (прерывание 9,
прерывание от клавиатуры), который вызывает программу обработки прерывания
(драйвер), выполняющий чтение скэн-кода из порта А, чтобы определить, какая
клавиша нажата (отпущена). Каждому прерыванию (внешнему или внутреннему)
поставлено в соответствие число (номер прерывания), например, прерыванию от
клавиатуры – 9, для управления устройством печати – 15 и так далее. Кроме того,
любому прерыванию соответствуют два слова (ячейки) памяти, в которых хранится
вектор прерывания. В первом слове хранится значение IP (указателя команды), а
во втором – CS (сегмент кода), определяющие адрес программы, обслуживающей
прерывание. Чтобы найти место вектора прерывания в памяти, необходимо номер
прерывания умножить на 4, так как под каждый вектор отводится 4 байта.
Например, для прерывания 9 вектор имеет адрес 9´4=36 (0024Н). Таким образом,
стартовый адрес подпрограммы обработки прерывания от клавиатуры хранится в двух
ячейках памяти, адрес первой из которых – 0024Н.
Из подпрограммы обработки прерывания скэн-код передается в
ROM–BIOS (базовую систему ввода-вывода), в которой подпрограммы, обслуживающие
клавиатуру, переводят его в 2-байтный код. Для клавиш первого типа (клавиш
ASCII) младший байт 2-байтного кода содержит код ASCII, а старший – скэн-код
нажатой клавиши (скэн-код отжатой клавиши отбрасывается). Например, клавише Р,
порядковый номер которой 25, 2-байтный код равен 80:25, где 80 – код ASCII
символа Р, а 25 – скэн-код клавиши Р. Специальным клавишам второго типа
(комбинациям клавиш) соответствуют 2-байтные расширенные коды. Например,
клавише Del, порядковый номер которой 83, соответствует 2-байтный расширенный
код 0:83, где 83 – скэн-код клавиши Del. При преобразовании скэн-кода решается
задача нахождения соответствующего ему кода ASCII или расширенного кода. Задача
поиска кода ASCII решается с помощью таблицы, размещенной в сегменте данных.
Если скэн-код был равен 32, то из 256-байтной таблицы берется байт номер 32,
равный 68 (44Н) и соответствующий D.
Затем
подпрограммы ROM–BIOS помещают 2-байтный код в буфер клавиатуры (область памяти
с младшими адресами 0000:041Е), имеющий емкость до 15 вводимых символов. В
буфере коды ожидают своей очереди, пока не будут запрошены программой,
ожидающей ввода информации с клавиатуры.
Перевод
(трансляция) скэн-кода выполняется не для всех клавиш. При поступлении
скэн-кодов от клавиш регистров Shift, Alt, Ctrl и клавиш переключателей (Caps
Lock, Scroll Lock, Num Lock) в байты памяти с адресами 417Н и 418Н записывается
информация о состоянии этих клавиш. Например, в байте состояния с адресом 417Н,
если разряд 3 равен 1, это указывает на активное состояние клавиши Alt (клавиша
нажата). Если разряд 3 равен 0, то это соответствует неактивному (отжатому)
состоянию клавиши Alt.
При
поступлении скэн-кода ROM–BIOS сначала анализирует состояние клавиш регистров и
переключателей, чтобы определить код а или А, и только после этого код символов
помещается в буфер клавиатуры.
Кроме
того, ROM-BIOS при трансляции скэн-кодов проверяет их на различные комбинации
клавиш переключателей и регистров, например, Ctrl–Alt–Del, Ctrl–Num Lock и
Shift–Prt Sc.
Эти
клавишные наборы заставляют ROM–BIOS выполнить определенные действия без записи
скэн-кодов в буфер клавиатуры. Так, комбинация Ctrl–Alt–Del, как известно,
выполняет перезагрузку DOS, комбинация Ctrl–Num Lock – приостановку работы
программы (фиксация клавиатуры) до тех пор, пока не будет нажата клавиша с
печатаемым символом, комбинация Shift–Prt Sc выводит содержимое экрана на
устройство печати. Если клавиша нажата больше полсекунды, то клавиатура,
следящая за длительностью нажатия, с частотой 10 раз в секунду, генерирует
скэн-код нажатия этой клавиши без промежуточных скэн-кодов отжатия, что
позволяет упростить драйвер, который распознает разницу между нажатием и
автоматическим повторением. Если, например, клавиша С удерживается долго, то ROM–BIOS
формирует серию символов С, которые будут переданы программе.
С
другой стороны, если удерживается долго клавиша регистра, то ROM–BIOS
анализирует только первый скэн-код этой клавиши, а все остальные коды она
игнорирует.
Клавиатура
имеет много повторяющихся клавиш: две клавиши Shift, по две цифры, два плюса
(минуса), две точки и т.д.
Скэн-коды
повторяющихся клавиш разные, но ROM–BIOS транслирует их (скэн-коды) в одни и те
же коды ASCII, и для их различия в старшем (вспомогательном) байте сохраняется
значение скэн-кода. Только для клавиш Shift в байте состояния с адресом 417Н
отмечается в разряде 1 состояние левой клавиши Shift, а в разряде 0 – состояние
правой клавиши Shift. На рис. 8.1 показана схема связи клавиатуры и процессора.

Рис. 8.1. Схема связи клавиатуры и процессора
Клавиатура
содержит контроллер i8048, представляющий собой однокристальную микроЭВМ, в
состав которой входят внутренние ОЗУ емкостью 64 байта, 8-разрядное АЛУ, ППЗУ и
три 8-разрядных порта с тремя состояниями. Перед установкой в клавиатуру
микроЭВМ программируется и обеспечивает: управление схемой опроса матрицы
клавиш, прием и анализ состояния опрашиваемой клавиши, устранение эффекта
дребезга контактов, буферизацию кодов клавиш, выполнение протокола связи;
осуществление автотестирования матрицы клавиш с целью обнаружения залипших
клавиш и контроля ОЗУ. В ПК АТ используют другой контроллер i8042, который
выполняет почти те же функции, что и контроллер ПК РС/ХТ.
В
работе схемы (см. рис. 8.1) можно выделить следующие основные моменты (цифры
показывают последовательность действий в схеме).
Процессор
осуществляет прием скэн-кода и после этого производит сброс регистра адаптера
клавиатуры и сигнала прерывания IRQ1.
Этот сброс процессор выполняет с помощью разряда 7 порта В (B[7]=1) микросхемы 8255 (580 ВВ55),
называемой иногда трехканальным портом. Процессор сначала устанавливает B[7]=1, а затем сбрасывает этот разряд
B[7]=0 (разрешает работу адаптера
клавиатуры). Порт В имеет адрес 061h. Кроме того, процессор через разряд 6 порта В (B[6]=1) разрешает формирование сигналов синхронизации со
стороны клавиатуры.
Процессор
выполняет по таблице преобразование скэн-кода в 2-байтный код с кодом ASCII или
расширенным кодом или установку соответствующих бит в байтах состояния для
клавиш регистров и переключателей. Процессор записывает 2-байтный код клавиши в
буфер клавиатуры, если имеется свободное место.
Между
прерываниями клавиатуры процессор может выполнять десятки тысяч команд, так что
прерывания не отнимают у него слишком много времени. Хорошая машинистка
способна вводить до 400 символов в минуту, т.е. через каждые 150 мс процессор
должен успевать считывать и запоминать символ. Благодаря механизму прерывания,
процессор выполняет чтение скэн-кода из регистра адаптера за 10 мкс, а в
оставшееся от 150 мс время он осуществляет другие действия.
В клавиатуре
ПК РС/АТ управление ее работой выполняется через порт ввода-вывода (64Н или 60Н),
предназначенный для вывода команд и данных и для чтения состояния клавиатуры.
Приведем некоторые команды контроллера клавиатуры: сброс и запуск теста (0FFН),
привести клавиатуру в исходное состояние и разрешить сканирование (0F6Н), запись
в порт вывода (0D1Н), чтение порта ввода (0С0Н) и так далее.
Похожие материалы:
Клавиатура PC/AT
Кислотчик (Выпуск №29 ЕТКС)
Кислотчик
Клавиатурщик
Клад - ст.233 ГК РФ
Классировщик шерсти и пуха
|