Einzelnen Beitrag anzeigen

Benutzerbild von flomei
flomei

Registriert seit: 17. Jan 2003
Ort: Schieder-Schwalenberg
2.094 Beiträge
 
Delphi 2005 Personal
 
#3

Ansteuern des Parallelports - Win9x und ME

  Alt 10. Jul 2003, 21:09
Vielen Dank Daniel!

Hallo nochmal!

Da nun soviele Leute hier gefragt haben will ich doch schnell noch einen Teil machen...

Achtung! Dieser Code funktioniert nur unter Win9x und ME!

Man kann den Parallelport auf Win9x und ME Systemen leicht über eine kleine Prozedur ansprechen...

Delphi-Quellcode:
procedure PortOut(x:byte);
 begin
  asm //erklärt dem Compiler, dass Assembler Code anfängt
   mov dx,378h //378h ist die Adresse von LPT 1
   mov al,x //x müssen wir noch einen Wert zuweisen
   out dx,al
  end;
 end;
Schreibt diese Prozedur in euren Quelltext.
Dann könnt Ihr sie leicht aufrufen.
Bsp.:
Delphi-Quellcode:
procedure TEureForm.ZBButtonClick(Sender: TObject); assembler;
 begin
  port(1); //hier weisen wir x einen Wert zu (siehe Tabelle unten)
 end;
In diesem Beispiel setzen wir Datenpin 0 (den ersten Pin am Stecker) auf High.



Wir können erkennen, dass jeder Pin einen eigenen Wert hat. Setzen wir x nun auf diesen Wert werden die entsprechenden Pins High gesetzt. Damit kann man lustig herum experimentieren und allerlei "Zeugs" ansteuern und was sonst noch alles.

Kommen wir zum Einlesen...

Folgender Code stammt von Michael *-=[ Mika ]=-* Wendeln. Er hat mir beim Einlesen geholfen. Er wurde von ihm kommentiert und ich modifizierte ihn meinen Ansprüchen entsprechend.

Original Code:
Delphi-Quellcode:
//Nochmals tausend Dank an *-=[ Mika ]=-*
Function LesePort( Port : Word ) : Byte;
Const
  LPT_DataRegister = $378;
  LPT_StatusRegister = $379;
  LPT_KontrollRegister = $37A;

Var
  Value: Byte;
  Port: Word;

Begin
  // Welches Register des Statusports willst du lesen?
  Port := LPT_DataRegister

  // Werte holen aus dem Register des Ports (NUR UNTER WINDOWS 9X)
  asm
    mov dx, Port
    in al, dx
    Mov Value, AL
  end;

  // Nachsehen was gesetzt war
  case Port of
    LPT_DataRegister : Begin
                             IF Value AND $01 = $01 then ShowMessage('Pin 1 ist gesetzt: Databit 0');
                             IF Value AND $02 = $02 then ShowMessage('Pin 2 ist gesetzt: Databit 1');
                             IF Value AND $04 = $04 then ShowMessage('Pin 3 ist gesetzt: Databit 2');
                             IF Value AND $08 = $08 then ShowMessage('Pin 4 ist gesetzt: Databit 3');
                             IF Value AND $16 = $16 then ShowMessage('Pin 5 ist gesetzt: Databit 4');
                             IF Value AND $32 = $32 then ShowMessage('Pin 6 ist gesetzt: Databit 5');
                             IF Value AND $64 = $64 then ShowMessage('Pin 7 ist gesetzt: Databit 6');
                             IF Value AND $128 = $128 then ShowMessage('Pin 8 ist gesetzt: Databit 7');
                           End;
    LPT_StatusRegister : Begin
                             IF Value AND $08 = $08 then ShowMessage('Pin 4 ist gesetzt: ERROR');
                             IF Value AND $16 = $16 then ShowMessage('Pin 5 ist gesetzt: SELECT');
                             IF Value AND $32 = $32 then ShowMessage('Pin 6 ist gesetzt: PAPER OUT');
                             IF Value AND $64 = $64 then ShowMessage('Pin 7 ist gesetzt: ACK');
                             IF Value AND $128 = $0 then ShowMessage('Pin 8 ist gesetzt: BUSY (INVERTIERT)');
                           End;
    LPT_KontrollRegister : Begin
                             IF Value AND $01 = $00 then ShowMessage('Pin 1 ist gesetzt: STROBE (INVERTIERT)');
                             IF Value AND $02 = $02 then ShowMessage('Pin 2 ist gesetzt: AUTO FEED');
                             IF Value AND $04 = $00 then ShowMessage('Pin 3 ist gesetzt: INIT (INVERTIERT)');
                             IF Value AND $08 = $00 then ShowMessage('Pin 4 ist gesetzt: SELECT IN (INVERTIERT)');
                           End;
  end;
end;
Diesen Code kann man seinen Wünschen entsprechend anpassen (mehr oder weniger Ports abfragen usw.).
Am Besten ist man probiert einfach ein bisschen rum. Je nachdem was man machen will muss man vielleicht auch gar nichts einlesen sondern nur ausgeben... Ihr seht: Eurer Fantasie sind keine Grenzen gesetzt!

Nun ja... als nächstes müsste ich mit Win2k / NT / XP weiter machen. Wie mir von *-=[ Mika ]=-* berichtet wurde muss man lediglich einen Treiber einbinden damit der obrige Code auch dort funktioniert.
Ich möchte mich dafür entschuldigen, dass ich diesen Teil nur so hingepfuscht habe aber ich habe wirklich sehr wenig (ja ich wiederhole mich ) Zeit. Der gepostete Code funktioniert bei mir tadellos und sollte so auch auf jedem anderen Win9x oder ME System laufen. So bald ich mich über das Einbinden der Treiber und deren Umgang schlau gemacht habe werde ich fortfahren.
Ich hoffe jedoch, dass ich wenigstens einigen wieder ein wenig helfen konnte.

MfG der gestresste Florian

[edit=Admin]Bild eingebettet und als Attachment entfernt. Mfg, Daniel[/edit]
Florian Meier
... ist raus.
Vielen Dank für die Zeit mit euch!
http://www.flomei.de -- http://www.md5hash.de
  Mit Zitat antworten Zitat