Виртуальные приборы: программа LPT генератор 5 – 600 Гц
В предыдущем примере Вы написали Pin клавиатуру на основе операции Xor , где бит результата равен 1, если соответствующие биты операндов не равны друг другу, в противном случае итоговый бит равен 0. А теперь, используя Xor мы превратим LPT порт в генератор импульсов от 5 до 600 Гц. Примечательно, что генератор “возбуждается” в бесконечном цикле While not stop do , пока флаг останова – stop не поднят. Это позволяет при задержке 0 проверить максимальную скорость компьютера, порта, и системы в целом. Для контроля частоты в программу LPTgenerator вмонтирован простенький частотомер.
В целом пример небольшой, но возможно, достаточно сложный для начинающих, поэтому не будем описывать как его сделать “с нуля” а ознакомимся с кратким описанием кода, сам же пример гораздо проще скачать готовый и разобраться с исходником, изменяя номера Pin и другие параметры самостоятельно.
И так, смотрим код:
Прежде всего обратите внимание, что в 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;[/pas]
Cкачайте этот пример – primer_xp03.zip(30 kb)
Cкачать готовую программу – LPTgenerator.zip(190 kb)
Смотрите дальше: Шаг 4. LPT терминатор – программа дистанционного управления компьютером.