Biblioteki graficzne Microchipa: obsługa touch-panela i LCD ze sterownikiem SSD1289
List. 2. Plik konfiguracyjny MY_BOARD.h
#define MY_BOARD//nazwa mojej “platformy” sprzętowej #define PIC32_USB_SK//definicje właściwe dla użytego mikrokontrolera #define GFX_USE_DISPLAY_CONTROLLER_SSD1289//użyty sterownik #ifdef MY_BOARD #define MY_TFT_PANEL//mój wyświetlacz #endif #if defined (MY_TFT_PANEL)//definicje właściwości wyświetlacza #define DISP_ORIENTATION 0 #define DISP_HOR_RESOLUTION 240 #define DISP_VER_RESOLUTION 320 #define DISP_DATA_WIDTH 18 #define DISP_INV_LSHIFT #define DISP_HOR_PULSE_WIDTH 25 #define DISP_HOR_BACK_PORCH 5 #define DISP_HOR_FRONT_PORCH 10 #define DISP_VER_PULSE_WIDTH 4 #define DISP_VER_BACK_PORCH 0 #define DISP_VER_FRONT_PORCH 2 #defined (MY_BOARD) //definicje linii sterujących magistrali równoległej #define LCD_CS PORTGbits.RG15 #define LCD_CS_TRIS TRISGbits.TRISG15 #define LCD_RS PORTGbits.RG14 #define LCD_RS_TRIS TRISGbits.TRISG14 #define LCD_RD PORTGbits.RG12 #define LCD_RD_TRIS TRISGbits.TRISG12 #define LCD_WR PORTGbits.RG13 #define LCD_WR_TRIS TRISGbits.TRISG13 #define LCD_RES PORTBbits.RB15 #define LCD_RES_TRIS TRISBbits.TRISB15 #endif
Tab. 1. Zalecany sposób połączenia wyświetlacza z liniami portów mikrokontrolera
Linia interfejsu |
Wyprowadzenie wyświetlacza |
Linia portu |
CS – aktywacja interfejsu aktywny stan niski |
CS |
RG15 |
RS (D/!C) – wybór rejestru: stan niski rejestr konfiguracyjny, stan wysoki dane pamięci obrazu |
RS |
RG14 |
RD – odczytu danych z magistrali aktywny stan niski |
RD |
RG12 |
WR – zapis danych na magistrali aktywny stan niski |
WR |
RG13 |
RES – zerowanie sterownika aktywny stan niski |
RES |
RB15 |
DATAH – 8 starszych bitów danych |
DB8…DB15 |
RE0….RE7 |
DATAL – 8 młodszych bitów danych |
DB0…DB7 |
RD0…RD7 |
Magistrala Intel 8080 składa się z linii danych i linii sterujących (opcjonalnie z linii adresowych). Linie sterujące to !WR i !RD. Cykl zapisu danych rozpoczyna się od wystawienia stanu niskiego na linii !WR, a następnie ważnych danych na magistrali. Narastające zbocze sygnału !WR zapisuje dane do rejestru sterownika. Interfejs sterujący jest uzupełniony o 2 dodatkowe linie: wyboru interfejsu CS i źródła zapisywanych danych D/!C (w opisie wyprowadzeń wyświetlacza ta linia nazywa się RS). Jeżeli linia D/!C jest w stanie wysokim to zapisywana jest pamięć danych, jeżeli w stanie niskim to zapisywany jest rejestr (adres rejestru).
Rys. 3. Sekwencja zapisu danych na magistralę
Na rysunku 4 pokazano przebiegi czasowe w czasie zapisu danych. Na listingu 3 pokazano procedurę zapisu danej (zaadresowanej komórki pamięci obrazu), a na listingu 4 zapis rejestru sterownika. Mikrokontroler jest taktowany z częstotliwością 80 MHz, a układy peryferyjne w tym linie portów z częstotliwością 40 MHz. Żeby zapewnić poprawne zbocza sygnałów sterujących po każdej zmianie ich stanu jest wykonywanych klika rozkazów NOP (dodatkowe opóźnienie). W czasie zapisu danych linia !RD musi cały czas pozostawać w stanie wysokim.
List. 3. Zapisanie danej na magistralę
//zapisanie danych void LcdWriteData(unsigned int data) { LCD_RD=1;Nop();Nop(); LCD_RS = 1;Nop();Nop(); LCD_CS = 0; Nop();Nop(); PORTE=(data>>8);Nop(); PORTD=data;Nop();Nop(); LCD_WR = 0;Nop();Nop(); LCD_WR = 1;Nop();Nop(); LCD_CS = 1;Nop();Nop(); }
List. 4. Zapis zawartości rejestru na magistralę
void LcdWriteControl(unsigned int data) { LCD_RD=1;Nop();Nop(); LCD_RS = 0;Nop();Nop(); LCD_CS = 0;Nop();Nop(); PORTE=(data>>8);Nop(); PORTD=data;Nop();Nop(); LCD_WR = 0;Nop();Nop(); LCD_WR = 1;Nop();Nop(); LCD_RS = 1;Nop();Nop(); LCD_CS = 1;Nop();Nop(); }
Odczytywanie danych również nie jest skomplikowane. Na listingu 5 pokazano procedurę odczytu danej z pamięci obrazu.
List. 5. Odczytanie danej z pamięci obrazu
unsigned short LcdReadData(void) { Unsigned short Data; LCD_WR=1;Nop();Nop(); LCD_RS = 0;Nop();Nop(); LCD_CS = 0;Nop();Nop(); LCD_RD = 0;Nop();Nop();Nop();Nop(); Nop();Nop(); Data=PORTE; Data=(data>>8); Data=Data|PORTD; LCD_RD = 1;Nop();Nop(); LCD_RS = 1;Nop();Nop(); LCD_CS = 1;Nop();Nop(); return(data); }
Każdy sterownik wyświetlacza graficznego wymaga inicjalizacji polegającej na zapisaniu rejestrów konfiguracyjnych. W przypadku sterownika SSD1289 zapisywanie rejestrów polega na wykonaniu cyklu zapisu adresu, a po nim cyklu zapisu 16-bitowej danej (listing 6).
List. 6. Procedura zapisu rejestrów sterownika
void SetReg(WORD index, WORD value) { LcdWriteControl(index); LcdWriteData(value); }
Kompletny cykl przykładowej inicjalizacji zapytał pokazany na listingu 7.