Аппаратное обеспечение персонального компьютера© Александр Фролов, Григорий ФроловТом 33, М.: Диалог-МИФИ, 1997, 304 стр. Порты для работы с клавиатуройНазначение портов, предназначенных для работы с клавиатурой, зависят от типа компьютера. Компьютер IBM PC/XTДля работы с клавиатурой типа IBM PC/XT используются порты с адресами 60h и 61h. Порт 60h доступен только для чтения. После выполнения этой операции он содержит скан-код последней нажатой клавиши. Порт 61h доступен как для чтения, так и для записи. Он управляет не только клавиатурой, но и другими устройствами компьютера, например, работой встроенного динамика. Если в старший бит порта 61h записать значение 1, клавиатура будет заблокирована, если 0 - разблокирована. Так как порт 61h управляет не только клавиатурой, при изменении содержимого старшего бита необходимо сохранить состояние остальных битов этого порта. Для этого можно сначала выполнить чтение содержимого порта в регистр, изменить состояние старшего бита, затем выполнить запись нового значения в порт: . . . in al, 61h or al, 80h out 61h, al . . . Современные компьютерыСовременные компьютеры позволяют управлять скоростными характеристиками клавиатуры, а также зажигать или гасить светодиоды Scroll Lock, Num Lock и Caps Lock, расположенные на лицевой панели клавиатуры. Для расширенного управления клавиатурой применяется порт 60h в режиме записи. Этот порт служит для управления подчиненным процессором Intel 8042, ответственным за обмен данными с клавиатурным компьютером, или его аналогом, установленным на системной плате компьютера. При использовании порта 60h на запись программа дополнительно получает следующие возможности: · установка времени ожидания перед переходом клавиатуры в режим автоповтора; · установка периода генерации скан-кода в режиме автоповтора; · управление светодиодами, расположенными на лицевой панели клавиатуры. Процессор 8042 обслуживает не только клавиатуру, но и другие системы компьютера. Через порт 64h, например, выполняется сброс (отключение) процессора 80286 для возврата из защищенного режима работы в реальный. Подробности об этом вы можете узнать из 6 тома «Библиотеки системного программиста», который называется «Защищенный режим процессоров Intel 80286/80386/80486». Перед тем как посылать команду процессору 8042, необходимо убедиться в том, что его внутренняя очередь команд пуста. Это можно сделать, прочитав слово состояния 8042 из порта с адресом 64h. Бит с номером 1 должен быть равен нулю. Приведем фрагмент программы, составленной на языке ассемблера, проверяющий состояние очереди команд процессора 8042: . . . ; Счетчик для ограничения времени ожидания готовности 8042 mov cx,0 wait_loop: ; Читаем порт состояния процессора 8042 in al, 64h and al, 00000010b ; флаг готовности ; Ожидаем готовность процессора 8042 к приему команды loopnz wait_loop . . . После того, как программа дождется готовности процессора 8042, она может послать ему команду, записав ее в порт с адресом 60h: mov al, cmd ; команда для 8042 out 60h, al ; вывод команды в 8042 Некоторые команды состоят более чем из одного байта. Второй и следующие байты таких команд необходимо записывать в порт 60h, предварительно убедившись в готовности процессора 8042 с помощью приведенной выше последовательности команд. В большинстве случаев можно также использовать простую временную задержку: mov al, cmd_byte1 out 60h, al mov cx, 2000h wait_loop: loop wait_loop mov al, cmd_byte2 out 60h, al Мы приведем формат двух команд процессора 8042, имеющих отношение к работе с клавиатурой - команду установки задержки и периода автоповтора и команду управления светодиодами, расположенными на клавиатуре. Для установки характеристик режима автоповтора в порт 60h необходимо записать код команды 0F3h, затем байт, определяющий характеристики режима. Ниже вы найдете описание полей байта режима автоповтора:
Первоначально при инициализации системы BIOS устанавливает период задержки для включения режима автоповтора равным 500 мс при периоде автоповтора, равным 10 повторам в секунду. Если это слишком медленно для вас, вы можете установить другие значения. Для управления светодиодами, расположенными на лицевой панели клавиатуры, используйте команду 0EDh. Вслед за этой командой в порт 60h необходимо записать байт, имеющий следующий формат:
Программа KBDLEDПриведем пример простейшей программы KBDLED, управляющей светодиодами, расположенными на лицевой панели клавиатуры (листинг 2.1). Такое управление может выполняться только при использовании порта 60h, так как BIOS не содержит никаких подходящих для этого функций. Наша программа после запуска включит все светодиоды и будет ожидать, пока вы не нажмете любую клавишу. Затем программа выключит светодиоды. Заметим, что программа KBDLED может не работать на виртуальной машине DOS, создаваемой, например, в операционной системе Microsoft Windows NT. Листинг 2.1. Файл kbdled\kbdled.c // ===================================================== // Переключение светодиодов на клавиатуре // // (C) Фролов А.В, 1997 // // E-mail: frolov@glas.apc.org // WWW: http://www.glasnet.ru/~frolov // или // http://www.dials.ccas.ru/frolov // ===================================================== #include <stdio.h> #include <conio.h> int main(void) { int i; printf("KBDLED, (c) A. Frolov, 1997\n"); // Посылаем процессору клавиатуры // команду управления светодиодами outp(0x60,0xed); // Перед посылкой второго байта команды // выполняем небольшую задержку for(i=0; i<4000; i++); // Выводим второй байт команды, младшие три бита // которого определяют состояние светодиодов // на лицевой панели клавиатуры outp(0x60,7); printf("Нажмите любую клавишу для выключения " "светодиодов\n"); // Задерживаем выполнение программы, пока // пользователь не нажмет на любую клавишу getch(); // Выключаем все светодиоды outp(0x60,0xed); for(i=0; i<4000; i++); outp(0x60,0); return 0; } |