Avatar billede phylox2 Nybegynder
11. marts 2000 - 22:55 Der er 8 kommentarer og
1 løsning

Parallel port ... hvad er der galt ??? (Newbie/Wannabie)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Bevel1: TBevel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

procedure udport(Ad:smallint;Value:smallint);
var
  ByteValue:Byte;
begin
    ByteValue:=Byte(Value);
    asm
        push dx
        mov dx,Ad
        mov al, ByteValue
        out dx,al
        pop dx
    end;
end;

function indport(Ad:smallint):smallint;
var
  ByteValue:byte;
begin
  asm
        push dx
        mov dx, Ad
        in al,dx
        mov ByteValue,al
        pop dx
    end;
    indport:=smallint(ByteValue) and $00FF;
end;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
udport($378,StrToInt(edit1.text));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
edit1.text := IntToStr(indport($378));
end;

end.
Avatar billede pellelil Nybegynder
12. marts 2000 - 15:24 #1
Tjaee måske du skulle skrive lidt mere om hvad problemet er (hvad er det er der ikke virker), men skulle jeg komme med et kvalificeret gæt så prøver du i et 32 bit miljø at læse/skrive til en adresse som ligger uden for dit program og dette vil operativsystemet ikke tilade.
Avatar billede sabine Nybegynder
12. marts 2000 - 15:27 #2
Det er fordi at du har lagt de to funktioner oppe over

implementation
{$R *.DFM}

ryk dem ned under så virker det

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Bevel1: TBevel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure udport(Ad:smallint;Value:smallint);
var
  ByteValue:Byte;
begin
    ByteValue:=Byte(Value);
    asm
        push dx
        mov dx,Ad
        mov al, ByteValue
        out dx,al
        pop dx
    end;
end;

function indport(Ad:smallint):smallint;
var
  ByteValue:byte;
begin
  asm
        push dx
        mov dx, Ad
        in al,dx
        mov ByteValue,al
        pop dx
    end;
    indport:=smallint(ByteValue) and $00FF;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
udport($378,StrToInt(edit1.text));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
edit1.text := IntToStr(indport($378));
end;

end. 
Avatar billede phylox2 Nybegynder
12. marts 2000 - 15:38 #3
men sabine :

skriver den til lpt1 ? min printer reagerer ikke

og hvad så, hvis man vil have den til at skrive itl lpt2 ?
Avatar billede sabine Nybegynder
12. marts 2000 - 16:04 #4
Du skal huske at skrive til den rigtige
addresse
standart addresserne er
378 Ltp1
278 Ltp2
3BC Ltp3

jeg er ikke helt sikker på dem,
men ellers kan du se din addresse i din
bios eller inde under system enheder i windows
Avatar billede sabine Nybegynder
12. marts 2000 - 16:11 #5
Lige en ting til, du kan ikke bare skrive, sådan unden vider til din printer,
hvis du vil have din printer til at reagere, er du nød til at følge den protokol som alle printer køre efter
ellers tag de det ikke som en commando
og derfor reagere de ikke
Avatar billede pellelil Nybegynder
12. marts 2000 - 16:18 #6
Hvis du vil skrive direkte til printeren så prøv nedenstående ("szPrinter" indeholder printerens navn, "szData" indeholder det/de tegn der skal sendes):

procedure  DirectPrint(szPrinter, szData : String);
type
  TDoc_Info_1 = record
    DocName    : PChar;
    OutputFile : PChar;
    Datatype  : PChar;
  end;
var
  hPrinter    : THandle;
  DocInfo      : TDoc_Info_1;
  BytesWritten : Cardinal;
  Count        : Cardinal;
begin
  Count := Length(szData);
  if not OpenPrinter(PChar(szPrinter), hPrinter, nil) then raise EPrinterError.Create('Invalid printer');
  // Fill in the structure with info about this "document"
  DocInfo.DocName    := 'My Document';
  DocInfo.OutputFile := nil;
  DocInfo.Datatype  := 'RAW';
  try
    // Inform the spooler the document is beginning
    if StartDocPrinter(hPrinter, 1, @DocInfo) = 0 then EPrinterError.Create('Not able to: "Start document"');
    try
      // Start a page
      if not StartPagePrinter(hPrinter) then EPrinterError.Create('Not able to: "Start page"');
      try
        // Send the data to the printer
        if not WritePrinter(hPrinter, @szData, Count, BytesWritten) then EPrinterError.Create('Not able to: Send data to printer');
      finally
        // End the page
        if not EndPagePrinter(hPrinter) then EPrinterError.Create('Not able to: "End page"');
      end;
    finally
      // Inform the spooler that the document is ending
      if not EndDocPrinter(hPrinter) then EPrinterError.Create('Not able to: "End document"');
    end;
  finally
    // Tidy up the printer handle
    ClosePrinter(hPrinter);
  end;
  // Check to see if correct number of bytes written
  if BytesWritten <> Count then EPrinterError.Create('All chars were not send corretly to printer');
end;

Avatar billede phylox2 Nybegynder
14. marts 2000 - 19:43 #7
pellelil : Det var bare for at teste det om den skrev noget ud gennem porten ....

sabine : Hvad er så indput værdien ?? Jeg har været inde under systemenheder på computeren, og der står

Input / Output adresse 0378
Input / Output adresse 0778

og jeg har derfor ændret "Læs" knappens portværdi til 0778, men DET virker vist ikke efter hensigten ?




Avatar billede phylox2 Nybegynder
15. marts 2000 - 01:54 #8
Jeg har selv fundet ud af det ... det man skulle gøre, var at finde input adressen for porten .. i mit tilfælge 379

det vil sige :

procedure TForm1.Button2Click(Sender: TObject);
begin
edit1.text := IntToStr(indport($379));
end;


så nemt var det :)

Takker for hjælpen!

Avatar billede sabine Nybegynder
15. marts 2000 - 17:42 #9
phylox2 hvis du læser fra addresse $379

så læser du fra paralellportens Control bit og ikke data bit'ne
paralellporten har 3 addresser en til data bit,en til control bit og en addresse til status bit

$378 er data addressen og er
på en byte (8 bit)

$379 er status addressen og er på 5 bit
status porten er indput

$37A er control addressen er på 4 bit


Det med at der står Input / Output adresse 0378 / 778

man skal bruge addresse $778 hvis din paralellport køre i ECP eller EPP mode

og $378 hvis den køre i SPP mode

Thomas



Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester