Консалтинговая компания Консалтер.Ру
Главная Новости Библиотека Исследования Законодательство Консалтинг Бизнес-форумы Контакты

Реклама

Рекомендуем



Консалтер.Ру > Библиотека > Информационные технологии

В.А. Авдеев, В.Ф. Гузик
Компьютеры: шины, контроллеры, периферийные устройства

Учебное пособие. Таганрог: ТРТУ, 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 ГК РФ
Классировщик шерсти и пуха



О сайте   Авторам   Реклама и услуги   Контакты
Copyright © 2007-2021, Консалтер.Ру