Both sides previous revisionPrevious revisionNext revision | Previous revision |
et:examples:display:lcd [2014/09/30 07:19] – raivo.sell | et:examples:display:lcd [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
---|
| <pagebreak> |
====== Ekraan ====== | ====== Ekraan ====== |
| |
//Vajalikud teadmised: [HW] [[et:hardware:homelab:lcd]], [LIB] [[et:software:homelab:library:module:lcd_alphanumeric]], [LIB] [[et:software:homelab:library:delay]], \\ [PRT] [[et:examples:timer:periodic_interrupt]]// | //Vajalikud teadmised: |
| [HW] [[et:hardware:homelab:digi]], |
| [LIB] [[et:software:homelab:library:module:lcd_alphanumeric]], [LIB] [[et:software:homelab:library:module:lcd_graphic]], \\ |
| [LIB] [[et:software:homelab:library:delay]]// |
| |
===== Teooria ===== | ===== Teooria ===== |
| |
Teksti LCD ehk alfabeetiline LCD on vedelkristall-ekraan (inglise keeles //liquid crystal display//), mis on ette nähtud tähtede ja numbrite kuvamiseks. Inglise keeles nimetatakse seda kui //alphanumeric// LCD. Lihtsamates vedelkristall-ekraanides kasutatakse läbipaisvate elektroodide vahele paigutatud vedelat kristalli, mis muudab elektriväljas läbiva valguse polarisatsiooni. Elektroode katavad veel polarisatsioonifiltrid, mis tagavad, et kogu ekraani saab läbida vaid ühtpidi polariseeritud valgus. Kui vedelkristall elektrivälja mõjul polarisatsiooni muudab, siis valgus ekraani või selle osa (segmenti) läbida ei saa ning see paistab tumedana. | [{{ :examples:display:lcd:lcd_element.jpg?250|Graafilise LCD element}}] |
| /*[{{ :examples:display:lcd_alphanumeric:lcd_alphanumeric_abc.png?200|Alfabeetilise LCD pikslite maatriksitest moodustatud tekst}}]*/ |
| |
Põhiline iseloomustaja on alfabeetilise LCD juures tema segmentide paigutus. Ekraan on jagatud paljudeks indikaatoriteks. Igal indikaatoril on kas piisavalt palju segmente tähtede ja numbrite kuvamiseks või moodustub see väikeste ruudukujuliste segmentide (pikslite) maatriksist. Näiteks 5x7 pikslisest maatriksist piisab kõigi numbrite, ladina tähestiku ja täppidega tähtede kuvamiseks. Indikaatoreid on tavaliselt 1-4 rida ja 8-32 tulpa. Igal indikaatoril on väike vahe sees, täpselt nagu tekstis tähtedelgi. | [{{ :examples:display:lcd_graphic:lcd_graphic_smiley.png?200|Graafilise LCD pikslitest moodustatud pilt}}] |
| |
[{{ :examples:display:lcd_alphanumeric:lcd_alphanumeric_abc.png?200|Alfabeetilise LCD pikslite maatriksitest moodustatud tekst}}] | Mikrokontrolleritega kasutatavad LCD ekraanid võib jaotada üldistatult kaheks: teksti LCD ehk alfabeetiline LCD ja graafiline LCD. Alfabeetiline LCD on vedelkristall-ekraan (inglise keeles //liquid crystal display//), mis on ette nähtud tähtede ja numbrite kuvamiseks. Inglise keeles nimetatakse seda kui //alphanumeric// LCD. Lihtsamates vedelkristall-ekraanides kasutatakse läbipaisvate elektroodide vahele paigutatud vedelat kristalli, mis muudab elektriväljas läbiva valguse polarisatsiooni. Elektroode katavad veel polarisatsioonifiltrid, mis tagavad, et kogu ekraani saab läbida vaid ühtpidi polariseeritud valgus. Kui vedelkristall elektrivälja mõjul polarisatsiooni muudab, siis valgus ekraani või selle osa (segmenti) läbida ei saa ning see paistab tumedana. |
| |
Alfabeetiline LCD ekraan koosneb peale ekraani enda veel ka kontrollerist, mis vastavalt sideliidesest tulevatele käskudele juhib ekraani segmente. Kontrollerisse on eelnevalt sisse programmeeritud tähekaart, kus igal tähel, numbril või märgil on oma järjekorranumber ehk indeks. Ekraanil teksti kuvamine toimub põhimõtteliselt LCD kontrollerile tähtede indekseid saates. Tegelikkuses tuleb LCD kontrolleritele ka mitmeid juhtkäske saata, enne kui midagi kuvama hakatakse. Iga konkreetse LCD ekraani kasutamiseks tuleb tutvuda enne selle andmelehega, kuna neid on väga erinevaid ning ühtlasi ka nende juhtimine toimub erinevalt. | Põhiline iseloomustaja on alfabeetilise LCD juures tema segmentide paigutus. Ekraan on jagatud paljudeks indikaatoriteks. Igal indikaatoril on kas piisavalt palju segmente tähtede ja numbrite kuvamiseks või moodustub see väikeste ruudukujuliste segmentide (pikslite) maatriksist. Näiteks 5x7 pikslisest maatriksist piisab kõigi numbrite, ladina tähestiku ja täppidega tähtede kuvamiseks. Indikaatoreid on tavaliselt 1-4 rida ja 8-32 tulpa. Igal indikaatoril on väike vahe sees, täpselt nagu tekstis tähtedelgi. |
| |
Alfabeetilised LCD ekraanid on üldjuhul passiivmaatriksiga, kus segmentide elektrivälja uuendamine toimub kordamööda. Sellest tulenevalt on passiivmaatriksiga ekraanid aeglasemad ja kehvema kontrastiga kui aktiivmaatriks-ekraanid, kus iga segmendi laengut juhib eraldi transistor. LCD ekraane on nii peegelduva taustaga kui taustvalgustusega, vahel isegi mitme erinevat värvi taustvalgustusega. Segmendi värve on alfabeetlistel LCD ekraanidel enamasti siiski üks - reeglina must, kuid esineb ka valge ja värvilise kirjaga ekraane. | Alfabeetiline LCD ekraan koosneb peale ekraani enda veel ka kontrollerist, mis vastavalt sideliidesest tulevatele käskudele juhib ekraani segmente. Kontrollerisse on eelnevalt sisse programmeeritud tähekaart, kus igal tähel, numbril või märgil on oma järjekorranumber ehk indeks. Ekraanil teksti kuvamine toimub põhimõtteliselt LCD kontrollerile tähtede indekseid saates. Tegelikkuses tuleb LCD kontrolleritele ka mitmeid juhtkäske saata, enne kui midagi kuvama hakatakse. Iga konkreetse LCD ekraani kasutamiseks tuleb tutvuda enne selle andmelehega, kuna neid on väga erinevaid ning ühtlasi ka nende juhtimine toimub erinevalt. |
| /*Alfabeetilised LCD ekraanid on üldjuhul passiivmaatriksiga, kus segmentide elektrivälja uuendamine toimub kordamööda. Sellest tulenevalt on passiivmaatriksiga ekraanid aeglasemad ja kehvema kontrastiga kui aktiivmaatriks-ekraanid, kus iga segmendi laengut juhib eraldi transistor. LCD ekraane on nii peegelduva taustaga kui taustvalgustusega, vahel isegi mitme erinevat värvi taustvalgustusega. Segmendi värve on alfabeetlistel LCD ekraanidel enamasti siiski üks - reeglina must, kuid esineb ka valge ja värvilise kirjaga ekraane. |
===== Praktika ===== | */ |
| |
Kodulabori digitaalse mooduli külge ühendub 2x16 märgiline alfabeetiline LCD WC1602A. Ekraani juhtimiseks on 4-bitine andmesiin ja 3 juhtviiku, kuid selle suhtlusprotokoll on liiga mahukas, et seda siinkohal lahti seletada. Lihtsuse huvides on ekraani kasutamiseks Kodulabori teegis olemas vastavad funktsioonid, mille lähtekoodi leiab Kodulabori veebilehelt. | |
| |
Esimene asi, mis ekraani kasutamiseks teha tuleb, on see algseadistada. Vastavaks otstarbeks on funktsioon //lcd_alpha_init//, millega saab lisada ekraanile ka vilkuva kursori. Ekraanil on olenemata sellest, kas seda on näha või mitte, pidevalt üks aktiivne kursori positsioon, kuhu sisestatakse järgmine täht. Seega tuleb enne teksti sisestamist viia kursor soovitud asukohale. Kursori asukoha muutmiseks on //lcd_alpha_goto_xy// ja teksti kuvamiseks //lcd_alpha_write_string// funktsioon. Kõik alfabeetilise LCD funktsioonid on lahti seletatud selle teegis. | |
| |
Järgnev programmikood demonstreerib alfabeetilise LCD kasutamist kellana. Kellaaeg algab alates "00:00:00" ja suureneb iga ligikaudu sekundiga. Kuna aja lugemine toimub viite funktsiooniga, siis pole see päris täpne. Ebatäpsust selgitab perioodilise katkestuse harjutus. Programm loeb sekundeid ja teisendab need arvutuste abil minutiteks ja sekunditeks. Kellaaja teksti kujule viimiseks on kasutusel C-keele standardfunktsioon //sprintf//. | |
| |
<code c> | |
// | |
// Kodulabori alfabeetilise LCD kasutamise näide. | |
// LCD-le kuvatakse kellaaeg programmi algusest alates. | |
// | |
#include <stdio.h> | |
#include <homelab/module/lcd_alpha.h> | |
#include <homelab/delay.h> | |
| |
// | |
// Põhiprogramm | |
// | |
int main(void) | |
{ | |
int seconds = 0; | |
char text[16]; | |
| |
// LCD ekraani seadistamine | |
lcd_alpha_init(LCD_ALPHA_DISP_ON); | |
| |
// LCD ekraani puhastamine | |
lcd_alpha_clear(); | |
| |
// Programmi nimi | |
lcd_alpha_write_string("Aja loendur"); | |
| |
// Lõputu tsükkel | |
while (true) | |
{ | |
// Sekundite teisendamine kellaaja kujule | |
// hh:mm:ss | |
sprintf(text, "%02d:%02d:%02d", | |
(seconds / 3600) % 24, | |
(seconds / 60) % 60, | |
seconds % 60); | |
| |
// Kellaaja teksti kuvamine LCD teise rea alguses | |
lcd_alpha_goto_xy(0, 1); | |
lcd_alpha_write_string(text); | |
| |
// Sekundi suurendamine 1 võrra | |
seconds++; | |
| |
// Riistvaraline paus 1000 millisekundit | |
hw_delay_ms(1000); | |
} | |
} | |
</code> | |
| |
| |
~~PB~~ | |
====== Graafiline LCD ====== | |
| |
//Vajalikud teadmised: [HW] [[et:hardware:homelab:digi]], [LIB] [[et:software:homelab:library:module:lcd_graphic]], [LIB] [[et:software:homelab:library:delay]], \\ [PRT] [[et:examples:display:lcd_graphic]]// | |
| |
===== Teooria ===== | |
| |
Graafiline LCD on vedelkristall-ekraan, millega saab peale teksti ka kujundeid kuvada. Selle ehitus sarnaneb alfabeetilisele LCD-le ja põhiline erinevus seisneb selles, et graafilisel ekraanil on kõik pikslid jaotatud üle ekraani ühe suure maatriksina. Kui tegu on monokromaatilise graafilise LCD ekraaniga, siis piksel on üks pisike ruudukujuline segment. Värvilistel ekraanidel moodustab üks piksel kolmest alampikslist, millest igaüks laseb läbi värvifiltri kas punast, rohelist või sinist valgust. Kuna alampikslid on lähestikku, paistavad need kui üks piksel. | Graafiline LCD on vedelkristall-ekraan, millega saab peale teksti ka kujundeid kuvada. Selle ehitus sarnaneb alfabeetilisele LCD-le ja põhiline erinevus seisneb selles, et graafilisel ekraanil on kõik pikslid jaotatud üle ekraani ühe suure maatriksina. Kui tegu on monokromaatilise graafilise LCD ekraaniga, siis piksel on üks pisike ruudukujuline segment. Värvilistel ekraanidel moodustab üks piksel kolmest alampikslist, millest igaüks laseb läbi värvifiltri kas punast, rohelist või sinist valgust. Kuna alampikslid on lähestikku, paistavad need kui üks piksel. |
| |
[{{ :examples:display:lcd_graphic:lcd_graphic_smiley.png?200|Graafilise LCD pikslitest moodustatud pilt}}] | Monokromaatilised graafilised ekraanid on tavaliselt passiivmaatriksiga, suured värvilised ekraanid, kaasa arvatud arvutiekraanid, on aktiivmaatriksiga. Kogu tausta- ja pikslite värvi puudutav info on graafilistel LCD-del sarnane alfabeetiliste LCD omadustega ja sarnaselt alfabeetiliste ekraanidega on ka graafilistel ekraanidel eraldi kontroller, mis hoolitseb sideliidese kaudu info vastuvõtmise ja segmentide elektrivälja tekitamise eest. |
| |
Monokromaatilised graafilised ekraanid on tavaliselt passiivmaatriksiga, suured värvilised ekraanid, kaasa arvatud arvutiekraanid, on aktiivmaatriksiga. Kogu tausta- ja pikslite värvi puudutav info on graafilistel LCD-del sarnane alfabeetiliste LCD omadustega ja sarnaselt alfabeetiliste ekraanidega on ka graafilistel ekraanidel eraldi kontroller, mis hoolitseb sideliidese kaudu info vastuvõtmise ja segmentide elektrivälja tekitamise eest. Kui alfabeetilisele LCD ekraanile piisab teksti kuvamiseks märkide indeksite saatmisest, siis graafilised ekraanid ise tähti ei moodusta - kõik tekstid ja pildid tuleb kasutajal ise pikselhaaval tekitada. | |
| |
~~CL~~ | |
| |
===== Praktika ===== | ===== Praktika ===== |
Kodulabori III seeria kasutajaliidesele on paigaldatud 128 x 160 piksliga 1.8" täisvärviline TFT LCD ekraan. Ekraani juhib Sitronixi ST7735 LCD kontroller, mida juhtakse üle SPI siini. Lisaks on juhitav ekraani taustavalgus, kuid ilma taustavalguseta ei ole võimalik ekraani kasutada. Ekraaniga suhtlemine pole kuigi keeruline, kuid funktsioonide suure arvu tõttu pole siinkohal seda lahti seletatud. Kodulabori teegis on olemas funktsioonid selle kasutamiseks. | |
| |
/* Kodulabor 2 info: | Kodulabori III seeria Kasutajaliidese moodulile on paigaldatud 128 x 160 piksliga 1,8 tolline täisvärviline TFT LCD ekraan. Ekraani juhib Sitronixi ST7735 LCD kontroller, mida juhtakse üle SPI siini. Lisaks on juhitav ekraani taustavalgus, kuid ilma taustavalguseta ei ole võimalik ekraani kasutada. Ekraaniga suhtlemine pole kuigi keeruline, kuid funktsioonide suure arvu tõttu pole siinkohal seda lahti seletatud. Kodulabori teegis on olemas funktsioonid selle kasutamiseks. |
Kodulabori komplekti kuulub mõõtudega 84 x 48 pikslit monokromaatiline graafiline LCD ekraan. See ekraan on sama, mida kasutatakse Nokia 3310 mobiiltelefonides. Ekraani küljes on Philipsi PCD8544 kontroller, millega saab suhelda läbi SPI-taolise järjestikliidese. Eraldi juhitav on veel ekraanimooduli taustvalgustus. Ekraaniga suhtlemine pole kuigi keeruline, kuid funktsioonide suure arvu tõttu pole siinkohal seda lahti seletatud. Kodulabori teegis on olemas funktsioonid selle kasutamiseks.*/ | |
| |
Graafilise LCD teegi funktsioonid on sarnased alfabeetilise LCD omadele. Esmalt tuleb ekraan algväärtustada funktsiooniga //lcd_gfx_init//. Teeki on sisse kirjutatud tähekaart kogu ladina tähestiku, numbrite ja üldkasutatavate märkidega. Tähe kõrgus on 7 ja laius 5 pikslit. Iga tähe vahe on horisontaalselt 6 ja vertikaalselt 8 pikslit, ehk kokku mahub ekraanile 6 rida ja 14 tulpa tähti. Tähe või teksti kuvamiseks tuleb eelnevalt //lcd_gfx_goto_char_xy// funktsiooniga määrata selle asukoht. Tähe kuvamiseks on //lcd_gfx_write_char// ja teksti kuvamiseks //lcd_gfx_write_string// funktsioon. | Erinevalt Kodulabor III-st on Kodulabor II varustatud monokromaatilise graafilise 84 x 48 piksli LCD ekraaniga, mis on tundud ka vanemate Nokia mobiiltelefonide pealt. Ekraani küljes on Philipsi PCD8544 kontroller, millega saab suhelda läbi SPI-taolise järjestikliidese. Eraldi juhitav on veel ekraanimooduli taustvalgustus. |
| |
Järgnevalt on toodud näide aja loenduri kohta. Programm loendab sekundeid (ligikaudu), minuteid ja tunde. Aja tekstiks teisendamiseks on kasutusel //sprintf// funktsioon. | Graafilise LCD kasutamiseks tuleb esmalt ekraan algväärtustada funktsiooniga //lcd_gfx_init//. Teeki on sisse kirjutatud tähekaart kogu ladina tähestiku, numbrite ja üldkasutatavate märkidega. Tähe või teksti kuvamiseks tuleb eelnevalt //lcd_gfx_goto_char_xy// funktsiooniga määrata selle asukoht. Tähe kuvamiseks on //lcd_gfx_write_char// ja teksti kuvamiseks //lcd_gfx_write_string// funktsioon. Muid funktsioone näeb juba teegi dokumentatsioonist. Järgnevalt on toodud näide aja loenduri kohta. Programm loendab sekundeid (ligikaudu), minuteid ja tunde. Aja tekstiks teisendamiseks on kasutusel //sprintf// funktsioon. |
| |
~~PB~~ | |
| |
<code c> | <code c> |
// | // Kodulabori graafilise LCD kasutamise näide |
// Kodulabori graafilise LCD kasutamise näide. | |
// LCD-le kuvatakse kellaaeg programmi algusest alates. | |
// | |
#include <stdio.h> | #include <stdio.h> |
#include <homelab/module/lcd_gfx.h> | #include <homelab/module/lcd_gfx.h> |
#include <homelab/delay.h> | #include <homelab/delay.h> |
| |
// | |
// Põhiprogramm | // Põhiprogramm |
// | |
int main(void) | int main(void) |
{ | { |
int seconds = 0; | int seconds = 0; |
char text[16]; | char text[16]; |
| |
// LCD ekraani algseadistamine | // LCD ekraani algseadistamine |
lcd_gfx_init(); | lcd_gfx_init(); |
| // Ekraani puhastamine |
| lcd_gfx_clear(); |
| // Taustavalgustuse tööle lülitamine |
| lcd_gfx_backlight(true); |
| // Programmi nime kuvamine |
| lcd_gfx_goto_char_xy(1, 1); |
| lcd_gfx_write_string("Aja loendur"); |
| |
// Ekraani puhastamine | // Lõputu tsükkel |
lcd_gfx_clear(); | while (1) { |
| // Sekundite teisendamine kellaaja kujule hh:mm:ss |
| sprintf(text, "%02d:%02d:%02d", |
| (seconds / 3600) % 24, (seconds / 60) % 60, seconds % 60); |
| |
// Taustavalgustuse tööle lülitamine | // Kellaaja teksti kuvamine |
lcd_gfx_backlight(true); | lcd_gfx_goto_char_xy(3, 3); |
| lcd_gfx_write_string(text); |
// Programmi nime kuvamine | |
lcd_gfx_goto_char_xy(1, 1); | |
lcd_gfx_write_string("Aja loendur"); | |
| |
// Lõputu tsükkel | |
while (true) | |
{ | |
// Sekundite teisendamine kellaaja kujule | |
// hh:mm:ss | |
sprintf(text, "%02d:%02d:%02d", | |
(seconds / 3600) % 24, | |
(seconds / 60) % 60, | |
seconds % 60); | |
| |
// Kellaaja teksti kuvamine | |
lcd_gfx_goto_char_xy(3, 3); | |
lcd_gfx_write_string(text); | |
| |
// Sekundi suurendamine 1 võrra | |
seconds++; | |
| |
// Riistvaraline paus 1000 millisekundit | // Sekundi suurendamine 1 võrra |
hw_delay_ms(1000); | seconds++; |
} | // Riistvaraline paus 1000 millisekundit |
| hw_delay_ms(1000); |
| } |
} | } |
</code> | </code> |