- •Лабораторная работа Изучение принципа работы и принципов связи с пэвм манипулятора "мышка"
- •1. Краткие сведения из истории изобретения
- •2. Механическая и оптическая мыши
- •Модели компьютерных мышей и их характеристики
- •Драйверы мыши
- •Функции прерывания 33h
- •Использование прерываний мыши в Паскале
- •Очистка мыши от пыли и грязи. Устранение элементарных неисправностей
- •Практическая работа
- •Задание 1
- •Задание
- •Задание 3
- •Задание 4
- •Задание 5
- •Задание 6
- •Задание 7
- •Задание 8 обнаружение наличия реакции "мышки" на движения
- •Задание 3
- •Задание 4 инициализация комуникационного порта
- •Задание 5
Использование прерываний мыши в Паскале
В языке «Паскаль» нет стандартных функций для работы с мышью, поэтому для использования мыши нам необходимо воспользоваться прерываниями. В Паскале для работы с прерываниями существует две функции: msdos и intr. Прерывания зависят от состояния регистров. Регистры - ячейки памяти, расположенные в центральном процессоре и использующиеся для временного хранения управляющей или обрабатываемой информации.
Для работы с мышью используется прерывание $33, которое обрабатывается операционной системой. Следовательно, для работы программы, использующей процедуры работы с мышью необходимо установить драйвер мыши для dos, если вы запускаете программу не windows dos - box.
Для работы процедур и функций к программе нужно подключить модуль dos, который содержит процедуры, предназначенные для работы с прерываниями: intr и msdos. Msdos эквивалентна вызову процедуры intr для прерывания $21, поэтому она нам не подходит.
function resetmouse:boolean; var r:registers; begin r.ax:=0; intr($33,r); resetmouse:=r.ax=$FFFF; end;
Функция resetmouse включает мышь в программе. Она возвращает значение true, если возникли ошибки. Скорее всего, это связано с отсутствием драйвера мыши. Resetmouse необходимо запускать один раз и обязательно перед использованием остальных функции.
procedure hidemousecursor; var r:registers; begin r.ax:=2; intr($33,r); end; Процедура hidemousecursor делает курсор мыши невидимым. procedure showmousecursor; var r:registers; begin r.ax:=1; intr($33,r); end;
Результат работы showmousecursor прямо противоположен hidemousecursor, т.е. делает курсор мыши видимым. При запуске resetmouse курсор не появляется автоматически, поэтому необходимо использовать процедуру showmousecursor.
procedure movemousecursor(x,y:integer); var r:registers; begin r.ax:=4; r.cx:=x; r.dx:=y; intr($33,r); end;
Процедура movemousecursor перемещает курсор мыши в нужную точку. У нее есть два обязательных параметра: x и y. Которые задают соответственно горизонтальную и вертикальную координаты точки, в которую надо передвинуть курсор. Начало координат находится в верхнем левом углу и ось oy направлена вниз.
procedure readmousestate(var x,y:integer;var lb,mb,rb:boolean); var r:registers; begin r.ax:=3; intr($33,r); x:=r.cx; y:=r.dx; lb:=(r.bx and 1)<>0; rb:=(r.bx and 2)<>0; mb:=(r.bx and 4)<>0; end;
Readmousestate является самой интересной, т.к. именно она возвращает текущее положение мыши и проверяет нажатие клавиш. Процедура возвращает в переменные x, y координаты мыши на экране. Переменные lb (левая клавиша), mb (средняя клавиша), rb (правая клавиша) булевского типа возвращаются значения true, если нажата соответствующая клавиша и false в противном случае.
Выше описаны наиболее важные процедуры работы с мышью. На самом деле их гораздо больше, но они используются редко и для начинающего программиста не так важны. Главное понять принцип работы с прерываниями: прерывания содержат множество функций для работы с конкретным оборудованием. Номер функции записывается в регистр ax, остальные регистры используются по-разному в каждом конкретном случае. В них либо записываются входные данные, либо процессор возвращает в них выходные значения, а может и все сразу. Некоторые регистры могут не использоваться. Описанные выше функции можно оформить в виде юнита, подключаемого к программе, чтобы не писать все функции заново в каждой программе, где надо использовать мышь.