SVETELEKTRO

7. marca 2012   Verzia pre tlač Verzia pre tlač

Programujeme AVR v jazyku C – 6. časť


zawin

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.

Pripojenie LCD displeja ku mikrokontroleru:


LCD displej obsahuje obvod (nazývaný radič), ktorý nám uľahčuje prácu s displejom. Obsahuje komunikačné rozhranie, preddefinovanú sadu znakov atď. Nám potom stačí poslať cez komunikačné rozhranie niekoľko príkazov na vypísanie znakov na displej. Najčastejšie používaným radičom na znakové LCD displeje sa stal legendárny HD47780.

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

Práca s displejom pomocou mikrokontroléra:


Nakoľko na internete existuje množstvo knižníc pre prácu zo znakovými displejmi, je jeho ovládanie oveľa jednoduchšie ako by ste možno čakali 🙂
Knižnica ktorú používam obsahuje 2 súbory lcd.c a lcd.h, ktorá obsahuje funkcie na jednoduché ovládanie 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:

Príklad č.2 – využitie funkcie gotoxy(x,y);

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.

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();


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().

V ďalšej časti seriálu sa bližšie pozrieme na prácu s AD-prevodníkmi!

Ako sa vám páčil tento článok?
  • Páči sa mi (0)
  • Súhlasím (0)
  • Zábavné (0)
  • Informatívne (0)
Najnovšie články od zawin (zobraziť všetky)

Komentáre (19)

  1. Petus píše:

    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.

  2. luboss17 píše:

    myslim ze hned v prvom zdrojaku je vynechany znak LF cize

  3. zawin píše:

    Malo by to byt opravene. Dik za upozornenie

  4. zabacik181 píše:

    ak mam megu16 tak co vsetko treba zmenit v suboroch lcd.c/lcd.h

  5. madboy píše:

    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 …

  6. majo505 píše:

    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

  7. wwsly píše:

    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ů.

  8. ves178 píše:

    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

  9. m6r3k píše:

    inač nebolo by na škodu doplniť subor lcd.c o #include util/delay.h> ( AVR studio 5 to inač nevezme)

  10. milan_b píše:

    Č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.

  11. frico píše:

    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

  12. SamuelPulpan píše:

    Perfektny clanok, ale ako nadefinujem piny disleja, na ktorych ho mam pripojeny. Co a kde je to potreba upravit ?

Pridaj komentár