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