sslug-teknik team mailing list archive
-
sslug-teknik team
-
Mailing list archive
-
Message #20683
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