unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Buttons, StdCtrls, ExtCtrls, AIOUSB; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel; Label20: TLabel; Label21: TLabel; counterPanel0: TPanel; counterPanel1: TPanel; counterPanel2: TPanel; counterPanel3: TPanel; counterPanel4: TPanel; counterPanel5: TPanel; counterPanel6: TPanel; counterPanel7: TPanel; counterPanel8: TPanel; counterPanel9: TPanel; counterPanel10: TPanel; counterPanel11: TPanel; counterPanel12: TPanel; counterPanel13: TPanel; counterPanel14: TPanel; readTimer: TTimer; GroupBox1: TGroupBox; Label6: TLabel; FreqOutButtonA: TSpeedButton; FreqOutButtonB: TSpeedButton; FreqOutButtonC: TSpeedButton; FreqOutButtonD: TSpeedButton; FreqOutButtonE: TSpeedButton; Label22: TLabel; FreqOutTrackA: TTrackBar; FreqOutTrackB: TTrackBar; FreqOutTrackC: TTrackBar; FreqOutTrackD: TTrackBar; FreqOutTrackE: TTrackBar; Button1: TButton; Label23: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FreqOutTrackAChange(Sender: TObject); procedure FreqOutButtonAClick(Sender: TObject); procedure readTimerTimer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses DetectUnit; {$R *.DFM} var DeviceIndex : DWORD; FreqOutTrack : array [0..4] of TTrackBar; FreqOutButton : array [0..4] of TSpeedButton; counterPanels : array [0..14] of TPanel; DIOData : DWORD; DoUpdate : bool; //--------------------------------------------------------------------------- function FormatFreq(Freq : double) : AnsiString; begin if (Freq >= 1000000) then FormatFreq := Format('%.2f', [Freq / 1000000]) + 'MHz' else if (Freq >= 10000) then FormatFreq := Format('%.1f', [Freq / 1000]) + 'KHz' else if (Freq >= 1000) then FormatFreq := Format('%.2f', [Freq / 1000]) + 'KHz' else if (Freq >= 10) then FormatFreq := Format('%.1f', [Freq]) + 'Hz' else if (Freq >= 1) then FormatFreq := Format('%.2f', [Freq]) + 'Hz' else FormatFreq := Format('%f', [Freq]) + 'Hz'; end; procedure TForm1.FormCreate(Sender: TObject); var DetectForm : TDetectForm; OutMask : Byte; status : DWORD; PID: LongWord; begin DeviceIndex := diOnly; Status := QueryDeviceInfo(DeviceIndex, @PID, nil, nil, nil, nil); if (Status <> ERROR_SUCCESS) or (PID <> $8020) then begin DetectForm := TDetectForm.Create(self); if DetectForm.ShowModal = mrOk then begin DeviceIndex := DetectForm.DeviceIndex; DetectForm.Free(); end else begin DetectForm.Free(); Application.Terminate(); exit; end; end; DIO_Configure(DeviceIndex, False, @OutMask, @DIOData); FreqOutTrack[0] := FreqOutTrackA; FreqOutTrack[1] := FreqOutTrackB; FreqOutTrack[2] := FreqOutTrackC; FreqOutTrack[3] := FreqOutTrackD; FreqOutTrack[4] := FreqOutTrackE; FreqOutButton[0] := FreqOutButtonA; FreqOutButton[1] := FreqOutButtonB; FreqOutButton[2] := FreqOutButtonC; FreqOutButton[3] := FreqOutButtonD; FreqOutButton[4] := FreqOutButtonE; counterPanels[0] := counterPanel0; counterPanels[1] := counterPanel1; counterPanels[2] := counterPanel2; counterPanels[3] := counterPanel3; counterPanels[4] := counterPanel4; counterPanels[5] := counterPanel5; counterPanels[6] := counterPanel6; counterPanels[7] := counterPanel7; counterPanels[8] := counterPanel8; counterPanels[9] := counterPanel9; counterPanels[10] := counterPanel10; counterPanels[11] := counterPanel11; counterPanels[12] := counterPanel12; counterPanels[13] := counterPanel13; counterPanels[14] := counterPanel14; DoUpdate := True; readTimer.Enabled := true; end; //--------------------------------------------------------------------------- procedure TForm1.FreqOutTrackAChange(Sender: TObject); var I : integer; CounterValue : Word; bar : TTrackBar; begin bar := Sender as TTrackBar; I := bar.Tag; CounterValue := ($FFFF - FreqOutTrack[I].Position); FreqOutButton[I].Caption := 'Output ' + FormatFreq(10000000 / (CounterValue * CounterValue)); if FreqOutButton[I].Down = true then begin CTR_8254ModeLoad(DeviceIndex, I, 1, 2, CounterValue); CTR_8254ModeLoad(DeviceIndex, I, 2, 3, CounterValue); end; end; //--------------------------------------------------------------------------- procedure TForm1.FreqOutButtonAClick(Sender: TObject); var I : Integer; counterValue : DWORD; button : TSpeedButton; begin button := sender as TSpeedButton; I := button.Tag; if (FreqOutButton[I].Down) then begin CounterValue := ($FFFF - FreqOutTrack[I].Position); CTR_8254ModeLoad(DeviceIndex, I, 1, 2, CounterValue); CTR_8254ModeLoad(DeviceIndex, I, 2, 3, CounterValue); end else begin CTR_8254Mode(DeviceIndex, I, 1, 2); CTR_8254Mode(DeviceIndex, I, 2, 3); end; end; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- procedure TForm1.readTimerTimer(Sender: TObject); var Values: array[0..14] of Word; Ctr: Integer; begin CTR_8254ReadAll(DeviceIndex, @Values[0]); for Ctr := 0 to 14 do CounterPanels[Ctr].Caption := IntToHex(Values[Ctr], 4) ; end; procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin for I := 0 to 4 do begin CTR_8254ModeLoad(DeviceIndex, I, 0, 2, 0); CTR_8254ModeLoad(DeviceIndex, I, 1, 2, 0); CTR_8254ModeLoad(DeviceIndex, I, 2, 3, 0); end; end; end.