Ecrire sur le port parralléle avec Visual Basic

On arrive à ce but tant désiré par les éléctro-informaticiens en ayant recours à des DLL, qui contiennent un certain nombre de fonctions. Il faut déclarer ces fonctions dans la partie "général" (là ou on déclare les variables globales) du code du module où l'on désire utiliser le port parallèle.

Normalement, la solution exposée ici permet de créer des logiciels qui ne fonctionneront que sous windows 3.11, 95 et 98. Mais une solution existe pour les utilisateurs de windows NT, 2000 et XP. Il s'agit du logiciel PORTTALK. Cliquez ici pour télécharger cet utilitaire avec les explications en français. Page officielle de porttalk :
http://www.beyondlogic.org/porttalk/porttalk.htm

Les DLL que j'utilise ne sont pas livrées avec Windows. Elle ont étè écrites par quelqu'un qui a décidé de distrubuer ces DLL gratuitement (DLL freewares !). D'ailleurs, c'est pour cela que l'on trouve ces DLL sur les disquettes et CD-ROM de la revue Electronique Pratique.
Pour vous faciliter la tâche, vous pouvez télécharger ces DLL sur mon site en cliquant ici. [18 Ko].

Voici un code source qui montre comment utiliser les différentes broches du port parrallèle : (utilisez le copier/coller !)

'CODE A METTRE DANS LA PARTIE DECLARATION
  Dim ADR_C As Integer 'Registre de contrôle (sorties)
  Dim ADR_D As Integer 'Registre de données (sorties)
  Dim ADR_E As Integer 'Registre d'état (entrées)

  '!!! LAISSEZ LES DEUX INSTRUCTIONS SUIVANTES UNIQUEMENT SI VOUS UTILISEZ Visual Basic 3.0 :
  Declare Function INP Lib "inpout16.Dll" Alias "Inp16" (ByVal PortAddress As Integer) As Integer
  Declare Sub OUT Lib "inpout16.Dll" Alias "Out16" (ByVal PortAddress As Integer, ByVal Value As Integer)

  '!!! LAISSEZ LES DEUX INSTRUCTIONS SUIVANTES UNIQUEMENT SI VOUS UTILISEZ Visual Basic 4.0 ou supérieur :
  Private Declare Function INP Lib "inpout32.Dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer
  Private Declare Sub OUT Lib "inpout32.Dll" Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)

'CODE A METTRE DANS FORM_LOAD :
  Dim AdresseDuPort As String

  'Mettez ici l'adresse du port utilisé (indiquée par le BIOS) :
  AdresseDuPort = "&H378"

  Select Case AdresseDuPort
  Case "&H3BC"
    ADR_C = 958
    ADR_D = 956
    ADR_E = 957
  Case "&H378"
    ADR_C = 890
    ADR_D = 888
    ADR_E = 889
  Case "&H278"
    ADR_C = 634
    ADR_D = 632
    ADR_E = 633
  End select

'EXEMPLE D'UTILISATION; CODE A PLACER OU VOUS VOULEZ (PAR EXEMPLE DANS LA PROCEDURE "CLICK" D'UN BOUTON)
  Dim octet As Integer

  Dim C_Strobe As Integer
  Dim C_Auto As Integer
  Dim C_Init As Integer
  Dim C_SelectIn As Integer

  Dim E_Error As Integer
  Dim E_Select As Integer
  Dim E_Pout As Integer
  Dim E_Ack As Integer
  Dim E_Busy As Integer

  Dim Message As String

  'Ecriture d'un octet vers le registre de données : octet doit être compris entre 0 (inclus) et 255 (inclus)
  octet = 177
  OUT ADR_D, octet

  'Dans ce qui suit, "Logique inversée" signifie que 1 équivaut à 0V et 0 équivaut à +5V.

  'Ecriture vers le registre de contrôle (1 ou 0 pour chaque bit) :
  C_Strobe = 1 'Logique inversée
  C_Auto = 1 'Logique inversée
  C_Init = 0
  C_SelectIn = 1 'Logique inversée
  OUT ADR_C, C_Strobe + 2 * C_Auto + 4 * C_Init + 8 * C_SelectIn

  'Lecture du registre d'état :
  octet = INP(ADR_E)
  E_Error = 0
  E_Select = 0
  E_Pout = 0
  E_Ack = 0
  E_Busy = 0
  If (octet And 8) > 0 Then E_Error = 1
  If (octet And 16) > 0 Then E_Select = 1
  If (octet And 32) > 0 Then E_Pout = 1
  If (octet And 64) > 0 Then E_Ack = 1
  If (octet And 128) > 0 Then E_Busy = 1

  Message = "ETAT DES ENTREES :" + chr$(13)
  Message = Message + "ERROR : " + Format$(E_Error) + chr$(13)
  Message = Message + "SELECT : " + Format$(E_Select) + chr$(13)
  Message = Message + "PAPER OUT : " + Format$(E_Pout) + chr$(13)
  Message = Message + "ACKNOWLEDGE : " + Format$(E_Ack) + chr$(13)
  Message = Message + "BUSY (Logique inversée) : " + Format$(E_Busy)
  Msgbox Message

Si vous utilisez cette instruction pour commander l'allumage de 8 leds (cf mon interface), vous aimeriez sûrement savoir quelle valeur doit avoir "octet" pour allumer la diode n°2 et la n°5 par exemple.

Je vais vous expliquer.

D'abord, "octet" est un octet, c'est à dire un nombre allant de 0 à 255, codé à l'aide de 8 bits. Un bit est un nombre qui ne peut prendre que 2 valeurs : 0 ou 1. Dans votre P.C., tout est exprimé en bits. Les bits égaux à 1 correspondent à du +5V, et les bits nuls correspondent à du 0V (sauf dans le cas de la logique inversée, où c'est ... l'inverse !).

Alors, voici comment on code la valeur d'un octet avec 8 bits :

Soit B1, B2, ..., B8 les huits bits utilisés.
On dit alors que la valeur de l'octet = B1 + B2*2 + B3*4 + B4*8 + B5*16 + B6*32 + B7*64 + B8*128

En supposant que pour chaque bit B1, B2, ... B8 corresponds une diode D1, D2, ... D8, si vous voulez allumer les diodes D2 et D5, il faut que les bits B2 et B5 soient égaux à 1 et que les autres bits soient nuls ; donc il faut envoyer comme valeur de octet = 0 + 1*2 + 0*4 + 0*8 + 1*16 + 0*32 + 0*64 + 0*128 = 1*2 + 1*16 = 18

Pour allumer la diode n°2 et la diode n°5, il faut donc remplacer la valeur 117 de l'exemple par 18.