środa, 16 marca 2011

Kurs XMega (05): Wyświetlacz LCD HD44780

Autor: Dominik Leon Bieczyński
Redakcja: Dondu

Artykuł jest fragmentem cyklu: Kurs mikrokontrolerów XMega by Leon-Instruments


Mruganie diodami, opisane w poprzednim odcinku kursu jest fajne, aczkolwiek mało komunikatywne. Dlatego zanim przejdziemy do omawiania poszczególnych peryferiów mikrokontrolerów XMEGA, najpierw nauczymy się obsługiwać popularny wyświetlacz tekstowy LCD 16x2 ze sterownikiem HD44780.

Niniejszy artykuł ma zapoznać czytelnika z podstawą obsługi tego wyświetlacza, lecz nie będziemy tworzyć jego biblioteki funkcji od zera – wykorzystamy gotowca, którego udostępnił Radosław Kwiecień na swojej stronie radzio.dxp.pl. Jego bibliotekę przystosowałem do współpracy z mikrokontrolerami XMEGA, aby móc wykorzystać wyświetlacz w następnych odcinkach kursu. Przy okazji zobaczymy, jak dodaje się gotowe biblioteki do projektu w Atmel Studio.

Po utworzeniu nowego projektu (jak to zrobić opisałem w 2 części kursu) musimy dodać bibliotekę obsługi wyświetlacza. Następnie, w drzewku projektu, widocznym po prawej stronie okna Atmel Studio, wskazujemy najwyższą pozycję i klikamy ją prawym przyciskiem myszy. Z wyskakującego menu wybieramy Add, a następnie Existing Item.

Do pobrania: XMega-LCD-HD44780-display.zip (kopia)


Dodawanie bibliotek do Atmel Studio
Dodawanie bibliotek do Atmel Studio


Wskazujemy pliki hd44780.c oraz hd44780.h, które wcześniej ściągnęliśmy z serwera. Po dodaniu drzewo projektu powinno wyglądać następująco:





Następnie, zgodnie z regułami języka C, powinniśmy dodać plik nagłówkowy biblioteki przy pomocy dyrektywy #include.

    #include <avr/io.h>
    #include <util/delay.h>
    #include "hd44780.h"

Przedstawię teraz skrótowo funkcje odpowiedzialne za obsługę wyświetlacza:
  • void LcdInit(void) – inicjalizacja kontrolera wyświetlacza
  • void LcdClear(void) – czyszczenie wyświetlacza
  • void LcdData(unsigned char data) – wyświetlenie pojedynczego znaku na wyświetlaczu na bieżącej pozycji kursora
  • void LcdGoto(unsigned char x, unsigned char y) – przesunięcie kursora na wskazaną pozycję, gdzie x jest numerem kolumny licząc od lewej, a y jest numerem wiersza licząc od góry (liczymy od zera!)
  • void LcdWrite(char * text) – wyświetlenie tekstu zapisanego w pamięci RAM; należy używać tej funkcji rozważnie, bo wszystkie napisy przez nią używane będą zapisane w pamięci RAM, którą można w ten sposób bardzo szybko zapełnić
  • #define Lcd(tekst) LcdWriteProgmem(PSTR(tekst)) – makro umożliwiające wyświetlenie napisu zapisanego w pamięci Flash, dzięki czemu nie marnuje się miejsca w cennej pamięci RAM na napisy
  • #define Lcd2 LcdGoto(0,1) – przejście do drugiej linii
  • void LcdDec(uint32_t liczba) – wyświetlenie liczby

Warto jeszcze zwrócić uwagę na plik hd44780.h, ponieważ w nim musimy zdefiniować, które piny wyświetlacza są podłączone do których pinów procesora.

    #define LCD_PORT        PORTC
    #define LCD_RS_bm       PIN2_bm
    #define LCD_E_bm        PIN3_bm
    #define LCD_D4_bm       PIN4_bm
    #define LCD_D5_bm       PIN5_bm
    #define LCD_D6_bm       PIN6_bm
    #define LCD_D7_bm       PIN7_bm

Mając tak zdefiniowany plik nagłówkowy, możemy przystąpić do budowania układu na płytce stykowej według schematu


Schemat podłączenia wyświetlacza LCD HD44780 do mikrokontrolera XMega.
Schemat podłączenia wyświetlacza LCD HD44780 do mikrokontrolera XMega.

Należy zwrócić szczególną uwagę, że niektóre starsze wyświetlacze są przeznaczone do pracy przy napięciu zasilania 5V, a mikrokontrolery XMEGA są przystosowane do napięcia 3,3V. Pamiętaj, że na pinach procesora nie mogą pojawić się napięcia wyższe od napięcia zasilającego.

W tym układzie komunikacja między procesorem a wyświetlaczem jest jednokierunkowa. Chcąc odczytać dane z wyświetlacza, np. flagę zajętości, należałoby wyposażyć układ w jakiś translator napięć, chociażby dzielniki napięcia z rezystorów, gdyż bezpośrednie połączenie mogłoby uszkodzić piny procesora.

Można się wzorować na rozwiązaniach przedstawionych przez Drzaśka w artykule Podłączenie karty pamięci SD.


Możemy teraz przejść do pisania programu. Po włączeniu zasilania, niech na wyświetlaczu pojawi się komunikat powitalny, a potem program ma zliczać ile razy wcisnęliśmy przycisk FLIP na płytce testowej do procesorów ATxmega. Kod programu jest na tyle prosty, że po przeczytaniu tego artykułu, jego zrozumienie nie powinno stwarzać problemu.

#define F_CPU 2000000UL
#include <avr/io.h>
#include <util/delay.h>
#include "hd44780.h"

int main(void) {
    
    // konfiguracja przycisku FLIP
    PORTE.DIRCLR    =  PIN5_bm;             // pin E5 jako wejście
    PORTE.PIN5CTRL  =  PORT_OPC_PULLUP_gc;  // podciągnięcie do zasilania
    
    // Inicjalizacja wyświetlacza
    LcdInit();                              // inicjalizacja sterownika LCD
    Lcd("   Kurs XMEGA");                   // wyświetlenie napisu
    Lcd2;                                   // przejście do drugiej linii
    Lcd("Leon Instruments");                // wyświetlenie napisu

    // zmienna służąca jako licznik
    uint8_t licznik = 0;
    
    while(1) {
        if(!(PORTE.IN & PIN5_bm)) {         // jeżeli przycisk FLIP jest wciśnięty
            licznik++;                      // zwiększ licznik o 1
            LcdClear();                     // wyczyść wyświetlacz
            Lcd("Licznik:");                // wyświetlenie napisu
            Lcd2;                           // przejście do drugiej linii
            LcdDec(licznik);                // wyświetlenie zmiennej liczbowej
            _delay_ms(100);                 // czekanie 100ms
        }
    }
}


Przykład działania

Przykład działania


A to filmik przedstawiający działanie naszego programu:




Dominik Leon Bieczyński
leon-instruments.pl

1 komentarz:

  1. Witam, mam pewne pytanie, podłączyłem LCD do xmegi do portów od B0 do B5 korzystając z biblioteki z tego kursu (w bibliotece zmieniłem odpowiednie porty) a programując, lcd nie reagował. Potem zmieniłem na port od C2 do C7 i wszystko działało poprawnie? Jaka może być tego przyczyna?

    OdpowiedzUsuń