Паралельний інтерфейс IEEE 1284 (інтерфейс Centronics)
Паралельний інтерфейс IEEE 1284 (інтерфейс Centronics)
Паралельний інтерфейс IEEE 1284 (інтерфейс Centronics)
Реферат на тему
«Паралельний інтерфейс IEEE 1284 (інтерфейс Centronics)»
1. Загальні положення
1.1 Призначення інтерфейсу
В ПК традиційно використовується паралельний інтерфейс IEEE 1284 (більше відомий під назвою Centronics, названий в честь фірми яка першою розробила даний інтерфейс), реалізований LPT – портом. Основним призначенням інтерфейсу IEEE 1284 є підключення до комп’ютера периферійних пристроїв (ПП), здебільшого принтерів різноманітних типів [1]. Тому розподіл контактів рознімача, призначення сигналів, програмні засоби керування налаштовані саме на це використання.
1.2 Характеристика інтерфейсу
Інтерфейс Centronics є радіальним, асинхронним, паралельним інтерфейсом. Його використовують для підєднання ПП з невеликою швидкістю. Аналогічним можна вважати інтерфейс ИРПР-М, який використовували для спряження із ЕОМ друкуючих пристроїв [1]. Інтерфейс реалізує паралельне передавання 8-ми бітів (1 байта). Лінії інтерфейсу однонапрямлені і забезпечують передавання даних між одним передавачем (ПРД) і одним приймачем (ПРМ).
В LPT-порті використовуються логічні рівні ТТЛ, що обмежує допустиму довжину кабелю через невелику завадостійкість ТТЛ-інтерфейсу.
Максимальна довжина з’єднувального кабелю по стандарту — 1.8 м. Швидкість передачі даних при стандартних налаштуваннях 100–150 Кбайт/с.
1.3 Лінії інтерфейсу
Призначення 25-контактого рознімача IEEE 1284-A (рис. 1) приведено в таблиці 1 [2].
Рис. 1. Рознімач IEEE 1284-A DB-25 (DB (Data Bus) – шина даних, 25 – кількість контактів)
Таблиця 1. Призначення контактів рознімача IEEE 1284-A
Контакт DB-25 (LPT)
Напрям передачі
Регістр, № біта в регістрі
Сигнал
Призначення
1
→
CR.0
Strobe#
Спроб даних. Дані фіксуються по низькому рівню сигналу.
2
→
DR.0
D0
Дані 0
3
→
DR.1
D1
Дані 1
4
→
DR.2
D2
Дані 2
5
→
DR.3
D3
Дані 3
6
→
DR.4
D4
Дані 4
7
→
DR.5
D5
Дані 5
8
→
DR.6
D6
Дані 6
9
→
DR.7
D7
Дані 7
10
←
SR.6
Ack#
Імпульс підтвердження прийому байта даних.
11
←
SR.7
Busy
Зайнятість. Прийом даних можливий тільки при низькому рівні сигналу.
12
←
SR.5
PE
Paper End. Низький рівень сигналізує про закінчення паперу.
13
←
SR.4
Select
Сигналізує про включення принтера
14
→
CR.1
AutoLF#
Автоматичний перевід каретки
15
←
SR.3
Error#
Помилка
16
→
CR.2
Init#
Ініціалізація пристрою
17
→
CR.3
SelectIn#
Вибір принтера (низьким рівнем)
18–25
—
—
GND
Заземлення (нульовий потенціал 0V)
Сигнали IEEE 1284 мають таке призначення
← — вхідний сигнал від периферійного пристрою до ПК;
→ — вихідний сигнал від ПК до периферійного пристрою;
1.4 Пам’ять інтерфейсу
LPT-порт містить три 8-бітних регістра, розміщених по сусідніх адресах в просторі пам’яті вводу-виводу, починаючи з базової адреси порту BASE. В комп’ютері може використовуватись декілька LPT-портів, що позначаються LPT1, LPT2 і т.д., відповідно адреси в них будуть різними. В табл. 2 показано адреси для 3-х LPT-портів.
Таблиця 2. Адреси LPT-портів
Базова адреса (BASE) Регістр даних (Data Register)
Регістр стану (Status Register)
Регістр управління (Control Register)
3BCh
3BDh
3BEh
378h
379h
37Ah
278h
279h
27Ah
Регістр даних (Data Register, DR), 8-бітний регістр, дані, що записуються в цей регістр, виводяться на вихідні лінії (DR. [0 7]), адреса = BASE.
Регістр стану (Status Register, SR) призначений тільки для зчитування. Регістр відображає 5-бітовий (SR. [3 7]) порт вводу сигналів стану, адреса = BASE+1.
Регістр управління (Control Register, CR), 4-бітний (CR. [0 3]) порт виводу управляючих сигналів, адреса = BASE+2.
З’єднання регістрів пам’яті із рознімачем DB-25 показано на рис. 2.
Рис. 2. З’єднання регістрів пам’яті з рознімачем DB-25
1.5 Робота інтерфейсу
Формування і прийом сигналів проводиться шляхом запису і читання виділених для конкретного порту регістрів за певними адресами. При вмиканні обладнання відбувається процедура послідовність погодження режиму передачі даних (рис. 3).
Послідовність погодження режиму передачі
Послідовність погодження режиму передачі складається з наступних кроків
1. ПК виставляє так званий байт розширення на лінії даних.
2. ПК виставляє високий рівень сигналу SelectIn# і низький – AutoLF#, що означає початок послідовності погодження.
3. ПП відповідає встановленням низького рівня сигналу Ack# і низького – Error#, PE і Select.
4. ПК встановлює низький рівень сигналу Strobe# для запису байту розширення в ПП.
5. ПК встановлює високий рівень сигналу Strobe# і AutoLF#.
6. ПП відповідає встановленням в низький рівень PE і Error#, якщо ПП має зворотній канал передачі даних. Якщо режим, що запитується, підтримується пристроєм, то на лінії Select встановлюється високий рівень, а якщо не підтримується – низький.
7. ПП встановлює високий рівень на лінії Ack# для вказівки на завершення погодження, після чого контролер встановлює потрібний режим роботи.
Рис. 3. Послідовність погодження режимів передачі IEEE 1284
Послідовність побудована так, що старі пристрої, які не розраховані на застосування IEEE 1284, на неї не дадуть відповіді і контролер ПК залишиться в стандартному режимі. Під час фази погодження контролер ПК встановлює на лінії даних байт розширення, тим самим даючи запит на перевід інтерфейсу в потрібний режим [3] (табл. 3).
Таблиця 3. Біти в байті розширення
Бит
Опис
Допустимі комбінації бітів [7 0]
7
Зарезервовано
1000 0000
6
Запит режиму EPP
0100 0000
5
Запит режиму ECP з RLE
0011 0000
4
Запит режиму ECP без RLE
0001 0000
3
Зарезервовано
0000 1000
2
Запит ідентифікатора пристрою з відповіддю в режимі півбайтовий байтовий ECP без RLE ECP з RLE
0000 0100 0000 0101 0001 0100 0011 0100
1
Зарезервовано
0000 0010
0
Запит півбайтового режиму
0000 0001
none
Запит байтового режиму
0000 0000
Передача даних
Після узгодження режиму передачі можна здійснювати передачу даних. На рис. 4 показано передачу даних по протоколу Centronics.
Рис. 4. Передача даних по протоколу Centronics
1.6 Програмна частина інтерфейсу
Програмувати розробку інтерфейсу можна на нижчому рівні (наприклад із використанням мови Assembler), на середньому рівні та на мовах високого рівня (наприклад в середовищі Delphi).
Для програмування LPT портів в середовищі Delphi використовується модуль LPTIO.pas в якому описана вся взаємодія з драйвером LPT-порту lptwdmio.sys (Увага!!! Драйвер повинен знаходитись в папці c WINDOWSsystem32drivers або в тій же папці що і програма) [4].
Для роботи з LPT-портом оголошуємо об’єкт
Lpt TLptPortConnection;
В процедурі створення форми створюємо об’єкт Lpt
procedure TForm1. FormCreate (Sender TObject);
var
msg AnsiString;
begin
Lpt = TLptPortConnection. Create;
В тій же процедурі занесемо в регістр даних і у регістр управління заносимо 0 і 3 відповідно, що в результаті приведе до виключення всіх світлодіодних індикаторів.
Lpt. WritePort (GetCurrentPort, 0,0);
Lpt. WritePort (GetCurrentPort, 2,3);
Регістри є 8-бітні тому максимально можливе десяткове число, яке може бути записане в них, це 255 або 11111111 в двійковому форматі. Для запису використовується функція WritePort, де в параметрах вказується порт, в який записуються дані, його можна взнати використавши процедуру GetCurrentPort. Номера регістру 0 – регістр даних, 1 – регістр стану, 2 – регістр управління. Число яке записується від 0 до 255.
Для зчитування значень з регістру використовується функція ReadPort в параметрах якої вказується поточний порт і номер регістру (аналогічно з функцією запису).
Lpt. ReadPort (GetCurrentPort, 0)
Зчитується все значення регістру і тому, для того, щоб отримати значення певної комірки регістру, над зчитаним значенням потрібно виконати наступні дії
var
d boolean;
begin
d = true;
d = d and (1 = (1 and Lpt. ReadPort((GetCurrentPort), 0)));
Над зчитаними даними і степенем двійки, відповідно до номера регістра, значення якого потрібно взнати, виконується логічна операція and (логічне множення). Потім прирівнюємо до того ж числа в результаті виходе логічне значення true – якщо значення рівні і false – якщо ні. Значення булевої змінної можна використати наприклад для перемикання прапорця чи зміни кольору фігури, яка символізує діод. Повний текст програми яка зчитує і записує значення в LPT-порт дивіться в додатку.
1.7 Перспективи інтерфейсу IEEE 1284
Зараз практично всі сучасні системні плати не мають LPT-порту. Але на старіших системних платах цей порт досить поширений. Це пов’язане з вичерпанням портом свого ресурсу як такого. На заміно йому прийшов більш зручний і функціональний USB-порт. [5]. Порівняльні характеристики інтерфейсу IEEE 1224 та USB приведено в табл. 4
інтерфейс аналог асинхронний передача
Таблиця 4. Порівняльні характеристики інтерфейсу IEEE 1224 та USB
IEEE 1284
USB 2.0
USB 3.0
Швидкість
1,2 Мбіт/c
Low-speed 10 – 1500 Кбіт/c Full-speed 0,5 – 12 Мбіт/с Hi-speed 25 – 480 Мбіт/с
4,8 Гбит/с
Довжина лінії
3 м
3–5 м
3–5 м
Додаток
Код програми написаний на мові Delphi для зчитування і запису даних в LPT-порт.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, LPTIO, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Shape1 TShape;
Shape2 TShape;
Shape3 TShape;
Shape4 TShape;
Shape5 TShape;
Shape6 TShape;
Shape7 TShape;
Shape8 TShape;
Shape9 TShape;
Shape10 TShape;
Shape11 TShape;
Shape12 TShape;
Shape13 TShape;
Shape14 TShape;
Shape15 TShape;
Shape16 TShape;
Shape17 TShape;
Label1 TLabel;
Label2 TLabel;
Label3 TLabel;
Label4 TLabel;
Label5 TLabel;
Label6 TLabel;
Label7 TLabel;
Label8 TLabel;
Label9 TLabel;
Label10 TLabel;
Label11 TLabel;
Label12 TLabel;
Label13 TLabel;
Label14 TLabel;
Label15 TLabel;
Label16 TLabel;
Label17 TLabel;
Shape18 TShape;
Shape19 TShape;
Shape20 TShape;
Shape21 TShape;
Shape22 TShape;
Shape23 TShape;
Label19 TLabel;
Label20 TLabel;
Label21 TLabel;
Label22 TLabel;
Label23 TLabel;
Label24 TLabel;
Label25 TLabel;
Label26 TLabel;
Label27 TLabel;
Label28 TLabel;
Label29 TLabel;
Label30 TLabel;
Label31 TLabel;
Label32 TLabel;
Label33 TLabel;
Label34 TLabel;
Label35 TLabel;
Button1 TButton;
Button2 TButton;
Button3 TButton;
Button4 TButton;
Button5 TButton;
Button6 TButton;
Button7 TButton;
Button8 TButton;
Button9 TButton;
Button14 TButton;
Button16 TButton;
Button17 TButton;
Shape24 TShape;
Shape25 TShape;
Shape26 TShape;
Label18 TLabel;
Label36 TLabel;
Label37 TLabel;
ComboBox1 TComboBox;
Timer1 TTimer;
CheckBox1 TCheckBox;
CheckBox2 TCheckBox;
CheckBox3 TCheckBox;
CheckBox4 TCheckBox;
CheckBox5 TCheckBox;
CheckBox6 TCheckBox;
CheckBox7 TCheckBox;
CheckBox8 TCheckBox;
CheckBox9 TCheckBox;
CheckBox10 TCheckBox;
CheckBox11 TCheckBox;
CheckBox12 TCheckBox;
CheckBox13 TCheckBox;
CheckBox14 TCheckBox;
CheckBox15 TCheckBox;
CheckBox16 TCheckBox;
CheckBox17 TCheckBox;
Edit1 TEdit;
procedure Button1Click (Sender TObject);
procedure Button2Click (Sender TObject);
procedure Button3Click (Sender TObject);
procedure Button4Click (Sender TObject);
procedure Button5Click (Sender TObject);
procedure Button6Click (Sender TObject);
procedure Button7Click (Sender TObject);
procedure Button8Click (Sender TObject);
procedure Button9Click (Sender TObject);
procedure Button14Click (Sender TObject);
procedure Button16Click (Sender TObject);
procedure Button17Click (Sender TObject);
procedure FormCreate (Sender TObject);
procedure FormDestroy (Sender TObject);
procedure Timer1Timer (Sender TObject);
private
{Private declarations}
Lpt TLptPortConnection;
public
{Public declarations}
function GetCurrentPort byte;
function Pin2 boolean;
function Pin3 boolean;
function Pin4 boolean;
function Pin5 boolean;
function Pin6 boolean;
function Pin7 boolean;
function Pin8 boolean;
function Pin9 boolean;
function Pin1 boolean;
function Pin14 boolean;
function Pin16 boolean;
function Pin17 boolean;
function Pin10 boolean;
function Pin11 boolean;
function Pin12 boolean;
function Pin13 boolean;
function Pin15 boolean;
procedure ButtonPin2;
procedure ButtonPin3;
procedure ButtonPin4;
procedure ButtonPin5;
procedure ButtonPin6;
procedure ButtonPin7;
procedure ButtonPin8;
procedure ButtonPin9;
procedure ButtonPin1;
procedure ButtonPin14;
procedure ButtonPin16;
procedure ButtonPin17;
end;
var
Form1 TForm1;
implementation
{$R *.dfm}
procedure TForm1. FormCreate (Sender TObject);
var
msg AnsiString;
begin
Lpt = TLptPortConnection. Create;
if not Lpt. Ready then
begin
msg = ‘Помилка при створенні обєкта Lpt, драйвер ERROR, код = ‘ + Application. MessageBox (PChar(msg), ‘ERROR’, MB_OK);
Application. Terminate;
end;
ComboBox1. Items. Clear;
if Lpt. IsPortPresent(LPT1) then
ComboBox1. Items. Add (‘$3BC’);
if Lpt. IsPortPresent(LPT2) then
ComboBox1. Items. Add (‘$378’);
if Lpt. IsPortPresent(LPT3) then
ComboBox1. Items. Add (‘$278’);
if 0=ComboBox1. Items. Count then
begin
ComboBox1. Items. Add (‘LPT ïîðò⊃3;â íå çíàéäåíî’);
ComboBox1. ItemIndex = 0;
end
else
ComboBox1. ItemIndex = 0;
Lpt. WritePort (GetCurrentPort, 0,0);
Lpt. WritePort (GetCurrentPort, 2,3);
end;
procedure TForm1. FormDestroy (Sender TObject);
begin
Lpt. Destroy;
Timer1. Enabled = false;
end;
function TForm1. GetCurrentPort byte;
begin
if ‘$3BC’ = ComboBox1. Text then
GetCurrentPort =LPT1
else
if ‘$378’ = ComboBox1. Text then
GetCurrentPort =LPT2
else
GetCurrentPort =LPT3;
end;
procedure TForm1. Timer1Timer (Sender TObject);
begin
CheckBox1. Checked = Pin1;
CheckBox2. Checked = Pin2;
CheckBox3. Checked = Pin3;
CheckBox4. Checked = Pin4;
CheckBox5. Checked = Pin5;
CheckBox6. Checked = Pin6;
CheckBox7. Checked = Pin7;
CheckBox8. Checked = Pin8;
CheckBox9. Checked = Pin9;
CheckBox10. Checked = Pin10;
CheckBox11. Checked = Pin11;
CheckBox12. Checked = Pin12;
CheckBox13. Checked = Pin13;
CheckBox14. Checked = Pin14;
CheckBox15. Checked = Pin15;
CheckBox16. Checked = Pin16;
CheckBox17. Checked = Pin17;
if Pin1=true then
Shape1. Brush. Color =clRed
else
Shape1. Brush. Color =clWhite;
if Pin2=true then
Shape2. Brush. Color =clRed
else
Shape2. Brush. Color =clWhite;
if Pin3=true then
Shape3. Brush. Color =clRed
else
Shape3. Brush. Color =clWhite;
if Pin4=true then
Shape4. Brush. Color =clRed
else
Shape4. Brush. Color =clWhite;
if Pin5=true then
Shape5. Brush. Color =clRed
else
Shape5. Brush. Color =clWhite;
if Pin6=true then
Shape6. Brush. Color =clRed
else
Shape6. Brush. Color =clWhite;
if Pin7=true then
Shape7. Brush. Color =clRed
else
Shape7. Brush. Color =clWhite;
if Pin8=true then
Shape8. Brush. Color =clRed
else
Shape8. Brush. Color =clWhite;
if Pin9=true then
Shape9. Brush. Color =clRed
else
Shape9. Brush. Color =clWhite;
if Pin10=true then
Shape10. Brush. Color =clRed
else
Shape10. Brush. Color =clWhite;
if Pin11=true then
Shape11. Brush. Color =clRed
else
Shape11. Brush. Color =clWhite;
if Pin12=true then
Shape12. Brush. Color =clRed
else
Shape12. Brush. Color =clWhite;
if Pin13=true then
Shape13. Brush. Color =clRed
else
Shape13. Brush. Color =clWhite;
if Pin14=true then
Shape14. Brush. Color =clRed
else
Shape14. Brush. Color =clWhite;
if Pin15=true then
Shape15. Brush. Color =clRed
else
Shape15. Brush. Color =clWhite;
if Pin16=true then
Shape16. Brush. Color =clRed
else
Shape16. Brush. Color =clWhite;
if Pin17=true then
Shape17. Brush. Color =clRed
else
Shape17. Brush. Color =clWhite;
end;
procedure TForm1. Button1Click (Sender TObject);
begin
ButtonPin1;
end;
procedure TForm1. Button2Click (Sender TObject);
begin
ButtonPin2;
end;
procedure TForm1. Button3Click (Sender TObject);
begin
ButtonPin3;
end;
procedure TForm1. Button4Click (Sender TObject);
begin
ButtonPin4;
end;
procedure TForm1. Button5Click (Sender TObject);
begin
ButtonPin5;
end;
procedure TForm1. Button6Click (Sender TObject);
begin
ButtonPin6;
end;
procedure TForm1. Button7Click (Sender TObject);
begin
ButtonPin7;
end;
procedure TForm1. Button8Click (Sender TObject);
begin
ButtonPin8;
end;
procedure TForm1. Button9Click (Sender TObject);
begin
ButtonPin9;
end;
procedure TForm1. Button14Click (Sender TObject);
begin
ButtonPin14;
end;
procedure TForm1. Button16Click (Sender TObject);
begin
ButtonPin16;
end;
procedure TForm1. Button17Click (Sender TObject);
begin
ButtonPin17;
end;
procedure TForm1. ButtonPin2;
begin
Lpt. WritePort (GetCurrentPort, 0, (1 xor Lpt. ReadPort((GetCurrentPort), 0)));
end;
procedure TForm1. ButtonPin3;
begin
Lpt. WritePort (GetCurrentPort, 0, (2 xor Lpt. ReadPort((GetCurrentPort), 0)));
end;
procedure TForm1. ButtonPin4;
begin
Lpt. WritePort (GetCurrentPort, 0, (4 xor Lpt. ReadPort((GetCurrentPort), 0)));
end;
procedure TForm1. ButtonPin5;
begin
Lpt. WritePort (GetCurrentPort, 0, (8 xor Lpt. ReadPort((GetCurrentPort), 0)));
end;
procedure TForm1. ButtonPin6;
begin
Lpt. WritePort (GetCurrentPort, 0, (16 xor Lpt. ReadPort((GetCurrentPort), 0)));
end;
procedure TForm1. ButtonPin7;
begin
Lpt. WritePort (GetCurrentPort, 0, (32 xor Lpt. ReadPort((GetCurrentPort), 0)));
end;
procedure TForm1. ButtonPin8;
begin
Lpt. WritePort (GetCurrentPort, 0, (64 xor Lpt. ReadPort((GetCurrentPort), 0)));
end;
procedure TForm1. ButtonPin9;
begin
Lpt. WritePort (GetCurrentPort, 0, (128 xor Lpt. ReadPort((GetCurrentPort), 0)));
end;
procedure TForm1. ButtonPin1;
begin
Lpt. WritePort (GetCurrentPort, 2, (1 xor Lpt. ReadPort((GetCurrentPort), 2)));
end;
procedure TForm1. ButtonPin14;
begin
Lpt. WritePort (GetCurrentPort, 2, (2 xor Lpt. ReadPort((GetCurrentPort), 2)));
end;
procedure TForm1. ButtonPin16;
begin
Lpt. WritePort (GetCurrentPort, 2, (4 xor Lpt. ReadPort((GetCurrentPort), 2)));
end;
procedure TForm1. ButtonPin17;
begin
Lpt. WritePort (GetCurrentPort, 2, (8 xor Lpt. ReadPort((GetCurrentPort), 2)));
end;
function TForm1. Pin2 boolean;
var
d boolean;
begin
d = true;
d = d and (1 = (1 and Lpt. ReadPort((GetCurrentPort), 0)));
Pin2 = d;
end;
function TForm1. Pin3 boolean;
var
d boolean;
begin
d = true;
d = d and (2 = (2 and Lpt. ReadPort (GetCurrentPort, 0)));
Pin3 = d;
end;
function TForm1. Pin4 boolean;
var
d boolean;
begin
d = true;
d = d and (4 = (4 and Lpt. ReadPort (GetCurrentPort, 0)));
Pin4 = d;
end;
function TForm1. Pin5 boolean;
var
d boolean;
begin
d = true;
d = d and (8 = (8 and Lpt. ReadPort (GetCurrentPort, 0)));
Pin5 = d;
end;
function TForm1. Pin6 boolean;
var
d boolean;
begin
d = true;
d = d and (16 = (16 and Lpt. ReadPort (GetCurrentPort, 0)));
Pin6 = d;
end;
function TForm1. Pin7 boolean;
var
d boolean;
begin
d = true;
d = d and (32 = (32 and Lpt. ReadPort (GetCurrentPort, 0)));
Pin7 = d;
end;
function TForm1. Pin8 boolean;
var
d boolean;
begin
d = true;
d = d and (64 = (64 and Lpt. ReadPort (GetCurrentPort, 0)));
Pin8 = d;
end;
function TForm1. Pin9 boolean;
var
d boolean;
begin
d = true;
d = d and (128 = (128 and Lpt. ReadPort (GetCurrentPort, 0)));
Pin9 = d;
end;
function TForm1. Pin1 boolean;
var
d boolean;
begin
d = true;
d = d xor (STROBE = (STROBE and Lpt. ReadPort (GetCurrentPort, 2)));
Pin1 = d;
end;
function TForm1. Pin14 boolean;
var
d boolean;
begin
d = true;
d = d xor (AUTOFEED = (AUTOFEED and Lpt. ReadPort (GetCurrentPort, 2)));
Pin14 = d;
end;
function TForm1. Pin16 boolean;
var
d boolean;
begin
d = true;
d = d and (INIT = (INIT and Lpt. ReadPort (GetCurrentPort, 2)));
Pin16 = d;
end;
function TForm1. Pin17 boolean;
var
d boolean;
begin
d = true;
d = d xor (SELECTIN = (SELECTIN and Lpt. ReadPort (GetCurrentPort, 2)));
Pin17 = d;
end;
function TForm1. Pin10 boolean;
var
d boolean;
begin
d = true;
d = d and (ACK = (ACK and Lpt. ReadPort (GetCurrentPort, 1)));
Pin10 = d;
end;
function TForm1. Pin11 boolean;
var
d boolean;
begin
d = true;
d = d xor (BUSY = (BUSY and Lpt. ReadPort (GetCurrentPort, 1)));
Pin11 = d;
end;
function TForm1. Pin12 boolean;
var
d boolean;
begin
d = true;
d = d and (PAPEREND = (PAPEREND and Lpt. ReadPort (GetCurrentPort, 1)));
Pin12 = d;
end;
function TForm1. Pin13 boolean;
var
d boolean;
begin
d = true;
d = d and (SELECT = (SELECT and Lpt. ReadPort (GetCurrentPort, 1)));
Pin13 = d;
end;
function TForm1. Pin15 boolean;
var
d boolean;
begin
d = true;
d = d and (ERROR = (ERROR and Lpt. ReadPort (GetCurrentPort, 1)));
Pin15 = d;
end; end.
Додаток 2
Код програми написаний на мові Delphi для виводу двійкового числа 10000000 на світлодіодні індикатори лабораторного макету із періодом зміни інформації в 1 секунду.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, LPTIO, ExtCtrls, StdCtrls, Spin;
type
TForm1 = class(TForm)
Button1 TButton;
Timer1 TTimer;
SpinEdit1 TSpinEdit;
CheckBox1 TCheckBox;
Label1 TLabel;
Label2 TLabel;
procedure FormCreate (Sender TObject);
procedure FormDestroy (Sender TObject);
procedure Timer1Timer (Sender TObject);
procedure Button1Click (Sender TObject);
procedure SpinEdit1Change (Sender TObject);
private
{Private declarations}
Lpt TLptPortConnection;
public
{Public declarations}
function GetCurrentPort byte;
end;
var
Form1 TForm1;
implementation
{$R *.dfm}
procedure TForm1. FormCreate (Sender TObject);
var
msg AnsiString;
begin
Lpt = TLptPortConnection. Create;
if not Lpt. Ready then
begin {объект не готов – покажем код ошибки}
msg = ‘Ошибка при создании объекта Lpt, драйвер ERROR, код = ‘ + IntToStr (GetLastError());
Application. MessageBox (PChar(msg), ‘ERROR’, MB_OK);
Application. Terminate;
end;
Lpt. WritePort (GetCurrentPort, 0,0);
Lpt. WritePort (GetCurrentPort, 2,3);
end;
procedure TForm1. FormDestroy (Sender TObject);
begin
Lpt. Destroy;
Timer1. Enabled = false;
end;
function TForm1. GetCurrentPort byte;
begin
if Lpt. IsPortPresent(LPT1) then
GetCurrentPort =LPT1
else
if Lpt. IsPortPresent(LPT2) then
GetCurrentPort =LPT2
else
if Lpt. IsPortPresent(LPT3) then
GetCurrentPort =LPT3;
end;
procedure TForm1. Timer1Timer (Sender TObject);
begin
Lpt. WritePort (GetCurrentPort, 0, (1 xor Lpt. ReadPort((GetCurrentPort), 0)));
if CheckBox1. Checked=false then
CheckBox1. Checked =true
else
CheckBox1. Checked =false;
end;
procedure TForm1. Button1Click (Sender TObject);
begin
if Timer1. Enabled=false then
begin
Timer1. Enabled =true;
Button1. Caption =’Stop’;
end
else
begin
Timer1. Enabled =false;
Button1. Caption =’Start’;
end;
end;
procedure TForm1. SpinEdit1Change (Sender TObject);
begin
Timer1. Interval =SpinEdit1. Value;
end;
end.