Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OKIU / методичка_ОКІУ.doc
Скачиваний:
22
Добавлен:
16.02.2016
Размер:
1.11 Mб
Скачать

Ввід/вивід даних через паралельний порт

Існує декілька способів запису інформації в паралельний порт.

Команди принтера і процедури переривань bios

У Тр6 команда виводу на друк writeln(lst). Інший спосіб управління принтером полягає у використанні переривання BIOS - INT 17h. Тимчасові діаграми виведення даних через паралельний порт показані на рис. 1.5. Спочатку комп'ютер перевіряє, чи готовий принтер до прийому нових даних. Для цього необхідно проконтролювати стан лінії BUSY. Коли на ній низький рівень («не зайнятий»), ПК записує дані в регістр даних. Через 500 нс комп'ютер переводить сигнал STROBE в низький рівень, який, у свою чергу, переводить принтер в стан «зайнятий» (BUSY=1). Принтер приймає і обробляє дані, а тоді переводить сигнал АСК в низький рівень для індикації, що прийняті дані оброблені. В той же час принтер переводить лінію BUSY в низький рівень.

Рис. 1.5. Тимчасові діаграми взаємодії комп'ютера з принтером

Практично в кожній мові програмування існують інструкції по управлінню принтером. Проте потрібно враховувати, що цей метод недостатньо гнучкий для операцій вводу/виводу при з’єднанні ПК із зовнішніми пристроями.

Якщо до комп'ютера приєднана зовнішня схема, то в ній повинна бути спеціальна схема для генерації сигналів BUSY і АСК. Найзручніше, якщо ПК при взаємодії використовуватиме тільки лінії АСК. BUSY постійно з'єднується з цифровою «землею» для індикації, що схема готова до прийому даних, а РЕ показує, що в принтері є папір; на лінію ERROR подається високий рівень. Якщо не з'єднати таким чином лінії РЕ і ERROR, при запиті комп'ютера на друк видаватимуться повідомлення про помилку. Більш гнучкіший спосіб управління паралельним портом - безпосередній доступ до регістрів порту.

Безпосередній доступ до регістрів порту

Це метод управління портом за допомогою безпосереднього доступу до його регістрів. Паралельний порт розглядається як три окремі регістри вводу/виводу, два з яких призначені для виведення даних, а один - для вводу.

Наступні процедури на мові Тр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

byte1:byte;

begin

bytel:=port(P_address+1); (*Зчитування байта з регістра стану.*)

bytel:=byte1 and 120; (*01111000 (від старшого до молодшого) and 0dddd... = 0dddd000.*)

Read_status_port:=byte1 shr 3;

(*Зсув на 3 біта вправо, Read_status_port=0000hhhh.*)

end;

У наступних прикладах, написаних на мові Turbo Pascal для Windows, представлено ввід і виведення даних через паралельний порт.

(*-Бібліотека ресурсів № А4 (запис інформації в регістр даних).-*)

Function Write_data_port(P_address:integer, port_data:integer); export;

(*Біти регістра даних не інвертовані.*)

begin

port(P_address):=port_data (*Введення байта в регістр даних.*)

end;

(*-Библиотека ресурсів № А5 (запис даних в регістр управління).-*)

Function Write_control_port(P_addres3: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; (*Ввід байта даних в регістр управління.*)

end;

(*-Бібліотека ресурсів № 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 0dddd = 0dddd000 *)

Read_status_port:=byte1 shr 3; (*Зсув на 3 біта вправо, Read_status_port-0000hhhh.*)

end;

Соседние файлы в папке OKIU