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.

Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć
Fotorezystor, czyli czujnik światła dwojakiego działania. Przykład innowacji w automatyce i elektronice możliwej dzięki technologii fotooporników 



