LCD English Kuvia Kytkentä Ohjelmat Omat ohjelmat Forum

Omat ohjelmat

Tällä sivulla on itse tekemiäni ohjelmia T6963C pohjaisille LCD näytöille. Ohjelmien LCD:n käsittelyrutiinit on tehty Ohjelmat sivulla olevien C-kielisen DOS ohjelman sekä Delphillä tehtyjen ohjelmien pohjalta. Itse en ole ennen windows ohjelmia tehnyt, joten bugeja varmasti löytyy. Windowsiin en c-kielistä koodia tämän näytön ohjaukseen mistään kuitenkaan löytänyt, niin ajattelin laittaa tämän koodin tähän jakoon jos vaikka joku muukin sitä sattuisi tarvitsemaan.


Tarpeellisia tiedostoja:

Pelkät DriverLINX ajurit ja asennusohjelma (172 KB)
Vcl50.zip - C++ Builder 5 / Delphi 5 runtime (640 KB)

Alkuperäinen TDLPortIO paketti: TDLPortIO wrapper luokka + DriverLINX ajurit (850 KB)
Alkuperäinen DriverLINX paketti: port95nt.exe (1570 KB)


Huomioitavaa:


11.6.2002 3.35

lcd_info_v0.2d.zip (189 KB)
Innostuinpa tässä taas pariksi tunniksi vääntämään tätäkin ja seuraavanlaisia ominaisuuksia tuli mukaan:

v. 0.2d
-Language changed to english
-Added option to choose between two different wiring schematics:
 0 = original
 1 = wiring used in tweakers.net forum (not tested)
-Added play, pause and stop icons for winamp (bugs)
-Added CheckBusyFlag selection to ini -> if you are experiencing problems when it's set to 0 try setting it to 1
-The program can now be minimized to the system tray (looks like I'm going to need some icon)

8.5.2002 22.45

lcd_info_v0.2c.zip (212 KB)

v. 0.2c
-Winampin channels näyttää nyt Stereo/Mono
-setin total cpun pitäisi toimia
-Lisätty Päivitä nappi, joka lukee tiedot INI:stä uudelleen

6.5.2002 22.45

lcd_info_v0.2b.zip (209 KB)

v. 0.2b
-Winampille tullut muutama uusi muuttuja
-Muutin setin infon lukua -> lukuvälin saa määrätä inissä
-Onnistuin myös ilmeisesti rikkomaan setin totalcpu:n

5.5.2002 14.30

lcd_info_v0.2.zip (208 KB)

v. 0.2
-Turhaa LCD:lle kirjoitusta vähennetty -> päivitettäessä tarkistetaan onko rivi muuttunut 
 ja jos ei ole, sitä ei turhaan kirjoiteta LCD:lle -> auttaa välkyntään
-Vähän yritetty nopeuttaa myös kuvien vaihtumista
-Lisätty mahdollisuus jättää winamp ruudun näyttäminen väliin, jos winamp ei ole käynnissä
-Nämä ovat voineet aiheuttaa uusia bugeja johonkin väliin

5.5.2002 01.00

LCDInfo v. 0.1e (207 KB)
Pieniä korjauksia ja mukana uudet kuvat.

4.5.2002 18.30

LCDInfo v. 0.1d

v. 0.1d
Lisätty:
-Seti username / results / cputime
-Seti spikes, gaussians, pulses, triplets

Muutettu:
-Seti progress prosenteiksi
-Winampin tiedot näyttää nyt 0:00 / 0:00 eikä kuten ennen 0:0 / 0:0
-Tehty joistain kentistä vakiolevyisiä
lcd_info_v0.1d.zip (207 KB)

2.5.2002 23.30

LCDInfo v. 0.1c

Lisätty:
-INI tiedostoon SetiEnable
-POP3 Interval
-Mukaan Nikon tekemät bitmapit ja tekstien sijoitukset
-Tekstit eivät enää päivity sekuntia kuvan perässä, vieläkin parantamisen varaa on
lcd_info_v0.1c.zip (197 KB)

1.5.2002 22.20

Pieniä muutoksia ja lisäyksiä. lcd_info_v0.1b.zip (192 KB)
-Seti@Home progress
-Screen interval ini-tiedostossa vaikuttaa
-Date/Time
-Oma IP

1.5.2002 13.00

Tässä nyt jonkinlainen versio ohjelmasta jota voisi jo vaikka käyttääkin LCD:n ohjaukseen. Bugeja löytyy varmasti tästäkin, joten niistä saa ilmoitella kun eteen sattuu. Pop3 tarkistus ja muut nettitoiminnot vaativat nmfast50.bpl nimisen tiedoston, joka löytyy paketista. Lisää kehitysideoita otetaan myös vastaan. Yksi tällä hetkellä tulossa oleva toiminto on seti statistiikka. Myös jos joku tekee ohjelmaan jotain bitmappeja tai suunnittelee ruutuja, niin niitä voi lähettää minulle ja lisään ne ohjelmaan. Jo tällaisessa tilassakin konfiguroinnissa on monia erilaisia mahdollisuuksia.

lcd_info_v0.1.zip (192 KB)

LCDInfo v. 0.1

Ominaisuuksia:
-INI-tiedoston avulla tapahtuva konfigurointi
-Jokaisella ruudulla voi olla oma bitmap
-Ruutuja tällä hetkellä max. 5, määrää helppo lisätä tarvittaessa

Ohjelmasta tällä hetkellä löytyviä muuttujia:

mbmtemp0 ...... MBM:n lämmöt
mbmtemp1
mbmtemp2
mbmvolt0 ......	MBM:n jännitteet
mbmvolt1
mbmvolt2
mbmvolt3
mbmvolt4
mbmvolt5
mbmvolt6
mbmfan0 .......	MBM:n tuulettimien kierrosluvut
mbmfan1
mbmfan2
mbmmhz ........	MBM:n prosessorin kellotaajuus

uptimed	.......	Uptime päivät, tunnit, minuutit, sekunnit
uptimeh
uptimem
uptimes

memtotphys ....	Muisti Fyysinen, Total/Available
memavphys
memusage ......	Muistin käyttö %
memtotpage ....	Pagefile Total/Available
memavpage
memtotvirt ....	Virtuaali Total/Available
memavvirt

computername .. Koneen nimi

mailcount ..... Saapuneiden postien määrä

winampstatus .. Winampin status, track position/length, title
winamptrackpos
winamptracklen
winamptitle


Tulossa:

-turhan lcd:lle kirjoituksen vähentäminen -> ei kirjoiteta kuin muuttuneet merkit

Ohjelmassa on vielä debuggauksessa käytettyjä ikkunoita, mutta ei niistä pitäisi olla mitään haittaa. Alla esimerkki ini-tiedostosta.

[Port]
Base=0x378

[Pop3]
Enable=1
Host=
UserID=
Password=

[Screens]
Update=1000

[Screen0]
Enable=1
Interval=5000
Bitmap=image1.bmp
Line0=" Temp1: $mbmtemp0$ Temp2: $mbmtemp1$ "
Line1=
Line2=" Volt1: $mbmvolt0$ $mbmvolt1$ $mbmvolt2$ "
Line3=
Line4=
Line5=" $computername$"
Line6=
Line7=

[Screen1]
Enable=1
Interval=5000
Bitmap=
Line0=
Line1=" $mbmmhz$ Mhz"
Line2=
Line3=" Winamp $winampstatus$"
Line4=" $winamptrackpos$ / $winamptracklen$"
Line5=" $winamptitle$"
Line6=
Line7=

[Screen2]
Enable=1
Interval=5000
Bitmap=
Line0=
Line1=" $uptimed$ Days $uptimeh$ Hours $uptimem$ Minutes $uptimes$ Seconds"
Line2=
Line3=" Vapaa Phys: $memavphys$ / $memtotphys$"
Line4=" Mem Usage: $memusage$ %"
Line5=" Vapaa Page: $memavpage$ / $memtotpage$"
Line6=" Vapaa Virt: $memavvirt$ / $memtotvirt$"
Line7=

[Screen3]
Enable=0
Interval=5000
Bitmap=
Line0="screen3"
Line1=
Line2=
Line3=
Line4=
Line5=
Line6=
Line7=

[Screen4]
Enable=0
Interval=5000
Bitmap=
Line0="screen4"
Line1=
Line2=
Line3=
Line4=
Line5=
Line6=
Line7=

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:

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)));   // ???
}