Устроен джойстик крайне просто - его ручка связана с двумя потенциометрами (при отклонении ручки сопротивление потенциометров изменяется). Каждый потенциометр соединен с конденсатором, при этом время зарядки конденсатора обратно пропорционально сопротивлению потенциометра. Как только заряд конденсатора достигает заданной пороговой величины, в порту джойстика выставляется соответствующий бит.
Обычно с джойстиком связан порт 20 lh, который в состоянии поддерживать два джойстика одновременно. Рассмотрим роль каждого бита.
Бит |
Его значение |
Бит |
Его значение |
Джойстик А ось X |
Джойстик А кнопка 1 |
||
Джойстик А ось Y |
5 . |
Джойстик А кнопка 2 |
|
Джойстик В ось X |
Джойстик В кнопка 1 |
||
Джойстик В ось Y |
Джойстик В кнопка 2 |
Биты 0-3 служат для определения координат джойстика, биты 4-7 - для чтения состояния кнопок.
При нажатой кнопке соответствующий бит принимает значение 0, при отпущенной - значение 1. Для чтения позиции джойстика в его порт записывают 0 и находят время до выставления 1 в нужном разряде порта. Так как время обычно измеряют числом итераций цикла, то соответствующее значение будет различным для компьютеров с разным быстродействием. Поэтому программа перед первым использованием джойстика должна произвести его калибровку, т. е. определить, какие значения соответствуют крайним положениям рукоятки джойстика, и затем нормировать все снимаемые с джойстика значения.
Для проверки наличия джойстика в цикле опрашивается в течение определенного времени порт джойстика. Если при этом значения всех битов равны нулю, то можно с уверенностью считать, что джойстик к компьютеру не подключен.
Помимо непосредственного опрашивания порта и определения времени для установления координат джойстика можно использовать BIOS.
Ниже приводятся файлы для работы с джойстиком и пример его использования.
® // File joystick.h
#ifndef __JOYSTICK_ #define _JOYSTICK_
#define JOYPORT 0x201 //joystick port
#define BUTTON_1_A 0x10 //joystick A, button 1
#define BUTTON_2_A 0x20 // joystick A, button 2