KAMAMI ZL31ARM: OLED w SmartSwitch’u i STM32F103
Zapis do pamięci obrazu sterownika wyświetlacza polega na wysłaniu danych przez interfejs SPI podczas gdy linia D/C ma stan wysoki. Ponieważ sterownik jest przystosowany do pracy również z większymi wyświetlaczami jego pamięć jest większa niż wymagana dla 3072 pikseli (64×48), umiejscowienie widocznego na wyświetlaczu obrazu w pamięci sterownika widać na rysunku 4.
Rys. 4. Obszar pamięci kontrolera OLED widoczny na wyświetlaczu
Zanim zaczniemy zapisywać do pamięci sterownika obraz musimy poinformować sterownik do jakiego okna mają trafić dane, służą do tego instrukcje:
- 0x15, następnie wysyłamy numery pierwszej i ostatniej kolumny okna
- 0x75, następnie wysyłamy numery pierwszego i ostatniego wiersza okna
Aby zapisać cały ekran przycisku ISC15ANP4 musimy wysłać sekwencje 0x15, 0x10, 0x4F i 0x75, 0x0, 0x2F. Ta operacja jest realizowana przez funkcję ISC15ANP4_SetRangeToFullScreen.
void ISC15ANP4_SetRangeToFullScreen() { DC_Low(); SS_Low(); SPI_Transmit(0x15); SPI_Transmit(0x10); SPI_Transmit(0x4F); // Set column range SS_High(); SS_Low(); SPI_Transmit(0x75); SPI_Transmit(0x0); SPI_Transmit(0x2F); // Set row range SS_High(); DC_High(); }
Rys. 5. Format zapisu koloru pojedynczego piksela
Po ustaleniu okna możemy przystąpić do wysłania obrazu do wyświetlenia. Kolor każdego piksela jest określony przez dwa bajty (format RGB 565 – rysunek 5). Przykładowa aplikacja wyświetla na zmianę dwie bitmapy zapisane w tablicach cortex i isc15anp4, zmiana wyświetlanego obrazu następuje po naciśnięciu przycisku, nowa bitmapa jest „wskrolowywana” na wyświetlacz od prawej strony, funkcja realizująca tę operację wygląda następująco:
void ISC15ANP4_Transition(char * from, char * to) { int x, y, step = 0; DC_High(); for (step = 0; step < 64; step+=5) { for (y = 0; y < 48; y++) { for (x = 0; x <= step; x++) { SS_Low(); SPI_Transmit(to[2*(y * 64 + (63-step+x))]); SS_High(); SS_Low(); SPI_Transmit(to[2*(y * 64 + (63-step+x))+1]); SS_High(); } for (x = step + 1; x < 64; x++) { SS_Low(); SPI_Transmit(from[2*(y*64 + x -step)]); SPI_Transmit(from[2*(y*64 + x -step)+1]); SS_High(); } } } ISC15ANP4_DrawScreen(to); }
void ISC15ANP4_DrawScreen(char * buffer) { int i; DC_High(); for (i = 0; i < 64*48*2; i++) { SS_Low(); SPI_Transmit(buffer[i]); SS_High(); } }
Parametry from i to są wskaźnikami początków tablic z bitmapami odpowiednio: początkową i końcową. W tej funkcji ze względu na dobranie kroku przesunięcia o wartości 5 (czyli kolejna klatka animacji prezentuje bitmapy przesunięte o 5 pikseli w lewo w stosunku do poprzedniej) na końcu wywołujemy funkcję ISC15ANP4_DrawScreen, która rysuje bitmapę końcową (jest to konieczne, bo przy kroku o wartości 5 nie dojdziemy do wartości 63).