Реферат: Параллельные интерфейсы Centronics и LPT-порт
4 однонаправленных контакта (регистр Control) - данные туда может записать только программа
Вывод: у нас есть 17 выводов которыми мы можем управлять по своему усмотрению.
Теперь рассмотрим, а как происходит запись и чтение данных в регистры LPT порта, т.е. как нам установить на нужных выводах 0 или 1.
Запись/чтение данных в регистр Data
Итак, рассмотрим сразу практическую задачу. Хочу чтобы на выводе регистра Data под номером 3 (3 - это номера вывода LPT порта) была установлена логическая 1 (т.е. чтоб между ним и землей было +5 В) и на остальных выводах этого регистра (2,4-9 выводы порта) были нули. Пишемкод:
int Address=888;
int data=2;
Out32(Address, data);
ЯиспользовалфункциюOut32 библиотеки inpout32.dll, будем привыкать к ней, т.к. дальнейшие примеры будем разбирать именно на этой библиотеке. Если этот код выполнить, то получится что на выводе порта 3 есть +5 В, а на 2,4-9 висит ноль. Как это получилось?
Начнем разбираться: первым параметром функции Out32 мы передаем число 888. Как Вы уже знаете, это адрес регистра Data LPT порта. Теперь функция знает куда ей писать данные. Далее вторым параметром мы передаем число 2. Прошу обратить внимание, что двойка в десятичной системе счисления. Что дальше делает функция? Ей надо эту двойку запихнуть в регистр Data, но вот проблема: регистр совершенно не понимает что такое 2. Он знает 0 или 1. Больше ничего. Тогда функция как бы "переводит эту двойку в двоичную систему счисления" (это не совсем верно, но для объяснения на пальцах сгодится) и каждый разряд двоичного числа справа на лево записывает по порядку в регистр начиная с младшего разряда D0 (вывод 2 порта) и заканчивая старшим D7 (вывод 9). Если Вы переведете число 2 из десятичной в двоичную систему счисления то получите 10 . Функция берет первый разряд двоичного числа - это 0 (самую правую) и пишет ее в D0, далее берет 1 и пишет ее в D1. Т.к. регистр 8-ми разрядный (у него есть 8 контактов), функция продолжает брать данные справа на лево и писать в следующий бит регистра. Т.к. наше число закончилось, то функция как бы дописывает нулями наше двоичное число слева, чтоб оно стало 8-ми разрядным. Эта операция смыслу не противоречит, т.к. например, что 23 руб. так и 00023 руб. - одно и тоже.
Ну что, мозг опух пока прочитали? Сейчас станет понятнее. Давайте в регистр Data запишем число 245. Пишем код:
intAddress=888;
intdata=245;
Out32(Address, data);
Опять переводим 245 в двоичную систему счисления и справа на лево записываем разряды числа в соответствующие биты регистра. В итоге получим, что на выводах LPT порта под номерами 2,4,6-9 присутствует напряжение +5 В, на выводах 3,5 ноль.
Ну что, теперь я думаю, с записью данных в регистр Data мы разобрались. Надо отметить, что диапазон десятичных чисел, которые можно записать в регистр Data лежит в пределах от 0 до 255 . Регистр он у нас 8-ми разрядный, значит максимальное число комбинации 0 и 1 на его выводах составляет 28 -1=256-1=255.
Чтение данных
Теперь давайте получим данные из порта, а именно из его регистра Data, к нам в программу. Мы хоти узнать, на каких выводах регистра Data сейчас высокий уровень напряжения, а на каких низкий. Помните, выше мы записали в порт число 245? Давайте его сейчас получим из порта. Пишем код:
intAddress=888;
intdata;
data = Inp32(Address);
Inp32 это функция для чтения данных из порта библиотеки inpout32.dll. Единственным параметром для нее является адрес того регистра, откуда мы хотим прочесть данные. На выходе она возвращает десятичное число, соответствующее текущему содержимому регистра. Выполнив этот код, переменная data будет содержать число 245. Что это значит? Чтобы разобраться, переводим число 245 из десятичной в двоичную и смело можем сказать что на выводах порта 2,4,6-9 сейчас +5 В а на выводах 3,5 0 В. (см. рис. выше)
Как я уже упомянул выше, в регистр Data данные записать может и внешнее устройство. Однако рассмотрение этого вопроса пока оставим, т.к. это потребует внешних источников питания. Сначала, давайте полностью разберемся с базовыми операциями.
Запись/чтение данных в регистр Control
Теперь по управляем регистром Control. Он однонаправленный, данные в него может записать только наша программа. Обратите внимание на несколько особенностей этого регистра. Во-первых, о содержит всего четыре рабочих вывода. Значит в него можно записать число в диапазоне от 0 до 24 -1=16-1=15. Во-вторых, он имеет очень неприятную особенность: некоторые из его выводов инвертированы, т.е. если Вы на этот вывод пишете 1, то на ней устанавливается 0. И наоборот, читаете 1, а на самом деле там 0. Поэтому, значение записываемых данных и читаемых данные не совсем очевидны. Для разбора необходимо просто попробовать писать в регистр разные данные и смотреть, что получается. Приведу пример записи числа в регистр Control. Пишем код:
intAddress=890; //адрес регистра Control
int data=10;
Out32(Address, data);