Манипулятор "мышь" фирмы Microsoft
Подключение
Манипулятор "мышь" фирмы Microsoft подключается к компьютеру через интерфейс в стандарте RS232. Прибор потребляет достаточно малый ток, поэтому для питания его обычно используются некоторые сигнальные линии.
В таблице приведено соответствие выводов этого разъема и разъема манипулятора. Нумерация выводов соответствует разъему РП15-9 ( она отличается от американской, указанной на разъеме манипулятора).
компьютер | "мышь" |
1 | 1 |
8 | 2+8 (выводы соединить) |
3 | 3 |
4 | 4 |
Инициализация
Передача осуществляется со скорость 1100 бод, а не 9600, как исходно настроен контроллер последовательного интерфейса, поэтому перед началом работы с манипулятором необходимо настроить канал таймера, определяющий тактовую частоту передатчика:
MVI A,68H ;коэффициент деления для 1100 бод
STA 0FB01H
XRA A
STA 0FB01H
то же, на языке C:
*(char *) 0xfb01 = 0x68;
*(char *) 0xfb01 = 0;
Микросхема контроллера последовательного интерфейса уже инициализирована операционной системой, однако в случае возникновения ошибки (например, программа не успела принять байт, принятый контроллером, необходимо перед началом работы сбросить бит ошибки контроллера:
MVI A,35H
STA 0FB11H ;Инициализация UART
то же, на языке C:
*(char *) 0xfb11 = 0x35;
Принцип действия манипулятора следующий:
- если не происходит изменения состояния клавишей или движения, манипулятор "молчит".
- при движении "мыши", нажатии или отпускании какой-либо клавиши манипулятор передает трехбайтовую посылку описанного ниже формата с информацией о новом состоянии клавишей и смещении, происшедшем со времени последней посылки.
- если во время посылки сообщения происходит новое смещение, манипулятор запоминает его во внутреннем счетчике, а по окончании текущей посылки сразу передает новую с этой информацией.
Формат посылки
Манипулятор посылает посылку из трех байт. Во всех трех седьмой, старший бит, равен нулю. Шестой бит является флагом первого байта в посылке - он равен 1 в этом байте и равен нулю в двух остальных. Относительное перемещений мыши по каждой координате передается в виде однобайтового числа со знаком.
Формат первого байта:
Формат второго байта:
Формат третьего байта:
Обработка посылки программой
Ниже приведен фрагмент программы на языке C, обслуживающий манипулятор.
/* Текущие значения координат и состояния клавишей */
int Button_1, Button_2;
int X_mouse, Y_mouse;
/* Байты посылки */
char b1, b2, b3;
/* Значения смещения манипулятора по обеим осям */
int dx, dy;
/* 1. Принять три байта посылки: b1, b2 и b3. */
b1 = byte_from_RS232();
b2 = byte_from_RS232();
b3 = byte_from_RS232();
/* 2. Произвести изменение переменных координат и клавишей */
Button_1 = (b1 & 0x20) != 0;
Button_2 = (b1 & 0x10) != 0;
dx = ((b1 & 3) << 6) + (b2 & 0x3f);
if (dx & 0x80) dx |= 0xff00; /* Учет знака */
dy = ((b1 & 0xc) << 4) + (b3 & 0x3f);
if (dy & 0x80) dy |= 0xff00; /* Учет знака */
X_mouse += dx; Y_mouse += dy;