// Attention : Le fonctionnement du programme requiert la DLL nommée : mcHID.dll. // N'oubliez pas d'inclure dans le même répertoire de votre programme cette fameuse DLL !!! unit FormMain; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls, ComCtrls, Gauges, Spin; const // input and out buffer size constants... BufferInSize = 55; BufferOutSize = 55; type // input and output buffers... TBufferIn = array[0..BufferInSize] of byte; TBufferOut = array[0..BufferOutSize] of byte; // main form TForm1 = class(TForm) Edit1: TEdit; SpeedButton1: TSpeedButton; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; SpeedButton2: TSpeedButton; SpeedButton3: TSpeedButton; SpeedButton4: TSpeedButton; SpeedButton5: TSpeedButton; Label1: TLabel; GroupBox1: TGroupBox; GroupBox2: TGroupBox; TrackBar1: TTrackBar; TrackBar2: TTrackBar; GroupBox3: TGroupBox; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; GroupBox4: TGroupBox; Label10: TLabel; Label11: TLabel; GroupBox5: TGroupBox; Label12: TLabel; Label13: TLabel; Label14: TLabel; Edit5: TEdit; SpeedButton6: TSpeedButton; Edit6: TEdit; SpeedButton7: TSpeedButton; Label15: TLabel; Gauge1: TGauge; Gauge2: TGauge; Label16: TLabel; Label17: TLabel; Edit7: TEdit; SpeedButton8: TSpeedButton; Label18: TLabel; Edit8: TEdit; SpeedButton9: TSpeedButton; Label19: TLabel; Edit9: TEdit; SpeedButton10: TSpeedButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); procedure SpeedButton2Click(Sender: TObject); procedure SpeedButton3Click(Sender: TObject); procedure SpeedButton4Click(Sender: TObject); procedure SpeedButton5Click(Sender: TObject); procedure TrackBar2Change(Sender: TObject); procedure TrackBar1Change(Sender: TObject); procedure SpeedButton6Click(Sender: TObject); procedure SpeedButton7Click(Sender: TObject); procedure SpeedButton8Click(Sender: TObject); procedure SpeedButton9Click(Sender: TObject); procedure SpeedButton10Click(Sender: TObject); private FBufferIn:TBufferIn; FBufferOut:TBufferOut; function USBEvent(var Msg: TMessage): Boolean; public end; var Form1: TForm1; implementation uses cUSBInterface, cUSBInterfaceTypes; const // VENDOR et PRODUCT ID. // Attention, ne pas changer ces 2 constantes sinon l'Interface universelle I/O USB ne sera plus reconnue. VENDOR_ID = 1240; PRODUCT_ID = 0009; {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin //** Ne supprimez pas les deux lignes suivantes ** Application.HookMainWindow(USBEvent); Connect(Application.Handle); //************************************************ //*** Nombre maximal de caractères admissibles pour chaque ligne du LCD *** // Ligne n°1 // Edit1.MaxLength:=8 // 8 caractères maxi à saisir dans Edit pour un afficheur n X 8 caractères. // Edit1.MaxLength:=16; // 16 caractères maxi à saisir dans Edit pour un afficheur n X 16 caractères. Edit1.MaxLength:=20; // 20 caractères maxi à saisir dans Edit pour un afficheur n X 20 caractères. // Ligne n°2 // Edit2.MaxLength:=8 // 8 caractères maxi à saisir dans Edit pour un afficheur n X 8 caractères. // Edit2.MaxLength:=16; // 16 caractères maxi à saisir dans Edit pour un afficheur n X 16 caractères. Edit2.MaxLength:=20; // 20 caractères maxi à saisir dans Edit pour un afficheur n X 20 caractères. // Ligne n°3 // Edit3.MaxLength:=8 // 8 caractères maxi à saisir dans Edit pour un afficheur n X 8 caractères. // Edit3.MaxLength:=16; // 16 caractères maxi à saisir dans Edit pour un afficheur n X 16 caractères. Edit3.MaxLength:=20; // 20 caractères maxi à saisir dans Edit pour un afficheur n X 20 caractères. // Ligne n°4 // Edit4.MaxLength:=8 // 8 caractères maxi à saisir dans Edit pour un afficheur n X 8 caractères. // Edit4.MaxLength:=16; // 16 caractères maxi à saisir dans Edit pour un afficheur n X 16 caractères. Edit4.MaxLength:=20; // 20 caractères maxi à saisir dans Edit pour un afficheur n X 20 caractères. // Positions par défaut du TrackBar1 pour la sortie J7 permettant de définir le rapport cyclique du signal PWM TrackBar1.Max:=255; // Valeur maxi du rapport cyclique TrackBar1.Min:=0; // Valeur mini du rapport cyclique TrackBar1.Position:=127; // Position par défaut du rapport cyclique de la sortie J7 à 50% // Positions par défaut du TrackBar1 pour la sortie J8 permettant de définir le rapport cyclique du signal PWM TrackBar2.Max:=255; // Valeur maxi du rapport cyclique TrackBar2.Min:=0; // Valeur mini du rapport cyclique TrackBar2.Position:=127; // Position par défaut du rapport cyclique de la sortie J8 à 50% // Détermination des paramètres des GAUGE1 et GAUGE2 pour les entrées analogiques J5 et J6 du CAN 12 bits. GAUGE1.MinValue:=0; GAUGE1.MaxValue:=4096; GAUGE2.MinValue:=0; GAUGE2.MaxValue:=4096; // Sorties digitales J3, J4, J9, J10, J11 Edit5.MaxLength:=3; // Autorise une valeur maxi composée de 3 chiffres. Soit de 0 à 999. Edit6.MaxLength:=3; // Autorise une valeur maxi composée de 3 chiffres. Soit de 0 à 999. Edit7.MaxLength:=3; // Autorise une valeur maxi composée de 3 chiffres. Soit de 0 à 999. Edit8.MaxLength:=3; // Autorise une valeur maxi composée de 3 chiffres. Soit de 0 à 999. Edit9.MaxLength:=3; // Autorise une valeur maxi composée de 3 chiffres. Soit de 0 à 999. Edit5.Text:='0'; // Valeur par défaut de l'octet à zéro. Edit6.Text:='0'; // Valeur par défaut de l'octet à zéro. Edit7.Text:='0'; // Valeur par défaut de l'octet à zéro. Edit8.Text:='0'; // Valeur par défaut de l'octet à zéro. Edit9.Text:='0'; // Valeur par défaut de l'octet à zéro. Label1.Caption:='Interface universelle I/O USB non détectée'; // Fin de votre CODE ... end; //********************************************* //******************************** //* Ne pas supprimer ces lignes. * //******************************** procedure TForm1.FormDestroy(Sender: TObject); begin Application.UnHookMainWindow(USBEvent); end; //********************************** //*********************************************************** //*********************************************************** //** Procedures de transfert des données du PC vers le PIC ** //*********************************************************** //*********************************************************** //******************** //** GESTION DU LCD ** //******************** procedure TForm1.SpeedButton1Click(Sender: TObject); // Bouton "Transfert ligne 1 du LCD" var DevHandle:cardinal; Long, i : Integer; begin FBufferOut[1] := 1; // Première ligne du LCD Long := Length(Edit1.text); // Détermine le nombre de caractères tapés dans Edit.text. if Long = 0 Then Exit; // Si aucun caractère tapé dans Edit.text, sortir de la procédure. For i:= 1 to (Long+1) Do Begin FBufferOut[i+1]:=Ord(Edit1.Text[i]); // Transfert de la chaine de caractère vers le PIC. End; FBufferOut[long+2]:=Ord('#'); // Ajoute à Edit.Text l'indispensable caractère '#' de fin de chaîne. DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; procedure TForm1.SpeedButton2Click(Sender: TObject); // Bouton "Transfert ligne 2 du LCD" var DevHandle:cardinal; Long, i : Integer; begin FBufferOut[1] := 2; // Seconde ligne du LCD Long := Length(Edit2.text); // Détermine le nombre de caractères tapés dans Edit.text. if Long = 0 Then Exit; // Si aucun caractère tapé dans Edit.text, sortir de la procédure. For i:= 1 to (Long+1) Do Begin FBufferOut[i+1]:=Ord(Edit2.Text[i]); // Transfert de la chaine de caractère vers le PIC. End; FBufferOut[long+2]:=Ord('#'); // Ajoute à Edit.Text l'indispensable caractère '#' de fin de chaîne. DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; procedure TForm1.SpeedButton3Click(Sender: TObject); // Bouton "Transfert ligne 3 du LCD" var DevHandle:cardinal; Long, i : Integer; begin FBufferOut[1] := 3; // Troisième ligne du LCD Long := Length(Edit3.text); // Détermine le nombre de caractères tapés dans Edit.text. if Long = 0 Then Exit; // Si aucun caractère tapé dans Edit.text, sortir de la procédure. For i:= 1 to (Long+1) Do Begin FBufferOut[i+1]:=Ord(Edit3.Text[i]); // Transfert de la chaine de caractère vers le PIC. End; FBufferOut[long+2]:=Ord('#'); // Ajoute à Edit.Text l'indispensable caractère '#' de fin de chaîne. DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; procedure TForm1.SpeedButton4Click(Sender: TObject); // Bouton "Transfert ligne 4 du LCD" var DevHandle:cardinal; Long, i : Integer; begin FBufferOut[1] := 4; // Quatrieme ligne du LCD Long := Length(Edit4.text); // Détermine le nombre de caractères tapés dans Edit.text. if Long = 0 Then Exit; // Si aucun caractère tapé dans Edit.text, sortir de la procédure. For i:= 1 to (Long+1) Do Begin FBufferOut[i+1]:=Ord(Edit4.Text[i]); // Transfert de la chaine de caractère vers le PIC. End; FBufferOut[long+2]:=Ord('#'); // Ajoute à Edit.Text l'indispensable caractère '#' de fin de chaîne. DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; procedure TForm1.SpeedButton5Click(Sender: TObject); // Bouton "Efface le LCD". var DevHandle:cardinal; begin FBufferOut[1] := 5; // Efface le LCD DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; //************************ //** FIN GESTION DU LCD ** //************************ //*********************************** //** 2 Sorties analogiques et PWM ** //*********************************** procedure TForm1.TrackBar1Change(Sender: TObject); // Sortie J7 var DevHandle:cardinal; begin // Affiche la position du Trackbar1 Label8.Caption:=IntToStr(TrackBar1.Position); // Transfert USB du PC vers le PIC FBufferOut[1]:=6; // On indique au PIC que l'on va lui envoyer sur FBufferOut[2] la valeur du TrackBar1 FBufferOut[2]:=TrackBar1.Position; DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; procedure TForm1.TrackBar2Change(Sender: TObject); // Sortie J8 var DevHandle:cardinal; begin // Affiche la position du Trackbar2 Label9.Caption:=IntToStr(TrackBar2.Position); // Transfert USB du PC vers le PIC FBufferOut[1]:=7; // On indique au PIC que l'on va lui envoyer sur FBufferOut[2] la valeur du TrackBar2 FBufferOut[2]:=TrackBar2.Position; DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; //*************************************** //** FIN 2 Sorties analogiques et PWM ** //*************************************** //************************************************************* //** Sorties digitales J3 sur 1 octet compris entre 0 et 255 ** //************************************************************* procedure TForm1.SpeedButton6Click(Sender: TObject); var DevHandle:cardinal; begin if Edit5.Text='' then // Si le champs est vide on ne fait rien. begin Edit5.Text:='0'; // Valeur par défaut Exit; end; if (StrToInt(Edit5.Text)<0) or (StrToInt(Edit5.Text)>255) then // Les valeurs négatives ou supérieures à 255 sont rejetées. begin Edit5.Text:='0'; // Valeur par défaut Exit; end; if (StrToInt(Edit5.Text)>=0) and (StrToInt(Edit5.Text)<=255) then // Valeur comprise entre 0 et 255 => on envoie l'octet au PIC par liaison USB. begin // Transfert USB du PC vers le PIC FBufferOut[1]:=8; // On indique au PIC que l'on va lui envoyer sur FBufferOut[2] la valeur de Edit5 FBufferOut[2]:=StrToInt(Edit5.Text); // Envoie la valeur de Edit5. DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; end; //***************************************************************** //** FIN Sorties digitales J3 sur 1 octet compris entre 0 et 255 ** //***************************************************************** //************************************************************* //** Sorties digitales J4 sur 1 octet compris entre 0 et 255 ** //************************************************************* procedure TForm1.SpeedButton7Click(Sender: TObject); var DevHandle:cardinal; begin if Edit6.Text='' then // Si le champs est vide on ne fait rien. begin Edit6.Text:='0'; // Valeur par défaut Exit; end; if (StrToInt(Edit6.Text)<0) or (StrToInt(Edit6.Text)>255) then // Les valeurs négatives ou supérieures à 255 sont rejetées. begin Edit6.Text:='0'; // Valeur par défaut Exit; end; if (StrToInt(Edit6.Text)>=0) and (StrToInt(Edit6.Text)<=255) then // Valeur comprise entre 0 et 255 => on envoie l'octet au PIC par liaison USB. begin // Transfert USB du PC vers le PIC FBufferOut[1]:=9; // On indique au PIC que l'on va lui envoyer sur FBufferOut[2] la valeur de Edit6 FBufferOut[2]:=StrToInt(Edit6.Text); // Envoie la valeur de Edit6. DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; end; //***************************************************************** //** FIN Sorties digitales J4 sur 1 octet compris entre 0 et 255 ** //***************************************************************** //************************************************************* //** Sorties digitales J9 sur 1 octet compris entre 0 et 255 ** //************************************************************* procedure TForm1.SpeedButton8Click(Sender: TObject); var DevHandle:cardinal; begin if Edit7.Text='' then // Si le champs est vide on ne fait rien. begin Edit7.Text:='0'; // Valeur par défaut Exit; end; if (StrToInt(Edit7.Text)<0) or (StrToInt(Edit7.Text)>255) then // Les valeurs négatives ou supérieures à 255 sont rejetées. begin Edit7.Text:='0'; // Valeur par défaut Exit; end; if (StrToInt(Edit7.Text)>=0) and (StrToInt(Edit7.Text)<=255) then // Valeur comprise entre 0 et 255 => on envoie l'octet au PIC par liaison USB. begin // Transfert USB du PC vers le PIC FBufferOut[1]:=10; // On indique au PIC que l'on va lui envoyer sur FBufferOut[2] la valeur de Edit7 FBufferOut[2]:=StrToInt(Edit7.Text); // Envoie la valeur de Edit7. DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; end; //***************************************************************** //** FIN Sorties digitales J9 sur 1 octet compris entre 0 et 255 ** //***************************************************************** //************************************************************* //** Sorties digitales J10 sur 1 octet compris entre 0 et 255 ** //************************************************************* procedure TForm1.SpeedButton9Click(Sender: TObject); var DevHandle:cardinal; begin if Edit8.Text='' then // Si le champs est vide on ne fait rien. begin Edit8.Text:='0'; // Valeur par défaut Exit; end; if (StrToInt(Edit8.Text)<0) or (StrToInt(Edit8.Text)>255) then // Les valeurs négatives ou supérieures à 255 sont rejetées. begin Edit8.Text:='0'; // Valeur par défaut Exit; end; if (StrToInt(Edit8.Text)>=0) and (StrToInt(Edit8.Text)<=255) then // Valeur comprise entre 0 et 255 => on envoie l'octet au PIC par liaison USB. begin // Transfert USB du PC vers le PIC FBufferOut[1]:=11; // On indique au PIC que l'on va lui envoyer sur FBufferOut[2] la valeur de Edit FBufferOut[2]:=StrToInt(Edit8.Text); // Envoie la valeur de Edit7. DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; end; //***************************************************************** //** FIN Sorties digitales J10 sur 1 octet compris entre 0 et 255 ** //***************************************************************** //************************************************************* //** Sorties digitales J11 sur 1 octet compris entre 0 et 255 ** //************************************************************* procedure TForm1.SpeedButton10Click(Sender: TObject); var DevHandle:cardinal; begin if Edit9.Text='' then // Si le champs est vide on ne fait rien. begin Edit9.Text:='0'; // Valeur par défaut Exit; end; if (StrToInt(Edit9.Text)<0) or (StrToInt(Edit9.Text)>255) then // Les valeurs négatives ou supérieures à 255 sont rejetées. begin Edit9.Text:='0'; // Valeur par défaut Exit; end; if (StrToInt(Edit9.Text)>=0) and (StrToInt(Edit9.Text)<=255) then // Valeur comprise entre 0 et 255 => on envoie l'octet au PIC par liaison USB. begin // Transfert USB du PC vers le PIC FBufferOut[1]:=12; // On indique au PIC que l'on va lui envoyer sur FBufferOut[2] la valeur de Edit9 FBufferOut[2]:=StrToInt(Edit9.Text); // Envoie la valeur de Edit9. DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; end; //***************************************************************** //** FIN Sorties digitales J11 sur 1 octet compris entre 0 et 255 ** //***************************************************************** //*************************************************************** //*************************************************************** //** FIN Procedures de transfert des données du PC vers le PIC ** //*************************************************************** //*************************************************************** //**************************************************************** //**************************************************************** //* Fonction dédiée au transfert des données du PIC vers le PC. ** //**************************************************************** //**************************************************************** function TForm1.USBEvent(var Msg: TMessage): Boolean; var DevHandle:cardinal; CH0, CH1 : Integer; begin result := False; if Msg.Msg = WM_HID_EVENT then begin case Msg.WParam of // L'interface USB a été connectée au PC... NOTIFY_PLUGGED : begin DevHandle := Msg.LParam; if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then begin //... Votre CODE ... Label1.Caption:='Interface universelle I/O USB détectée !!!'; SpeedButton1.Enabled:=True; SpeedButton2.Enabled:=True; SpeedButton3.Enabled:=True; SpeedButton4.Enabled:=True; SpeedButton5.Enabled:=True; //... Fin de votre CODE... end; result := true; end; // L'interface USB a été déconnecté du PC... NOTIFY_UNPLUGGED : begin DevHandle := Msg.LParam; if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then begin //... Votre CODE ... Label1.Caption:='Interface universelle I/O USB déconnectée'; Application.Terminate; // Arrêt du programme. //... Fin de votre CODE... end; result := true; end; //** Ne retirez pas 6 lignes suivantes, elles sont indispensables !!! ** NOTIFY_CHANGED : begin DevHandle := GetHandle(VENDOR_ID,PRODUCT_ID); SetReadNotify(DevHandle,true); result := true; end; //********************************************************************** //********************************* //** Transfert du PIC vers le PC.** //********************************* // L'interface universelle I/O a envoyé des données... NOTIFY_READ : begin DevHandle := Msg.LParam; if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then begin // lecture des données. Read(DevHandle,@FBufferIn); //... Votre CODE ... //************************* //** 16 entrées digitales** //************************* //** Entrées RB0 à RB7 du PORT B J2 ** if FBufferIn[1]=1 then // Si = 1 alors on a reçu l'octet présent sur le PORT B c-a-d J2 begin label13.Caption:=IntToStr(FBufferIn[2]); // Valeur présente sur le PORT B. end; //** Entrées RD0 à RD7 du PORT D J1 ** if FBufferIn[1]=2 then // Si = 2 alors on a reçu l'octet présent sur le PORT D c-a-d J1 begin label14.Caption:=IntToStr(FBufferIn[2]); // Valeur présente sur le PORT D. end; //************************************* //** FIN gestion 16 entrées digitales** //************************************* //****************************************** //** Gestion de l'entrée J5 du CAN 12 bits * //****************************************** if FBufferIn[1]=3 then // Si = 3 alors on a reçu les 2 octets du canal A CH0 du CAN 12 bits begin CH0:= (256 * FBufferIn[3]) + FBufferIn[2]; // Reconstitution de la valeur décimale du CAN 12 bits à partir des deux octets transmis par liaison USB. Label2.Caption:=inttostr(CH0); // Valeur décimale de la tension appliquée sur l'entrée J5 du CAN 12 bits. GAUGE1.Progress:=CH0; // Affecte à la gauge1 la valeur mesurée sur l'entrée J5 du CAN 12 bits. end; //****************************************** //** Gestion de l'entrée J6 du CAN 12 bits * //****************************************** if FBufferIn[1]=4 then // Si = 4 alors on a reçu les 2 octets du canal B CH1 du CAN 12 bits begin CH1:= (256 * FBufferIn[3]) + FBufferIn[2]; // Reconstitution de la valeur décimale du CAN 12 bits à partir des deux octets transmis par liaison USB. Label3.Caption:=inttostr(CH1); // Valeur décimale de la tension appliquée sur l'entrée J6 du CAN 12 bits. GAUGE2.Progress:=CH1; // Affecte à la gauge2 la valeur mesurée sur l'entrée J6 du CAN 12 bits. end; end; result := true; end; end; end; end; //******************************************************************** //******************************************************************** //* FIN Fonction dédiée au transfert des données du PIC vers le PC. ** //******************************************************************** //******************************************************************** end.