[APLIKACJA] STM32 i monochromatyczny wyświetlacz OLED
Mając do dyspozycji procedurę wysyłania bajtów można napisać dwie funkcje służące do wysyłania kodów poleceń i pojedynczych danych do kontrolera wyświetlacza (pokazane odpowiednio na listingach 5 i 6).
List. 5. Funkcja wysyłająca kod polecenia do sterownika wyświetlacza
//wysłanie komendy Status OledCmd(uint8_t cmd){ uint8_t BufCmd[3]; BufCmd[0]=0x80;//bajt kontrolny BufCmd[1]=cmd; return(I2C_Master_BufferWrite(I2C1, BufCmd,2,DMA, 0x78)); }
List. 6. Funkcja wysyłająca do sterownika wyświetlacza pojedynczą daną
Status OledData(uint8_t data){ uint8_t BufData[3]; BufData[0]=0x40; BufData[1]=data; return(I2C_Master_BufferWrite(I2C1, BufData,2,DMA, 0x78)); }
Funkcja OledCmd jest przeznaczona tylko do wysyłania komend bez argumentu. Zgodnie z tym co powiedzieliśmy wcześniej, w bajcie kontrolnym przesyłanym po adresie slave bit Co=1 i bit D/C=0. Kiedy przesyłana jest dana przez funkcję OledData, to w bajcie kontrolnym Co=0 i D/C=1.
Każde przesłanie danej z wykorzystaniem funkcji OledData wymaga wysłania adresu slave, bajtu kontrolnego i bajtu danych. W przypadku przesyłania dużej ilości danych – na przykład przy wyświetlaniu całych bitmap – można skorzystać z procedury I2C_Master_BufferWrite, tylko należy pamiętać, że pierwszy bajt bufora wysyłany po adresie slave jest bajtem kontolnym o wartości 0x40.
Sterownik wyświetlacza graficznego przed rozpoczęciem pracy wymaga zainicjowania. Konieczność inicjalizacji wynika na przykład z możliwości ustalania współrzędnej początkowej (0,0) zależnie od mocowania mechanicznego panelu, różnych źródeł zasileń driverów matrycy (wewnętrzna przetwornica vs napięcie podawane zewnętrznie), poziomu kontrastu, częstotliwości odświeżania itp. Inicjalizacja polega na wysłaniu szeregu komend ustalających początkowe parametry pracy (szczegóły są dostępne w dokumentacji sterownika).
Ponieważ część komend wymaga podania argumentu, to nie użyłem do inicjowania funkcji OledCmd, tylko wszystkie bajty komend inicjalizacji łącznie z niezbędnymi argumentami umieściłem w buforze Buffer_Init. Zawartość bufora z pierwszym bajtem kontrolnym 0x80 jest wysyłana do sterownika wyświetlacza funkcją I2C_Master_BufferWrite. Zawartość tego bufora została pokazana na listingu 7.
List. 7. Bufor Buffer_Init z komendami inicjalizacji
uint8_t Buffer_Init[255]={0x80, //control byte 0xae,//Display OFF 0x00,//Low Column 0x10,//High Column 0xB0,//Page 0x40,//Start line 0xA1,//remap 0xDA,//com pins 0x12, 0xD3, //display offset 0x00,//NO offset 0xc0,//scan direction 0xc8, 0xA6,//normal display 0xA4,//display ON 0x81,//set contrast 0x50,//contrast DATA 0xa8,//multiplex ratio 0x3f,//1/64 duty 0xD5,//Display clock divide 0x80, 0xd9,//precharge period 0xF1, 0xDB,//VCOM deselect 0x40, 0x8d,//charge pump 0x14, 0xAF,//display ON };
Inicjalizację można podzielić na kilka etapów:
- wyzerowanie liczników: kolumn, stron pamięci i linii początkowej,
- Ustawienie powiązania zawartości pamięci RAM obrazu z pozycją na panelu OLED (orientacja wyświetlania),
- Ustawienie kontrastu, przetwornicy DC/DC zasilającej drivery, i częstotliwości taktowania, oraz włączenie wyświetlenia.
Żeby prawidłowo zapisywać dane do zainicjalizowanego sterownika trzeba znać powiązanie zawartości pamięci obrazu z wyświetlanymi pikselami na matrycy OLED. Matryca w modOLED13 jest monochromatyczna, a w takim przypadku jednemu pikselowi odpowiada jeden bit w pamięci obrazu. Pomimo, że pamięć ma rozmiar 132×64 bity, to w rzeczywistości ma ona organizacje bajtową. Host wysyła kolejne bajty po magistrali I2C pod lokacje określone przez liczniki kolumn i stron.
Rys. 5. Adresowanie pamięci obrazu (pokazano jej fragment odpowiadający trzem pierwszym znakom)