Реферат на тему:
«Паралельний інтерфейс 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].
![](/images/paper/94/27/8072794.png)
Рис. 1. Рознімач IEEE 1284-ADB-25 (DB (DataBus) – шина даних, 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)
Регістр даних
(DataRegister)
|
Регістр стану
(StatusRegister)
|
Регістр управління
(ControlRegister)
|
3BCh |
3BDh |
3BEh |
378h |
379h |
37Ah |
278h |
279h |
27Ah |
Регістр даних (DataRegister, DR), 8-бітний регістр, дані, що записуються в цей регістр, виводяться на вихідні лінії (DR. [0:7]), адреса = BASE.
Регістр стану (StatusRegister, SR) призначений тільки для зчитування. Регістр відображає 5-бітовий (SR. [3:7]) порт вводу сигналів стану, адреса = BASE+1.
Регістр управління (ControlRegister, CR), 4-бітний (CR. [0:3]) порт виводу управляючих сигналів, адреса = BASE+2.
З’єднання регістрів пам’яті із рознімачем DB-25 показано на рис. 2.
![](/images/paper/95/27/8072795.png)
Рис. 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# для вказівки на завершення погодження, після чого контролер встановлює потрібний режим роботи.
![](/images/paper/96/27/8072796.png)
Рис. 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.
![](/images/paper/97/27/8072797.png)
Рис. 4. Передача даних по протоколу Centronics
1.6 Програмна частина інтерфейсу
Програмувати розробку інтерфейсу можна на нижчому рівні (наприклад із використанням мови Assembler), на середньому рівні та на мовах високого рівня (наприклад в середовищі Delphi).
Для програмування LPT портів в середовищі Delphi використовується модуль LPTIO.pas в якому описана вся взаємодія з драйвером LPT-порту lptwdmio.sys (Увага!!! Драйвер повинен знаходитись в папці c:\WINDOWS\system32\drivers\ або в тій же папці що і програма) [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 ïîðò³â íå çíàéäåíî');
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.
|