Раздел: Документация
0 ... 4 5 6 7 8 9 10 ... 105 От компьютера к принтеру Линии данных STR0SE группе контроля Безразличное состояние 1мкс минимум и От принтера к компьютеру 0,5мкс минимум -1 Омкс Busy группе состояния as"k б группе состояния 1 Омкс Рис. 1.5. Временные диаграммы взаимодействия компьютера с принтером переводит принтер в состояние «занят» (BUSY=1). Принтер принимает и обрабатывает данные, а затем переводит сигнал АСК в низкий уровень для индикации, что принятые данные обработаны. В то же время принтер переводит линию BUSY в низкий уровень. Практически в каждом языке программирования существуют инструкции по управлению принтером. Однако нужно учитывать, что этот метод недостаточно гибок для операций ввода/вывода при сопряжении ПК с внешними устройствами. Если к компьютеру подсоединена внешняя схема, то в ней должна быть специальная схема для генерации сигналов BUSY и АСК. Удобнее всего, если ПК при взаимодействии будет использовать только линии АСК. BUSY постоянно соединяется с цифровой «землей» для индикации, что схема готова к приему данных, а РЕ показывает, что в принтере есть бумага; на линию ERROR подается высокий уровень. Если не соединить таким образом линии РЕ и ERROR, при запросе компьютера на печать будут выдаваться сообщения об ошибке. Более гибкий способ управления параллельным портом - непосредственный доступ к регистрам порта. Непосредственный доступ к регистрам порта Это метод управления портом при помощи непосредственного доступа к его регистрам. Параллельный порт рассматривается как три отдельных регистра ввода/вывода, два из которых предназначены для вывода данных, а один - для ввода. Рассмотрим пример управления портом LPT1. Так как адреса регистров данных, управления и состояния имеют номера 888, 890 и 889 соответственно, для записи информации в регистры данных и управления применяются следующие команды языка QBASIC: OUT 888, X OUT 890, X где X - записываемое значение в десятичном представлении. Некоторые линии порта управления инвертированы, что необходимо учитывать при выводе данных. Для чтения данных из регистра состояния можно пользоваться следующей командой: Y=INP(889) где Y - десятичное входное значение. Биты входных данных соответствуют номерам с 3 по 7 регистра состояния, некоторые из них инверсные. Следующие процедуры на языке ТР6 записывают информацию в регистры данных и управления. Обеим процедурам требуются базовый адрес выбранного параллельного порта и значение выходных данных. Выходные данные для регистра управления предусматривают проведение некоторых преобразований над битами. (•-Библиотека ресурсов № А4 (запись информации в порт данных компьютера)-.*) Procedure Write data port(P address:integer, port data:byte); (*Биты регистра данных не инвертированы,*) begin port(P address):=port data; («Ввод байта данных в регистр данных.*) end; (•-Библиотека ресурсов № А5 (запись данных в регистр управления.)-.*) Procedure Write control port(P address:integer; port data:byte); (•Биты 0, 1 и 3 инвертированы. Требуются преобразования над битами.*) begin if port data and 1=1 then port data:=port data and (255-1) else port data:=port data or 1; if port data and 2=2 then port data:=port data and (255-2) else port data:=port data or 2; if port data and 8=8 then port data:=port data and (255-8) else port data:=port data or 8; port(P address+2):=port data; (*Ввод байта данных в регистр управления.*) end; Следующая функция на языке ТР6 считывает биты с 3 по 6 из регистра состояния. Она требует базовый адрес выбранного параллельного порта. Функция также выполняет битовые преобразования и возвращает значение четырехбитовых входных данных. (•-Библиотека ресурсов № A3 (считывание данных в компьютер).-*) Function Read status port(P address:integer):byte; var bytel:byte; begin bytel:=port(P address+1);(«Считывание байта из регистра состояния.*) bytel :=byte1 and 120;(*01111000 (от старшего к младшему) and Odddd... = OddddOOO.*) Read status port:=byte1 shr 3; (*Сдвиг на 3 бита вправо, Read status port=0000hhhh.*) end; (•-Библиотека ресурсов № А5 (запись данных в регистр управления).-*) Function Write control port(P address:integer; port data:integer) integer; export; (♦Биты 0, 1 и 3 инвертированы Требуются преобразования над битами.*) begin if port data and 1=1 then port data:=port data and (255-1) else port data:=port data or 1; if port data and 2=2 then port data:=port data and (255-2) else port data:=port data or 2; if port data and 8=8 then port data:=port data and (255-8) else port data:=port data or 8, port(P address+2):=port data; (*Ввод байта данных в регистр управления.*) («-Библиотека ресурсов № A3 (считывание данных в компьютер).-*) Function Read status port(P address:integer).integer; export; var bytel byte; begin bytel =port(P address+1);(«Считывание байта из регистра состояния *) bytel =byte1 and 120;(«01111000 (от старшего к младшему) and Odddd = OddddOOO «) Read status port:=byte1 shr 3; («Сдвиг на 3 бита вправо, Read status port=0000hhhh.*) Преобразования над битами В данном разделе рассматриваются некоторые основные приемы битовых преобразований. Рассказывается о том, что такое вес бита, как сделать определенный бит единицей или нулем, описываются процедуры побитовых сдвигов. Вес бита Соотношения между битами и их весами приведены ниже: бит 01 (десятичное значение) end; end, end; бит 1 бит 2 бит 3 бит 4 бит 5 бит 6 бит 7 2 4 8 16 32 64 128 В следующих примерах, написанных на языке Turbo Pascal для Windows, представлен ввод и вывод данных через параллельный порт. (♦-Библиотека ресурсов № А4 (запись информации в регистр данных).-*) Function Write data port(P address:integer, port data:integer); export; (*Биты регистра данных не инвертированы.*) begin port(P address):=port data(«Ввод байта в регистр данных.*) 0 ... 4 5 6 7 8 9 10 ... 105 |