Grafični LCD

 

Velikokrat moramo svojemu projektu dodati tudi možnost prikaza različnih stvari. Ena od možnosti je LED prikazovalnik s 7 segmentnimi prikazovalniki, druga možnost je alfanumerični, “klasični” LCD velikosti od 1×8 do 4×40 znakov in vse vmes, tretja možnost so preprosti grafični LCD prikazovalniki (kot je opisan v nadaljevanju), “najlepšejšo” sliko pa dobimo z uporabo barvnih grafičnih LCDjev (npr. QVGA 320×240 TFT barvni LCD). Žal pa slednji potrebujejo tudi precej dodatne elektroniko in so zelo zahtevni s stališča procesiranja. Zaradi tega se mi zdi nekje najbolj optimalna izbira monokromatski (dvobarvni) LCD prikazovalnik ločljivosti 128×64 točk. Ta omogoča nekaj več kot običajni 2×16 alfanumerični, istočasno pa za krmiljenje ne potrebujemo nekega “hudega” programa. Vmesnik je “samo” SPI, kar zmanjša število potrebnih linij na minimum. Dobro je tudi, da je prikazovalnik dobavljiv. Jaz sem izbral model proizvajalca EDT z oznako ES13BB0BMW.

Monokromatski LCD ločljivosti 128×64 točk z osvetlitvijo

LCD proizvajalca Emerging Display Technologies ima oznako ES13BB0BMW ima diagonalo 73mm in je v modro/sivi kombinaciji. Obstajajo tudi kombinacije v zeleni, rumeni barvi. Poganja ga sitronixov  krmilnik  ST7565P, tako da je tale opis primeren za vse LCD prikazovalnike s tem krmilnikom brez sprememb ali zu minimalnimi prilagoditvami v inicializaciji. Za napajanje potrebujemo le 3,3V. Digitalne linije pa so SPI vhodne linije (SCK, MOSI in CS) ter ena linija za izbiro vpisa ukaza ali podatka (RS). LCD ima tudi osvetlitev, čeprav je viden tudi ob dnevni svetlobi brez osvetlitve.

Shema priklopa je prikazana na sliki:

LCD ima ploščat fleksibilen priključek, za katerega potrebujemo konektor. Izdelava vmesne ploščice je skoraj trivialna, saj v glavnem služi za prilagoditev ozkega rastra na LCD priključku na raster 2,54mm:

Tule je arhiv projekta za altium.

Izbira materiala

Konektor FCC
Molex 528521970
LCD 128×64 mono
ES13BB0BMW

Oboje lahko dobavi IC.

Priklop na mikrokrmilnik

LCD sem uspešno priklopil na LPC2138 in LPC2378. Lahko pa uporabimo katerikoli mikrokrmilnik, ki ima SPI in dodatna 2 pina za signal R/S ter vklop osvetlitve. Osvetlitev lahko tudi direktno vežemo na napajanje.

Spodaj je koda za preizkus delovanja. Edina datoteka, ki jo je potrebno prilagoditi lastnemu vezju je glcdhw.h, kjer so vse definicije hardverskih povezav med mikrokontrolerjem in LCD-jem.

Ker grafični LCD nima lastnih pisav, moramo sami poskrbeti za to. Sam sem uporabil kar kodo, ki je na voljo v tem projektu.

Povezave sem izbral takole:

*  P0.9 – MOSI 1
*  P0.7 – SCK1
*  P0.6 – LCD_CS
*  P0.5 – Backlight
*  P0.4 – LCD_RS

Koda je razdeljena na naslednje datoteke:

glcd.c Funkcije za krmiljenje grafičnega LCD in risanje osnovnih gradnikov
fonts.c Zbirka pisav
glcdhw.c Hardverske povezave med LCD in mikrokontrolerjem
lcdtest.c Testni program

Celotna izvorna koda je na voljo tule. V bistvu je to arhiv celotnega keilovega uVision projekta. Koda je pripravljena tako, da jo je zelo enostavno uporabiti kjerkoli drugje. Spremeniti moramo le funkcije v glcdhw.c.

Če LCD priklopimo na LPC2378 po zgoraj opisanem razporedu, je za prikaz napisa in enega krogca dovolj taka koda:

#include "glcd.h"

int main(void)
{
 glcd_Init();
 glcd_ClrScr(1);
 glcd_backlight(1);

 glcd_Text(1, 32, 3, "(c)Mare 2010" );
 glcd_Circle(100, 50, 10, GLCD_MODE_SET);
 glcd_Text(1, 50, 1, "Ready." );

 glcd_UpdateAll();

 while(1);

}

Opis funkcij

Grafični LCD krmilimo z naslednjimi funkcijami:

/*********************************************************************
 * Function:        glcd_Init(void)
 * PreCondition:    SPI and RTOS initialized
 * Input:           -
 * Output:          -
 * Overview:        Initialize LCD module
 * Note:            Reset pause is implemented with os_dly_wait()
 ********************************************************************/
void glcd_Init(void);
/*********************************************************************
 * Function:        glcd_SetInvert(unsigned char mode)
 * PreCondition:    LCD initialized
 * Input:           mode (GLCD_MODE_INVERT or GLCD_MODE_NORMAL)
 * Output:          -
 * Overview:        Set writing mode
 * Note:            -
 ********************************************************************/
void glcd_SetInvert(unsigned char mode);
/*********************************************************************
 * Function:        glcd_Update(unsigned int top, unsigned int bottom)
 * PreCondition:    LCD initialized
 * Input:           top     top line of area to update.
 *					bottom  bottom line of area to update.
 * Output:          -
 * Overview:        Copy buffer-RAM to display-RAM
 * Note:            -
 ********************************************************************/
void glcd_Update(unsigned int top, unsigned int bottom);
#define glcd_UpdateAll() glcd_Update(GLCD_TOP, GLCD_BOTTOM);
/*********************************************************************
 * Function:        glcd_ClrScr(unsigned char bufferAndDisplay)
 * PreCondition:    LCD initialized
 * Input:           bufferAndDisplay (boolean), if 1 = clear LCD too
 * Output:          -
 * Overview:        clear LCD buffer and display
 * Note:            -
 ********************************************************************/
void glcd_ClrScr(unsigned char bufferAndDisplay);
/*********************************************************************
 * Function:        glcd_Dot(unsigned char x, unsigned char y, unsigned char mode)
 * PreCondition:    LCD initialized
 * Input:           x,y - dot coordinate
 *					mode - GLCD_MODE_SET, GLCD_MODE_CLEAR, GLCD_MODE_XOR
 * Output:          -
 * Overview:        Set a single dot within LCD buffer
 * Note:            -
 ********************************************************************/
void glcd_Dot(unsigned char x, unsigned char y, unsigned char mode);
#define glcd_SetDot(x,y) glcd_Dot(x, y, GLCD_MODE_SET)
#define glcd_ClearDot(x,y) glcd_Dot(x, y, GLCD_MODE_CLEAR);
/*********************************************************************
 * Function:        void glcd_Line( unsigned char x1, unsigned char y1,
						unsigned char x2, unsigned char y2,
						unsigned char mode )
 * PreCondition:    LCD initialized
 * Input:           x1,y1 - line start coordinate
 *					x2,y2 - line end coordinate
 *					mode - GLCD_MODE_SET, GLCD_MODE_CLEAR, GLCD_MODE_XOR
 * Output:          -
 * Overview:        Draw a line
 * Note:            -
 ********************************************************************/
void glcd_Line(unsigned char x1, unsigned char y1,
	unsigned char x2, unsigned char y2, unsigned char mode);
/*********************************************************************
 * void glcd_Circle(unsigned char xCenter, unsigned char yCenter,
					unsigned char radius, unsigned char mode)
 * PreCondition:    LCD initialized
 * Input:           xCenter,yCenter - circle center
 *					radius - circle radius
 *					mode - GLCD_MODE_SET, GLCD_MODE_CLEAR, GLCD_MODE_XOR
 * Output:          -
 * Overview:        Draw a circle
 * Note:            -
 ********************************************************************/
void glcd_Circle(unsigned char xCenter, unsigned char yCenter,
		unsigned char radius, unsigned char mode);
/*********************************************************************
 * void glcd_Rect(unsigned char x, unsigned char y,
 					unsigned char width, unsigned char height,
					unsigned char mode)
 * PreCondition:    LCD initialized
 * Input:           x,y - top left corner
 *					width, height - width and height of the rectangle
 *					mode - GLCD_MODE_SET, GLCD_MODE_CLEAR, GLCD_MODE_XOR
 * Output:          -
 * Overview:        Draw a rectangle
 * Note:            -
 ********************************************************************/
void glcd_Rect(unsigned char x, unsigned char y, unsigned char width, unsigned char height,
		unsigned char mode);
/*********************************************************************
 * void glcd_Box(unsigned char x, unsigned char y,
 					unsigned char width, unsigned char height,
					unsigned char mode)
 * PreCondition:    LCD initialized
 * Input:           x,y - top left corner
 *					width, height - width and height of the box
 *					mode - GLCD_MODE_SET, GLCD_MODE_CLEAR, GLCD_MODE_XOR
 * Output:          -
 * Overview:        Draw a solid box
 * Note:            -
 ********************************************************************/
void glcd_Box(unsigned char x, unsigned char y, unsigned char width, unsigned char height,
		unsigned char mode);
/*********************************************************************
 * glcd_Text(unsigned char left, unsigned char top,
   unsigned char font, const char *str)
 * PreCondition:    LCD initialized
 * Input:           left       coordinate of left start of string.
					top        coordinate of top of string.
					font       font number to use for display (see fonts.h)
					str   	   text string to display (null-terminted)
 * Output:          -
 * Overview:        Prints the given string at location x,y in the specified font.
					Prints each character given via calls to lcd_glyph.
 * Note:            The entry string is null terminated and
 					non 0x20->0x7e characters are ignored.
 ********************************************************************/
void glcd_Text(unsigned char left, unsigned char top, unsigned char font, const char *str);
/*********************************************************************
 * Function:        glcd_WriteCommand(unsigned char byte)
 * PreCondition:    LCD initialized
 * Input:           command byte
 * Output:          -
 * Overview:        Send command to LCD module
 * Note:            None
 ********************************************************************/
void glcd_WriteCommand(unsigned char byte);
/*********************************************************************
 * Function:        glcd_backlight(BOOL state)
 * PreCondition:    -
 * Input:           LED status
 * Output:          -
 * Overview:        Switch backlight ON/OFF
 * Note:            None
 ********************************************************************/
void glcd_backlight(int state);
This page as PDFPDF.