Wyświetlacze ze sterownikiem PCD8544 były stosowane w starych modelach telefonów komórkowych Nokii. Obecnie łatwo dostępne i relatywnie tanie pozwolą poszerzyć możliwości urządzenia z STM-em.
Manipulator (joystick) analogowy
Manipulator może być wykorzystany jako wygodny w użyciu interfejs sterujący lub wprowadzający dane. Element użyty w przykładach nosi nazwę handlową "joystick PS2". Jego schemat elektryczny pokazano na rysunku 1. Niewielki manipulator ma wymiary 35 mm×27 mm×32 mm.
Głównymi elementami są dwa potencjometry zamontowane na płytce drukowanej pod kątem prostym. Ośki potencjometrów połączone są z pionowym drążkiem za pomocą przegubu. Drążek ma możliwość wychylenia w płaszczyźnie X-Y a jego ruch przenoszony jest na ośki potencjometrów.
W zależności od położenia drążka napięcie na suwakach potencjometrów zmienia się w zakresie od 0 V do napięcia zasilania (na schemacie zaznaczone jako +5 V). Napięcie zasilania może mieć dowolną wartość a w układach z kontrolerem STM32 nie powinno przekraczać 3,3 V. Dodatkowo, naciśnięcie drążka powoduje zadziałanie przycisku SW zwierając do masy wyprowadzenie J-1.
Wyświetlacz graficzny
Jako wyświetlacz wybrany został moduł z wyświetlaczem LCD stosowanym kiedyś w telefonach Nokia 5110. Na rysunku 2 pokazano jego wygląd i wymiary. Monochromatyczny wyświetlacz ma rozdzielczość 84×48 piksele. Może być zasilany napięciem 3,3 V. W module można skorzystać z podświetlenia matrycy 4 białymi diodami LED. Pracą wyświetlacza steruje zamontowany na płytce modułu układ PCD8544 lub jego odpowiednik. W tabeli 1 umieszczono zestawienie sygnałów wyprowadzonych na 2 złączach 8 stykowych.
Format transmisji do wyświetlacza
Przesyłanie danych i rozkazów do wyświetlacza odbywa się w formacie podobnym do SPI. Wykorzystywane są trzy sygnały:
- SDIN linia szeregowa, po której przesyłane są dane.
- SCLK linia zegara, którego zbocza narastające zatrzaskują kolejne przesyłane bity danych.
- SCE - linia uaktywniająca dostęp do wyświetlacza, gdy jej poziom będzie niski.
Na rysunku 3 przedstawiono przebiegi czasowe podczas transmisji 1 bajtu do wyświetlacza. Do wyświetlacza można wysyłać większą liczbę danych przy sygnale SCE stale utrzymywanym na poziomie niskim.
Organizacja pamięci obrazu
W module wyświetlacza z PCD8544 każdy piksel obrazu jest zapalany lub gaszony stanem pojedynczego bitu pamięci obrazu. Przy rozdzielczości matrycy 84×48 daje to 504 bajty. Cała pamięć zorganizowana jest w 6 bankach po 84 bajty każdy (rysunek 4). Po wpisaniu do pierwszego bajtu banku 0 wartości 0xFF w lewym górnym rogu wyświetlacza pojawi się pionowa linia o długości 8 pikseli.
Za pomocą rozkazów sterujących można określić miejsce w pamięci obrazu, do którego ma zostać wpisany bajt danych. Licznik wierszy można ustawić w przedziale od 0 do 5. Licznik kolumn można ustawić w przedziale od 0 do 83.
Po zapisaniu do pamięci obrazu danej, liczniki kolumn i wierszy zostaną automatycznie zwiększone. Zależnie od ustawionego wcześniej trybu pracy wyświetlacza inkrementacja liczników przebiegnie odmiennie. W trybie poziomym (horyzontalnym) zwiększany zostanie licznik kolumn.
Po osiągnięciu wartości 83 przed kolejnym wpisem do pamięci obrazu zostanie wyzerowany natomiast licznik rzędów zwiększy się o 1 (rysunek 5).
W trybie pionowym (wertykalnym) zwiększony zostanie licznik rzędów. Po osiągnięciu wartości 5 przed kolejnym wpisem do pamięci obrazu zostanie wyzerowany natomiast licznik kolumn zwiększy się o 1 (rysunek 6).
Wyświetlacz rozkazy sterujące
Oprócz rozkazów ustawiających liczniki kolumn i wierszy inne wpływają na tryb pracy, ustawienie kontrastu wyświetlacza itd. Przesyłane dane traktowane są jak komendy sterujące, gdy linia D/C jest wyzerowana.
Rozkazy sterownika PCD8544 zebrane zostały w tabeli 2, natomiast ustawienia bitów konfiguracyjnych w tabeli 3.
Przogram przykładowy
Przykładowy program ma działać tak by zamieniać wychylenie manipulatora na liczby odpowiednio dla osi X (poziomej) i Y (pionowej).
Chwilowa pozycja wskazywana przez joystik wyświetlana będzie na wyświetlaczu.
Ze względu na łatwość dołączenia wyświetlacza i manipulatora do testów użyty został opisywany we wcześniejszych numerach EP Panel Edukacyjny.
W tabeli 4 podano wykaz połączeń pomiędzy wyświetlaczem, manipulatorem a Panelem. Dodatkowo, w gnieździe J5 Panelu można zamocować wyświetlacz LCD 2×16.
Przykładowy program został przygotowany dla środowiska CooCox.
Procedury do obsługi joystika analogowego
Ponieważ joystick dostarcza na wyjściach poziomy napięć proporcjonalne do ustawionej pozycji, w systemie z mikrokontrolerem należy je najpierw przekształcić do postaci cyfrowej. STM32F103RC zamontowany na Panelu wyposażony jest w konwerter analogowo-cyfrowy o rozdzielczości 12 bitów a więc zupełnie wystarczającej.
Przedstawiona dalej procedura została oparta na przykładzie z biblioteki stm3210x_stdpheriph_lib. Do obsługi konwersji napięć z dwu kanałów X i Y joystika wykorzystano interfejsy ADC1 i ADC3 przetwornika oraz DMA. Dzięki takiemu rozwiązaniu po jednokrotnej inicjacji konwersje przebiegają całkowicie automatycznie wraz z odświeżaniem wyniku we wskazanych rejestrach programu.
Zgodnie z tym, co zostało podane w tabeli, napięcie z potencjometru X manipulatora podawane jest na wejście portu PC2, zaś napięcie z potencjometru Y na wejście PC4. Oba porty podłączone są wewnętrznie w kontrolerze do kanałów 12 i 14 przetwornika A/C.
Na początku należy zadeklarować adresy bazowe interfejsów ADC1 i ADC3 oraz zmiennych, w których po konwersji będą umieszczane wyniki dla kanału X i Y:
#define ADC1_DR_Address
((uint32_t)0x4001244C)
#define ADC3_DR_Address
((uint32_t)0x40013C4C)
uint16_t ADC1ConvertedValue,
ADC3ConvertedValue;
Potem do portów i DMA należy podłączyć wewnętrzny zegar i zainicjować porty w analogowym trybie pracy (listing 1). Kolejna procedura inicjuje interfejsy ADC1, ADC3, kanały DMA oraz uruchamia automatyczną konwersję. Zamieszczono ją na listingu 2.
Od tego momentu zmienne ADC1ConvertedValue, ADC3ConvertedValue będą automatycznie odświeżane po zakończeniu kolejnej konwersji. Ponieważ przetwornik pracuje z 12 bitową rozdzielczością wyniki konwersji umieszczane w zmiennych będą mogły przyjąć wartość od 0 do 4095.
Procedury obsługi modułu wyświetlacza
Najpierw należy zadeklarować porty kontrolera, które będą sterować odpowiednimi liniami wyświetlacza. Połączenia pomiędzy portami Panelu i liniami wyświetlacza podane zostały w tabeli. W procedurach zamiast nazwą portu wygodnie jest posłużyć się etykietą:
- PCD8544_SCLK_WY - PA0, sygnał SCLK wyświetlacza.
- PCD8544_DN_WY - PA1, sygnał DN wyświetlacza.
- PCD8544_DnC_WY - PA2, sygnał D/N wyświetlacza.
- PCD8544_RST_WY - PA5, sygnał RESET wyświetlacza.
- PCD8544_SCE_WY - PA6, sygnał SCE wyświetlacza.
Najpierw znanym sposobem należy podłączyć sygnał zegarowy do portów (w tym przypadku PA) i zainicjować je w trybie wyjścia z podciąganiem GPIO_Mode_Out_PP. Potem wstępnie ustawiamy odpowiednie poziomy na poszczególnych portach - listing 3.
Podstawowa procedura transmisji pojedynczego bajtu do modułu wyświetlacza może być taka, jak na listingu 4. Na tej procedurze oparto procedury transmisji danych do pamięci obrazu oraz wysyłania rozkazów sterujących. Wyglądają one następująco:
//procedura zapisu danej obrazu do sterownika PCD8544
void WriteData_PCD8544(unsigned char dana)
{
GPIO_PCD8544_Low(PCD8544_SCE_WY);
GPIO_PCD8544_High(PCD8544_DnC_ WY);//wysyłanie danych obrazu WriteSPI_PCD8544(dana);
GPIO_PCD8544_ High(PCD8544_SCE_WY);
}
//procedura zapisu rozkazu do sterownika PCD8544 void WriteCmd_ PCD8544(unsigned char dana)
{
GPIO_PCD8544_ Low(PCD8544_SCE_WY);
GPIO_PCD8544_ Low(PCD8544_DnC_ WY);//wysyłanie komend WriteSPI_PCD8544(dana);
GPIO_PCD8544_High(PCD8544_SCE_WY);
}
Po opisanym wcześniej zainicjowaniu portów kontrolera należy wywołać procedurę inicjacji samego wyświetlacza. Sprowadza się ona do przesłania do wysłania sekwencji komend a na koniec do wyczyszczenia pamięci obrazu. Całą sekwencję zaprezentowano na listingu 5.
Kolejna procedura służy do ustawienia licznika wierszy i kolumn na pożądaną wartość. Ustawienia te wyznaczą na wyświetlaczu pozycję, od której rozpocznie się wyświetlanie nowego tekstu (listing 6). Następne procedury konwertują łańcuch znaków na ich graficzną reprezentację przesyłaną do wyświetlenia. Kształt każdego znaku zapisany jest w tabeli-matrycy znaków 5*8 pikseli. Zamieszczono je na listingu 7.
Główna pętla programu
W głównej, nieskończonej pętli programu (listing 8) następuje:
- Przekształcenie otrzymanych po konwersji wartości do zakresu odpowiadającego rozdzielczości poziomej i pionowej.
- Wymazanie poprzednich napisów na wyświetlaczu.
- Wyświetlenie informacji o nowej pozycji joysticka.
Program demonstracyjny został przygotowany jako pakiet środowiska programistycznego CooCox.
Ryszard Szymaniak, EP