Минимум теории - максимум практики:
пишем в порт, читаем с портов, пишем логический индикатор и 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/1
4 }
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:
procedure TForm1.Button1Click(Sender: TObject);
begin
{
записуем число 10 ($A) в базовый порт, регистр данных - 0 }
Lpt.WritePort (GetCurrentPort,0,$A);
end;
Щёлкаем по кнопке Button2:
procedure TForm1.Button2Click(Sender: TObject);
begin
{
записуем число 8 ($8) в базовый порт, регистры контроля - 2, в результате на 0 и 1 бите повятся единицы – смотрите в XP LPT }
Lpt.WritePort (GetCurrentPort,2,$8);
end;
Щёлкаем по кнопке Button3:
procedure TForm1.Button3Click(Sender: TObject);
begin
{записуем число 32 в базовый порт, регистр данных - 0 }
Lpt.WritePort (GetCurrentPort,0,32);
end;
------------------------------------------------------------------------------------------------
Как видите, всё это не сложнее чем в проекте
PortCoding, только называется по другому. А теперь читаем с портов:
Для этого расположите на форме Edit1 и Edit2, таймер. Вставляем следующий код:
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;
В итоге отметим следующее:
LPT_DATA_REG : byte = 0; // Регистр данных
LPT_STATE_REG :
byte = 1; // Регистр состояния
LPT_CONTROL_REG : byte = 2; // Регистр управления
Следовательно код: Lpt.WritePort (GetCurrentPort,
0,32);
Будет тоже самое что и: Lpt.WritePort (GetCurrentPort,
LPT_DATA_REG,32);
Cкачайте этот пример - primer_xp01.zip(30 kb)
А теперь самостоятельно напишем
простой логический индикатор и pin клавиатуру:
Для этого возьмём
Timer, четыре ToolBar и семнадцать CheckBox:
С помощью функций
Pin это крайне просто - значения чекбоксов (boolean) - Checked становится false или true в зависимости от аналогичного состояния значения Pin , т.е. если 5вольт - true иначе - false;
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;
Добавим на оставшейся тулбар семнадцать кнопок
Pin клавиатуры:
Команды Pin клавиатуры встроены в шаблон!
Теперь без труда Вы можете установить/снять напряжение 5вольт
на соответствующей ножке (Pin) LPT разъёма очень простой командой!
Если у Вас старый шаблон, скачайте его снова - обновленный 23.05.04 !
{ ------------------- регистры данных ------------------------------ }
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;
Cкачайте этот пример - primer_xp02.zip(30 kb)
Смотрите дальше: Шаг 3. Виртуальные приборы: программа LPT генератор 5 - 600 Гц
|