[MBED] STM32 i SSD1306 – sterowanie dwukolorowym OLED [2]
Po każdym wyświetleniu jednego znaku na podstawie informacji o maksymalnych współrzędnych ekranu wyświetlacza (SSD1306_WIDTH i SSD1306_HEIGHT), oraz wartości argumentu size są wyliczane współrzędne kolejnego znaku. Jeżeli kolejny znak nie zmieści się w całości w linijce, to tekst jest automatycznie przenoszony na początek kolejnej linijki (CR, LF). Efekt działania krótkiego fragmentu programu z listingu 11 pokazano na fotografii 9.
List. 11. Wyświetlanie w trybie tekstowym
int main (void) { InitSSD1306 (); DispTxt(0,0,"Test wyswietlacz",16,1);//znaki 16pikseli – obszar żółty DispTxt(0,16,"Test wyswietlacz OLED",12,0);//znaki 12 pikseli – negatyw DispTxt(0,32,"Sterownik ",16,1);//znaki 16 pikseli DispTxt(76,36,"SSD1306",12,1);//znaki 12 pikseli RefreshRAM(); //przepisz do sterownika SSD1306 while(1); }
Wyświetlanie bitmap
Każda czcionka wyświetlana w trybie tekstowym jest bitmapą rysowaną na ekranie. Te bitmapy – wzorce znaków umieszczane są w tablicy generatora znaków i mają jednakowe wymiary. Jednak często zachodzi konieczność wyświetlania bitmap o różnych rozmiarach. Pewnym problemem jest konwertowanie monochromatycznych. Ja używam prostego programu bmp2c.exe potrafiącego konwertować monochromatyczne mapy o niewielkich rozmiarach na tablicę w języku C. Kiedy już mamy skonwertowana bitmapę, to procedura jej wyświetlania jest stosunkowo prosta – listing 12.
List. 12. Wyświetlenie bitmapy
//******************************************************************************** //rysuj bitmapę //argumenty //x,y współrzędne początku bitmapy //*bmp wskaźnik na tablicę z przekonwertowaną bitmapą //width - szerokość bitmapy //height - wysokość bitmapy //********************************************************************************* void DrawBmp(uint8_t x, uint8_t y, const uint8_t *bmp, uint8_t width, uint8_t height) { uint16_t i, j, byteWidth = (width + 7) / 8; for(j = 0; j < height; j ++){ for(i = 0; i < width; i ++) { if(*(bmp + j * byteWidth + i / 8) & (128 >> (i & 7))) { DrawPoint(x + i, y + j, 1); } } } }
Na fotografii 10 pokazano wyświetloną bitmapę, a na fotografii 11 kilka małych bitmap – ikon wyświetlanych w żółtym obszarze matrycy.