← Back to team overview

sslug-teknik team mailing list archive

Re: Er du haj til borland pascal 7.0 i dos og c i Linux??

 

Hmmm.... Det lader ikke til at min mail klient vil atache filer....

Her kommer de i mail'en så må det da for h...... virke!

lcdtekst.hpp
<-----------------------KLIP --------------------------------->
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <asm/io.h>

#define DATA    0x3BC  //Gammeldags printer port nu er det 0x378
#define STATUS  DATA+1
#define CONTROL DATA+2

#define HIGH    1
#define LOW     0

#define READ    0
#define WRITE   1

class LCD
{
  public:
   void WriteData(unsigned char databyte);
   void WriteCommand(unsigned char commandbyte);
   void Clear(void);
   void GraphClear(void);
   unsigned char Readkeys(void);
   void TextTest(void);
   void TextClear(void);
   void GotoXY(unsigned char x, unsigned char y);
   void Write(char *tekst);

   void LPTMode(unsigned char mode);
   void CE(unsigned char value);
   void RD(unsigned char value);
   void WR(unsigned char value);
   void CD(unsigned char value);
   void Init(void);
   void CheckStatus(void);
   void InitT6963(void);
   void ClearSlow(void);
   void ClosePort(void);
   LCD();
   ~LCD();

};

LCD::LCD()
{
 InitT6963();
 Clear();
}

LCD::~LCD()
{
 ClosePort();
}

void LCD::ClosePort(void)
{
 if (ioperm(DATA, 3, 0))
 {
  perror("ioperm");
  exit(1);
 }
}

void LCD::LPTMode(unsigned char mode)
{
 if (mode == WRITE)
  outb(inb(CONTROL) & (0xFF - 32), CONTROL);
 else
  outb(inb(CONTROL) | 32, CONTROL);
}

void LCD::CE(unsigned char value)
{
 if (value == HIGH)
  outb(inb(CONTROL) & (0xFF - 1), CONTROL);
 else
  outb(inb(CONTROL) | 1, CONTROL);
}

void LCD::RD(unsigned char value)
{
 if (value == HIGH)
  outb(inb(CONTROL) & (0xFF - 2), CONTROL);
 else
  outb(inb(CONTROL) | 2, CONTROL);
}

void LCD::WR(unsigned char value)
{
 if (value == LOW)
  outb(inb(CONTROL) & (0xFF - 4), CONTROL);
 else
  outb(inb(CONTROL) | 4, CONTROL);
}

void LCD::CD(unsigned char value)
{
 if (value == HIGH)
  outb(inb(CONTROL) & (0xFF - 8), CONTROL);
 else
  outb(inb(CONTROL) | 8, CONTROL);
}

void LCD::Init(void)
{
 if (ioperm(DATA, 3, 1))
 {
  perror("ioperm");
  exit(1);
 }
 LPTMode(WRITE);
 CE(HIGH);
 RD(HIGH);
 WR(HIGH);
 CD(HIGH);
}

void LCD::CheckStatus(void)
{
 unsigned char status;

 do
 {
  usleep(1000);
  LPTMode(READ);
  CD(HIGH);
  WR(HIGH);
  CE(LOW);
  RD(LOW);
  status = inb(DATA);
  RD(HIGH);
  CE(HIGH);
 } while (((status & 1) == 1) && ((status & 2) == 2));
 LPTMode(WRITE);
}

void LCD::WriteData(unsigned char databyte)
{
 LPTMode(WRITE);
 CD(LOW);
 outb(databyte, DATA);
 CD(LOW);
 WR(LOW);
 WR(HIGH);
 CE(HIGH);
 CD(HIGH);
}

void LCD::WriteCommand(unsigned char commandbyte)
{
 LPTMode(WRITE);
 CD(HIGH);
 outb(commandbyte, DATA);
 CD(LOW);
 WR(LOW);
 WR(HIGH);
 CE(HIGH);
}

void LCD::InitT6963(void)
{
 Init();
 WriteCommand(128+32+16+2);
 WriteData(0x00);
 WriteCommand(0x40);
 WriteData(0x1E);
 WriteData(0x00);
 WriteCommand(0x41);
 WriteData(0x00);
 WriteCommand(0x42);
 WriteData(0x1E);
 WriteData(0x00);
 WriteCommand(0x43);
 WriteCommand(0x81);
 WriteData(0x00);
 WriteCommand(0x24);
 WriteCommand(0x97);
 WriteData(0);
 WriteData(0);
 WriteCommand(33);
 WriteCommand(7+32+128);
 WriteCommand(147);
 WriteCommand(0x98+4);
}

unsigned char LCD::Readkeys(void)
{
 unsigned char oldvalue, count;
 unsigned char mask, one=1;

 Init();
 for (count = 1; count <= 4; count++)
 {
  outb(0xFF - one, DATA);
  oldvalue = inb(STATUS);
  if ((oldvalue & 16) != 16) return (count+10);
  if ((oldvalue & 32) != 32) return (count+20);
  if ((oldvalue & 64) != 64) return (count+30);
  if ((oldvalue & 182) != 128) return (count+40);
  one <<= 1;
 }
 return (0);
}

void LCD::ClearSlow(void)
{
 unsigned int count;

 WriteCommand(0xB0);
 WriteData(0x00);
 WriteCommand(0x24);
 for (count=0; count <= 1919; count++) WriteData(0);
 WriteCommand(128+32+16+2);
}

void LCD::GraphClear(void)
{
 unsigned int count;

 WriteData(0x00);
 WriteData(0x02);
 WriteCommand(0xB0);
 LPTMode(WRITE);
 CD(LOW);
 CE(LOW);
 for (count=0; count <= 1919; count++)
 {
  outb(0, DATA);
  WR(LOW);
  WR(HIGH);
 }
 CD(HIGH);
 CD(HIGH);
 WriteCommand(128+32+16+2);
}

void LCD::TextClear(void)
{
 unsigned int count;

 WriteData(0x00);
 WriteData(0x00);
 WriteCommand(0x24);
 WriteCommand(0xB0);
 LPTMode(WRITE);
 CD(LOW);
 CE(LOW);
 for (count=0; count<= 320; count++)
 {
  outb(0, DATA);
  WR(LOW);
  WR(HIGH);
 }
 CE(HIGH);
 CD(HIGH);
 WriteCommand(128+32+16+2);
}

void LCD::Clear(void)
{
 GraphClear();
 TextClear();
}

void LCD::TextTest(void)
{
 unsigned char count1, count2;

 WriteData(0x00);
 WriteData(0x00);
 WriteCommand(0x24);
 WriteCommand(0xB0);
 for (count1=1; count1 <= 2; count1++)
  for (count2=1; count2 <= 127; count2++)
   WriteData(count2);
 WriteCommand(128+32+16+2);
}

void LCD::GotoXY(unsigned char x, unsigned char y)
{
 unsigned int addr;

 addr = ( (y-1) * 30 ) + x-1;
 WriteData(addr | 256);
 WriteData(addr << 8);
 WriteCommand(0x24);
}

void LCD::Write(char *tekst)
{
 unsigned char i=1;
 char c;

 do
 {
  c = tekst[i] - 0x20;
  if (c < 0) c = 0;
  WriteData(c);
  WriteCommand(0xC0);
  i++;
 } while(i <= (strlen(tekst)+1));
}
<---------------------- KLIP ---------------------------------------->

test.cpp
<---------------------- KLIP ---------------------------------------->
#include <stdio.h>
#include "lcdtekst.hpp"

int main(void)
{
 LCD lcd;

 lcd.GraphClear();

 return 0;
}
<---------------------- KLIP ---------------------------------------->

Håber du får det til at virke....

Mvh.
 Jimmy Dansbo
 ALTO Danmark A/S

-----Original Message-----
From: Jimmy Dansbo <jimmy@xxxxxxxxxxx>
To: sslug-teknik@xxxxxxxx <sslug-teknik@xxxxxxxx>
Date: 26. marts 2000 20:49
Subject: Re: [TEKNIK] Er du haj til borland pascal 7.0 i dos og c i Linux??


>Jeg har vedlagt et par filer som jeg er rimelig sikker på virker...
>Programmet skal dog sikkert køres som root for at det virker.
>
>Du skal lige huske at kompilere programmet med '-O'.
>
>Mvh.
> Jimmy Dansbo
> ALTO Danmark A/S
>
>-----Original Message-----
>From: ALM <alm@xxxxxxxx>
>To: 'sslug-teknik@xxxxxxxx' <sslug-teknik@xxxxxxxx>
>Date: 23. marts 2000 13:09
>Subject: [TEKNIK] 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