Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

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

Чтение данных

Теперь давайте получим данные из порта, а именно из его регистра 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. Он однонаправленный, данные в него может записать только наша программа. Обратите внимание на несколько особенностей этого регистра. Во-первых, о содержит всего четыре рабочих вывода. Значит в него можно записать число в диапозоне от 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, и переведя их в двоичное число, сразу довольно трудно понять что же реально творится с напряжениями на выходах этого регистра. Во-первых, он тоже имеет инвертированные выводы, а во-вторых рабочими являются биты под номерами 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 не приводят к неконтролируемым процессам в порту.

 

<== предыдущая лекция | следующая лекция ==>
Запись/чтение данных в регистр Data | Понятие прерывания
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 365; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.