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