Index | T6963C | KS0108 | LCDInfo | Forum
What's new | Features | Old versions | Pictures | Test program | Gallery


26.4.2002 20.30

Lisäsin testiohjelmaan mahdollisuuden näyttää LCD:llä max 240x64 pikselin 1-bittisiä bitmappeja. lcd_testi_v0.05.zip (96 KB)


25.4.2002 18.30

Tässä on huomattu, että kuitenkin tarvitaan VCL50.BPL niminen runtime kirjasto. Tämä tiedosto pitää laittaa joko ohjelman hakemistoon tai kopioida windowsin system hakemistoon. Win9x:llä tämä on windows/system ja NT:llä windows/system32. Kuvittelin, että valittaessa kääntäjän optioneista runtime kirjastojen käyttö pois päältä tätäkään ei tarvittaisi, mutta ilmeisesti olin väärässä. Ehkä siellä joku switchi on, mutta ei sattunut silmään.


24.4.2002 19.15

Nyt kun näitä näyttöjä alkaa olla muillakin, niin joitain asioita mitä näistä ohjelmista tuli mieleen:

  • koodi on tehty niin, että se yrittää käyttää porttia 378h
  • Win9x ympäristössä tarvitaan DLPORTIO.DLL ja NT pohjaisissa lisäksi DLPORTIO.SYS. Nämä löytyvät tästä paketista.
Jos jollain on jotain ongelmia tai vastaan tulee bugeja, otan mielelläni kommentteja vastaan ja yritän korjata niitä.


22.4.2002 20.25

Uusi käännös testiohjelmasta. Mukana runtime kirjastot, eikä vaadi enää ylimääräisiä tiedostoja. Jos kuitenkin kysyy jotain, kertokaa. Mukana myös muutamia pieniä muutoksia. lcd_testi_v0.04.zip (92 KB)


20.4.2002 21.15

Tänään ehdin katsoa vähän tätäkin projektia taas. Tein nyt pienen yksinkertaisen ohjelman, jossa on kaksi ruutua: MBM tiedot ja Winampin tiedot. Ohjelma on toteutettu kahdella timerilla ja ruutu vaihtuu viiden sekunnin välein ja tietoja päivitetään sekunnin välein.

Näitä ohjelmia ei varmaan kannata kokeilla jos ei ole sopivaa näyttöä koneessa kiinni, koska tällaista tilannetta varten ei ole tehty minkäänlaisia virhetarkistuksia ja seuraukset voivat olla varsin mielenkiintoisia. Tähän uusimpaan ohjelmaan käänsin myös mukaan ajonaikaiset kirjastot kun niitä ei noihin aikaisempiin ollut tullut mukaan, vaan ne vaativat paria ylimääräistä tiedostoa. Pitää tehdä tuosta testiohjelmastakin samanlainen käännös. Tein tuossa myös yhden version, joka ei tarvitse LCD näyttöä, vaan tiedot tulostetaan ohjelmassa 40x8 merkkiä kokoiseen ikkunaan. Tämän avulla on hyvä testailla ilman näyttöä, mutta ohjelma vaatii vielä pientä hiomista.

Seuraavaksi olisi tarkoitus saada aikaan jonkinlainen runko ohjelmalle, joka näyttäisi näytöllä tietoja käyttäen useaa erilaista ruutua. Tässä en nyt pikaisella miettimisellä saanut kasaan mitään mielestäni järkevää tapaa tämän toteutukseen, mutta pitää tutkia asiaa. Jos jollakulla on jonkinlainen idea tätä koskien tai peräti pientä koodinpätkää niin en panisi ollenkaan pahakseni jos ko. henkilö vihjaisisi minullekin miten asian voisi ehkä tehdä. Kun tämän rungon saisi aikaan niin sitten olisi hyvä alkaa lisäillä erilaisia toimintoja kuten esim. Seti statistiikkaa ja e-mail tarkistusta ym.


15.4.2002 22.50

Taas tuli vähän päivitettyä ohjelmaa. Tällä kertaa oli vuorossa muutamia bugikorjauksia ja pieniä lisäyksiä sekä tuki Winampille. Sain myös grafiikan pelaamaan.

v. 0.03
-Lisää bugikorjauksia ja tuki Winampille
-Ohjelma kirjoitti osan MBM:n tiedoista LCD:lle päällekkäin -> korjattu
-Jonkinlainen tuki Winampille: ohjelma lukee mitä Winamp soittaa ja ajan, sekä kirjoittaa tiedot LCD:lle
-Grafiikkakin toimii, toimimattomuus oli vain omaa hölmöyttä ja koodi oli ihan oikein
-Ryhmitelty vähän toimintoja
-Lisätty valinnat joilla saa valita: kursori päälle/pois, vilkkuuko kursori, teksti päälle/pois, grafiikka päälle/pois


Tulossa/suunnitelmissa:
-Funktioita grafiikan piirtoon: ympyrä, neliö, viiva ym.
-Parempi muunnos ANSI merkeistä LCD:n merkkeihin

-Parempi tuki Motherboard Monitorille
-Parempi tuki Winampille ym.

lcd_testi_v0.03.zip (63 KB)



14.4.2002 22.13

Päivitin vähän ohjelmaa ja väsäsin siihen mm. yksinkertaisen tuen Motherboard Monitorille. Valitettavasti en omista digikameraa, joten kuvia itse näytöstä en voi laittaa.

v. 0.01
-Ensimmäinen versio, parin tunnin työn tulos
-Perusfunktiot toimii, tosin niissäkin voi olla bugeja
-Näytölle saa tekstiä, grafiikka ei vielä toimi

v. 0.02
-Pieniä muutoksia ulkoasuun ja muutamia lisätoimintoja, C++Builderin opettelua
-Sisäisen merkkigeneraattorin merkkien tulostus näytölle
-SetXY:n ja SetLCDCursorin arvot voi antaa
-Voi tulostaa itse annettua tekstiä näytölle
-Yksinkertainen tuki Motherboard Monitorille: tulostaa näytölle lämpötilat, 
 tuulettimien nopeudet ja jännitteet. Vaatii: MBM5.1
-Grafiikkapuolta en vielä ole ehtinyt tutkia



Tulossa/suunnitelmissa:
-Grafiikka toimimaan
-Funktioita grafiikan piirtoon: ympyrä, neliö, viiva ym.
-Parempi muunnos ANSI merkeistä LCD:n merkkeihin

-Parempi tuki Motherboard Monitorille
-Tuki Winampille ym.

lcd_testi_v0.02.zip (64 KB) Sisältää lähdekoodin ym. Jos jotain puuttuu ja tarvitset, kysy.

Kuva uusimmasta versiosta:


Vanha (13.4.2002) versio:


Sain perus low-level funktiot toimimaan, joten ohjelmalla voi kirjoittaa näytölle tekstiä. Grafiikkaa en saanut vielä toimimaan, mutta pitää tutkia asiaa. Tarkoituksena on myös jossain vaiheessa saada ohjelman avulla esim. Motherboard Monitorin lukemat / Winapin soitetut kappaleet ym. tietoja näytölle.

lcd_testi_0.01.zip (50 KB)

Kuten allaolevasta kuvasta voi päätellä, ei ohjelma vielä kovin hienossa kunnossa ole, mutta ainakin tältä pohjalta on hyvä lähteä kehittämään eteenpäin.

Ohjelman LPT portin käsittely tapahtuu DLPortIO ajurin avulla, jolloin sen pitäisi toimia myös NT/Win2000/WinXP ympäristössä. Itselläni näyttö on tällä hetkellä kiinni WinME koneessa ja ohjelman kehitys tapahtuu Win2000 pohjaisella koneella. Ohjelmassa on käytetty John Pappasin TDLPortIO wrapper luokkaa, jonka avulla ajurin yhdistäminen omaan ohjelmaan on helppoa.

TDLPortIO sekä itse DriverLINX ajuri löytyvät tästä.


Jos on jotain kysyttävää / ehdotuksia laita mailia


Alla vielä tämänhetkiset (14.4.2002) funktiot perustoimintoihin.


void __fastcall TForm1::StartLPTDriver(void)
{
        //ajurin hakemisto
        DLPortIO1->DriverPath=ExtractFileDir(ParamStr(0));
        // ajurin avaus
        DLPortIO1->OpenDriver();
        if (!DLPortIO1->ActiveHW)
   {
      MessageDlg("Could not open the DriverLINX driver.",
                 mtError, TMsgDlgButtons() << mbOK, 0);
   }
}

void __fastcall TForm1::WaitDisplayReady(void)
// lukee näytön status byten ja varmistaa,
// että näyttö on valmiina ennen kirjoitusta

// ei sisällä vielä mitään tarkistusta sen varalta,
// että status byten luku ei onnistu, joten
// ohjelma on melko helppo saada jumiin

{
  int Tmp;

       Tmp = DLPortIO1->Port[BASE + 0x402];
       Tmp = Tmp & 0x1F;
       Tmp = Tmp | 0x20;
       DLPortIO1->Port[BASE + 0x402] = Tmp;

       do{

             DLPortIO1->Port[BASE + 2] = 0x20 + 4 + 2;     //In, CD=1, CS=0, Wr=1
             DLPortIO1->Port[BASE + 2] = 0x20 + 4 + 2 + 8; //In, CD=1, CS=0, Wr=1, Rd=0
             Tmp = DLPortIO1->Port[BASE];
             DLPortIO1->Port[BASE + 2] = 0x20 + 4 + 2;     //In, CD=1, CS=0, Wr=1

       }while ((Tmp & 3) != 3 );
       DLPortIO1->Port[BASE + 2] = 0;
}

void __fastcall TForm1::WriteData(BYTE Data)
{
  WriteData_Edit1->Text=WriteData_Edit1->Text+Data+" ";
  WaitDisplayReady();
  DLPortIO1->Port[BASE] = Data;
  DLPortIO1->Port[BASE + 2] = 0; // C/D = L (Data)
  DLPortIO1->Port[BASE + 2] = 2; // CE
  DLPortIO1->Port[BASE + 2] = 3; // CE+WR
  DLPortIO1->Port[BASE + 2] = 2; // CE
  DLPortIO1->Port[BASE + 2] = 0;

}

void __fastcall TForm1::WriteCtrl(BYTE Command)
{
  WriteCtrl_Edit1->Text=WriteCtrl_Edit1->Text+Command+" ";
  WaitDisplayReady();
  DLPortIO1->Port[BASE] = Command;
  DLPortIO1->Port[BASE + 2] = 4;   // C/D = H (ctrl)
  DLPortIO1->Port[BASE + 2] = 4+2; // CE
  DLPortIO1->Port[BASE + 2] = 4+3; // CE+WR
  DLPortIO1->Port[BASE + 2] = 4+2; // CE
  DLPortIO1->Port[BASE + 2] = 0;
}

void __fastcall TForm1::InitLCD(void)
{
  // Display init
  WriteData(T_BASE & 0xFF);   //Data1: LowAddress
  WriteData(T_BASE >> 8);     //Data2: HighAddress
  WriteCtrl(0x40);            //Command: 0x40 -> 01000000

  WriteData(BYTES_PER_ROW);  //Data1: Colums
  WriteData(0);              //Data2: 0
  WriteCtrl(0x41);           //Command: 0x41 -> 01000001

  WriteData(G_BASE & 0xFF);  //Data1: LowAddress
  WriteData(G_BASE >> 8);    //Data2: HighAddress
  WriteCtrl(0x42);           //Command: 0x42 -> 01000010

  WriteData(BYTES_PER_ROW);  //Data1: Colums
  WriteData(0);              //Data2: 0
  WriteCtrl(0x43);           //Command: 0x43 -> 01000011

  //Internal CGROM Mode, OR Mode
  WriteCtrl(0x80); // OR Mode    //80->10000000

  WriteCtrl(0xa7); // cursor is 8 lines high
  WriteData(0x00);
  WriteData(0x00);
  WriteCtrl(0x21); // put cursor at (x,y)

  //DisplayMode
  WriteCtrl(0x97);

  // CG RAM
  // WriteData(2);
  // WriteData(0);
  // WriteCtrl(0x22);

}

void __fastcall TForm1::SetLCDXY(int x, int y)
{
int addr;
  addr = T_BASE + (y * BYTES_PER_ROW) + x;
  WriteData(addr & 0xFF);
  WriteData(addr >> 8);
  WriteCtrl(0x24);
}

void __fastcall TForm1::SetLCDCursor(int x, int y)
{
  WriteData(x);
  WriteData(y);
  WriteCtrl(0x21);
}

void __fastcall TForm1::ClearLCDText(void)
{
  int i;

  WriteData(T_BASE & 0xFF);
  WriteData(T_BASE >> 8);
  WriteCtrl(0x24);      // address pointer T_BASE alkuun

  for (i=0;i<320;i++) {
        WriteData(0); WriteCtrl(0xc0); // kirjoita data ja inc ptr
  }
}

void __fastcall TForm1::ClearLCDGraph(void)
{
  int i;

  WriteData(G_BASE & 0xFF);
  WriteData(G_BASE >> 8);
  WriteCtrl(0x24); // address pointer G_BASE alkuun

  for (i=0;i<2560;i++){
        WriteData(0); WriteCtrl(0xc0); // kirjoita data ja inc ptr
  }
}

void __fastcall TForm1::PrintLCDText(char *string)
{
  unsigned int i;
  int c;

  for (i=0;i> 8);
  WriteCtrl(0x24);
  WriteCtrl(0xf8 | (5-(x % 6)));   // ???
}