LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

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.

 

Absolwent Wydziału Elektroniki Politechniki Wrocławskiej, współpracownik miesięcznika Elektronika Praktyczna, autor książek o mikrokontrolerach Microchip i wyświetlaczach graficznych, wydanych nakładem Wydawnictwa BTC. Zawodowo zajmuje się projektowaniem zaawansowanych systemów mikroprocesorowych.