sslug-teknik team mailing list archive
-
sslug-teknik team
-
Mailing list archive
-
Message #20547
Er du haj til borland pascal 7.0 i dos og c i Linux??
Hej slugger
Kan du svare ja til subject, så vil jeg meget gerne have din hjælp
til et problem jeg har.
Følgende er der en Borland pascal unit jeg har lavet, til
at styre et display jeg har via lpt1 porten.
Displayet er af grafiktypen (240x64 punkter), men det regner jeg med
selv
at kunne lave, når denne unit er blevet oversat.
Dette kunne jeg godt tænke mig at få lavet i C til linux.
Men har er så mit problem,
Jeg kender ikke en pind til C endnu.
Så en oversættelse af følgende vil hjælpe mig meget godt igang.
Jeg håber virkeligt at der er en venlig sjæl, der vil hjælpe mig...
>>>>>>>>>>>> Klip end. >>>>>>>>>>>>>>>>>>>
{###################################################
# LCDTekst T6963 Routines in borland pascal 7.0 #
###################################################}
Unit LCDTEKST;
Interface
Procedure WriteData (DataByte : Byte);
Procedure WriteCommand (CommandByte : Byte);
Procedure LCDClear;
Procedure LCDGraphClear;
Function ReadKeys : Byte;
Procedure TextTest;
Procedure LCDTextClear;
Procedure LCDGotoXY(X,Y : Byte);
Procedure LCDWrite(Tekst : String);
Implementation
Uses
Graph, Crt;
Type
HiLo = (H, L);
RW = (Read, Write);
Const
Data = $378; { LPT1 printer port}
Status = Data + 1;
Control = Data + 2;
Var
i,j,k,w : Word;
d, OldValue : Byte;
grDriver : Integer;
grMode : Integer;
ErrCode : Integer;
X0, X1, X2 : Integer;
Y0, Y1, Y2 : Integer;
OldValueS : String;
x, y : Byte;
fColor : Word;
{*********************************************************************}
Procedure CE (Value: HiLo); {/CE is connected to C0-}
Begin
If Value = H Then Port[Control] := Port[Control] And (Not 1)
else Port[Control] := Port[Control] Or 1;
End;
Procedure RD (Value : HiLo); {/RD is connected to C1-}
Begin
If Value = H Then Port[Control] := Port[Control] And (Not 2)
else Port[Control] := Port[Control] Or 2;
End;
Procedure WR (Value : HiLo); {/WR is connected to C2+}
Begin
If Value = L Then Port[Control] := Port[Control] And (Not 4)
else Port[Control] := Port[Control] Or 4;
End;
Procedure CD (Value : HiLo); {/CD is connected to C3-}
Begin
If Value = H Then Port[Control] := Port[Control] And (Not 8)
else Port[Control] := Port[Control] Or 8;
End;
Procedure LPTMode (Mode : RW);
Begin
If Mode = Write Then Port[Control] := Port[Control] And (Not 32)
else Port[Control] := Port[Control] Or 32;
End;
{*********************************************************************}
Procedure Init;
Begin
LPTMode(Write);
CE(H);
RD(H);
WR(H);
CD(H);
End;
{*********************************************************************}
Procedure CheckStatus;
Var
StatusByte : Byte;
Begin
Repeat
Delay(1);
LPTMode(Read);
CD(H);
WR(H);
CE(L);
RD(L);
StatusByte := Port[Data];
RD(H);
CE(H);
Until ((StatusByte And 1) = 1) And ((StatusByte And 2) = 2);
LPTMode(Write);
End;
{*********************************************************************}
Procedure WriteData (DataByte : Byte);
Begin
LPTMode(Write);
CD(L);
Port[Data] := DataByte;
CE(L);
WR(L);
WR(H);
CE(H);
CD(H);
End;
{*********************************************************************}
Procedure WriteCommand (CommandByte : Byte);
Begin
LPTMode(Write);
CD(H);
Port[Data] := CommandByte;
CE(L);
WR(L);
WR(H);
CE(H);
End;
{*********************************************************************}
Procedure InitT6963;
Begin
Init;
WriteCommand(128+32+16+2); {Auto Mode Off}
WriteData($00); {Text home Address 0780h}
WriteData($00);
WriteCommand($40);
WriteData($1E); {Text area for 240*64}
WriteData($00);
WriteCommand($41);
WriteData($00); {Grapic home address}
WriteData($02);
WriteCommand($42);
WriteData($1E); {Grapich area for 240*64}
WriteData($00);
WriteCommand($43);
WriteCommand($81); {EXOR Text mode}
WriteData($00); {Address pointer set}
WriteData($00);
WriteCommand($24);
WriteCommand(97); {Cursor On, Blink on}
WriteData(0);
WriteData(0);
WriteCommand(33);
WriteCommand(7+32+128);
WriteCommand(147);
WriteCommand($98+4); {Set display mode (Graphics only)}
End;
{*********************************************************************}
Function ReadKeys : Byte;
Var
OldValue : Byte;
Maske, Eins : Byte;
Begin
Init;
Eins := 1;
For i := 1 to 4 Do Begin
Port[Data] := (Not Eins);
OldValue := Port[Status];
If (OldValue And 16) <> 16 Then Begin ReadKeys := i+10; Exit End;
{S4+}
If (OldValue And 32) <> 32 Then Begin ReadKeys := i+20; Exit End;
{S5+}
If (OldValue And 64) <> 64 Then Begin ReadKeys := i+30; Exit End;
{S6+}
If (OldValue And 128) <> 128 Then Begin ReadKeys := i+40; Exit End;
{S7-}
Eins := Eins shl 1;
End;
ReadKeys := 0;
End;
{*********************************************************************}
{*********************************************************************}
{*********************************************************************}
Procedure LCDClearSlow;
Begin
WriteCommand($B0); {Dato auto write on}
WriteData($00); {Address pointer set}
WriteData($00);
WriteCommand($24);
For i := 0 To 1919 Do WriteData(0);
WriteCommand(128+32+16+2); {Auto Mode off}
End;
{*********************************************************************}
Procedure LCDGraphClear;
Begin
WriteData($00); {Address pointer set}
WriteData($02);
WriteCommand($24);
WriteCommand($B0); {Dato auto write on}
LPTMode(Write);
CD(L);
CE(L);
For i := 0 to 1919 Do Begin
Port[Data] := 0;
WR(L);
WR(H);
End;
CE(H);
CD(H);
WriteCommand(128+32+16+2); {Auto Mode off}
End;
Procedure LCDTextClear;
Begin
WriteData($00); {Address pointer set}
WriteData($00);
WriteCommand($24);
WriteCommand($B0); {Dato auto write on}
LPTMode(Write);
CD(L);
CE(L);
For i := 0 to 320 Do Begin
Port[Data] := 0;
WR(L);
WR(H);
End;
CE(H);
CD(H);
WriteCommand(128+32+16+2); {Auto Mode off}
End;
Procedure LCDClear;
Begin
LCDGraphClear;
LCDTextClear;
End;
{*********************************************************************}
Procedure TextTest;
Begin
WriteData($00); {Address pointer set}
WriteData($00);
WriteCommand($24);
WriteCommand($B0); {Dato auto write on}
For j := 1 To 2 Do
For i := 1 To 127 Do Begin
WriteData(i);
End;
WriteCommand(128+32+16+2); {Auto Mode off}
End;
{*********************************************************************}
Procedure LCDGotoXY(X,Y : Byte);
Var
Addr : Integer;
Begin
Addr := ( (Y-1) * 30 ) + X-1;
WriteData(Addr Or 256);
WriteData(Addr shr 8);
WriteCommand($24);
End;
Procedure LCDWrite(Tekst : String);
Var
i,
c : Byte;
Begin
i := 1;
Repeat
c := Ord(Tekst[i]) - $20;
If c < 0 Then c := 0;
WriteData(c);
WriteCommand($c0);
Inc(i);
Until i >= Length(Tekst)+1;
End;
Begin
InitT6963;
LCDClear;
End.
>>>>>>>>>>>> Klip end. >>>>>>>>>>>>>>>>>>>
Med venlig hilsen / Regards
Allan Madsen
Systemadministrator
Dator A/S Tel. +45 96 53 10 00
Stadionvej 2A Fax +45 96 53 10 10
DK-9560 Hadsund e-mail alm@xxxxxxxx
Denmark
Follow ups