Работа с клавиатурой через порт ввода/вывода. 


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



ЗНАЕТЕ ЛИ ВЫ?

Работа с клавиатурой через порт ввода/вывода.



Доступ к клавиатуре через порты ввода/вывода является самым низкоуровневым методом доступа. С помощью порта 64h можно определить доступна ли клавиатура, и разрешить (запретить) доступ к ней. Причем, если значение, возвращаемое из порта 64h, содержит в четвертом разряде ноль, то клавиатура недоступен. Порт 60h предназначен для чтения данных с клавиатуры и передачи команд и кодов в клавиатуру. С помощью порта 64h можно управлять работой адаптера клавиатуры (микроконтроллер I8042, расположенный на системной плате PC/AT) записью по этому адресу соответствующих кодов команд адаптера клавиатуры, читать состояние его портов и пр.

Команды управления клавиатурой.

Команды клавиатуры представлены в Таблице 1 а в Таблице 2 - коды особых случаев, посылаемые клавиатурой адаптеру.

Таблица 1.

Таблица 2.

 


Описание команд.

1. Установка и сброс индикаторов состояния (Edh).

На клавиатуре обычно расположены по крайней мере 3 светодиодных индикатора, которые отражают состояние переключателей NUM LOCK, CAPS LOCK, SCROLL LOCK. Состоянием этих индикаторов можно управлять, выдавая в клавиатуру команду EDh. После получения этой команды клавиатура прекращает сканирование, возвращает системе EAh - код подтверждения, и ожидает от системы байта конфигурации, который определяет установку светодиодных индикаторов. После получения байта конфигурации клавиатура устанавливает светодиодный индикатор, возвращает код АСК (код EAh) и возобновляет сканирование. Если в то время, когда клавиатура ожидает байт конфигурации, поступает другая команда, выполнение EDh прекращается и выполняется новая команда.

Байт конфигурации имеет следующий формат:

разряд 0 - 1, если SCROLL LOCK включен

разряд 1 - 1, если NUM LOCK включен

разряд 2 - 1, если CAPS LOCK включен

разряды 3-7 должны быть установлены в ноль.

2. Эхо (ЕЕh).

Данная команда используется для диагностирования. После получения этой команды клавиатура возвращает ответ - «эхо» (ЕЕh).

3. Выбрать альтернативный режим (F0h).

Данная команда позволяет выбрать один из трех возможных режимов работы клавиатуры [1,2,3] (набор SCAN-кодов клавиатуры). В качестве параметра команды можно посылать 01, 02, 03 для выбора соответствующего набора SCAN-кодов. Клавиатура подтверждает как получение самой команды, так и получение параметра. Параметр может принимать значение 00h, тогда вслед за посылкой подтверждения приема параметра, клавиатура отвечает еще одним байтом с номером используемой таблицы SCAN-кодов (программа 3 в приложении).

4. Холостые операции (EFh-F1h).

«Холостые операции» (EFh-F1h): в ответ на такую команду клавиатура посылает код повторной посылки FEh, не предпринимая никаких других действий.

5. Идентификатор расширенной клавиатуры (F2h).

По этой команде клавиатура посылает подтверждение, прекращает сканирование, а затем посылает последовательно 2 байта идентификатора и возобновляет сканирование (программа 1 в приложении).

6. Установить частоту повторения клавиши (F3h).

Эта команда изменяет значение задержки и частоты при повторе клавиши. Как только клавиатура получает команду F3h, она прекращает сканирование и вызывает код АСК. После этого система посылает клавиатуре байт, в котором содержатся значения частоты повторения и времени задержки. Частота повторения показывает, сколько раз в секунду повторяется данная клавиша. Время задержки - это время, в течении которого клавиша должна удерживаться нажатой, прежде чем начнется функция повторения. Клавиатура возвращает код АСК и остается в предшествующем состоянии сканирования.

Величина начальной задержки D и частоты повтора (период) Р в миллисекундах могут быть рассчитаны по


следующим формулам:

D=(1+2*B6+B5)*250

P=4.17*(8+4*B2+2*B1+B0)*2**(2*B4+B3),

где В6-В0-значения соответствующих битов байта-параметра, бит 7 при этом не используется и должен быть равен 0. Для расчетной величины задержки D допустимы отклонения до 20 %.

По умолчанию после начальной загрузки устанавливаются следующие значения:

D=500±25 (мс)

P=81.7±16 (мс)

Для возобновления сканирования должна быть передана команда F4h (разрешить клавиатуру).

Байт частоты повторения и времени задержки имеет следующий формат:

- частота повторения (число повторений в секунду) - разряды 4-0.

- время задержки (в миллисекундах) - разряды 5, 6.

8. Разрешить клавиатуру (F4h).

Команда «Разрешить клавиатуру (F4h)» разрешает клавиатуре начать сканирование. После получения этой команды клавиатура возвращает код АСК, сбрасывает выходной буфер и начинает сканирование.

9. Блокировка клавиатуры (0F5h).

Данная команда предназначена для приведения всех характеристик клавиатуры в исходное состояние. Клавиатура подтверждает прием команды, чистит выходной буфер, устанавливает набор SCAN-кодов 3 и устанавливает значения частоты повтора клавиши, начальную задержку, принятые по умолчанию. Затем клавиатура блокируется и переходит в ожидание дальнейших инструкций.

10. Установть условия по умолчанию (F6h).

По команде «Установть условия по умолчанию (F6h)» клавиатура посылает код АСК и

сбрасывает частоту повторения клавиши и время задержки;

очищает буфер клавиатуры;

устанавливает типы клавиш по умолчанию (только для режима 3);

сбрасывает последнюю повторяемую команду;

продолжает сканирование.

11. Повторить передачу (FEh).

Команда выдается только после передачи данных с клавиатуры. Клавиатура отвечает повторной передачей последнего байта, переданного системе. Если последний переданный байт был RESEND (FEh), клавиатура передает предшествующий ему байт.

2. Сброс (FFh).

Клавиатура возвращает системе код АСК. Для того, чтобы принять этот код, система возбуждает линии CLOCK и DATA по меньшей мере на 500 мкс. После получения команды клавиатура запрещается либо до принятия системой кода АСК, либо до выдачи на клавиатуру другой команды.

 

7.3.4 Режимы работы клавиатуры.

У 101-клавишной клавиатуры есть три режима работы - 1,2 и 3. Каждый из этих режимов может быть выбран с помощью команд от системы.


Режим 1. Для установки этого режима необходимо выполнить команду контроллера А0h с байтом конфигурации 01h. В наборе кодов сканирования режима 1 каждой клавише присваивается базовый код сканирования, а в некоторых случаях и дополнительные коды для генерирования в системе искусственных состояний переключения регистров. Коды сканирования автоматического повторения каждой клавиши идентичны одиночным кодам сканирования.

Режим 2. Это устанавливаемый по умолчанию режим расширенной клавиатуры, который система выбирает при инициализации после включения питания. В этом режиме код сканирования адаптер клавиатуры 8042 преобразует генерируемые клавиатурой коды нажатия в системные коды, требуемые BIOS. За исключением системных кодов новых клавиш расширенной клавиатуры системные коды соответствуют кодам сканирования, которые генерируются клавиатурой в режиме 1.

Режим 3. В этом режиме должно быть запрещено преобразование кодов у адаптера клавиатуры 8042, поскольку адаптер не может преобразовать этот набор кодов сканирования. В наборе кодов сканирования 3 каждой клавише присваивается уникальный 8-разрядный код нажатия, который передается при нажатии клавиши. При отжатии каждая клавиша отправляет код отжатия. Код отжатия состоит из двух байтов, первый из которых является префиксом отжатия (F0h), а второй идентичен коду нажатия данной клавиши. В этом наборе кодов каждая клавиша посылает только один код сканирования и состояние любой клавиши не зависит от состояния других.

 

7.3.5 Регистры и порты адаптера клавиатуры.

Регистр состояния адаптера клавиатуры доступен по чтению по шестнадцатеричному адресу 64 h. Биты регистра несут информацию о состоянии адаптера и интерфейса с клавиатурой. Регистр состояния может быть считан в любой момент времени. Формат регистра состояния приведен в Таблице 3.

 

Таблица 3.

 

РЕ отражает состояние ошибки четности при приеме байта от клавиатуры. Если значение бита равно 1, то последний принятый байт содержал четное число единиц, что является ошибкой.

RTO устанавливается в 1, если прием байта от клавиатуры не был закончен в заданный интервал времени, что является ошибкой.

TTO устанавливается в 1, если передача байта в клавиатуру не была завершена. Если причина ошибки при передаче-отсутствие тактирования со стороны клавиатуры, то только этот бит будет установлен в 1. Если клавиатура не ответит на переданный байт в заданный интервал времени, то будут установлены в 1 два бита RTO и TTO. Если в ответ на переданный в клавиатуру байт будет получен байт с нарушением четности, то будут установлены в 1 два бита РЕ и TTO.

IS отражает состояние переключателя блокировки клавиатуры. Бит установлен в 0, если клавиатура заблокирована.

CD указывает адаптеру клавиатуры на то, как


 

интерпретировать байт, помещенный во входной буфер. Если запись производилась по адресу 60h, то записанный байт считается данными и бит CD устанавливается в 1.. Если запись производилась по адресу 64 h, то бит CD устанавливается в 0 и байт во входном буфере рассматривается как команда.

SF принимает значение 0 после включения питания компьютера, после завершения начального тестирования бит устанавливается в 1.

IBF отражает состояние входного буфера адаптера клавиатуры (шестнадцатеричные значения 60 h и 64 h). Данный бит равен 0, если буфер пуст. При записи во входной буфер байта информации, который адаптер еще не готов считать для передачи в клавиатуру, бит IBF устанавливается в 1.

OBF отражает состояние выходного буфера адаптера клавиатуры (шестнадцатеричный адрес 60 h). Данный бит равен 0, если выходной буфер пуст. При записи в выходной буфер байта от клавиатуры адаптер устанавливает бит OBF в 1. После считывания системой байта из выходного буфера бит снова устанавливается в 0.

Порты адаптера клавиатуры не доступны процессору напрямую, т.е. он не может их адресовать как регистр состояния и входные или выходные буферы. Вместо этого адаптер предоставляет специальные команды для чтения данных входного и выходного портов, а также для записи значения выходного порта (команды C0 h, D0 h и D1 h соответственно).

Ниже приведены значения битов, определенные для данных портов адаптера клавиатуры.

Входной порт адаптера клавиатуры определяет некоторые параметры конфигурации компьютера, как это показано в Табл. 4.

 

Таблица 4.

 

В7 указывает, заблокирована ли клавиатура ключом (0-заблокирована, 1-не заблокирована).

В6 определяет тип видеоадаптера (0-цветной графический адаптер, 1-монохромный адаптер).

В5 задает значение переключателя фирмы-изготовителя (0-переключатель установлен, 1- переключатель не установлен).

В4 указывает количество RAM на системной плате (0-не использовать вторые 256 К памяти, 1- использовать вторые 256 К памяти).

Биты 3-0 не определены.

Следует отметить, что состояние входного порта может быть разным в разных компьютерах и, вообще говоря, не несет в себе ценной для программиста информации. Скорее всего наличие входного порта является атавизмом, оставшимся от самой первой модели IBM PC/AT, поэтому не рекомендуется работать с этим портом и полагаться на его значение.

Выходной порт адаптера клавиатуры отражает состояние сигналов на некоторых выходных линиях. При этом значения битов 1 и 0 отражают соответственно нижний и верхний уровень сигнала на линии, как это показано в Таблице 5.

 


Таблица 5.

 

Бит В7 определяет значение линии данных при передаче их в клавиатуру.

Бит В6 определяет значение линии синхронизации при передаче данных в клавиатуру.

Бит В5 указывает, пуст ли входной буфер, бит устанавливается в 1, если входной буфер пуст.

Бит В4 содержит значение 1, если выходной буфер полон, и значение 0 в противном случае.

Содержимое битов 3 и 2 не определено.

Бит В1 определяет состояние дополнительной адресной линии А20.

Бит В0 подсоединен к линии сброса системы (System Reset). Переустановка значения этого бита в 0 приводит к сбросу системы.

Порт состояния входных линий Т0 и Т1.

Помимо описанных портов адаптера клавиатуры существует порт состояния входных линий Т0 и Т1. Его значение также может быть считано только специальной командой контроллера (Е0h). Значение порта определено в Табл. 6.

 

Таблица 6.

 

Биты 7-2 не определены.

Биты Т0 и Т0 определяют значения входной линии данных и входной линии синхронизации соответственно.

 

7.3.6 Команды адаптера клавиатуры.

Команды адаптера клавиатуры представляют собой набор кодов, посылаемых процессором во входной буфер команд с шестнадцатеричным адресом 64h. В том случае, если у команды существует параметр, он записывается сразу после записи кода команды во входной буфер данных (шестнадцатеричный адрес порта 60 h).

 

 


Некоторые коды команд адаптера (выполненного на базе микроконтроллера 8042) представлены в Таблице 7.

Таблица 7.

1).Считать (командный) управляющий байт (20h).

Код 20h посылается по адресу 64h. Адаптер в ответ помещает в порт 60h значение текущего управляющего байта. Он может быть прочитан процессором командой IN с адресом 60h.

 

2).Загрузить новый командный байт (60h).

Это 2-байтовая операция. Чтобы записать новый командный байт, необходимо

1) записать 60h в порт 064h,

2) записать новый командный байт в порт 060h

Формат командного байта адаптера представлен в Таблице 8.

Таблица 8.

 

IBM - режим совместимости с IBM PC. Запись единицы в этот разряд программирует адаптер на конвертирование кодов сканирования, полученных с клавиатуры, по принципам IBM PC. Это включает в себя конвертирование двухбайтных последовательностей кодов отжатия в однобайтный формат IBM PC.

0 - не преобразовывать коды клавиатуры,

1 - преобразовывать коды клавиатуры в коды сканирования


8088/8086.

DAD - режим IBM PC. Запись единицы в этот разряд программирует адаптер на поддержку интерфейса IBM PC. В этом режиме контроллер не контролирует паритет и не конвертирует коды сканирования.

0 - использовать 11-разрядные коды клавиатуры (PC AT/80386/80286),

1 - использовать коды клавиатуры, совместимые с PC XT/8088/8086

DK - заблокировать клавиатуру: 0 - разрешить интерфейс клавиатуры; 1 - запретить интерфейс клавиатуры

DL - отмена блокировки замка: 0 - подчиниться защитному замку; 1 - игнорировать защитный замок

SF - системный флажок. Значение, записанное в этот разряд, записывается в соответствующий разряд регистра состояния

EAI - резервирован. Должен быть равен нулю

EKI -разрешение прерывания по заполнению выходного буфера. Нулевое значение означает «не генерировать прерывание», единичное «генерировать прерывание» при заполнении выходного буфера.

3).Специальное чтение (A5h) - 8042 помещает в выходной буфер истинное значение порта 2 за исключением разрядов 4 и 5, которым дается новое определение. Не генерируется состояние «Буфер полон». Если разряд 5 = 0, используется 9-разрядная клавиатура (XT); 5 = 1, используется 11-разрядная клавиатура; 4 = 0, запрещается прерывание по заполнению выходного буфера; 4 = 1, разрешается прерывание по заполнению выходного буфера.

4).Инициализация(AAh) - 8042 инициализирует порты 1 и 2, запрещает клавиатуру и очищает указатели буфера. Затем он помещает 55h в выходной буфер.

5).Контроль интерфейса (ABh) - направляет 8042 на тестирование линий данных и синхронизации интерфейса клавиатуры. Выходной буфер (порт вода (60h) получает результаты тестирования:

00h - ошибок не обнаружено;

01h - линия синхронизации клавиатуры «остается нулевой»;

02h - линия синхронизации клавиатуры «остается единичной»;

03h - линия данных клавиатуры «остается нулевой»;

04h - линия данных клавиатуры «остается единичной».

Примечание: «остается нулевой» не проверяется для 9-разрядных клавиатур.

6).Дамп диагностирования (AC h). Резервируется для диагностирования.

7).Запретить клавиатуру (ADh) - устанавливает разряд 4 командного байта 8042, который запрещает интерфейс клавиатуры. До разрешения клавиатуры данные не передаются и не принимаются.

8).Разрешить клавиатуру (AEh). Сбрасывает разряд 4 командного байта 8042, который разрешает интерфейс клавиатуры.

9).Прочитать входной порт (C0 h). Настраивает 8042 на передачу содержимого входного порта и помещение его в выходной буфер (порт ввода 60h). Пользуйтесь этой командой только при пустом выходном буфере.

10).Прочитать выходной порт (D0h). Настраивает 8042 на передачу текущего байта выходного порта в выходной буфер (порт ввода 60h). Пользуйтесь этой командой только при пустом выходном буфере.

 


11). Записать в выходной порт (D1h). Помещает следующий байт, записанный по адресу 60h, в выходной порт. Разряд 0 выходного порта подключен к линии системного сброса. Этот разряд не должен переключаться из «единицы» в «нуль».

12). Прочитать входы TEST0 и TEST1. Настраивает 8042 на передачу текущего состояния входов TEST0 и TEST1 в выходной буфер (порт 60h) разряды 0 и 1 соответственно.

13). Пульсация выходного порта (F0h - FFh). Может быть вызвана пульсация разрядов 0 - 3 выходного порта (перевод в нулевое состояние примерно на 2 - 6 мкс.) Разряды 0 - 3 в этой команде указывают, какой разряд выходного порта должен пульсировать. Пульсация нулевого разряда приводит к сбросу системы.

7.4. Подготовка к лабораторной работе

º Ознакомиться с описанием лабораторной работы «Программирование клавиатуры»

º отладчиком AFD

º и примерами программ (см. Приложение к лабораторной работе).

7.5. Порядок выполнения лабораторной работы

7.5.1.1 Написать на ассемблере программу посылки команды клавиатуре и определения кода подтверждения клавиатуры.

7.5.1.2 Написать программу зажигания индикаторов NumLock, CapsLock, ScrollLock.

7.5.1.3 Написать программу установки повтора кода клавиши с частотой 0,3 сек.

7.5.2.1 Написать программу чтения данных выходного порта.

7.5.2.2 Написать программу записи значения выходного порта.

7.5.2.3 Написать программу чтения данных входного порта.

7.5.2.4 Написать программу чтения портов состояния входных линий Т0 и Т1.

7.5.2.5 Написать программу сброса выходного порта.

Запустить и отладить программы в среде отладчика AFD.



Поделиться:


Последнее изменение этой страницы: 2017-02-17; просмотров: 586; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.58.252.8 (0.077 с.)