Добро пожаловать!
Как управлять LPT портом из Delphi 7
Чтобы работать с LPT портом из среды Delphi 7, нам понадобится динамическая библиотека inpout32.dll, которую нужно будет скопировать в папку с проектом.
Для того, чтобы в проекте можно было работать с данной библиотекой, нужно между Uses и Type объявить 2 функции:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
function Inp32(PortAdr: word): byte; stdcall; external 'inpout32.dll';
function Out32(PortAdr: word; Data: byte): byte; stdcall; external 'inpout32.dll';
type
TForm1 = class(TForm)
Примечание: данная библиотека работает только в 32-разрядных версиях Windows.
Вот и всё, теперь можно работать с LPT, используя динамическую библиотеку.
На рисунке 1 изображена распиновка LPT порта.
Рисунок 1
LPT порт имеет 8 двунаправленных цепей (с 2-го по 9-й пин), с адресом $378(888 - в десятиричной системе счисления)
5 однонаправленных цепей предназначиных только для ввода (с 10-го по 13-й и 15 пины). Адрес порта $379(889 - в десятиричной с. с.)
4 однонаправленных цепи предназначенных только для вывода(1, 14, 16 и 17-й пины) с адресом 37А(890), все, кроме 16-го из которых инверсные см. Рисунок 2.
Рисунок 2
Немного теории.
Программно в цепях (на пинах) LPT порта можно устанавливать логический ноль (что сооттветствует отсутствию напряжения в цепи) и логическую единицу (что соответствует + 5 вольтам) в нужной нам цепи, т. е. на нужном нам пине(пинах)
Самый простой (короткий) способ написания процедуры, которая будет устанавливать к примеру 2-й пин (порта 888) в состояние логической единицы выглядит вот так:
Out32(888, 1);
где 888 - это номер порта, а 1 - это данные размером в 1 бит.
Процедура для кнопки будет выглядеть так:
procedure TForm1.Button1Click(Sender: TObject);
begin
Out32(888, 1);
end;
Установить лог. единицу сразу в нескольких цепях (на нескольких пинах) одного порта, например 888 можно следующим образом: вместо 1 напишем 3, в этом случае лог. единицы будут в цепи (3=1+2) D0 и D1 (2-й и 3-й пины). Чтобы установить лог. единицы на всех 8-и пинах, вместо 1 нужно подставить 255 т. к. 1+2+4+8+16+32+64+128=255.
Проще всего, по моему мнению, реализовать обработку данных в таймере, как я и сделал в своем проекте, код которого вы видите ниже.
8 переменных (d0-d7), объявленных глобально, обеспечивают контроль над каждой цепью порта. Дальше в проекте просто меняется значение переменных и сумма этих переменных каждые 10мс отправляется в порт.
А вот и форма приложения
Рисунок 3
Для управления портом 889 всё так же, кроме того, что нужно вместо 888 подставить 889 и учесть тот факт, что 3 из 4 цепей инвертируются, т. е. когда установим логический ноль, на выводе будет всё наоборот т. е. единица. И внимательно смотрим на Рисунок 2, а именно в колонку РАЗРЯДНОСТЬ.
Для считывания состояния (значения) используется функция Inp32. В коде выглядит так: Inp32(888);
Нужна библиотека Inpout32 - она ТУТ (11Kb)
Исходный код и проект программы на Delphi? Он ТУТ (219Kb)
Если нужна схема устройства для управления внешними электроприборами через LPT порт, то её можно посмотреть ТУТ
|