Виртуальные приборы: программа LPT генератор 5 - 600 Гц
____________________________________

 

В предыдущем примере Вы написали Pin клавиатуру на основе операции Xor , где бит результата равен 1, если соответствующие биты операндов не равны друг другу, в противном случае итоговый бит равен 0. А теперь, используя Xor мы превратим LPT порт в генератор импульсов от 5 до 600 Гц. Примечательно, что генератор "возбуждается" в бесконечном цикле While not stop do , пока флаг останова - stop не поднят. Это позволяет при задержке 0 проверить максимальную скорость компьютера, порта, и системы в целом. Для контроля частоты в программу LPTgenerator вмонтирован простенький частотомер.

В целом пример небольшой, но возможно, достаточно сложный для начинающих, поэтому не будем описывать как его сделать "с нуля" а ознакомимся с кратким описанием кода, сам же пример гораздо проще скачать готовый и разобраться с исходником, изменяя номера Pin и другие параметры самостоятельно.

pr03.jpg

И так, смотрим код:

 

Прежде всего обратите внимание, что в implementation

{ Объявляем глобальную переменную для кнопки СТОП }

Var stop:boolean;



{ Для частотомера добавлена функция Bits которая отслеживает логическое состояние бита или группы бит, заданных в SpinEdit1 .}

 

function TForm1.Bits : boolean ; //--отслеживает переключения бит (1-2-4-8-16-32-64-128)

Var

d : boolean;

begin

d := true; {Для генератора нет принципиальной разницы - xor или and }

d := d and ((SpinEdit1.Value) = ((SpinEdit1.Value) and Lpt.ReadPort(GetCurrentPort,GetCurrentRegister))) ;

Bits := d;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

Stop:=true; //--кнопка стоп

Edit3.Color := clBtnFace;

end;

procedure TForm1.Button2Click(Sender: TObject); //--кнопка СТАРТ

begin

Edit3.Color := claqua; //--индицируем

stop:=false; //--флаг старта

While not stop do //--бесконечный цикл, пока флаг стоп не поднят:

begin

{ Битовая операция как на Pin клавиатуре, здесь биты устанавливает SpinEdit1; }

Lpt.WritePort (GetCurrentPort,GetCurrentRegister,((SpinEdit1.Value) xor

Lpt.ReadPort( (GetCurrentPort) ,GetCurrentRegister) )); { при этом GetCurrentRegister устан. тип регистра }

if RadioButton2.Checked = true then Sleep(TrackBar1.Position div 10) else //--уменьшаем задержку на 10

if RadioButton3.Checked = true then Sleep(TrackBar1.Position div 100)else //--уменьшаем задержку на 100

Sleep(TrackBar1.Position); //--приложение засыпает на заданный интервал (установка частоты)


{ -------------- Счётчик импульсов (Биты задаются SpinEdit1 )--------------------}

if Edit2.Tag = 0 then

begin

if Bits = true then Edit2.Text := IntToStr(StrToInt(Edit2.Text)+1);

Edit2.Tag :=1;

end;

if Bits = false then Edit2.Tag := 0;

{-----------------------------------------------------------------------}

Application.ProcessMessages; //--Обработка всей очереди сообщений, иначе зациклит

end;

end;

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

stop := true; //-- чтобы можно было закрыть приложение стандартно (Х)

end;

procedure TForm1.TrackBar1Change(Sender: TObject);

begin

{ Показываем задержку }

Edit1.Text := IntToStr(TrackBar1.Position);

end;

procedure TForm1.FormActivate(Sender: TObject);

begin

Edit1.Text := IntToStr(TrackBar1.Position);

Application.HintColor := cllime;

end;

 

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Edit3.Text := edit2.Text; //--запоминает частоту

Edit2.Text := '0'; //--сбрасует счётчик в 0 ( период измерений = 1 Гц )

end;



Cкачайте этот пример - primer_xp03.zip(30 kb)

Cкачать готовую программу - LPTgenerator.zip(190 kb)

Смотрите дальше: Шаг 4. LPT терминатор - программа дистанционного управления компьютером.



******



Валерий Ковтун US4LEH
..

О сайте

Вернуться на Шаг2. Запись и чтение с портов, пишем логический индикатор и Pin клавиатуру.

Вернуться на XP LPT

Вернуться на главную страницу

Программа PortControl V3+
Программа PinRegistrator D1+


Гостевая книга
Обратная связь