AVR Atmega48/88/168 i LCD displej

 

slika

 

U mnogi projektima za prikazivanje izlaznih podataka, kao i za davanje instrukcija korisniku, koriste se alfanumerički LCD displeji (LCD - liquid crystal display).
LCD displej se može koristiti prilikom debugovanja, pri čemu su prekidne tačke podešene tako da se vrijednost željenih promjenljivih prikažu na LCD displeju. Najčešće korišteni LCD displeji su displeji sa ugrađenim kontrolerom Hitachi 44780 koji predstavlja interfejs između vanjskog svijeta i displeja.

Prema tome mikrokontroler komunicira sa kontrolerom Hitachi 44780, koji dalje upravlja LCD dispejom. U daljem tekstu koristiće se termin komunikacija između mikrokontrolera i LCD displeja, podrazumjevajući da je stvarni tok komunikacije mikrokontroler -> kontroler HD 44780 -> LCD displej.

Blok šema LCD displeja sa kontrolerom Hitachi 44780 prikazana je na sljedećoj slici:

 

Slika_hd_44780

 

Sa slike se vidi da LCD u sebi sadrži LCD panel i LCD kontroler baziran na kolu HD 44780. Da bi se uspostavila komunikacija između mikrokontrolera i LCD-a prvo je potrebno izvršiti povezivanje pinova mikrokontrolera sa odgovarajućim pinovima LCD-a i priključiti LCD na odgovarajući napon napajanja. U blok šemi postoji i dio backlight, a on predstavlja osvjetljenje pozadine. Postoje LCD displeji sa osvjetljenjem i bez osvjetljenja pozadine. Osvjetljenje pozadine jednostavno se uključuje povezivanjem pinova A i K na napon napajanja LCD displeja.

Da bi se ostvarila komunikacija između mikrokontrolera i LCD displeja, potrebno je znati za šta služi koji pin na LCD displeju. Zbog toga u sljedećoj tabeli dat je opis pojedinih pinova na LCD displeju:

Pinov
Opis
 DB0 - DB7
 Pinovi za prenos podataka pri čemu je DB0 najmanje značajan bit
 E Signal za uključenje
 R/W 0-pisanje na LCD, 1-čitanje sa LCD-a
 RS 0-naredba, 1-podatak
 V0 Kontrast
 Vdd +5V
 Vss GND

 

Prema navedenoj tabeli za prikazivanje podataka na LCD displeju, na mikrokontroler je potrebno povezati pinove DB0-DB7, E i RS signal. S obzirom da će se samo prikazivati podaci na LCD-u, nije potrebna komunikacija sa R/W pinom i on se može odmah spojiti na GND, jer je logička 0 potrebna za mogućnost pisanja na LCD displej. Ovim načinom povezivanja ostvaruje se 8-bitna komunikacija između mikrokontrolera i LCD displeja, a potrebno je ukupno 10 slobodnih pinova na mikrokontroleru. Takođe postoji i 4-bitna komunikacija za koju je potrebno 6 slobodnih pinova na mikrokontroleru. U ovom projektu koristiće se 4-bitna komunikacija zbog potrebe manjeg broja slobodnih pinova na mikrokontroleru.

U projektu su korišteni mikrokontroler Atmega88 i LCD displej DEM16217 16x2 (2 linije sa 16 znakova). Ovaj displej ima backlight, ali se nije koristio u projektu. Šema spajanja mikrokontrolera i LCD displeja prikazana je na sljedećoj slici:

Shema

Klikni na šemu da uvećaš

Na šemi se vidi da su međusobno povezani sljedeći pinovi:

 Mikrokontroler  LCD displej 
 PB0 DB5
 PB1 DB6
 PB2 DB7
 PB3 DB8
 PB4 E
 PB5 RS

 

S obzirom da svaki LCD displej ima odgovarajuće karakteristike, prije pisanja programskog koda za ostvarenje komunikacije između mikrokontrolera i LCD displeja potrebno je pogledati u karakteristikama LCD-a način za ostvarivanje 8-bitne ili u ovom slučaju 4-bitne komunikacije. Na sljedećoj slici prikazan je 4-bitni način ostvarivanja komunikacije koji je nalazi u karakteristikama korištenog LCD-a.

 

slika_komunikacija

Klikni na sliku da uvećaš

Prema toj blok šemi napisan je jednostavan programki kod u C programskom jeziku i AVR studio. Korisno je napomenuti da se ovom slučaju podatak šalje na LCD displej tako što se PB0, PB1, PB2 i PB3 postave na odgovarajuće vrijednosti, a zatim koristeći funkciju send pin PB4 postavi na logičku jedinicu, sačeka jedan vremenski period, a zatim postavi na logičku nulu čime je podatak poslan na LCD displej.

Funkcija f_put šalje komandu ili podatak u zavisnosti od ulaznog argumenta b, vdijeti komentar u programskom kodu.

Funkcija f_string prikazuje tekst na LCD displeju. S obzirom da će na LCD-u pisati Demonstracija rada LCD-a i da je poželjno da riječ demonstracija bude u jednom redu, a druge riječi u drugom redu. Riječ demonstracija ima ukupno 13 slova, pa se pomoćnom promjenljivom k u funkciji f_string kontroliše koliko je slova ispisano na LCD-u i kada bude ispisano 13 slova, zadaje se naredba za prelazak u novi red.

Funkcija f_init vrši inicijalizaciju mikrokontrolera i LCD displeja.

Programski kod za pisanje na LCD-u:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define send(void) {PORTB |= (1<<PB4);_delay_us(43);PORTB &= ~(1<<PB4);}

void f_put(char a,uint8_t b)// ako je b=0 salje komandu, b=1 salje podatak
{
    if(b==1)
        PORTB |= (1<<PB5);//postavi RS
    PORTB &= 0xF0;
    PORTB |= (a >> 4) & 0x0F;
    send();
    PORTB &= 0xF0;
    PORTB |= (a & 0x0F);
    send();
    PORTB = 0;

}

void f_string(char *str)
{
    f_put(0x01,0);
    _delay_ms(2);
    uint8_t k=0;
    while(*str)
    {
        f_put(*str,1);
        str++;
        k++;
        if(k==13) //za k=13 predji u novi red
        f_put(0xC0,0);
    }
}

void f_init(void)
{
    DDRB = 0x3F;//PortB je izlazni,pb5->S pb4->E Podaci su pb0, pb1, pb2, bp3
    PORTB = 0x00;

    // Inicijalizacija displeja

    _delay_ms(20);
    _delay_ms(10);

    f_put(0x02,0);
    f_put(0x02,0);
    f_put(0x08,0);

    _delay_ms(5);

    f_put(0x00,0);
    f_put(0x0C,0);

    _delay_ms(5);

    f_put(0x00,0);
    f_put(0x01,0);

    _delay_ms(5);

    f_put(0x00,0);
    f_put(0x06,0);

}

int main(void)
{
    f_init();
    f_string("Demostracija rada LCD-a");
    while(1);
    return 0;
}

 

Na sljedećoj slici prikazan je LCD displej nakon puštanja u rad:

 

Slika_Demo_lcd