Redakcja: Dondu
Artykuł jest fragmentem cyklu: Kurs mikrokontrolerów XMega by Leon-Instruments
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 |
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. |
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.
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
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ń