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.
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)
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)
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
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
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
LCDInfo v. 0.1e (207 KB)
Pieniä korjauksia ja mukana uudet kuvat.
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)
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 onlcd_info_v0.1c.zip (197 KB)
Pieniä muutoksia ja lisäyksiä. lcd_info_v0.1b.zip (192 KB)
-Seti@Home progress
-Screen interval ini-tiedostossa vaikuttaa
-Date/Time
-Oma IP
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.
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=
Lisäsin testiohjelmaan mahdollisuuden näyttää LCD:llä max 240x64 pikselin 1-bittisiä bitmappeja. lcd_testi_v0.05.zip (96 KB)
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:
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.
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.
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))); // ???
}