Начало работы с драйвером при помощи шаблона.
Минимум теории – максимум практики:
пишем в порт, читаем с портов, пишем логический индикатор и Pin клавиатуру.
Если Вы уже не новичок в программировании, Вам не составит труда разобраться как работать с драйвером LPTWDMIO прочитав соответствующее “Драйвер FAQ.html” в каталоге шаблона. Однако готовый шаблон является самым быстрым и оптимальным средством разработки приложений на основе драйвера LPTWDMIO с дополнительным набором функций Pin , существенно облегчающих и ускоряющих работу с этим прекрасным компонентом. Но, всё же, для начала заглянем в и FAQ самого драйвера, определив тот минимум, который необходимо знать, чтобы начать плодотворно (я надеюсь на это) работать. И так, смотрим FAQ:
***************************************************************************
В модуле LPTIO.pas определены следующие константы:
{ Номера портов LPT }
LPT1 : byte = $10; // база $3BC
LPT2 : byte = $20; // $378
LPT3 : byte = $30; // $278
{ Смещения регистров порта }
LPT_DATA_REG : byte = 0; // Регистр данных
LPT_STATE_REG : byte = 1; // Регистр состояния
LPT_CONTROL_REG : byte = 2; // Регистр управления
LPT_EPP_ADDRESS : byte = 3; // Регистр адреса EPP
LPT_EPP_DATA : byte = 4; // Регистр данных EPP
Например, логический номер регистра управления порта LPT2:
(LPT2 or LPT_CONTOL_REG)
при этом обращение будет выполняться по адресу $378+2 = $37A.
Нумерация отдельных бит регистров
Побитная раскладка регистров порта LPT определена в виде двух наборов констант — для регистров управления и для регистров состояния:
{ Битовые расклады регистров / разъём 25 pin / разъём Centronic }
{ Битовый расклад регистра УПРАВЛЕНИЯ }
STROBE : byte = $01; { Строб, 1 /1 }
AUTOFEED : byte = $02; { Автопротяжка, 14/14 }
INIT : byte = $04; { Инициализация, 16/31 }
SELECTIN : byte = $08; { Выбор принтера, 17/36 }
IRQE : byte = $10; { Прерывание, ------ }
DIRECTION : byte = $20; { Направление ШД, ------ }
{ Битовый расклад регистра СОСТОЯНИЯ }
IRQS : byte = $04; { Флаг прерывания,------ }
ERROR : byte = $08; { Признак ошибки, 15/32 }
SELECT : byte = $10; { Признак выбора, 13/13 }
PAPEREND : byte = $20; { Конец бумаги, 12/12 }
ACK : byte = $40; { Готовность к приёму данных, 10/10}
BUSY : byte = $80; { Занятость, 11/11 }
Эти значения могут быть использованы, например для управления состоянием отдельных линий.
Например, вот так можно установить бит INIT в регистре управления порта LPT1:
Lpt.WritePort(LPT1,LPT_CONTROL_REG, (INIT or Lpt.ReadPort(LPT1,LPT_CONTROL_REG)) )
***************************************************************************
Если Вам всё понятно – это хорошо, если же нет – ничего страшного, как раз для этого и разработан проект “XpCoding” и программа XP LPT ,благодаря которому Вы сможете создавать работающие программы даже методом “ скопировал – вставил ”. По сути, от Вас требуется только понимать что именно и куда надо встраивать. Могу Вас уверить, что проще, быстрее и практичней Вы уже не найдёте. Так что не выключайте компьютер в панике дёргая за сетевой шнур после просмотра “Драйвер FAQ.html” испугавшись нагромаждения всяческих кодов, потому что глаза боятся, а руки делают (:-.
Начнём с самого популярного народного метода: метода научного встраивания. Для начала сделайте себе несколько запасных копий шаблонов (папок), чтобы не жалко было портить (:- . Далее открываем каталог шаблона и запускаем файл проекта – Project1.dpr. Что мы видим было показано в шаге1. Сейчас же, не размениваясь по мелочам, сразу нажимаем кнопку компиляции – F9 . После компиляции запускается программа и определяет LPT порт или несколько портов, заполнив ими список в ComboBox1 . И так, порты отловлены (внимание: сакраментальная фраза, потому что в конце курса всей этой обучалки Вам придётся гордо сказать – “И так, баги отловлены !” и по-американски положив ноги на компьютерный столик почивать на лаврах). Далее закройте EXEшник и вернитесь в Делфи. Теперь всё готово для написания Вашей Windows 9x/2000/XP программы, жаль только я не могу Вам порекомендовать откинуться на спинку стула как кампания “Майкрософт” при установки Windows.
Традиционно устанавливаем на форму кнопки и экспериментируем с записью в порт:
————————————————————————————————
Щёлкаем по кнопке Button1:
begin[/pas]
{записуем число 10 ($A) в базовый порт, регистр данных – 0 }
[pas]Lpt.WritePort (GetCurrentPort,0,$A);end;[/pas]
Щёлкаем по кнопке Button2:
[pas]procedure TForm1.Button2Click(Sender: TObject);begin[/pas]
{записуем число 8 ($8) в базовый порт, регистры контроля – 2, в результате на 0 и 1 бите повятся единицы – смотрите в XP LPT }
[pas]Lpt.WritePort (GetCurrentPort,2,$8);end;[/pas]
Щёлкаем по кнопке Button3:
[pas]procedure TForm1.Button3Click(Sender: TObject);begin
{записуем число 32 в базовый порт, регистр данных – 0 }
Lpt.WritePort (GetCurrentPort,0,32);
end;[/pas]
————————————————————————————————
Как видите, всё это не сложнее чем в проекте PortCoding, только называется по другому. А теперь читаем с портов:
Для этого расположите на форме Edit1 и Edit2, таймер. Вставляем следующий код:
[pas]procedure TForm1.Timer1Timer(Sender: TObject);Var
dat : byte; //–переменная хранит прочитанное число
begin
dat:= Lpt.ReadPort (GetCurrentPort,0); //–читаем базовый порт: регистры данных – 0
Edit1.Text := ‘$’+IntToHex(integer(dat),2); //– выводим в HEX
Edit2.Text := IntToStr(dat); //– выводим в числах
end;[/pas]
В итоге отметим следующее:
LPT_DATA_REG : byte = 0; // Регистр данных
LPT_STATE_REG : byte = 1; // Регистр состояния
LPT_CONTROL_REG : byte = 2; // Регистр управления
Следовательно код:
[pas] Lpt.WritePort (GetCurrentPort,0,32);[/pas]Будет тоже самое что и:
[pas]Lpt.WritePort (GetCurrentPort, LPT_DATA_REG,32);[/pas]Cкачайте этот пример – primer_xp01.zip(30 kb)
А теперь самостоятельно напишем простой логический индикатор и pin клавиатуру:
Для этого возьмём Timer, четыре ToolBar и семнадцать CheckBox:
С помощью функций Pin это крайне просто – значения чекбоксов (boolean) – Checked становится false или true в зависимости от аналогичного состояния значения Pin , т.е. если 5вольт – true иначе – false;
[pas]procedure TForm1.Timer1Timer(Sender: TObject);begin
CheckBox1.Checked := Pin2; //–если Pin2 = true тогда будет галочка
CheckBox2.Checked := Pin3; //—-аналогично—-
CheckBox3.Checked := Pin4;
CheckBox4.Checked := Pin5;
CheckBox5.Checked := Pin6;
CheckBox6.Checked := Pin7;
CheckBox7.Checked := Pin8;
CheckBox8.Checked := Pin9;
CheckBox9.Checked := Pin1;
CheckBox10.Checked := Pin14;
CheckBox11.Checked := Pin16;
CheckBox12.Checked := Pin17;
CheckBox13.Checked := Pin11;
CheckBox14.Checked := Pin10;
CheckBox15.Checked := Pin12;
CheckBox16.Checked := Pin13;
CheckBox17.Checked := Pin15;
end;[/pas]
Добавим на оставшейся тулбар семнадцать кнопок Pin клавиатуры:
Команды Pin клавиатуры встроены в шаблон!
Теперь без труда Вы можете установить/снять напряжение 5вольт
на соответствующей ножке (Pin) LPT разъёма очень простой командой!
procedure TForm1.Button1Click(Sender: TObject);
begin
ButtonPin2; //– ( Pin2)
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ButtonPin3; //– ( Pin3)
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ButtonPin4; //– (Аналогично)
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
ButtonPin5;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
ButtonPin6;
end;
procedure TForm1.Button8Click(Sender: TObject);
begin
ButtonPin7;
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
ButtonPin8;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
ButtonPin9;
end;
{ ——————- регистры контроля —————————— }
procedure TForm1.Button9Click(Sender: TObject);
begin
ButtonPin1;
end;
procedure TForm1.Button10Click(Sender: TObject);
begin
ButtonPin14;
end;
procedure TForm1.Button11Click(Sender: TObject);
begin
ButtonPin16;
end;
procedure TForm1.Button12Click(Sender: TObject);
begin
ButtonPin17;
end;[/pas]
Cкачайте этот пример – primer_xp02.zip(30 kb)
Смотрите дальше: Шаг 3. Виртуальные приборы: программа LPT генератор 5 – 600 Гц