[e-PAPER] STM32L0538-DISCO w praktyce [2]: podstawy obsługi wyświetlacza e-paper GDE021A1 [PRZYKŁADY]
Uwaga! Wszystkie opublikowane odcinki kursu są dostępne pod adresem.
W tej części artykułu pokażemy w jaki sposób włączyć wybrane piksele wyświetlacza e-paper i w jaki sposób wyświetlić na wyświetlaczu GDE021A1 wcześniej przygotowaną monochromatyczną bitmapę.
Wyświetlacz GDE021A1, zastosowany w zestawie STM32L0538-DISCO, wyświetla obrazy o rozdzielczości 172×72 pikseli w monochromatycznej skali barw. Aby wyświetlić dowolny piksel na wyświetlaczu stworzymy następującą funkcję w bibliotece stm32l0538_discovery_epd.c :
void BSP_EPD_Pixel(uint16_t Xpos, uint16_t Ypos, uint8_t HEX) { epd_drv->SetDisplayWindow(Xpos, Ypos, Xpos, Ypos); epd_drv->WritePixel(HEX); }
Parametr Xpos odpowiada za rząd w którym zostanie wyświetlony piksel na dłuższym boku wyświetlacza. Może przybierać wartości od 0 do 171 (zgodnie z długością wyświetlacza, czyli 172 piksele).
Parametr Ypos odpowiada za rząd w którym zostanie wyświetlony piksel na krótszym boku wyświetlacza. Wartości wysyłane wyświetlacza są ośmiobitowe: cztery bity dla rejestru odpowiadającego za rząd X i 4 bity dla rzędu Y. Parametr Ypos może przybierać wartości od 0 do 17. Każda wartość odpowiada 4 pikselom, więc Ypos = 0 odpowiada za piksele 0…3, Ypos = 1 odpowiada za piksele 4…7 itd. Całkowita szerokość wyświetlacza to 18 pomnożone przez 4, czyli 72 piksele.
Parametr HEX pozwala na włączenie dowolnej kombinacji 4 pikseli, których dane są przesyłane w zapisie ośmiobitowym. Parametr HEX przybiera wartości w zapisie heksadecymalnym, od 0x00 do 0xFF. Pierwsza liczba (po lewej) wskazuje na dwa pierwsze piksele z czterech, po dwa bity na każdy piksel. Jeżeli chociaż jeden z dwóch bitów będzie miał wartość 0, piksel zostanie włączony, jeżeli oba będą mieć wartość 1, piksel będzie wyłączony. Liczba 0xFF oznacza wszystkie 4 piksele wyłączone, liczba 0x00 wszystkie włączone.
W funkcji main() deklarujemy użycie wyświetlacza za pomocą funkcji BSP_EPD_Init(); a następnie używamy następujących funkcji aby wyświetlić obraz na wyświetlaczu:
BSP_EPD_Clear(EPD_COLOR_WHITE);
BSP_EPD_Pixel(uint16_t Xpos, uint16_t Ypos, uint8_t HEX);
BSP_EPD_RefreshDisplay();
Funkcja BSP_EPD_Clear(EPD_COLOR_WHITE); zmienia wszystkie piksele wyświetlacza na białe pozwalając na wyświetlenie nowego obrazu.
Funkcja BSP_EPD_RefreshDisplay(); odświeża wyświetlacz i wyświetla piksele po załadowaniu ich danych do pamięci RAM mikrokontrolera.
Przykłady:
BSP_EPD_Pixel(0, 0, 0xFE); – włączenie piksela w punkcie 1×1
BSP_EPD_Pixel(0, 0, 0xFD); – włączenie piksela w punkcie 1×1, inny sposób
BSP_EPD_Pixel(99, 5, 0xFE); – włączenie piksela w punkcie 100×20
BSP_EPD_Pixel(99, 5, 0x80); – włączenie piksela w punkcie 100×23
BSP_EPD_Pixel(99, 5, 0x88); – włączenie pikseli w punktach 100×21 i 100×23
BSP_EPD_Pixel(99, 10, 0xFF); – włączenie pikseli w punktach 100×41, 100×42, 100×43 i 100×44
Wyświetlanie bitmap
Aby wyświetlić bitmapę na wyświetlaczu e-paper zestawu STM32L0538-DISCO, należy sformatować obraz i skonwertować go na kod możliwy do przesłania do pamięci RAM mikrokontrolera.
Wstępną edycję obrazu możemy dokonać w dowolnym programie graficznym. Programem, który umożliwi konwersję bitmapy na kod oraz edycję zapewniającą dobrą jakość wyświetlonego obrazu jest darmowy program XnView. Rozmiar obrazu nie może przekroczyć rozdzielczości wyświetlacza, czyli 172×72 pikseli, możemy tego dokonać wybierając opcję Zmień rozmiar… z zakładki Obraz .
Następnym krokiem jest zapisanie obrazu w czarno-białej skali barw, w zależności od obrazu wybieramy rodzaj konwersji zapewniający najlepszy efekt z zakładki Obraz i Konwertuj do czarno-białego .
Po konwersji część detali może zniknąć, możemy w tym momencie zapisać plik i dokonać jego edycji w dowolnym programie graficznym, np. Paint. Aby otrzymać obraz na wyświetlaczu odpowiadający naszej bitmapie, musimy obrócić go o 90° zgodnie ze wskazówkami zegara (jego rozmiar zmieni się z 172×72 na 72×172 pikseli).
Ostatnią częścią przygotowania obrazu jest zapisanie go w formacie XBM-X11 korzystając z opcji Zapisz jako… i wybraniu formatu z listy.
W utworzonym wcześniej projekcie w środowisku ARM-MDK otwieramy bitmapę zapisaną w formacie .xbm .
Kopiujemy cały kod oprócz definicji rozmiarów (możemy je skopiować i skomentować aby pamiętać o rozmiarze) do main.c jako prywatną funkcję, zmieniając static char x_bits[] = na static uint8_t x_bits[] = . W miejscu x_bits wpisujemy nazwę naszej funkcji, np. static uint8_t Logo[] = .
W funkcji main() deklarujemy użycie wyświetlacza za pomocą funkcji BSP_EPD_Init(); a następnie używamy następujących funkcji aby wyświetlić obraz na wyświetlaczu:
BSP_EPD_Clear(EPD_COLOR_WHITE);
BSP_EPD_DrawImage(uint16_t Xpos, uint16_t Ypos, uint16_t Xsize, uint16_t Ysize, uint8_t *pdata);
BSP_EPD_RefreshDisplay();
Funkcja BSP_EPD_Clear(EPD_COLOR_WHITE); zmienia wszystkie piksele wyświetlacza na białe pozwalając na wyświetlenie nowego obrazu.
Funkcja BSP_EPD_DrawImage(uint16_t Xpos, uint16_t Ypos, uint16_t Xsize, uint16_t Ysize, uint8_t *pdata); służy do przesłania danych naszego obrazu do wyświetlacza. Parametry uint16_t Xpos , uint16_t Ypos określają gdzie zostanie wyświetlony obraz. Aby obraz został wyświetlony poprawnie wartość parametru Ypos musi być podzielna przez 4. Parametry uint16_t Xsize , uint16_t Ysize określają rozmiar wyświetlanego obrazu, muszą być zgodne z rozmiarami naszego obrazu (maksymalnie uint16_t Xsize = 72 i uint16_t Ysize = 172). Parametr uint8_t *pdata wskazuje na dane o naszym obrazie, więc należy to wpisać nazwę funkcji pod jaką znajdują się dane skopiowane z pliku .xbm . Przykładowe wywołanie funkcji ma postać: BSP_EPD_DrawImage(0, 3, 48, 172, Logo); .
Funkcja BSP_EPD_RefreshDisplay(); odświeża wyświetlacz i wyświetla nasz obraz po załadowaniu jego danych do pamięci RAM mikrokontrolera.
Jakub Górnicki