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;
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.
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;
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
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;
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
Synes godt om
Ny brugerNybegynder
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.