V dalších častiach seriálu budeme potrebovať zobrazovať rôzne údaje, preto som sa rozhodol v tejto časti bližšie venovať pripojeniu LCD displeja ku mikrokontroléru a jeho obsluhe v programe.
Schéma zapojenia LCD displeja:
Dátové linky môžeme zapojiť na ktorýkoľvek PORT mikropočítača. Prepojenie potom definujeme v hlavičkovom súbore knižnice.
Popis pinov displeja:
Pin č.1 (VSS) – GND
Pin č.2 (VDD) – napájacie napätie v rozsahu 3,3 až 5V
Pin č.3 (VO) – na tento pin pripájame trimer ktorým nastavujeme kontrast displeja.
Pin č.4 (RS) – dátový pin (Register select), určuje či chceme cez dátové vodiče prenášať inštrukcie alebo dáta
Pin č.5 (R/W) – nastavujeme ním či chceme do displeja zapisovať alebo z neho čítať. Zvyčajne využívame len zápis, preto tento pin pripájame na GND.
Pin č.6 (E) – dátovy pin (Enable), zapnutie/vypnutie LCD displeja
Piny č. 7-14 (DB0-DB7) – obojsmerná dátová linka
Pin č. 15 – Anóda (+) podsvietenia LCD displeja
Pin č. 16 –Katóda (-) podsvietenia LCD displeja
Pre využívanie tejto knižnice v našom projekte treba spraviť nasledovné:
1) Vytvoriť nový projekt (viď 1.časť seriálu) alebo otvoriť existujúci projekt v AVR studio 4.
2) Do adresára kde sa nachádza náš projekt skopírujeme súbory lcd.c a lcd.h
3) Tieto súbory je treba pridať aj do nášho projektu v AVR studio 4. Klikneme pravým tlačidlom na položku „Source Files“ a zvolíme možnosť „Add existing source files“ a vyberieme súbor lcd.c. Obdobným spôsobom pridáme aj hlavičkový súbor lcd.h položku „Header files“ .
4) Nakoniec pridáme hlavičkový súbor do hlavného programu – #include „lcd.h“
Nastavenie hlavičkového súboru lcd.h:
Slúži na nastavenie práce s LCD displejom. V mnohých prípadoch stačí nastaviť len počet znakov na riadok, počet riadkov a rozloženie pinov na ovládanie displeja. Pokiaľ máte LCD displej 2×16 znakov a je zapojený podľa hore uvedenej schémy, netreba v tomto súbore nič nastavovať.
Knižnica obsahuje nasledovné funkcie na prácu s LCD displejom:
lcd_init(uint8_t dispAttr); – inicializácia LCD displeja, ako parameter funkcie možno zvoliť nasledovné možnosti:
LCD_DISP_OFF – displej vypnutý
LCD_DISP_ON – displej zapnutý, kurzor vypnutý
LCD_DISP_ON_CURSOR – displej zapnutý, kurzor zapnutý
LCD_DISP_ON_CURSOR_BLINK – displej zapnutý, kurzor bliká
lcd_clrscr(void); – vymazanie LCD displeja
lcd_home(void); – nastaví kurzor na domovskú pozíciu
lcd_gotoxy(uint8_t x, uint8_t y); – nastavenie kurzora na zadanú pozíciu x a y displeja (indexovanie je od 0)
lcd_putc(char c); – zobraz znak
lcd_puts(const char *s); – zobraz reťazec znakov
lcd_puts_p(const char *progmem_s); – zobraz reťazec znakov umiestený vo Flash pamäti
lcd_command(uint8_t cmd); – vyšle príkaz na displej
Výpis textu na displej:
Príklad č.1 – prvý text:
int main(){
lcd_init(LCD_DISP_ON); // inicializacia displeja
lcd_puts(„Hello World\nSvetelektro.com“); //vypis text
Príklad č.2 – využitie funkcie gotoxy(x,y);
int main(){
lcd_init(LCD_DISP_ON); //inicializacia displeja
lcd_gotoxy(4,0); // chod na poziciu x=4, y=0
lcd_puts(„Posunute“); // vypis text
Príklad č.3 – vypísanie špeciálneho znaku
Pokiaľ chceme vypísať nejaký špeciálny znak môžeme tak urobiť pomocou funkcie lcd_putc(); kde napíšeme adresu znaku z nasledovnej tabuľky.
Napr. pre vypísanie znaku OHM je to teda hodnota 0b11110100.
int main(){
lcd_init(LCD_DISP_ON); // inicializacia displeja
lcd_putc(0b11110100); //vypis znak OHM
while(1);
return 0;
}
Výpis čísel na displej:
Pokiaľ chceme zobraziť číslo na displeji, musíme ho skonvertovať na reťazec znakov. Pokiaľ ide o celé čísla využívame funkciu itoa() alebo sprintf().
Funkcia itoa ma nasledovné parametre – itoa(int value, char *string, int radix);
int value – premenná typu int v ktorej sa nachádza číslo ktoré chceme skonvertovať
char *string – ukazovateľ na reťazec znakov do ktorého sa zapíše naše číslo
int radix – základ čísla, určíme v akej sústave má byť výsledné číslo
Príklad č.1 – práca s číslami pomocou funkcie itoa();
int main(){
char text[16]; //pole znakov pre vypis na displej
int cele = 1234;
lcd_init(LCD_DISP_ON); // inicializacia displeja
itoa(cele,text,10); // konvertuj cele cislo na znaky pri zaklade 10
lcd_puts(text); // vypis znaky na displej
return 0;
}
Funkcia sprintf má nasledovne parametre – sprintf ( char * str, const char * format, … );, funguje podobne ako printf, s tým rozdieľom že výsledok zapíše do textového reťazca.
char * str – Ukazovateľ na pole znakov
const char * format – zápis reťazca
Problém nastane pokiaľ chceme vypísať desatinné číslo na displej pomocou funkcie sprintf(); .
Preto treba upraviť parametre projektu, aby sme s nimi mohli pracovať.
V menu teda vyberieme Project -> Configuration Options a prejdeme na záložku Libraries kde pridáme súbory libprintf_flt.a and libm.a
Potom chodte do záložky „Custom options“ , potom zvolte „Linker Options“, a pridajte prepínače-Wl,-u,vfprintf
Po tejto operácií môžete pracovať s desatinnými číslami typu float alebo double.
Príklad č.2 – práca s desatinnými číslami pomocou funkcie sprintf().
int main(){
float pi = 3.14;
int cele = 1234;
char text[32]; //pole znakov pre vypis na displej
lcd_init(LCD_DISP_ON); // inicializacia displeja
sprintf(text,“Cele cislo:%d\nDesatinne:%.2f“,cele,pi);
lcd_puts(text);
while(1);
V ďalšej časti seriálu sa bližšie pozrieme na prácu s AD-prevodníkmi!
Prepáčte, ale pred zanechaním komentára sa musíte prihlásiť.
není tam chybička?
„lcd_puts(„Hello World /n
Svetelektro.com“); //vypis text “
v docu co si posílal si jí tam přitom měl.
Hmm preco mi to nechce prelozit avr studio kde je ta chyby ako to ma byt spravne napisane
v kniznici je napisane toto asi tam bude problem ci?
#error „This library requires AVR-GCC 3.3 or later, update to newer AVR-GCC compiler !“
myslim ze hned v prvom zdrojaku je vynechany znak LF cize
Malo by to byt opravene. Dik za upozornenie
ak mam megu16 tak co vsetko treba zmenit v suboroch lcd.c/lcd.h
Netreba tam nic menit, treba si dat pozor na vystupne porty, mega8 ich ma odlisne od 16tky. A samozrejme ak mas externy krystal, treba zadat jeho frekvenciu do header.h
Možem použit aj tento display http://www.sos.sk/?str=371&artnum=68622&name=BOLYMIN-BC2004DBNHEH
?
obsahuje radič ST7066U
Hral som sa s Proteus 7 ako simulatorom a všetko tam fungovalo perfgektne potom som skusim zapojit v realite a nespravylo to nič … Nemal by dakdo dajaku dobru radu? ako na to? Dakujem za každu radu …
zravim chcel by som sa spitat ci treba robit niejake zmeny v lcd.h ak pouzivam displej 1×16? lebo ked nieco vypisem na displej dhsie ako osem znakov pomocou funkcie „lcd_puts“ tak sa mi zobrazi iba prvych osem znakov druha polovica displeja vobec nereaguje ..ak mozte niejaku radu co s tim ? dik
Ahoj,
chci se zeptat zda je možné namapovat pin R/W na PC0, datové a řídící piny na jiný port.
Prostě, tak aby mi displey nesežral víc jak 6 pinů.
Ahoj, zkoušel jsem tvuj přiklad z LCD, a mám takový problém.
Display vypíše všechno krome desetiného čísla 3.14, misto něho je tam ?. Nevíte v čem může být problém?
Díka za každou radu, klidně mi pište na meila: tomdatyne@seznam.cz
inač nebolo by na škodu doplniť subor lcd.c o #include util/delay.h> ( AVR studio 5 to inač nevezme)
Čaute, chcem sa spýtať….je tu viac ľudí, ktorí mali problém rozbehať program v reáli, teda ja takisto. Myslím, že som urobil všetko podľa návodu, ale ako keby sa mi disp nechcel inicializovať, ako keby vôbec inicializácia neprebehla. Mám rozmer 4×20, v lcd.h som zmenil rozmery lcd, ostatné som ponechal, nakoľko som lcd pripojil na rovnaký port. Ďakujem.
Zabudol som napísať, že používam attmegu328P…
s pôvodnou knižnicou od Petra Feluryho mi to ide, je tu: http://homepage.hispeed.ch/peterfleury/avr-software.html#libs
Skusal som to na 2×16 islo to dobre. Ale som skusil som lcd 4×20 nevypise nic. Skusal som to s atmega8 a lcd je DMC20481
#define LCD_LINES 4
#define LCD_DISP_LENGTH 20
#define LCD_LINE_LENGTH 0x40
#define LCD_START_LINE1 0x00
#define LCD_START_LINE2 0x40 to to je podla datashetu
#define LCD_START_LINE3 0x14
#define LCD_START_LINE4 0x54
#define LCD_WRAP_LINES 0
moze byt ze su zle fuse bit?
Perfektny clanok, ale ako nadefinujem piny disleja, na ktorych ho mam pripojeny. Co a kde je to potreba upravit ?