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]