Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы_дополн_ГОС_2007.doc
Скачиваний:
41
Добавлен:
10.02.2016
Размер:
1.87 Mб
Скачать

Вопрос 75. Принципы организации взаимодействия пользовательской программы с клавиатурой ibm pc.

Управление клавиатурой в машинах класса AT построено на основе микроконт­роллера Intel 8042. Контроллер клавиатуры выполняет следующие действие:

  • прием данных от клавиатуры;

  • проверка четности поступившего байта;

  • трансляция (кодирование) полученной информации;

  • помещение байта данных в выходной буфер и извещение процессора;

  • передача байта во входной буфер клавиатуры.

Для каждой клавиши клавиатурой вырабатывается два кода: код нажатия и код прерывания (клавишу отпустили). Коду прерывания предшествует код FOh. Контрол­лер преобразует коды от клавиатуры в scan-коды. Код FOh (при отпускании) преобра­зуется в 7-й бит scan-кода. Некоторые клавиши, однако, могут быть запрограммирова­ны только на посылку клавиши нажатия. Кроме того, при длительном удержании кла­виши начинают посылать повторные коды нажатия.

Регистр состояния контроллера клавиатуры. Доступен по чтению по адресу 64Н. Биты регистра:

0 - равен 0, если выходной буфер клавиатуры пуст.

1 - состояние входного контроллера клавиатуры. Равен нулю, если буфер пуст.

2 - отражает тот факт, что тестирование клавиатуры прошло.

3 - указывает контроллеру, как интерпретировать полученный байт. Если бит 1, то байт считается данным, если 0 - байт считается командой.

4 - если бит, равен 0, то клавиатура заблокирована.

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

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

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

Входной буфер контроллера. Доступен по записи: 60Ь - запись данных, 64Н -запись команды.

Выходной буфер контроллера. Доступен по чтению по адресу 60Н.

Входной порт контроллера клавиатуры. Доступен по чтению по команде СОН. Биты;

0-3 - резерв.

4 - указывает количество RAM на системной плате.

5 - значение переключателя фирмы-изготовителя.

6 - определяет тип видеоадаптера.

7 - указывает, заблокирована или нет клавиатура. Данный порт устарел и данные, возможно, недостоверны.

Выходной порт контроллера клавиатуры. Доступен по чтению (команда DOH), по записи (команда D1H). Биты:

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

1 - определяет состояние дополнительной адресной линии А20. 2-3 - значения не определены.

4 - содержит 1, если выходной буфер полон.

5 - равен 1, если входной буфер пуст.

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

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

Порт состояния входных линий. Значение может быть считано по команде E0H

0 - состояние входной линии часов.

1 - состояние входной линии данных.

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

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

Как уже упоминалось, команды передаются через порт 64Н. Если у команды < шествует параметр, то он помещается сразу за посылкой команды в порт 60Н.

Команда 20Н. После этой команды контроллер записывает значение управляющего байта в выходной буфер.

Команда 00Н. Запись управляющего байта контроллера (поместить в порт 60Н). Значение битов:

0 - значение 1 приводит к генерированию прерывания от контроллера клавиатуры» если выходной буфер содержит данные.

1 - обычно 0.

2 - заменяет собой соответствующий бит управляющего регистра контроллера,

3 - при установке в 1, переключатель замка клавиатуры перестает действовать.

4 - при установке в 1 клавиатура отключается.

5 • режим интерфейса. При установке в 1 не выполняется проверка четности, и не преобразуются scan-коды.

6 - бит совместимости.

7-0.

Команда ААН. Внутренний тест контроллера. Если ошибок нет, то в выходной буфер посылается 55h. После данной команды следует восстановить управляющий байт (см. команды 20h и 60h).

Команда АВН. По команде выполняется тест интерфейса между контроллером и клавиатурой. Результат помещается в выходной буфер:

00 - ошибок нет,

01 - сигнал линии часов завис в нижнем положении,

02 - сигнал линии часов завис в верхнем положении,

03 - сигнал линии данных завис в нижнем положении,

04 - сигнал линии данных завис в верхнем положении.

Команда АСН. Выполняется диагностический дамп 16-байтной памяти контрол­лера, текущего состояния входного и выходного порта, а также слова состояния кон­троллера. Дамп выдается в виде последовательности scan-кодов. В конце выдается символьная строка, идентифицирующая фирму-изготовитель.

Команда ADH. Блокировка клавиатуры.

Команда АЕН. Разблокировка клавиатуры.

Команда СОН. Чтение входного порта. Значение порта помещается в выходной буфер.

Команда DOH. Чтение выходного порта. Значение порта помещается в выходной буфер.

Команда D1H. Помещает байт в выходной порт контроллера клавиатуры.

Команда ЕОН. Команда предназначена для помещения информации о состоянии входных линий ТО и Т1 из порта состояния входных линий в выходной буфер.

Команды FOH-FFH - сброс выходного порта.

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

Команды передаются через входной буфер 60H. Если необходим параметр, то он передается после подтверждения получения команды, Подтверждением того, что кла­виатура приняла команду, является чтение процессором из порта 60h байта ответа кла­виатуры. Ответ посылается на все команды, кроме ЕЕН и FEH.

Команда EDH. Установка и сброс индикатора состояния. Следующий за ко­мандой параметр представляет собой байт, первые 3 бита которого определяют состо­яние индикаторов, а остальные равны 0:0 - Scrol Lock, I - Num Lock, 2 - Caps Lock.

Команда ЕЕН. На данную команду клавиатура откликается такой же командой (эхо). Используется для диагностики.

Команды EFH, F1H. Недействительные команды.

Команда FOH. Установка или запрос таблицы скан-ющов. Входной параметр: 0 -получить номер таблицы, I - установить таблицу 1,2- установить таблицу 2,3- уста­новить таблицу 3.

Команда F2H. Прочитать идентификатор. Вначале посылается подтверждение, • затем идентификатор • 83АВН.

Команда F3H. Задание частоты повтора кода клавиш и начальной задержки. Ис­пользуются биты 0-6:

частота = (l+2*b6+b5)*250;

повтор = 4.17*(8+4*b2+2b1+b0)*2*(2*b4+bЗ).

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

Команда F5. По этой команде все характеристики устанавливаются в исходные, зятем клавиатура блокируется и ждет дальнейших команд.

Команда F6h. Аналогична предыдущей, но клавиатура не блокируется.

Команды F7h-FAh. Характер реакции клавиш;

F7h - все клавиши повторяемые,

F8h - все клавиши посылают код нажатия и код прерывания,

F9h - все клавиши посылают только код нажатия,

FAh - все клавиши повторяемые и посылают коды нажатия и Орерыпния.

Команды FBh-FDh. Определение действия отдельных клавиш.

FBh - клавиша повторяемая,

FCh - клавиша посылает код нажатия и прерывания,

FDh - клавиша посылает только код нажатия.

При посылке такой команды следует послать scan-квд клавиши (таблица 3).

Команда FEh. Повторить передачу - клавиатура повторяет передачу.

Команда FFh. Сброс клавиатуры. Выполняется внутренний тест и посылает если все удачно, FCh - ошибка.

В качестве примера работы с клавиатурой ниже мы приводим программу, которая несколько раз периодически зажигает и nушит индикаторы ры клавиатуры.

CODE SEGMENT

ASSUME CS:CODE, DS:DATA, SS:STAK BEGIN:

MOV AX, DATA

MOV DS,AX

MOV CL,0

MOV COUNT,0

MOV AL,0

/отключить прерывания клавиатур»! на уровне контроллера /прерываний, другие прерывания работают исправно

MOV AL,00000010В

OUT 21H,AL

LOO:

/ждать, когда освободится входной буфер

CALL WAIT_IN_BUF

/послать команду

MOV AL,OEDH

OUT 60H,AL ;ждать подтверждение

CALL WAIT_OUT

IN AL,60H

/правильное ли подтверждение?

CMP AL,OFAH

JN2 ERR1

/теперь ждем, когда можно посылать параметр

CALL WAIT_IN_BUF

MOV AL.00000001B

MOV CL,CL

/переход к следующему индикатору

SHL AL.CL

OR AL,AL

MOV AL,AL

OUT 60H,AL /небольшая задержка

CALL DELAY

INC СL

/все ли индикаторы зажгли?

CMP CL,3

JNZ LOO

MOV CL,0

MOV _AL,0

CALL WAIT_IN_BUF /теперь погасим все индикаторы

MOV AL,OEDH

OUT 60H,AL

CALL WAIT_OUT

IN AL,60H

CMP AL.OFAH

JNZ ERR1

CALL WAIT_IN_BUF

MOV AL, 0

OUT 60H,AL

IMC COUNT ;не пора ли заканчивать?

СМР COUNT,20

JZ END

CALL DELAY

JMP LOO

ERR:

POP AX

ERR1:

MOV AL, 0

OUT 21H,AL

LEA DX,MES

INT 21H

MOV AX,4C01H

INT 21H

END:

MOV AL, 0

OUT 21H,AL

MOV AX,4COOH

INT 21H

;ждать, когда освободится входной буфер

WAIT_IN_BUF PROC

XOR CX,CX Tl:

IN AL,64H

TEST AL,2

LOOPNZ Tl

JNZ ERR

RETN WAIT_IN_BUF ENDP ;ждать, когда заполнится выходной буфер WAIT_OUT PROC

T3:

IN AL,64H

TEST AL,1

JZ ТЗ

RETN WAIT_OUT

ENDP DELAY PROC

XOR CX,CX L

PUSH CX MOV CX,50

LOOP LL2

POP CX

LL2:

LOOP LLl

RETN DELAY

ENDP CODE

ENDS

DATA SEGMENT CL DB ?

AL DB ?

COUNT DW ?

MES db 'Произошла овибка клавиатуры ,13,10,'$'

DATA ENDS

STAK SEGMENT STACK

DB 50 DUP(?)

STAK ENDS

END BEGIN

Кусок нашей лабы по работе с клавиатурой:

new_09h proc ;для работы с клавиатурой

push ax

push bx

push cx

push dx

in al,60h

cmp al,3eh ;скан-код F4

je hotkey_F4

cmp al,42h ;код F8

je hotkey_F8

pop dx

pop cx

pop bx

pop ax

jmp cs:old_09h

…………………………..

hotkey_F8:

in al,61h ;по нажатию F8 звук прекращался

and al,0fch

out 61h,al

and al,7fh ;разрешаем работу клавиатуры

out 61h,al

mov al,20h ; в контролер прерываний команду EOI

out 20h,al

pop dx

pop cx

pop bx

pop ax

iret