Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Аппаратное обеспечение персонального компьютера

© Александр Фролов, Григорий Фролов
Том 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, затем байт, определяющий характеристики режима. Ниже вы найдете описание полей байта режима автоповтора:

Биты

Описание

0-4

Период автоповтора, который определяет количество посылок скан-кода, генерируемых процессором клавиатуры в одну секунду. Можно использовать не только те значения, которые приведены ниже, но и промежуточные, например, 9 или 15h.

0 30.0

1 26.7

2 24.0

4 20.0

8 15.0

0Ah 10.0

0Dh 9.2

10h 7.5

14h 5.0

1Fh 2.0

5-6

Задержка включения режима автоповтора, mc:

00 250

01 500

10 750

11 1000

7

Зарезервировано и должно быть равно нулю

Первоначально при инициализации системы BIOS устанавливает период задержки для включения режима автоповтора равным 500 мс при периоде автоповтора, равным 10 повторам в секунду. Если это слишком медленно для вас, вы можете установить другие значения.

Для управления светодиодами, расположенными на лицевой панели клавиатуры, используйте команду 0EDh. Вслед за этой командой в порт 60h необходимо записать байт, имеющий следующий формат:

Биты

Описание

0

1 – включить светодиод Scroll Lock;

0 – выключить светдиод Scroll Lock

1

1 – включить светодиод Num Lock;

0 – выключить светодиод Num Lock

2

1 – включить светодиод Caps Lock;

0 – включить светодиод Caps Lock

Программа 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;
	}
[Назад] [Содеожание] [Дальше]