Strona 1 z 1

Oprogramowanie LPT w DELPHI - Pomocy

: 09 wrz 2005, 09:30
autor: MarcinK
Hej! Czy ktoś mógłby zamieścić listing procedury oprogramowującej wyjście LPT w DELPHI? W Pascalu była to instrukcja PORT. Niestety nie ma jej w DELPHI.
Być może to banalne pytanie, ale dzięki za pomoc

: 09 wrz 2005, 09:48
autor: prokopcio
poszukaj fo forum delphi - widziałem gdzieś odpowiednik komendy "port" ale to była napewno wstawka krótka w assemblerze (5 linijek) albo poszukaj gotowego komponentu.

: 09 wrz 2005, 10:08
autor: MarcinK
Hej
znalazlem tą wstawkę w asemblerze, ale ona również nie działa. Jeżeli mozna spytać, a Ty co wykorzystałeś (jaki komponent) do oprogramowa LPT?

Pozdrowienia

: 09 wrz 2005, 10:10
autor: ottop

: 09 wrz 2005, 10:19
autor: prokopcio
ja używam coma a nie LPT

: 09 wrz 2005, 15:44
autor: lodek123
Jak Ci to pomoże to proszę:

Jako adresy przy wywołaniu procedur podaj
dla LPT1 - $0378
LPT2 - $0278
dla danych
a dla linii sterujących $0379 i $0279
w/g opisu portu LPT

Pocedury może niezbyt optymalnie napisane, ale działają napewno.

Żeby nie było nieporozumień, tą metodą całość działa tylko pod wcześniejszymi windowsami
95,98,Me
jeżeli potrzebujesz tego pod Win2000, NT lub XP
szukaj biblioteki "io.dll" dla Delphi (i innych)
niestety nie pamiętam linka...

Kod: Zaznacz cały

// funkcja odczytu danej z portu
function odczytaj_z_portu(adres:word):byte; 
var odczyt:byte; 
begin
  asm
    mov DX,adres
    in AL,DX
    mov odczyt,AL
  end; 
 odczytaj_z_portu:=odczyt; 
end; 


// procedura zapisu danych do portu
procedure wpisz_do_portu(adres:word;dana:byte); 
begin
    asm
       mov DX,adres
       mov AL,dana
       out DX,AL
    end; 
end; 


procedure wylacz_bit(adres:word;numer:byte); 
  begin
    case numer of
      0:asm
         mov dx,adres
         in al,dx
         and al,11111110b
         out dx,al
        end; 
      1:asm
         mov dx,adres
         in al,dx
         and al,11111101b
         out dx,al
        end; 
      2:asm
         mov dx,adres
         in al,dx
         and al,11111011b
         out dx,al
        end; 
      3:asm
         mov dx,adres
         in al,dx
         and al,11110111b
         out dx,al
        end; 
      4:asm
         mov dx,adres
         in al,dx
         and al,11101111b
         out dx,al
        end; 
      5:asm
         mov dx,adres
         in al,dx
         and al,11011111b
         out dx,al
        end; 
      6:asm
         mov dx,adres
         in al,dx
         and al,10111111b
         out dx,al
        end; 
      7:asm
         mov dx,adres
         in al,dx
         and al,01111111b
         out dx,al
        end; 
    end; 
  end; 



procedure wlacz_bit(adres:word;numer:byte); 
  begin
    case numer of
      0:asm
         mov dx,adres
         in al,dx
         or al,00000001b
         out dx,al
        end; 
      1:asm
         mov dx,adres
         in al,dx
         or al,00000010b
         out dx,al
        end; 
      2:asm
         mov dx,adres
         in al,dx
         or al,00000100b
         out dx,al
        end; 
      3:asm
         mov dx,adres
         in al,dx
         or al,00001000b
         out dx,al
        end; 
      4:asm
         mov dx,adres
         in al,dx
         or al,00010000b
         out dx,al
        end; 
      5:asm
         mov dx,adres
         in al,dx
         or al,00100000b
         out dx,al
        end; 
      6:asm
         mov dx,adres
         in al,dx
         or al,01000000b
         out dx,al
        end; 
      7:asm
         mov dx,adres
         in al,dx
         or al,10000000b
         out dx,al
        end; 
    end; 
  end;

: 09 wrz 2005, 20:07
autor: ludas
Wstawki asm są fajne, ale z pewnych przyczyn nie działają pod winXP. Proponuję bibliotekę (+komponent) dlportIO, można tego używać również pod linuxem.

To jest freeware, więc daję w załączniku.

: 09 wrz 2005, 20:25
autor: vegelus
Pod Delphi przetestowalem i biblioteke IOPort jak i inne ale z czystego lenistwa i niecheci do WIN XP napisalem w pracy magisterskiej ze wymaganym systemem jest win98 i sterowanie zrobilem na wstawkach ASM :-)

Kod: Zaznacz cały

function PortWe(Adres : Word) : Byte; 
Asm
  mov DX,AX {ustawienie danych we właściwym miejscu} 
  in AL,DX {odczyt portu, w AL pojawi sie czytany bajt} 
End; 

procedure PortWy( Dane : Byte; Adres : Word); 
//procedura wysyla na port o adresie ADRES dane zawarte w zmiennej DANE
Asm
  out DX,AL
End; 
jest to krotsza wersja :-)
a samo obracanie silnikami w moim programie wygladalo tak :-)

Kod: Zaznacz cały


procedure Obracanie(kierunek_1 : Byte; kierunek_2 : Byte); 
Var
   DaneSilnik1, DaneSilnik2 : Word; 
begin
   DaneSilnik1 := 0;//sekwencja z pierwszego silnika
   DaneSilnik2 := 0;//sekwencja z drugiego silnika
   Dane := 0;//suma sekwencji wysylane na lpt
   Silnik_1[1]:=1; 
   Silnik_1[2]:=3; 
   Silnik_1[3]:=2; 
   Silnik_1[4]:=6; 
   Silnik_1[5]:=4; 
   Silnik_1[6]:=12; 
   Silnik_1[7]:=8; 
   Silnik_1[8]:=9; 
   Silnik_2[1]:=16; 
   Silnik_2[2]:=48; 
   Silnik_2[3]:=32; 
   Silnik_2[4]:=96; 
   Silnik_2[5]:=64; 
   Silnik_2[6]:=192; 
   Silnik_2[7]:=128; 
   Silnik_2[8]:=144; 
   Case kierunek_1 of
      0: Begin //zatrzymuje
            DaneSilnik1 := 0; 
         End; 
      1: Begin //kreci w prawo
            I_s1 := I_s1 + 1; 
            If (I_s1 > 8) then I_s1 := 1; 
            DaneSilnik1 := Silnik_1[I_s1]; 
         End; 
      2: Begin //kreci w lewo
            I_s1 := I_s1 - 1; 
            If (I_s1 < 1) then I_s1 := 8; 
            DaneSilnik1 := Silnik_1[I_s1]; 
         End; 
   End; 
   Case kierunek_2 of
      0: Begin //zatrzymuje
            DaneSilnik2 := 0; 
         End; 
      1: Begin //kreci w prawo
            I_s2 := I_s2 + 1; 
            If (I_s2 > 8) then I_s2 := 1; 
            DaneSilnik2 := Silnik_2[I_s2]; 
         End; 
      2: Begin //kreci w lewo
            I_s2 := I_s2 - 1; 
            If (I_s2 < 1) then I_s2 := 8; 
            DaneSilnik2 := Silnik_2[I_s2]; 
         End; 
   End; 
   Dane := DaneSilnik1 + DaneSilnik2; 
   PortWy(Dane,888); 
   Delay(30); 
end; 
Prace nad programikiem jednak ustaly po otrzymaniu zadawalajacej oceny z obrony :-) a teraz czekam az ruszy Open Sorsowy projekt :-)

: 01 lut 2006, 21:47
autor: woznk
Wlasnie w Delphi oprogramowalem port lpt pod XP - uzylem ActiveX ze strony http://www.logix4u.net - dziala elegancko :D

: 01 lut 2006, 23:03
autor: vegelus
są różne darmowe komponenty do obsługi LPT z pod wszystkich WIN ale pomyślałem, że jak praca naukowa to niech będzie naukowo ;)