start:eti:carte:sources:usmall2
uSmall_2.pas
UNIT Usmall_2; {----------------------------------------------------------------------------- NOM DE L'UNITE : USMALL_2.PAS BUT : Test du composant PIT8254 AUTEUR : Michael Amarantidis / Stéphane Claus DATE : Février / Mars 1997 MODIFIE LE : RAISON : REMARQUES : - Cette unité est une version (très) light du programme ETIPCBUS. - Aucun control n'est effectué, et il peut y avoir des plantée lors de l'utilisation. - Une fois le générateur lancé, il n'est plus possible de l'arrêter ! -----------------------------------------------------------------------------} {=============================================================================} INTERFACE {============================================== I N T E R F A C E } {=============================================================================} USES SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, DigDisp, StdCtrls, Buttons, Spin, ExtCtrls, UAlnEdit, Vcl8254, Prevchek; TYPE TfrmMain = CLASS(TForm) PIT8254: TPIT8254; bitbtnFermer: TBitBtn; grpbxGenerateur: TGroupBox; grpbxFacteurDivision: TGroupBox; lblFact1: TLabel; lblFact10: TLabel; lblFact100: TLabel; lblFact1000: TLabel; lblFact10000: TLabel; spnbtnFacteur1: TSpinButton; spnbtnFacteur10: TSpinButton; spnbtnFacteur100: TSpinButton; spnbtnFacteur1000: TSpinButton; spnbtnFacteur10000: TSpinButton; aedtFacteur: TAlignEdit; rgrpCompteur: TRadioGroup; grpbxFrequence: TGroupBox; lblFreqReelle: TLabel; lblFreqDesiree: TLabel; lblHz1: TLabel; lblHz2: TLabel; spnbtnChangeFreq: TSpinButton; aedtFreqVoulue: TAlignEdit; aedtFreqReelle: TAlignEdit; grpbxQuartz: TGroupBox; lblQuartz: TLabel; OneInstance1: TOneInstance; pnlInfos: TPanel; lblNomProjet: TLabel; lblNomProjet2: TLabel; lblAuteurs: TLabel; PROCEDURE FormActivate(Sender: TObject); PROCEDURE spnbtnFacteurDownClick(Sender: TObject); PROCEDURE rgrpCompteurClick(Sender: TObject); PROCEDURE spnbtnFacteurUpClick(Sender: TObject); PROCEDURE aedtFreqVoulueChange(Sender: TObject); PROCEDURE aedtFacteurChange(Sender: TObject); PRIVATE { Private-déclarations } PUBLIC { Public-déclarations } END; {CLASS} VAR frmMain: TfrmMain; {=============================================================================} IMPLEMENTATION {================================= I M P L E M E N A T I O N } {=============================================================================} {$R *.DFM} VAR NoCompteurChoisi : SHORTINT; { Choix d'un des trois compteurs } PROCEDURE TfrmMain.FormActivate(Sender: TObject); { BUT: Rafrâichit les infos lors de l'affichage de la fiche } VAR Facteur : WORD; BEGIN CASE rgrpCompteur.ItemIndex OF 0 : BEGIN PIT8254.ModeCompteur0 := mcGenerateur; Facteur := PIT8254.Compteur0; END; {BRANCH OF CASE} 1 : BEGIN PIT8254.ModeCompteur1 := mcGenerateur; Facteur := PIT8254.Compteur1; END; {BRANCH OF CASE} 2 : BEGIN PIT8254.ModeCompteur2 := mcGenerateur; Facteur := PIT8254.Compteur2; END; {BRANCH OF CASE} END; {CASE OF} aedtFacteur.Text := ''; aedtFreqReelle.Text := ''; { Quartz } lblQuartz.Caption := FloatToStr(PIT8254.Quartz) + '[Hz]'; END; {PROCEDURE FormActivate} PROCEDURE TfrmMain.spnbtnFacteurDownClick(Sender: TObject); { BUT: Diminue le facteur de division => Augmente la fréquence } VAR Facteur : LONGINT; BEGIN CASE NoCompteurChoisi OF 0 : Facteur := PIT8254.Compteur0; 1 : Facteur := PIT8254.Compteur1; 2 : Facteur := PIT8254.Compteur2; END; {CASE OF} Dec(Facteur, Abs((Sender AS TSpinButton).Tag)); IF Facteur < 2 THEN Facteur := 2; CASE NoCompteurChoisi OF 0 : PIT8254.Compteur0 := Facteur; 1 : PIT8254.Compteur1 := Facteur; 2 : PIT8254.Compteur2 := Facteur; END; {CASE OF} aedtFacteur.Text := IntToStr(Facteur); aedtFreqReelle.Text := FloatToStr(PIT8254.Quartz / Facteur); IF (Sender AS TSpinButton).Tag < 0 THEN BEGIN aedtFreqVoulue.Text := FloatToStr(PIT8254.Quartz / Facteur); END; {IF} END; {PROCEDURE spnbtnFacteurDownClick} PROCEDURE TfrmMain.spnbtnFacteurUpClick(Sender: TObject); { BUT: Diminue le facteur de division => Augmente la fréquence } VAR Facteur : LONGINT; BEGIN CASE NoCompteurChoisi OF 0 : Facteur := PIT8254.Compteur0; 1 : Facteur := PIT8254.Compteur1; 2 : Facteur := PIT8254.Compteur2; END; {CASE OF} Inc(Facteur, Abs((Sender AS TSpinButton).Tag)); IF Facteur > 65535 THEN Facteur := 65535; CASE NoCompteurChoisi OF 0 : PIT8254.Compteur0 := Facteur; 1 : PIT8254.Compteur1 := Facteur; 2 : PIT8254.Compteur2 := Facteur; END; {CASE OF} aedtFacteur.Text := IntToStr(Facteur); aedtFreqReelle.Text := FloatToStr(PIT8254.Quartz / Facteur); IF (Sender AS TSpinButton).Tag < 0 THEN BEGIN aedtFreqVoulue.Text := FloatToStr(PIT8254.Quartz / Facteur); END; {IF} END; {PROCEDURE spnbtnFacteurUpClick} PROCEDURE TfrmMain.rgrpCompteurClick(Sender: TObject); { BUT: Sélectionne un des compteurs pour le générateur } VAR Facteur : WORD; BEGIN NoCompteurChoisi := rgrpCompteur.ItemIndex; CASE NoCompteurChoisi OF 0 : BEGIN PIT8254.ModeCompteur0 := mcGenerateur; Facteur := PIT8254.Compteur0; END; {BRANCH OF CASE} 1 : BEGIN PIT8254.ModeCompteur1 := mcGenerateur; Facteur := PIT8254.Compteur1; END; {BRANCH OF CASE} 2 : BEGIN PIT8254.ModeCompteur2 := mcGenerateur; Facteur := PIT8254.Compteur2; END; {BRANCH OF CASE} END; {CASE OF} { Affiche les infos } aedtFacteur.Text := IntToStr(Facteur); aedtFreqReelle.Text := FloatToStr(PIT8254.Quartz / Facteur); { Active les autres contrôles } grpbxFacteurDivision.Enabled := TRUE; grpbxFrequence.Enabled := TRUE; END; {PROCEDURE rgrpCompteurClick} PROCEDURE TfrmMain.aedtFreqVoulueChange(Sender: TObject); { BUT: Change de fréquence, en prenant celle que l'utilisateur désire } VAR Frequence : EXTENDED; FacteurSup : LONGINT; FacteurInf : LONGINT; Facteur : LONGINT; FreqSup : REAL; FreqInf : REAL; BEGIN TRY {-- Lit la fréquence saisie } Frequence := StrToFloat(aedtFreqVoulue.Text); {-- Hors limite ? } IF Frequence > (PIT8254.Quartz / 2) THEN BEGIN Frequence := PIT8254.Quartz / 2; END; {IF} IF Frequence < (PIT8254.Quartz / 65535) THEN BEGIN Frequence := PIT8254.Quartz / 65535; END; {IF} {-- Cherche le facteur de division le plus proche } FacteurSup := Round(PIT8254.Quartz / Frequence); FacteurInf := Trunc(Int(PIT8254.Quartz / Frequence)); {-- Calcule les fréquence avec les facteurs trouvés précédemment } FreqSup := PIT8254.Quartz / FacteurInf; FreqInf := PIT8254.Quartz / FacteurSup; {-- Recherche le facteur de division qui nous permet d'être le plus proche de la fréquence voulue } IF ((Frequence = FreqSup) OR ((FreqSup - Frequence) < (Frequence - FreqInf))) THEN BEGIN Facteur := FacteurInf; END {IF} ELSE IF ((Frequence = FreqInf) OR ((FreqSup - Frequence) > (Frequence - FreqInf))) THEN BEGIN Facteur := FacteurSup; END; {ELSE IF} {-- Est-ce que les facteurs trouvés sont acceptables ?} IF Facteur < 2 THEN Facteur := 2; IF Facteur > 65535 THEN Facteur := 65535; {-- Change la fréquence et affiche } CASE NoCompteurChoisi OF 0 : PIT8254.Compteur0 := Facteur; 1 : PIT8254.Compteur1 := Facteur; 2 : PIT8254.Compteur2 := Facteur; END; {CASE OF} {-- Affiche les infos } aedtFacteur.Text := IntToStr(Facteur); aedtFreqReelle.Text := FloatToStr(PIT8254.Quartz / Facteur); {-- Couleur standard } aedtFreqVoulue.Color := clWindow; EXCEPT {-- Valeur incorrecte } aedtFreqVoulue.Color := clRed; { On voit rouge ! } END; {TRY} END; {PROCEDURE aedtFreqVoulueChange} PROCEDURE TfrmMain.aedtFacteurChange(Sender: TObject); { BUT: Change de facteur de division en saisissant simplement le facteur } VAR Facteur : LONGINT; BEGIN TRY { It's Red } aedtFacteur.Color := clRed; Facteur := StrToInt(aedtFacteur.Text); IF ((Facteur >= 2) AND (Facteur <= 65535)) THEN BEGIN aedtFreqReelle.Text := FloatToStr(PIT8254.Quartz / Facteur); CASE NoCompteurChoisi OF 0 : PIT8254.Compteur0 := Facteur; 1 : PIT8254.Compteur1 := Facteur; 2 : PIT8254.Compteur2 := Facteur; END; {CASE OF} aedtFacteur.Color := clWindow; END; {IF} EXCEPT { It's Red } aedtFacteur.Color := clRed; END; {TRY} END; {PROCEDURE aedtFacteurChange} INITIALIZATION NoCompteurChoisi := -1; END. {UNIT Usmall_2}
start/eti/carte/sources/usmall2.txt · Last modified: 2016/07/24 03:57 by admin