Шаг3. Пишем FM тюнер
Ниже приводится описание исходного кода простого примера FM_TUNER демонстрирующего процесс управления настройкой радиоприёмника согласно изменяемому цифровому коду 0..256 с выхода 888 ($379) LPT порта компьютера.
Программа позволяет изменять частоту настройки тюнера с помощью ползунка на панели или стрелок влево-вправо на клавиатуре, производить автоматическое сканирование диапазона, изменять скорость сканирования, вести плавную пошаговую настройку кнопками «+» или «-«. Имеется возможность включения — выключения приёмника кнопкой «Power», выключения звука кнопкой «MUTE»(порт 890 бит 0 и бит 3 переводятся в высокое 5в/низкое 0в состояние). Предусмотрена возможность выдачи инвертированного кода 255..0 для удобства сопряжения с цифро аналоговым (АЦП) преобразователем. Также показано как вести LOG радиостанций и отслеживать изменения данных в виде текстового лога. Предусмотрен вариант фиксированных настроек с помощью ComboBox и таймер автоматического выключения в минутах.
К сожалению, я имею мало времени, чтобы подробно всё расписывать, поэтому приводится код и краткие комментарии. Код очень простой и не представляет чего-либо сложного или нестандартного, просмотрите его, а если Вас заинтересует — скачайте данный пример и разберитесь, наращивая дальнейшие возможности программы самостоятельно.(Например добавьте процедуру остановки сканирования при обнарудении определённого числа на входе (889 порт)). Выбрать число удобно предварительно запустив программу PortControl V3+ .
Var
b : byte;
begin
b := TrackBar1.Position ; //—задаём число записи в порт (0..256)
if CheckBox2.Checked = true then b := Not b; //—если галочка, тогда инвертируем (256..0)
PortWriteByte(888,(b)); //—собственно пишем
Gauge1.Progress := b; //—синхронизируем с индикатором настройки
end;
procedure TForm1.Timer1Timer(Sender: TObject); //—читаем данные выбранного порта
Var
pa : integer;
b : byte;
begin
pa:= StrToInt(ComboBox1.Text); //—выбираем порт
b :=( PortReadByte(pa) ) ; //—читаем
Edit1.text := IntToStr(b); //—выводим на индикатор
end;
procedure TForm1.Edit1Change(Sender: TObject); //—ведём LOG данных
begin
if CheckBox1.Checked = true then
begin
RichEdit1.Lines.Add //—добавляем в лог время + данные
( FormatDateTime(‘hh:mm:ss’, time()) + ‘ data ‘+ (Edit1.Text) );
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
TrackBar1.Position := TrackBar1.Position +1; //— +1
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
TrackBar1.Position := TrackBar1.Position -1; //— -1
end;
procedure TForm1.ComboBox2Click(Sender: TObject); //—демонстрирует выбор предопр. значений
Var
ind : integer;
begin
RichEdit1.Lines.Add
( FormatDateTime(‘hh:mm:ss’, time()) + ‘ радио ‘+ (ComboBox2.Text) ); //—время + название
ind := ComboBox2.ItemIndex;
if ind = 0 then TrackBar1.Position := 10 ; //—значению 1 (Хит FM) соотв. число 10
if ind = 1 then TrackBar1.Position := 23 ; //—аналогично
if ind = 2 then TrackBar1.Position := 58 ;
if ind = 3 then TrackBar1.Position := 94 ;
if ind = 4 then TrackBar1.Position := 204 ;
end;
procedure TForm1.SpeedButton6Click(Sender: TObject); //—кнопка Power
begin
if SpeedButton6.Tag = 0 then //—чтобы определить состояние
begin
SpeedButton6.Font.Color := clRed;
Gauge1.BackColor := clLime;
PortWriteByte(890,58); //—устанавливаем 5в бит 0 порта 890
SpeedButton6.Tag :=1;
end else
begin
SpeedButton6.Font.Color := clWindowText;
Gauge1.BackColor := clWindow;
PortWriteByte(890,59); //—устанавливаем 0в бит 0-3 порта 890 (Power OFF)
SpeedButton6.Tag := 0;
end ;
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
Timer2.Interval := SpinEdit1.Value * 60000; //— интервал таймера выключения
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
Timer2.Interval := SpinEdit1.Value * 60000; //— аналогично
end;
procedure TForm1.SpeedButton3Click(Sender: TObject); //—ВКЛ таймер отключения
begin
Timer2.Enabled := true;
SpinEdit1.Color := cllime;
end;
procedure TForm1.SpeedButton4Click(Sender: TObject); //—ОТКЛ таймер отключения
begin
Timer2.Enabled := false;
SpinEdit1.Color := clWindow;
end;
procedure TForm1.Timer2Timer(Sender: TObject); //—таймер отключения
begin
PortWriteByte(890,59);
close;
end;
procedure TForm1.SpeedButton5Click(Sender: TObject); //—кнопка MUTE
Var
b : byte;
begin
if SpeedButton5.Tag = 0 then
begin
b:=(PortReadByte(890)); //—читаем значения данных в 890 порт
b := b — 8; //—из прочитанного числа вычитаем 8 (бит 3 =5вPin 17) 8 -это 2* в степени N
PortWriteByte(890,b); //—пишем нужное число
SpeedButton5.Font.Color := clRed;
SpeedButton5.Tag := 1;
end else
begin
b:=(PortReadByte(890));
b := b + 8; //—устанавливаем в 0вольт
PortWriteByte(890,b);
SpeedButton5.Font.Color := clWindowText;
SpeedButton5.Tag := 0;
end ;
end;
procedure TForm1.TrackBar2Change(Sender: TObject);
begin
Timer3.Interval := TrackBar2.Position; //—скорость сканирования
end;
procedure TForm1.Timer3Timer(Sender: TObject);
begin
TrackBar1.Position := TrackBar1.Position +1; //—сканируем
if TrackBar1.Position = 255 then TrackBar1.Position := 1 ; //—ограничитель
end;
procedure TForm1.SpeedButton8Click(Sender: TObject);
begin
Timer3.Enabled := false; //—отключ сканирование
end;
procedure TForm1.SpeedButton7Click(Sender: TObject);
begin
Timer3.Enabled := true; //—включить сканирование
end;[/pas]