Kurs XMEGA: wyświetlacz LCD (05)


Kurs XMEGA
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, którą można pobrać ze strony Leon Instruments. 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.
Pliki do pobrania:


Wskazujemy pliki hd44780.c oraz hd44780.h, które wcześniej ściągnęliśmy z serwera.

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


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ż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 X3-DIL64. 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
        }
    }
}


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


Pliki do pobrania:
Kurs XMEGA:Moduły prototypowe:

13 komentarze :

Anonimowy pisze...

Wyświetlacz ze sterem HD44780 jest świetny :) mimo że są dostępne różne graficzne, kolorowe z panelem dotykowym i innymi cudami, to jednak HD44780 jest najprostszy i najwygodniejszy w programowaniu.

Dominik Leon Bieczyński pisze...

za graficzne wyświetlacze też się weźmiemy w kursie xmega :)

Łukasz Patulski pisze...

"za graficzne wyświetlacze też się weźmiemy w kursie xmega :)" - już się nie mogę doczekać ! :)

Dominik Leon Bieczyński pisze...

Będzie ale w swoim czasie :) póki co płytka z tym wyświetlaczem leży u mnie na biurku i trzeba by najpierw jeszcze napisać parę odcinków kursu. Obecnie są same podstawy, ale od czegoś trzeba zacząć.

Anonimowy pisze...

Szanowny kolego Leonie, a pozostałe wejścia wyświetlacza nie muszą być podłączone?

Dominik Leon Bieczyński pisze...

Dokładnie tak - mają być niepołączone

Anonimowy pisze...

Co należy zmienić w kodzie programu wyświetlacza dla płytki eXtrino XL ?

Dominik Leon Bieczyński pisze...

W pliku H od biblioteki wyświetlacza trzeba skonfigurować odpowiednie piny. Napisz do mnie to wyślę Ci gotową bibliotekę.

Anonimowy pisze...

W tej chwili do Arduino Uno stosuję wyświetlacz 4x20 QC20004A z modułem konwertera I2C dla wyświetlacza LCD HD44780. Działa to znakomicie z biblioteką: LiquidCrystal_I2C.h [Malpartida - http://arduino-info.wikispaces.com/LCD-Blue-I2C). Czy jest jakaś biblioteka do ATXmega128A3U zapewniająca taką funkcjonalność, lub chociaż użycie wyświetlacza 4x20 ze sterowanym podświetlaniem?

Dominik Leon Bieczyński pisze...

Oczywiście - biblioteka z tej strony działa poprawnie.

Dominik Markowski pisze...

Super kurs, fajne wprowadzenie do xmegi :) Czy ktoś mógłby podesłać jakiś przykład z wykorzystaniem biblioteki LiquidCrystal_I2C.h? Z góry wielkie dzięki

Dominik Leon Bieczyński pisze...

a co to za biblioteka?

Dominik Markowski pisze...

Biblioteka, o której pisał kolega w komentarzu z 22 października . Malpartida - http://arduino-info.wikispaces.com/LCD-Blue-I2C)

Prześlij komentarz

Skomentuj!

Sklep Leon Instruments