Newsgroup: it.comp.lang.delphi
Titolo: Porta parallela

Ciao a tutti.
Ho realizzato una piccola interfaccia con 8 relè da collegare alla porta
parallela. Ora vi chiedo come faccio con delphi a utilizzare la porta
Grazie
GLF



Async Pro ex Turbopower.
Le trovi Opensource qui
http://sourceforge.net/projects/tpapro/
-- 
Ore 18.30: premo invio.

GLF wrote:

sono nuovo del NG e mi rendo utile :)
se ti interessa solo attivare/disattivare/leggere le uscite TTL sulla 
porta puoi usare direttamente il registro I/O.
Per farlo puoi anche utilizzare chiamate in assembler.
il semplice codice allegato dovrebbe fare al tuo caso.. l'ho fatto per 
l'occasione spero che non ci siano errori (non ho potuto testare)
Per info sui registri della porta I/O di LPT1 da una occhiata qui
http://www.pklab.net/kbase/infind/
...una mia doc di tempo fa non me ne vogliate
const
   //I/O address del registro LPT1 (PRINTER DATA OUTPUT o PDO)
   _LPTREG=$378;
   //maschere di bit usate per indicare i singoli bit
   bit0=1;   //00000001B;->pin2
   bit1=2;   //00000010b;->pin3
   bit2=4;   //00000100b;->pin4
   bit3=8;   //00001000b;->pin5
   bit4=16;  //00010000b;->pin6
   bit5=32;  //00100000b;->pin7
   bit6=64;  //01000000b;->pin8
   bit7=128; //10000000b;->pin9
(*********************************************************************
Description:
   Imposta lo stato di tutti i bit a alto (TTL=5V)
Autor: PkLab - 
http://www.pklab.net/kbase/infind/
*********************************************************************)
procedure AllOff;
begin
   asm
     //carico il registro DX con indirizzo I/O di porta parallela
     MOV DX,_LPTREG
     //calcolo PDO con tutti i bit OFF
   	MOV AL,$0
     //imposto PDO
     OUT DX,AL
     //ora i valori TTL dei pin corrispondono al valore del PDO
   end;
end;
(*********************************************************************
Description:
   Imposta lo stato di tutti i bit a basso (TTL=0V)
Autor: PkLab - 
http://www.pklab.net/kbase/infind/
*********************************************************************)
procedure AllOn;
begin
   asm
     //carico il registro DX con indirizzo I/O di porta parallela
     MOV DX,_LPTREG
     //calcolo PDO con tutti i bit ON
   	MOV AL,$FF
     //imposto PDO
     OUT DX,AL
     //ora i valori TTL dei pin corrispondono al valore del PDO
   end;
end;
(*********************************************************************
Description:
   Imposta lo stato dei bit indicati a basso (TTL=0V)
   lasciandi invariato lo stato dei rimanenti bit
Autor: PkLab - 
http://www.pklab.net/kbase/infind/
*********************************************************************)
procedure BitsOff(bitmask:byte);
begin
   asm
     //carico il registro DX con indirizzo I/O di porta parallela
     MOV DX,_LPTREG
     //leggo lo stato di PDO
     IN  AL,DX
     //calcolo nuovo PDO disattivando i bit richiesti
     NOT bitmask
     AND AL,bitmask
     //imposto PDO
     OUT DX,AL
     //ora i valori TTL dei pin sono tutti 0V
   end;
end;
(*********************************************************************
Description:
   Imposta lo stato dei bit indicati ad alto (TTL=5V)
   lasciandi invariato lo stato dei rimanenti bit
Autor: PkLab - 
http://www.pklab.net/kbase/infind/
*********************************************************************)
procedure BitsOn(bitmask:byte);
begin
   asm
     //carico il registro DX con indirizzo I/O di porta parallela
     MOV DX,_LPTREG
     //leggo lo stato di PDO
     IN  AL,DX
     //calcolo nuovo PDO attivando i bit richiesti
     OR  AL,bitmask
     //scrivo nuovo stato per PDO
     OUT DX,AL
     //ora i valori TTL dei pin indicati in bitmask sono tutti 5V
   end;
end;
(*********************************************************************
Description:
   Inverte lo stato dei bit indicati in bitmask lasciando
   invariato lo stato dei rimanenti bit
Autor: PkLab - 
http://www.pklab.net/kbase/infind/
*********************************************************************)
procedure BitsReverse(bitmask:byte);
begin
   asm
     //carico il registro DX con indirizzo I/O di porta parallela
     MOV DX,_LPTREG
     //leggo lo stato di PDO
     IN  AL,DX
     //calcolo nuovo PDO invertendo i bit richiesti
     XOR  AL,bitmask
     //scrivo nuovo stato per PDO
     OUT DX,AL
     //ora i valori TTL dei pin indicati in bitmask sono tutti 5V
   end;
end;
(*********************************************************************
Description:
   Legge lo stato dei biti indicati e ritorna
   true: se i bit sono alto (TTL=5V)
   false: se i bit sono bassi (TTL=0V)
Autor: PkLab - 
http://www.pklab.net/kbase/infind/
*********************************************************************)
function BitsRead(bitmask:byte):boolean;
begin
   asm
     //carico il registro DX con indirizzo I/O di porta parallela
     MOV DX,_LPTREG
     //leggo lo stato di PDO
     IN  AL,DX
     //calcolo nuovo PDO attivando i bit richiesti
     NOT  bitmask
     OR  bitmask,AL
   end;
   result :=(bitmask=$ff);
end;
(*********************************************************************
Description:
   Alcuni esempi su come utilizzare le procedure di sopra
Autor: PkLab - 
http://www.pklab.net/kbase/infind/
*********************************************************************)
procedure TForm1.Button1Click(Sender: TObject);
begin
   //esempi di utilizzo
   //tutti i bit OFF
   AllOff;
   //tutti i bit ON
   AllOn;
   //primo, terzo e sesto bit OFF
   BitsOff(bit0+bit2+bit5);
   //quarto bit OFF
   BitsOff(bit3);
   //inverte il secondo e il terzo bit
   BitsReverse(bit1+bit2);
   //sesto Bit ON
   BitsOn(bit5);
   //legge il valore del sesto bit
   if BitsRead(bit5) then
      ShowMessage('Bit=ON')
   else ShowMessage('Bit=OFF');
   //sesto Bit OFF
   BitsOff(bit5);
   //legge il valore del sesto bit
   if BitsRead(bit5) then
     ShowMessage('Bit=ON')
   else ShowMessage('Bit=OFF');
end;
-- 
web: 
http://www.pklab.net
    ||  Cyber Solutions
   (__)         _   _ _          __
  //  \\    ___| | / / |    ___ / /
  \\__//   / __ \|/ /| |   / __ \__ \
   //\\   / /_/ /. \ | |__/ /_/ /_/ /
   ||||  / .___/_|\_\|____|__,_/___/
  (_)(_)/_/