48028 (665976), страница 3

Файл №665976 48028 (Параллельные интерфейсы Centronics и LPT-порт) 3 страница48028 (665976) страница 32016-07-31СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 3)

5 однонаправленных контактов (регистр Status) - данные туда может записать только внешнее устройство

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. Пишем код:

int Address=888;

int data=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? Давайте его сейчас получим из порта. Пишем код:

int Address=888;

int data;

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. Пишем код:

int Address=890; //адрес регистра Control

int data=10;

Out32(Address, data);

И пример чтения:

int Address=890; //адрес регистра Control

int data;

data = Inp32(Address);

Запись/чтение данных в регистр Status

Наконец, добрались до регистра Status. Он однонаправленный, данные в него может записать только внешнее устройство, т.е. мы в программе можем только читать содержимое этого регистра. Причитав данные из Status, и переведя их в двоичное число, сразу довольно трудно понять что же реально творится с напряжениями на выходах этого регистра. Во-первых, он тоже имеет инвертированные выводы, а во-вторых рабочими являются биты под номерами 4-7, а 0-3 не используются, и следовательно число записывается довольно хитро. Чтобы разобраться, лучше просто несколько раз делать чтение при разных данных в регистре.

Возникает вопрос, а как эти данные на нем установить? Довольно просто. В качестве внешнего устройства, пока, будете выступать Вы. Выполните такой код.

int Address=889; //адрес регистра Status

int data;

data = Inp32(Address);

Вы получите некоторое число. Теперь возьмите проводник и соедините им любой из земляных выводов порта (18-25) с каким-нибудь выводом регистра Status (10-13, 15), например с десятым. И снова выполните чтение. Вы получите другое число. Уберите проводник. Прочитав, получаете исходное число. Как это работает? Исходно, на всех выводах этого регистра находится высокий уровень напряжения +5 В. Когда мы соединили один из его выводов с землей, то на нем, соответственно, напряжение стало равным нулю, т.е. логический ноль. Теперь двоичным данным в регистре соответствует другое десятичное число. Можно попробовать замыкать и другие выводы регистра Status на землю, замыкать сразу несколько. Каждый раз при чтении получится разный результат.

Следует заметить, что при таких опытах с регистром Status возникает не совсем понятная ситуация с другими выводами порта LPT. После первого замыкания выводов Status, начинают мигать выводы Data и Control. Это связано с тем, что порт LPT предназначен для подключения принтера, а выводы Status он использует, для того чтобы сообщить компьютеру некоторую служебную информацию. Изменения на выводах Status регистрирует системный драйвер операционной системы. Он же проводит и ответные действия, для нас наблюдаемые в виде периодического изменения состояния других выводов. Тут уж ни чего не поделаешь. Я обычно, просто в начале работы с портом делаю замыкание какой-нибудь линии регистра Status на землю и жду примерно минуту, пока драйвер не утихомирится. После этого порт свободен, и новые операции над регистром Status не приводят к неконтролируемым процессам в порту.

Характеристики

Тип файла
Документ
Размер
1,78 Mb
Тип материала
Учебное заведение
Неизвестно

Список файлов реферата

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6447
Авторов
на СтудИзбе
306
Средний доход
с одного платного файла
Обучение Подробнее