Digilent Pmod i STM32 (cz. 7) – PmodBT2, PmodTC1 i PmodCLP
PmodCLP
Ostatni z modułów opisywanych w tej części cyklu, PmodCLP, posiada wyświetlacz znakowy LCD zawierający 2 linie po 16 znaków. W roli kontrolera wyświetlacza użyto układu KS0066 firmy Samsung obsługującego wyświetlacze jedno- i dwuliniowe. Komunikacja z nim odbywa się za pomocą interfejsu równoległego, przez który wysyłane są zarówno komendy, jak i dane do wyświetlenia.
Sterowanie układu KS0066
Układ KS0066 posiada trzy typy wewnętrznej pamięci:
- CGROM – zawiera predefiniowany zestaw 192 znaków o rozmiarze 5×8 pikseli,
- CGRAM – umożliwiaja zdefiniowanie do 8 znaków użytkownika,
- DDRAM – przechowująca aktualnie wyświetlany zestaw znaków.
Wyświetlenie napisu jest możliwe przez zapis do pamięci DDRAM za pośrednictwem interfejsu równoległego, którego sygnały przedstawiono w tabeli 5. Za jego pomocą można także konfigurować wyświetlacz wysyłając do niego instrukcje. Część dostępnych instrukcji, użytych w przykładzie, razem z wybranymi parametrami została przedstawiona w tabeli 6. Szczegóły dotyczące wszystkich instrukcji, a także ich struktury znajdują się w dokumentacji modułu na stronie:
https://reference.digilentinc.com/reference/pmod/pmodclp/reference-manual
Tabela 5. Sygnały sterujące modułem PmodCLP
Sygnał | Opis |
DB0-DB7 | 8-bitowa szyna danych i instrukcji |
RS | Tryb instrukcji (stan niski) i danych (stan wysoki) |
R/W | Tryb zapisu (stan niski) i odczytu (stan wysoki) |
E | Wyzwalanie zapisu (na zboczu opadającym) lub tryb odczytu (w stanie wysokim) |
Tabela 6. Opis komend użytych w przykładzie wraz z ich parametrami
RS | R/W | DB7-DB0 | Opis |
0 | 0 | 0x38 | 8-bitowe dane (DB4 = 1), 2 linie (DB3 = 1), rozmiar znaku 5×8 (DB2 = 0) |
0 | 0 | 0x0C | Włączenie wyświetlacza (DB2 = 1), niewidoczny kursor (DB1 = 0) |
0 | 0 | 0x01 | Wyczyszczenie wyświetlacza |
0 | 0 | 0x06 | Przesuwanie kursora w prawo (DB1 = 1), wyłączenie przesuwania napisu (DB0 = 0) |
0 | 0 | 0x80 | Ustawienie kursora na początku pierwszej linii |
0 | 0 | 0xC0 | Ustawienie kursora na początku drugiej linii |
Połączenie z płytką KAmeleon
Ze względu na dużą liczbę sygnałów, moduł PmodCLP podłączono do złącza ARDUINO CONNECTOR według tabeli 7. W przykładzie używane są tylko komendy do zapisu danych i instrukcji, dlatego piny mikrokontrolera mogą być skonfigurowane wyłącznie jako wyjścia.
Tabela 7. Sposób podłączenia modułu PmodCLP do płytki KAmeleon
Sygnał | Numer pinu PmodCLP | Numer pinu KAmeleon ARDUINO CONNECTOR | Pin mikrokontrolera |
DB0 | 1 (J1) | D0 | PC5 |
DB1 | 2 (J1) | D1 | PC4 |
DB2 | 3 (J1) | D2 | PD6 |
DB3 | 4 (J1) | D3 | PB6 |
GND | 5 (J1) | GND | – |
VCC | 6 (J1) | +3,3 | – |
DB4 | 7 (J1) | D4 | PB9 |
DB5 | 8 (J1) | D5 | PD9 |
DB6 | 9 (J1) | D6 | PD10 |
DB7 | 10 (J1) | D7 | PB11 |
GND | 11 (J1) | – | – |
VCC | 12 (J1) | – | – |
RS | 1 (J2) | D8 | PD11 |
R/W | 2 (J2) | D9 | PB13 |
E | 3 (J2) | D10 | PB12 |
NC | 4 (J2) | – | – |
GND | 5 (J2) | – | – |
VCC | 6 (J2) | – | – |
Kod przykładu
Obsługa wyświetlacza znajduje się w plikach inc/PmodCLP.h, a także src/PmodCLP.c. W pierwszym z nich znajdują się definicje użytych pinów, portów, a także funkcji włączających sygnały zegarowe. Służą one ułatwieniu konfiguracji ze względu na duża liczbę sygnałów. Za samą konfigurację odpowiedzialna jest funkcja PmodCLP_Config. Włącza sygnały zegarowe dla kolejnych portów, a także konfiguruje piny jako wyjścia. Następnie program inicjalizację wyświetlacza, którą przedstawiono na listingu 8. Jest ona zgodna z procedują inicjalizacji przedstawioną w dokumentacji modułu, natomiast użyte w niej komendy zostały wyjaśnione w tabeli 6. Zastosowane opóźnienia pomiędzy instrukcjami zostały wydłużone ze względu na ograniczenie funkcji bibliotecznej HAL_Delay, która przyjmuje jedynie całkowitą liczbę milisekund.
Listing 8. Sekwencja inicjalizacji wyświetlacza
HAL_Delay(20); writeCommand(0x38); HAL_Delay(1); writeCommand(0x0C); HAL_Delay(1); writeCommand(0x01); HAL_Delay(2); writeCommand(0x06);
Funkcje pomocnicze
Podczas konfiguracji wykorzystywane są następujące funkcje pomocnicze ułatwiające zarządzanie pinami, a także korzystanie z interfejsu równoległego:
- configGpio – konfiguruje podany pin GPIO jako wyjście,
- setGpio – ustawia podany pin w stan wysoki,
- resetGpio – podaje stan niski na podany pin,
- writeGpio – ustawia podany pin w dowolny stan przekazany jako argument,
- setDataBits – wystawia podaną wartość 8-bitową na liniach DB7 – DB0,
- writeCommand – wysyła podaną instrukcję,
- writeData – wysyła podany bajt danych.
Wyświetlanie napisów
Do wyświetlania napisów zaimplementowano funkcję PmodCLP_Write, przedstawioną na listingu 9. Przyjmuje ona numer linii, a także napis wraz z jego długością, a następnie wysyła go do wyświetlacza. Wybór linii (0, lub 1) odbywa się przez zapis instrukcji ustawiającej kursor na odpowiednim adresie pamięci DDRAM. Dane do wyświetlacza mogą być wysłane bezpośrednio w kodzie ASCII, ze względu na zastosowane mapowanie kodów znaków w pamięci CGROM.
Listing 9. Wysyłanie napisu na wyświetlacz
void PmodCLP_Write(uint8_t line, char* text, uint32_t len) { if(line >= MAX_LINES || len > MAX_LINE_CHARACTERS) return; if(line == 0) writeCommand(0x80); else writeCommand(0xC0); for(uint32_t i = 0; i < len; i++) writeData((uint8_t)text[i]); }
Główna funkcja programu – main, wywołuje funkcję konfiguracji modułu PmodCLP, a także wyświetla napis:
Hello PmodCLP! KAmeleon Board
Efekt działania programu jest widoczny na fotografii 7.
Fotografia 7. Wyświetlanie napisu na module PmodCLP