LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

Mikrokontrolery AVR XMEGA w praktyce, część 5. Wyświetlacz LCD

Miganie 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 16×2 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, link do pliku znajduje się na końcu artykułu. 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. Pokazano to na rysunku 1.

 

Rys. 1. Dodawanie plików do projektu

Rys. 1. Dodawanie plików do projektu

 

Wskazujemy pliki hd44780.c oraz hd44780.h, które wcześniej ściągnęliśmy z serwera KAMAMI. Powinny pojawić się w drzewku projektu, tak jak na rysunku 2.

 

 Rys. 2. Drzewko projektu z dodanymi plikami wyświetlacza HD44780

Rys. 2. Drzewko projektu z dodanymi plikami wyświetlacza HD44780

 

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, pokazanego na rysunku 3.

 

Rys. 3. Schemat układu z wyświetlaczem LCD

Rys. 3. Schemat układu z wyświetlaczem LCD

 

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ęcie 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. Efekt działania programu pokazano na rysunku 4 i 5.

#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
 }
 }
}

 

Rys. 4. Komunikat powitalny

Rys. 4. Komunikat powitalny

Rys. 5. Praca licznika po wciśnięciu przycisku FLIP

Rys. 5. Praca licznika po wciśnięciu przycisku FLIP

 

Dystrybutorem zestawu X3-DIL64 jest KAMAMI.pl.

Dominik Leon Bieczyński

http://leon-instruments.blogspot.com