Добро пожаловать!
Как управлять LPT портом из Delphi 7 или
Использование регистра данных ЛПТ порта для ввода данных в компьютер.
        Как известно LPT порт можно использовать для управления какими-либо устройствами или электроприборами с персонального компьютера. Но что делать, если этого мало? Если нам нужно не просто управлять приборами, но и получать какие-либо ответы от этих приборов.
В этом случае можно использовать регистр состояния с цепями Error, Sel, Pe, ASK, Busy (Рис 1).
Рис. 1
Но что делать, если этих регистров мало, например: необходимо ввести данные с 6-8 датчиков, которые используются в устройстве...
В этом случае для ввода данных в пк и использовании их в программе подойдет 8-и битная шина данных с цепями D0-D7, так как она двунаправленная.
Для того, чтобы использовать ЛПТ порт нам прежде всего понадобится динамически подключаемая библиотека inpout32.dll. Как её подключить и использовать описано тут.
Ну что ж, приступим... Запустим Delphi и создадим новый проект, после чего поместим на форму все необходимые элементы управления... (Рис.2)
Рис.2
Прежде чем начать работать с регистром данных в режиме ввода данных, нужно установить на всех его цепях логическую "1", для этого пишем следующую процедуру для Button1 ("Задать")
procedure TForm1.Button1Click(Sender: TObject);
begin
out32(65000,strtoint(edit1.Text));
end;
Красным цветом выделен адрес порта. У Вас он может отличаться (стандартный адрес: 378 (888)). Если Вам необходимо узнать адрес Вашего порта, то Вам сюда.
Теперь необходимо написать функцию, которая будет переводить считываемые с порта данные в двоичный код, т.к. это значительно упростит дальнейшую работу с данными:
function IntToBinary(x: integer): string;
var
str: string;
begin
str:='';
while x>1 do
begin
if x mod 2=0 then str:=str+'0' else str:=str+'1';
x:=x div 2;
end;
if x=0 then str:=str+'0' else str:=str+'1';
Result:=str;
end;
Внимание! Функция должна быть написана выше использующей её процедуры, иначе возникнет ошибка (Целесообразно написать её в самом верху)
Теперь пишем процедуру для Button2 ("Считать"). В ней мы:
procedure TForm1.Button2Click(Sender: TObject);
begin
x:=inp32(65000); //считываем данные с порта
y:= IntToBinary(x);//отправляем их в функцию
label1.Caption := y;//выводим результат перевода данных в двоичный код в Label1
end;
Вот что получается в результате:
Рис. 3
Теперь осталось разбить строку по одному символу и привязать их значения к CheckBox'ам:
procedure TForm1.Button2Click(Sender: TObject);
begin
x:=inp32(65000); //считываем данные с порта
y:= IntToBinary(x);//отправляем их в функцию
label1.Caption := y;//выводим результат перевода данных в двоичный код
if label1.Caption[8]='1' then checkbox8.Checked := false else checkbox8.Checked := true;
if label1.Caption[7]='1' then checkbox7.Checked := false else checkbox7.Checked := true;
if label1.Caption[6]='1' then checkbox6.Checked := false else checkbox6.Checked := true;
if label1.Caption[5]='1' then checkbox5.Checked := false else checkbox5.Checked := true;
if label1.Caption[4]='1' then checkbox4.Checked := false else checkbox4.Checked := true;
if label1.Caption[3]='1' then checkbox3.Checked := false else checkbox3.Checked := true;
if label1.Caption[2]='1' then checkbox2.Checked := false else checkbox2.Checked := true;
if label1.Caption[1]='1' then checkbox1.Checked := false else checkbox1.Checked := true;
end;
Теперь при заземлении любых из цепей регистра данных в программе всё будет видно. Для примера я заземляю 7-й и 9-й пин (D5,D7) результат на рис.4. Обратите внимание, что при заземлении старшего регистра последний ноль не выводится в лейбл (Особенность алгоритма функции).
Рис. 4
Вот и всё, теперь Вы без особого труда сможете регистрировать изменения, получаемые, например, с микропереключателей какого-нибудь станка, гравировочного (Определение положения) или самодельного токарного с компьютерным управлением... Если Вы пишите на Delphi конечно...)
Листинг программы:
Исходник на Delphi 7 + библиотека inpout32.dll
|