← Back to team overview

sslug-teknik team mailing list archive

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