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

Команды передаются через входной буфер 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

Наши рекомендации