Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Avdeev

.pdf
Скачиваний:
158
Добавлен:
01.06.2015
Размер:
1.99 Mб
Скачать

205

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

FFh (сброс) клавиатура выполняет базовый тест, связанный с проверкой переключателей клавиш, внутренних ОЗУ и ПЗУ. Если базовый тест завершен успешно, то в контроллер передается код Aah (код ответа) и осуществляется сканирование переключателей клавиш. И наоборот, в случае ошибки в контроллер выводится код FCh.

Контроллер представляет собой однокристальный микрокомпьютер, взаимодействующий с процессором с помощью портов и аппаратного прерывания IRQ1. Доступ к портам выполняется по адресным сигналам А0 (младший бит адреса), CS (выбор кристалла) и сигналам управления RD (чтения порта), WR (запись в порт), а также с помощью команд. Передача данных между контроллером и процессором осуществляется по внутренней шине данных XD0-XD7, подключенной к системной шине данных SD0-SD7 через приемопередатчик (на см. рис. 8.5 это соединение не показано). Контроллер выполняет преобразование полученных от клавиатуры кодов нажатия (отжатия) клавиш в системные (стандартные для обработчика прерываний) скэн-коды, причем 2-байтовый код отпускания клавиши заменяется байтовым, у которого бит D7=1. Процессор устанавливает наличие в контроллере кодов нажатия (отпускания) через прерывание IRQ1, по которому определяется адрес вектора прерывания (36 или 24h, т. е. номер прерывания 9 умножается на 4), указывающий на фиксированнуюячейку оперативнойпамяти(0000:0024),хранящую4-байтовыйвек- тор прерывания (стартовый адрес обработчика прерывания). Кроме того, процессор с помощью обработчика прерывания выполняет анализ системного скэн-кода нажатия и преобразование его в 2-байтовый код, помещаемый в буфер клавиатуры (FIFO) оперативной памяти (RAM).

БуферклавиатурыRAMреализуетрежимкольцевойочередииможетхранить 15 двухбайтовых кодов нажатия, причем для обычных клавиш (алфавитно-цифро- вых),которымсоответствуюткодыASCII,вбуфереклавиатурыотводитсядвабайта, первый из которых является кодом ASCII, а второй - скэн-кодом (порядковым номером этой клавиши). Второй байт необходим для различения одинаковых клавиш.

206

При нажатии специальных клавиш, например, F1-F12, INS, DEL и т. д., которым присвоен двухбайтный расширенный код, в буфер клавиатуры RAM помещается также 2 байта, первый из которых равен 00, а второй содержит порядковый номер этой клавиши (скэн-код). Буфер клавиатуры представлен на рис. 8.6.

 

 

 

 

 

 

'A'

 

 

'B'

'C'

. . .

 

'H'

'I'

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0040:001E

20

22

24

26

28

 

2A

2C

36

38

3A

0040:003C

 

 

 

 

 

 

 

 

удаление

 

 

 

 

запись

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+2

 

 

 

 

 

 

+2

 

 

 

 

 

 

 

 

28

 

 

 

 

38

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0040:001A

 

 

 

 

0040:001С

 

 

 

 

 

 

 

указатель головы

указатель хвоста

Рис. 8.6. Циклический буфер клавиатуры RAM

Начальный адрес буфера клавиатуры - 0040:001Е, а конечный адрес - 0040:003С. Буферу клавиатуры RAM соответствуют все 2-байтовые ячейки памяти с адресами 0040:001А и 0040:001С, первая из которых является указателем головы заносимых данных (определяет первые введенные 2 байта данных), а вторая - указателем хвоста (см. рис. 8.6). В этих ячейках обычно используется только младший байт. По мере занесения данных в сторону увеличения адреса буфера клавиатуры RAMменяетсясоответственноизначениеуказателяхвоста.Послезаполненияконца буфера клавиатуры данные заносятся в его начальные ячейки памяти, если они были удалены при чтении данных из буфера клавиатуры, приводящим к изменению значения (позиции) указателя головы. В результате подобных действий значения указателя хвоста оказываются меньше значения указателя головы. Кроме того, в буфере клавиатуры используется дополнительная 2-байтовая ячейка (пустая позиция), которая содержит код возврата каретки (13) и код ввода (28) и предшествует ячейке буфера, соответствующей указателю головы.

Если значения указателей головы и хвоста равны, то буфер клавиатуры пуст. Поэтому для очистки буфера клавиатуры следует установить равные значения в указателях головы и хвоста. В том случае, если буфер клавиатуры уже заполнен, а поступают другие данные, вырабатывается звуковой сигнал переполнения. Наличие

207

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

Состояния нажатия и отпускания переключательных клавиш Caps Lock, Num Lock,ScrollLock,Ins,Shiftит.д.отражаютсявфиксированных ячейкахRAM(байтах состояния), имеющих адреса 0040:0017 и 0040:0018. Кроме того, информация о состоянии расширенной клавиатуры отмечается в ячейках с адресами 0040:0096 и 0040:0097. В этих ячейках задается состояние правых клавиш Ctrl, Alt и состояние индикаторов. При прерывании клавиатуры, если была нажата переключательная клавиша, устанавливается соответствующий бит одного из байтов состояния. Обработчик прерывания INT9h проверяет каждый раз состояние переключательных клавиш,чтобыправильноинтерпретироватьвводимыйкодклавиши,например,«С»или

«с».

При нажатии (отпускании) клавиши аппаратное прерывание IRQ1 вызывает обработчик прерывания INT09h, который выполняет следующие основные функции:

-сохранение содержимого регистров процессора;

-считывание и анализ номера клавиши из контроллера;

-преобразование этого номера с использованием таблиц в код ASCII и системный скэн-код;

-оповещение контроллера о завершении чтения номера клавиши;

-сбрасывание запроса в контроллере прерывания;

-передачу двухбайтного кода в буфер клавиатуры RAM;

-управление динамиком и буфером клавиатуры RAM и восстановление регистров процессора.

Кроме того, для некоторых комбинаций клавиш: Ctrl_Alt_Del (перезагрузка операционной системы), Ctrl_Break (формирование прерывания INT1Bh с установкой бита D7 в байте 0040:0071h), Alt_SysRq (вызов подфункции 85h прерывания INT15h) и т. д., выполняющих специальные функции, обработчик прерывания INT09h не использует скэн-коды в буфере клавиатуры RAM. Для других переключательных клавиш: Caps Lock, Num Lock и т. д. при их нажатии (отпускании) обработчик прерывания INT09h изменяет содержимое байтов состояния, размещенных в фиксированных ячейках RAM.

208

Обработчик (драйвер) программного прерывания INT16h употреб-

ляет функции:

-чтение кода нажатой клавиши (00h);

-проверка состояния буфера клавиатуры (01h);

-чтение байта состояния клавиатуры (02h);

-установка скорости повторения кода клавиши (03h);

-считывание кода нажатой клавиши (10h);

-проверка состояния буфера клавиатуры (11h);

-чтение байтов состояния клавиатуры (12h).

Функции 00h-02h предназначены для старой клавиатуры.

Функция 00h по значению указателя головы удаляет 2-байтный код из буфера клавиатуры, причем первый байт (код ASCII) помещается в регистр AL, а второй байт (скэн-код) - в регистр AH процессора. Если буфер клавиатуры пуст, то функция 00h ожидает нажатия клавиши (появления 2-байтного кода) и только потом передает управление программе.

Функция 01h позволяет исключить время ожидания нажатия клавиши путем проверки нажатия 2-байтных кодов в буфере клавиатуры. Эта функция сообщает только о готовности ввода с клавиатуры (устанавливает признак ZF=1, если буфер клавиатуры пуст).

Функция 02h предназначена для чтения байта состояния клавиатуры, который помещается в регистр AL.

Формат байта состояния (0040:0017) изображен на рис. 8.7.

биты

 

 

D7

1

- включен режим Insert

D6

1

- включен режим Caps Lock

D5

1

- включен режим Num Lock

D4

1

- включен режим Scroll Lock

D3

1

- нажата клавиша Alt

D2

1

- нажата клавиша Ctrl

D1

1

- нажата левая клавиша Shift

D0

1

- нажата правая клавиша Shift

Рис. 8.7. Формат байта состояния

209

Функция 03h управляет задержкой и частотой (скоростью) повто-

рения кода клавиши. Значение частоты повторения (число из диапазона 0-31) задается в регистре BL, а в регистре BH - задержка повторения (0-250 мс, 1-500 мс, ..., 3- 1000 мс).

В новой клавиатуре, имеющей 101 (102) клавишу, используется функция 00h, 01hи02hстаройклавиатуры.Этарасширеннаяклавиатура,какужеотмечалось,применяется в ПК РС/АТ и PS/2.

Функция 10h используется вместо функции 00h, если расширенная клавиатура работает в режиме 2, что позволяет получить коды для дополнительных клавиш. Общее назначение, входные и выходные параметры функций 00h и 10h совпадают. Аналогичным образом используется функция 11h вместо 01h. Функция 12h заменяет функцию 02h, если расширенная клавиатура работает в режиме 2. При выполнении функции 12h байты состояния размещаются в регистрах AL и АН, причем в регистре AL хранится первый байт состояния (см. рис. 8.7), а в регистре АН - второй байт состояния (0040:0018), формат которого показан на рис. 8.8.

биты

 

 

D7

1

- включен режим Insert

D6

1

- включен режим Caps Lock

D5

1

- включен режим Num Lock

D4

1

- включен режим Scroll Lock

D3

1

- включен режим «пауза»

D2

1

- нажата клавиша Sys Req

D1

1

- нажата правая клавиша Alt

D0

1

- нажата правая клавиша Ctrl

Рис. 8.8. Формат второго байта состояния Рассмотрим структурную схему контроллера, показанную на рис. 8.9.

210

XD0 - XD7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IRQ 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Входной буфер

 

 

 

 

 

 

 

 

7

 

0

64h

7

 

 

 

 

0

60h

7

 

 

0

64h

 

7

 

 

 

0

60h

 

 

 

Регистр

 

 

 

 

Регистр

Регистр

 

 

 

 

Выходной

 

состояния

 

 

 

данных

 

 

команды

 

 

 

 

 

 

буфер

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

E0h (R)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Микро-

 

 

ОЗУ

 

 

 

 

ПЗУ

 

 

Порт

 

 

Управляющий

процессор

 

 

128 x 8

 

 

 

 

2K x 8

 

 

 

Т0, Т1

 

 

 

байт

 

 

 

20h (R), 60h (W)

Входной порт

Выходной порт

C0h(R)

D0h(R), D1h(W)

CLK

DATA

Примечание:

 

 

C0h(R), D0h(R), D1h(W)

 

- команды

 

 

 

E0h(R), 20h(R), 60h(W)

 

- команды

 

 

 

 

 

(W)

 

- запись

 

 

(R)

 

- чтение

 

 

60h, 64h

 

- адреса

Рис. 8.9. Структурная схема контроллера

Входной буфер подключается к шине XD0 -XD7 и содержит два 8 - битовых регистра данных и команд, доступных по записи и имеющих соответственно адреса 60h и 64h. Информация записывается во входной буфер, если сброшен бит D1 регистра состояния (64h), содержащего флаг входного буфера (IBF), который устанавливается в единицу при записи информации во входной буфер. Данные из входного буфера (регистра данных) передаются в клавиатуру и выполняется автоматический сброс IBF.

Выходной буфер включает 8-битовый регистр, адрес которого 60h. Содержимое этого регистра считывается, если бит DO регистра состояния (64h) равен единице (установлен флаг выходного буфера OBF), что указывает на наличие данных в выходном буфере (выходной буфер полон). При чтении выходного буфера бит DO (OBF) регистра состояния (64h) автоматически сбрасывается.

211

Читаемый регистр состояния (64h) предназначен для хранения информации о состоянии контроллера и интерфейса. Формат регистра состояния (64h) представлен на рис. 8.10.

биты

D7 1 - ошибка нечетного паритета

D6 1 - прием байта из клавиатуры не завершен

D5 1 - передача байта в клавиатуру не завершена

D4 0 - клавиатура заблокирована (защитный замок закрыт) D3 0 - в выходном буфере данные

1- в выходном буфере команда D2 0 - сброс по включению питания

1- программный сброс

D1 0 - входной буфер пуст (IBF)

D0 1 - выходной буфер полон (OBF)

Рис. 8.10. Формат регистра состояния

Доступ к другим портам контроллера выполняется с помощью специальных команд, так как из-за ограниченного числа контактов микросхемы I8042 они не имеют адресов. Команды C0h(R), D0h(R), D1h(W), и Е0h(R) (см. рис. 8.9) использу-

ются соответственно для чтения входного и выходного портов, записи в выходной порт и чтение порта Т0, Т1 (чтение состояния линий CLK и DATA интерфейса клавиатуры). Эти команды должны быть переданы в регистр команд входного буфера по адресу 64h.

Входной порт контроллера предназначен для чтения информации о конфигурации системы, используемой программами BIOC. Формат входного порта показан на рис. 8.11.

биты

 

D7

0

- клавиатура заблокирована ключом

D6

0

- цветной адаптер

 

1

- монохромный адаптер

D5

0

- переключатель установлен

 

 

- переключатель не установлен

D4

0

- не используются вторые 256К RAM

 

 

- используются вторые 256К RAM

D3, D2,D1, D0

- резерв

Рис. 8.11. Формат входного порта

212

Выходной порт доступен по записи (W) и чтению (R) и хранит значения выходных линий. Формат выходного порта представлен на рис. 8.12.

биты

 

 

D7

 

- значение линии DATA при передаче данных в клавиатуру

D6

 

- значение линии CLK при передаче данных в клавиатуру

D5

1

- входной буфер пуст

D4

1

- выходной буфер полон

D3, D2

 

- резерв

D1

 

- состояние адресной линии А20

D0

0

- системный сброс

Рис. 8.12. Формат выходного порта

Значения порта состояния линий Т0 и Т1 считываются командой E0h(R), причем бит Т0 соответствует входному значению линии CLK, а бит Т1 - входному значению линии DATA.

Кроме того, контроллер содержит управляющий байт, доступный по чтению с помощью команды 20h(R) и по записи с использованием команды 60h(W).

Для считывания управляющего байта необходимо вначале записать команду 20h(R) в регистр команды (64h), а затем получить управляющий байт из выходного буфера (60h). Запись управляющего байта выполняется следующим образом. Предварительно в регистр команд (64h) входного буфера заносится команда 60h(W), а после этого содержимое управляющего байта - в регистр данных (60h) входного буфера. Формат управляющего байта изображен на рис. 8.13.

биты

 

 

D7

0

- резерв

D6

1

- режим совместимости клавиатуры с IBM PC

 

(вызывает преобразование 2-байтовых кодов отпускания в 1-байтовые)

D5

1

- используются коды клавиатуры IBM PC/XT

 

0

- используются 2-битовые коды АТ

D4

1

- отключение клавиатуры

 

0

- разрешение

D3

1

- запрещается защитный замок

D2

 

- значение этого бита записывается в бит D2 регистра состояния

D1

0

- резерв

D0

1

- разрешение прерывания, если выходной буфер полон

Рис. 8.13. Формат управляющего байта

213

Различают команды контроллера (некоторые из них были уже рассмотрены: C0h(R), D0h(R), D1h(W) и т.д.), команды управления клавиатурой и коды ответов клавиатуры.

Команда контроллера выводится процессором в регистр команд (64h) входного буфера и если у команды есть байт данных, то он загружается сразу после команды в регистр данных (60h) входного буфера.

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

 

Таблица 8.1

 

 

Код

Назначение команды

 

 

20h

Чтение управляющего байта

 

 

60h

Запись управляющего байта

 

 

AAh

Выполнение внутреннего теста

 

 

ABh

Тест интерфейса

 

 

ADh

Отключение (блокировка) клавиатуры

 

 

AEh

Разрешение (деблокирование) клавиатуры

 

 

C0h

Чтение входного порта

 

 

D0h

Чтение выходного порта

 

 

D1h

Запись в выходной порт

 

 

E0h

Чтение порта Т0, Т1

 

 

F0h -

Сброс выходного порта

FFh

 

 

 

Рассмотрим назначение команд контроллера. Команда ААh вызывает выполнение внутреннего теста контроллера. Если тест завершается успешно, то в выходной буфер (60h) помещается код 55h. Тест интерфейса (линий CLK и DATA) осуществляется командой AВh и в выходном буфере хранится результат тестирования (00 - ошибок нет, 01(03) - линия CLK(DATA) имеет нулевой уровень, 02(04) - на

214

линии CLK(DATA) установлен высокий уровень. По команде ADh производится отключение клавиатуры (данные не передаются и не принимаются), а по команде AЕh - разрешается работа клавиатуры (сбрасывается бит D4 управляющего байта). Команда C0h осуществляет чтение входного порта и занесение его содержимого в выходной буфер (60h).

Предварительно следует убедиться, что выходной буфер пуст, т.е. проверить бит D0(0BF) регистра состояния (64h). Чтение выходного порта исполняется командой D0h, которая помещает его содержимое в выходной буфер, если он пуст. Запись в выходной порт выполняется по команде D1h, за которой следует вывести байт по адресу 60h регистра данных, причем бит 0 выходного порта не должен быть равным нулю, иначе будет системный сброс. Для считывания значений порта Т0 и Т1 (значений входных линий CLK и DATA) в выходной буфер употребляется команда E0h. Команды F0h - FFh указывают своим кодом, какие четыре младших бита выходного порта следует сбросить, причем значение 0 определяет сброс бита.

Команды управления клавиатурой выводятся системным процессором как данные в регистр данных (60h) входного буфера контроллера, откуда передаются затем в клавиатуру. Клавиатура обязательно подтверждает прием команды управления, кроме команд EEh и FEh.

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

 

Таблица 8.2

 

 

Код

Назначение команды

 

 

EDh

Установить индикаторы состояния

 

 

EEh

Эхо (диагностика)

 

 

F0h

Установка таблицы скэн–кодов

 

 

FFh,

Холостые (недействительные) команды

F1h

 

 

 

F2h

Чтение идентификатора

 

 

F3h

Задание частоты повтора и задержки

 

 

F4h

Разрешение клавиатуры

 

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]