UNIT Uprincpl; {----------------------------------------------------------------------------- NOM DE L'UNITE : UPRINCIPL.PAS BUT : Unité principale du projet. AUTEUR : Michael Amarantidis & Stéphane Claus DATE : Décembre 1996 / Janvier 1997 MODIFIE LE : 12.04.1997 - 2.02ß - S.Claus RAISON(S) : - Ajout d'un menu pour le 8254 - Correction du composant PPI8255 - Ajout de commentaires REMARQUES : - Ce programme utilise le fichier d'aide ETIPCBUS.HLP. Pour en connaitre la liste complète: double clic sur l'îcone de l'application dans la boîte de dialogue "A propos de...". - Pratiquement toutes les procédures et fonctions ont un paramètre "Sender: TObject". Il n'est jamais décrit dans les entêtes des procédures. Ce paramètre Sender, dans un gestionnaire d'événement, communique à Delphi le composant qui a reçu l'événement et par conséquent fait appel au gestionnaire. -----------------------------------------------------------------------------} {=============================================================================} INTERFACE {============================================== I N T E R F A C E } {=============================================================================} USES { Unités "Maison" ajoutée par moi et réalisée par myself } Vcl8255, { Composant PPI 8255} Vcl8254, { Composant PIT 8254} UAPropos, { Boîte de dialogue "A propos de..." } UCfgPrgm, { Configuration du programme } UCfgPrts, { Configuration des ports du PPI 8255 } UCfgBs55, { Choix de l'adresse de base } ULit, { Lecture de l'état d'un des ports du PPI 8255 } UEcrit, { Ecriture sur l'un des ports du PPI 8255 } UChen, { Effet de chenillard sur un des ports du PPI 8255 } UPattern, { Transmission de données entre 2 ou 3 ports du PPI 8255 } Uchrono, { Chronogramme du PPI 8255 (Ne fonctionne pas) } UQuartz, { Fréquence du quartz pour le PIT 8254 } UGenerat, { Générateur de fréquence } UFreq, { Unités Delphi ajoutées automatiquement par Delphi himself... } SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, StdCtrls, IniFiles, Buttons, Wordcap, Prevchek; CONST version = 'Version 2.03ß'; { Version du programme } copyright = '© 1996, 1997 by S.Claus & M.Amarantidis'; { Commentaire ? } fichierini = 'ETIPCBUS.INI'; { Nom du fichier INI } debugmode : BOOLEAN = TRUE; { Activation du mode debug } debugcolor : TColor = clRed; { Couleur fenêtres en mode debug } debugetatports : BOOLEAN = FALSE; { Affiche l'état des ports } debugdelaietatports : INTEGER = 1000; { Vitesse de rafraîchissement } affichehint : BOOLEAN = TRUE; { Affichage des Hint } base8255 : WORD = $300; { Adresse de base du PPI8255 } offset8254 : BYTE = 8; { Différence entre les 2 addresses de base } en8255_8254 : BOOLEAN = TRUE; { 8255 & 8254 Enabled } freqquartz : EXTENDED = 6000000; { Fréquence du Quartz } TYPE TfrmMain = CLASS(TForm) MainMenu1: TMainMenu; Fichier1: TMenuItem; mQuitter: TMenuItem; N1: TMenuItem; mConfigurationProgramme: TMenuItem; pnlStatuts: TPanel; pnlDebug: TPanel; lblEtatPorts: TLabel; grpbx8255: TGroupBox; lblPortA: TLabel; lblPortC: TLabel; lblPortB: TLabel; lblModePortA: TLabel; lblModePortB: TLabel; lblModePortC: TLabel; timerEtatPorts: TTimer; lblBase55: TLabel; m8255: TMenuItem; mChenillard: TMenuItem; mPattern: TMenuItem; mLecture: TMenuItem; mEcriture: TMenuItem; N2: TMenuItem; mConfiguration8255: TMenuItem; mAdresseBase8255: TMenuItem; mEtatPorts8255: TMenuItem; Aide1: TMenuItem; Apropos1: TMenuItem; mHelpIndex: TMenuItem; N3: TMenuItem; mChronogramme: TMenuItem; MSOfficeCaption1: TMSOfficeCaption; m8254: TMenuItem; mGenerateur: TMenuItem; mFrequencemetre: TMenuItem; mConfiguration8254: TMenuItem; mAdresseDeBaseBis: TMenuItem; N4: TMenuItem; PIT8254: TPIT8254; grpbx8254: TGroupBox; lblBase54: TLabel; lblModeCnt0: TLabel; lblModeCnt1: TLabel; lblModeCnt2: TLabel; lblCompteur0: TLabel; lblCompteur1: TLabel; lblCompteur2: TLabel; mFrquenceQuartz: TMenuItem; lblQuartz: TLabel; N5: TMenuItem; PPI8255: TPPI8255; OneInstance: TOneInstance; PROCEDURE mQuitterClick(Sender: TObject); PROCEDURE mConfigurationProgrammeClick(Sender: TObject); PROCEDURE timerEtatPortsTimer(Sender: TObject); PROCEDURE mHelpIndexClick(Sender: TObject); PROCEDURE mEtatPorts8255Click(Sender: TObject); PROCEDURE mAdresseBaseClick(Sender: TObject); PROCEDURE FormActivate(Sender: TObject); PROCEDURE AProposClick(Sender: TObject); PROCEDURE FormCreate(Sender: TObject); PROCEDURE FormClose(Sender: TObject; VAR Action: TCloseAction); PROCEDURE mLectureClick(Sender: TObject); PROCEDURE mEcritureClick(Sender: TObject); PROCEDURE mChenillardClick(Sender: TObject); PROCEDURE PPI8255ChenillardBouge(Sender: TObject); PROCEDURE mPatternClick(Sender: TObject); PROCEDURE PPI8255ErrorPattern(Sender: TObject); PROCEDURE mChronogrammeClick(Sender: TObject); PROCEDURE mGenerateurClick(Sender: TObject); PROCEDURE mFrquenceQuartzClick(Sender: TObject); procedure mFrequencemetreClick(Sender: TObject); PRIVATE { Private-déclarations } PUBLIC { Public-déclarations } PROCEDURE DisplayHint(Sender: TObject); PROCEDURE LireFichierINI(Sender: TObject); PROCEDURE EcrireFichierINI(Sender: TObject); END; {CLASS} VAR frmMain: TfrmMain; {=============================================================================} IMPLEMENTATION {================================= I M P L E M E N A T I O N } {=============================================================================} {$R *.DFM} VAR FreqStr : STRING; { Stokage de la fréquence du Quartz pour la sauvegarde dans le fichier INI. } {=============================================================================} { DIVERS ------------------------------------------------------------- Divers } {=============================================================================} PROCEDURE TfrmMain.LireFichierINI(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Initialise les constantes en lisant le contenu du fichier INI ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : Les constantes sont initialisées REMARQUE(S) ... : -- -----------------------------------------------------------------------------} VAR FicINI: TIniFile; { Objet permetant d'écrire ou de lire un fichier .INI } BEGIN TRY FicINI := TIniFile.Create(fichierini); WITH FicINI DO BEGIN debugmode := ReadBool ('DEBUG', 'Active', debugmode); debugcolor := ReadInteger('DEBUG', 'Couleur', debugcolor); debugetatports := ReadBool('DEBUG', 'Etat', debugetatports); debugdelaietatports := ReadInteger('DEBUG', 'Delai', debugdelaietatports); affichehint := ReadBool('SETUP', 'Hint', affichehint); en8255_8254 := ReadBool('SETUP', 'en8255_8254', en8255_8254); base8255 := ReadInteger ('SETUP', 'Base8255', base8255); offset8254 := ReadInteger ('SETUP', 'offset8254', offset8254); FreqStr := ReadString ('SETUP', 'Quartz', FloatToStr(freqquartz)); END; {WITH} FINALLY { De toute façon on passe par là pour retirer FicINI de la mémoire. Au cas où il y a eu une erreur lors de la lecture... on ne sait jamais. } FicINI.Free; END; {TRY} END; {PROCEDURE LireFichierINI} PROCEDURE TfrmMain.EcrireFichierINI(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Inscrit dans le fichier INI l'état des différentes constantes qui ont pu changer durant l'utilisation du programme ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : -- -----------------------------------------------------------------------------} VAR FicINI: TIniFile; BEGIN TRY FicINI := TIniFile.Create(fichierini); WITH FicINI DO BEGIN WriteBool ('DEBUG', 'Active', debugmode); WriteInteger('DEBUG', 'Couleur', debugcolor); WriteBool('DEBUG', 'Etat', debugetatports); WriteInteger('DEBUG', 'Delai', debugdelaietatports); WriteBool('SETUP', 'Hint', affichehint); WriteBool('SETUP', 'en8255_8254', en8255_8254); WriteInteger ('SETUP', 'Base8255', base8255); WriteString ('SETUP', 'Quartz', FloatToStr(frmMain.PIT8254.quartz)); WriteInteger ('SETUP', 'offset8254', offset8254); END; {WITH} FINALLY FicINI.Free; END; {TRY} END; {PROCEDURE LireFichierINI} PROCEDURE TfrmMain.DisplayHint(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Affiche dans la barre d'état tous les hint rencontrés ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : L'affichage dans la barre d'état ne peut être désactivé par l'écran de configuration. Donc même si on affiche pas le hint dans une infobulle, on l'affiche dans la barre d'état -----------------------------------------------------------------------------} BEGIN pnlStatuts.Caption := Application.Hint; END; {PROCEDURE TForm1.DisplayHint} {=============================================================================} { DEBUG --------------------------------------------------------------- Debug } {=============================================================================} PROCEDURE TfrmMain.timerEtatPortsTimer(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Affiche sur l'écran principal l'état du PPI8255 et du PIT8254 toutes les "debugdelaietatports" [ms] si debugetatports est à TRUE (donc que le timer "timerEtatPorts" est activé) ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : Des valeurs sont affichées à l'écran REMARQUE(S) ... : -- -----------------------------------------------------------------------------} BEGIN { * 8255 * Adresse de base } { *-* 8255 *-* } lblBase55.Caption := 'Base = ' + IntToHex(PPI8255.Adresse,3) + 'h'; { * 8255 * Valeurs présentes sur les ports } lblPortA.Caption := 'A = ' + IntToHex(PPI8255.PortA,2) + 'h'; lblPortC.Caption := 'B = ' + IntToHex(PPI8255.PortB,2) + 'h'; lblPortB.Caption := 'C = ' + IntToHex(PPI8255.PortC,2) + 'h'; { * 8255 * Configuration des ports } CASE PPI8255.ModePortA OF mpIndefini : lblModePortA.Caption := 'A => Indéfini'; mpEntree : lblModePortA.Caption := 'A => Entrée'; mpSortie : lblModePortA.Caption := 'A => Sortie'; END; {CASE OF} CASE PPI8255.ModePortB OF mpIndefini : lblModePortB.Caption := 'B => Indéfini'; mpEntree : lblModePortB.Caption := 'B => Entrée'; mpSortie : lblModePortB.Caption := 'B => Sortie'; END; {CASE OF} CASE PPI8255.ModePortC OF mpIndefini : lblModePortC.Caption := 'C => Indéfini'; mpEntree : lblModePortC.Caption := 'C => Entrée'; mpSortie : lblModePortC.Caption := 'C => Sortie'; END; {CASE OF} { * 8254 * Adresse de base } { *-* 8254 *-* } lblBase54.Caption := 'Base = ' + IntToHex(PIT8254.Adresse,3) + 'h'; { * 8254 * Configuration des compteurs } CASE PIT8254.ModeCompteur0 OF mcIndefini : lblModeCnt0.Caption := '0 => Indéfini'; mcGenerateur : lblModeCnt0.Caption := '0 => Générateur'; END; {CASE OF} CASE PIT8254.ModeCompteur1 OF mcIndefini : lblModeCnt1.Caption := '1 => Indéfini'; mcGenerateur : lblModeCnt1.Caption := '1 => Générateur'; END; {CASE OF} CASE PIT8254.ModeCompteur2 OF mcIndefini : lblModeCnt2.Caption := '2 => Indéfini'; mcGenerateur : lblModeCnt2.Caption := '2 => Générateur'; END; {CASE OF} { * 8254 * Valeurs présentes sur les compteurs } lblCompteur0.Caption := '0 = ' + IntToStr(PIT8254.Compteur0); lblCompteur1.Caption := '1 = ' + IntToStr(PIT8254.Compteur1); lblCompteur2.Caption := '2 = ' + IntToStr(PIT8254.Compteur2); { * 8254 * Fréquence du quartz utilisé } lblQuartz.Caption := FloatToStr(PIT8254.Quartz) + ' [Hz]'; END; {PROCEDURE timerEtatPortsTimer} {=============================================================================} { INITIALISATIONS ------------------------------------------- Initialisations } {=============================================================================} PROCEDURE TfrmMain.FormCreate(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Initialisations du programme lors de la création de la fenêtre principale. ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : -----------------------------------------------------------------------------} BEGIN Caption := Application.Title; { Affichage du titre} Application.OnHint := DisplayHint; { Affichage des hint } LireFichierINI(Sender); { Lecture du fichier INI } PPI8255.Adresse := base8255; { Initialisation des adresses } {2.01ß: L'espace entres les adresses de bases du PPI8255 et du PIT 8254 n'est pas fixe, mais il est défini par la constante offset8254 PIT8254.Adresse := base8255 + 8; } PIT8254.Adresse := base8255 + offset8254; TRY { Initialisation de la fréquence du quartz } freqquartz := StrToFloat(FreqStr); frmMain.PIT8254.Quartz := freqquartz; EXCEPT { ERREUR lors de la conversion STRING -> FLOAT. On initialise alors avec une valeur correcte (enfin, espérons !) } freqquartz := 6000000; frmMain.PIT8254.Quartz := freqquartz; END; {TRY} END; {PROCEDURE FormCreate} PROCEDURE TfrmMain.FormActivate(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Initialisations du programme lors de la création de la fenêtre principale. ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : -----------------------------------------------------------------------------} BEGIN { Activation du PPI8255 et du PIT8254 si on est pas en mode DEBUG } PPI8255.Enabled := en8255_8254 AND (NOT debugmode); PIT8254.Enabled := en8255_8254 AND (NOT debugmode); { Activation des menus si le 8255 et le 8254 sont activés } mEtatPorts8255.Enabled := en8255_8254; mChenillard.Enabled := en8255_8254; mPattern.Enabled := en8255_8254; mLecture.Enabled := en8255_8254; mEcriture.Enabled := en8255_8254; mChronogramme.Enabled := en8255_8254; mGenerateur.Enabled := en8255_8254; mFrequencemetre.Enabled := en8255_8254; { Affichage de l'état des ports et des compteurs } WITH timerEtatPorts DO BEGIN Enabled := debugetatports; {2.01ß: Et si on initialisait l'intervalle du timer, ça ne serait pas mieux ?} Interval := debugdelaietatports; END; {WITH} pnlDebug.Visible := debugetatports; IF debugetatports THEN timerEtatPortsTimer(Sender); END; {PROCEDURE FormActivate} PROCEDURE TfrmMain.FormClose(Sender: TObject; VAR Action: TCloseAction); {----------------------------------------------------------------------------- BUT ........... : Sauvegarde des paramètres en quittant le programme, soit lors de la fermeture de la fenêtre principale. ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : Le type TCloseEvent de OnClose a un paramètre Action. La valeur du paramètre Action détermine si la fiche peut effectivement être fermée. Les valeurs possibles de Action sont : Valeur Signification ----------------------------------------------------------- caNone La fiche n'a pas le droit de se fermer, donc il ne se passe rien. caHide La fiche n'est pas fermée, juste cachée. L'application peut toujours accéder à une fiche cachée. caFree La fiche est fermée et la mémoire allouée à la fiche libérée. caMinimize La fiche n'est pas fermée, juste réduite en icône. C'est l'action par défaut des fiches enfant MDI. -----------------------------------------------------------------------------} BEGIN EcrireFichierINI(Sender); END; {PROCEDURE FormClose} {=============================================================================} { MENU FICHIER ------------------------------------------------- Menu fichier } {=============================================================================} PROCEDURE TfrmMain.mQuitterClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Quitte le programme par Fichier|Quitter ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : - Identique à ALT-F4 - La méthode Close ferme une fiche. L'appel de la méthode Close d'une fiche correspond à la sélection par l'utilisateur de l'élément de menu Fermer dans le menu système. La méthode Close appelle d'abord la méthode CloseQuery pour déterminer si la fiche peut être fermée. Si CloseQuery renvoie False, l'opération de fermeture est interrompue. Dans le cas où CloseQuery renvoie True, le code rattaché à l'événement OnClose s'exécute. Le paramètre CloseAction de l'événement OnClose contrôle la façon dont s'opère la fermeture effective de la fiche. -----------------------------------------------------------------------------} BEGIN Close; END; {PROCEDURE mQuitterClick} PROCEDURE TfrmMain.mConfigurationProgrammeClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Appel de la boîte de dialogue pour la configuration du programme. ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : L'état des constantes du programme peuvent être modifiées REMARQUE(S) ... : Identique à F12 -----------------------------------------------------------------------------} BEGIN frmCfgProgramme.ShowModal; { Appel de la boîte de dialogue } FormActivate(Sender); { Réinitialisation des contrôles, car il est possible que la configuration ait changé } END; {PROCEDURE mConfigurationProgrammeClick} {=============================================================================} { MENU AIDE ------------------------------------------------------- Menu aide } {=============================================================================} PROCEDURE TfrmMain.mHelpIndexClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Appel de l'index du ficher d'aide ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : Identique à F1 -----------------------------------------------------------------------------} BEGIN Application.HelpCommand(HELP_CONTENTS, 0); END; {PROCEDURE mHelpIndexClick} PROCEDURE TfrmMain.AProposClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Afiche la fenêtre "A propos de..." ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : Il y a un écran caché dans la fenêtre "A propos de..." -----------------------------------------------------------------------------} BEGIN frmAbout.ShowModal; END; {PROCEDURE AProposClick} {=============================================================================} { MENU 8255 ------------------------------------------------------- Menu 8255 } {=============================================================================} PROCEDURE TfrmMain.mAdresseBaseClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Configuration de l'adresse de base du 8255 et du 8254 ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : Les constantes "base8255", "offset8254" et "en8255_8254" peuvent être modifiées. REMARQUE(S) ... : -- -----------------------------------------------------------------------------} BEGIN frmAdresseBase.ShowModal; { Affiche la fenêtre de configuration } FormActivate(Sender); { Si une des constantes a été modifiées, réinitialise les contrôles de la fenêtres principale } END; {PROCEDURE TfrmMain.mAdresseBaseClick} PROCEDURE TfrmMain.mEtatPorts8255Click(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Appel de la boîte de dialogue pour la modification de l'état des ports ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : Les propriétés ModePortA, ModePortB et ModePortC du composant TPPI8255 seront configurées selon les désirs de l'utilisateur. REMARQUE(S) ... : -- -----------------------------------------------------------------------------} BEGIN frmCfgPorts.ShowModal; {2.01ß: Ca, il n'y a pas besoin de le faire... FormActivate(Sender); } END; {PROCEDURE mEtatPorts8255Click} PROCEDURE TfrmMain.mLectureClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Appel de la boîte de dialogue pour la lecture de la valeur actuellement présente sur un des ports du PPI8255 ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : Les propriétés ModePortA, ModePortB et ModePortC du composant TPPI8255 seront configurées en entrée lors de la lecture sur le port correspondant. -----------------------------------------------------------------------------} BEGIN frmLire.ShowModal; END; {PROCEDURE mLectureClick} PROCEDURE TfrmMain.mEcritureClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Appel de la boîte de dialogue pour l'écriture d'une valeur sur un des ports du PPI8255 ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : Les propriétés ModePortA, ModePortB et ModePortC du composant TPPI8255 seront configurées en sortie lors de l'écriture de la valeur sur le port correspondant. -----------------------------------------------------------------------------} BEGIN frmEcrire.ShowModal; END; {PROCEDURE mEcritureClick} PROCEDURE TfrmMain.mChenillardClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Appel de la boîte de dialogue de gestion du chenillard ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : Une des propriétés ModePortx du composant TPPI8255 sera configuré en sortie, et les autres en entrées -----------------------------------------------------------------------------} BEGIN frmChenillard.ShowModal; END; {PROCEDURE mChenillardClick} PROCEDURE TfrmMain.PPI8255ChenillardBouge(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Affiche l'état du chenillard lorsque le chenillard vient de changer d'état ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : -- -----------------------------------------------------------------------------} BEGIN frmChenillard.MAJEtatLEDs(Sender); { L'afichage de l'état des LEDs se fait dans l'unité UChen (fiche frmChenillard) par la méthode MAJEtatLEDs. } END; {PROCEDURE PPI8255ChenillardBouge} PROCEDURE TfrmMain.mPatternClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Appel de la boîte de dialogue de gestion du test de pattern ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : Une des propriétés ModePortx du composant TPPI8255 sera configuré en sortie, et les autres en entrées -----------------------------------------------------------------------------} BEGIN frmPattern.ShowModal; END; {PROCEDURE mPatternClick} PROCEDURE TfrmMain.PPI8255ErrorPattern(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Gestion des erreurs lors du test de transfert de pattern. ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : L'afichage de l'erreur détectée se fait dans l'unité UPattern (fiche frmPattern) par la méthode AjouteErreur. -----------------------------------------------------------------------------} BEGIN frmPattern.AjouteErreur(Sender, FALSE); { ¦ } { +-- TRUE = Sans ajout à la liste } END; {PROCEDURE PPI8255ErrorPattern} PROCEDURE TfrmMain.mChronogrammeClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Petite boucle de test pour relevé le chronogramme du PPI 8255 ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : -- REMARQUE(S) ... : Ne pas utiliser cette possibilité du programme, mais le programme DOS "Chrono.exe" qui sera plus rapide et moins perturbé par le multitâche de Windows -----------------------------------------------------------------------------} BEGIN frmChronoPPI.ShowModal; END; {PROCEDURE mChronogrammeClick} {=============================================================================} { MENU 8254 ------------------------------------------------------- Menu 8254 } {=============================================================================} PROCEDURE TfrmMain.mFrquenceQuartzClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Sélection de la fréquence du quartz ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : La propriété Quartz du composant PIT8254 est mise à jour REMARQUE(S) ... : -- -----------------------------------------------------------------------------} BEGIN frmQuartz.ShowModal; IF frmQuartz.ModalResult=mrOK THEN BEGIN { 2.01ß: MAJ de la constante.. } freqquartz := PIT8254.Quartz; { ..freqquartz & de la variable.. } FreqStr := FloatToStr(freqquartz); { ..FreqStr si la fréquence a.. } END; {IF} { ..changé } END; {PROCEDURE mFrquenceQuartzClick} PROCEDURE TfrmMain.mGenerateurClick(Sender: TObject); {----------------------------------------------------------------------------- BUT ........... : Générateur de fréquence ENTREE ........ : -- SORTIE ........ : -- EFFETS DE BORDS : Les propriété ModeCompteurx du composant PIT8254 sont MAJ REMARQUE(S) ... : -- -----------------------------------------------------------------------------} BEGIN frmgenerateur.ShowModal; END; {PROCEDURE mGenerateurClick} {=============================================================================} { INITIALISATIONS ------------------------------------------- Initialisations } {=============================================================================} procedure TfrmMain.mFrequencemetreClick(Sender: TObject); begin frmFrequencemetre.ShowModal; end; INITIALIZATION END. {UNIT Uprincpl}