SPI Graphic Lcd Library
The mikroC PRO for AVR provides a library for operating Graphic Lcd 128x64 (with commonly used Samsung KS108/KS107 controller) via SPI interface.
For creating a custom set of Glcd images use Glcd Bitmap Editor Tool.
Important :
- The library uses the SPI module for communication. User must initialize SPI module before using the SPI Graphic Lcd Library.
- For MCUs with multiple SPI modules it is possible to initialize all of them and then switch by using the
SPI_Set_Active()routine. See the SPI Library functions. - This Library is designed to work with the mikroElektronika's Serial Lcd/Glcd Adapter Board pinout, see schematic at the bottom of this page for details.
Library Dependency Tree
External dependencies of SPI Lcd Library
The implementation of SPI Lcd Library routines is based on Port Expander Library routines.
External dependencies are the same as Port Expander Library external dependencies.
Library Routines
Basic routines:
- SPI_Glcd_Init
- SPI_Glcd_Set_Side
- SPI_Glcd_Set_Page
- SPI_Glcd_Set_X
- SPI_Glcd_Read_Data
- SPI_Glcd_Write_Data
- SPI_Glcd_Set_Ext_Buffer
Advanced routines:
- SPI_Glcd_Fill
- SPI_Glcd_Dot
- SPI_Glcd_Line
- SPI_Glcd_V_Line
- SPI_Glcd_H_Line
- SPI_Glcd_Rectangle
- SPI_Glcd_Rectangle_Round_Edges
- SPI_Glcd_Rectangle_Round_Edges_Fill
- SPI_Glcd_Box
- SPI_Glcd_Circle
- SPI_Glcd_Circle_Fill
- SPI_Glcd_Set_Font
- SPI_Glcd_Set_Font_Adv
- SPI_Glcd_Set_Ext_Font_Adv
- SPI_Glcd_Write_Char
- SPI_Glcd_Write_Char_Adv
- SPI_Glcd_Write_Text
- SPI_Glcd_Write_Text_Adv
- SPI_Glcd_Write_Const_Text_Adv
- SPI_Glcd_Image
- SPI_Glcd_Ext_Image
- SPI_Glcd_PartialImage
- SPI_Glcd_Ext_PartialImage
SPI_Glcd_Init
| Prototype |
void SPI_Glcd_Init(char DeviceAddress); |
|---|---|
| Returns |
Nothing. |
| Description |
Initializes the Glcd module via SPI interface. Parameters :
|
| Requires |
Global variables :
|
| Example |
// Port Expander module connections sbit SPExpanderRST at PORTB0_bit; sbit SPExpanderCS at PORTB1_bit; sbit SPExpanderRST_Direction at DDB0_bit; sbit SPExpanderCS_Direction at DDB1_bit; // End Port Expander module connections ... // If Port Expander Library uses SPI1 module : SPI1_Init_Advanced(_SPI_MASTER, _SPI_FCY_DIV2, _SPI_CLK_HI_TRAILING); // Initialize SPI module used with PortExpander SPI_Glcd_Init(0); |
SPI_Glcd_Set_Side
| Prototype |
void SPI_Glcd_Set_Side(char x_pos); |
|---|---|
| Returns |
Nothing. |
| Description |
Selects Glcd side. Refer to the Glcd datasheet for detail explanation. Parameters :
The parameter Note :
For side, x axis and page layout explanation see schematic at the bottom of this page.
|
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. |
| Example |
The following two lines are equivalent, and both of them select the left side of Glcd: SPI_Glcd_Set_Side(0); SPI_Glcd_Set_Side(10); |
SPI_Glcd_Set_Page
| Prototype |
void SPI_Glcd_Set_Page(char page); |
|---|---|
| Returns |
Nothing. |
| Description |
Selects page of Glcd. Parameters :
Note :
For side, x axis and page layout explanation see schematic at the bottom of this page.
|
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. |
| Example |
SPI_Glcd_Set_Page(5); |
SPI_Glcd_Set_X
| Prototype |
void SPI_Glcd_Set_X(char x_pos); |
|---|---|
| Returns |
Nothing. |
| Description |
Sets x-axis position to Parameters :
Note :
For side, x axis and page layout explanation see schematic at the bottom of this page.
|
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. |
| Example |
SPI_Glcd_Set_X(25); |
SPI_Glcd_Read_Data
| Prototype |
char SPI_Glcd_Read_Data(); |
|---|---|
| Returns |
One byte from Glcd memory. |
| Description |
Reads data from the current location of Glcd memory and moves to the next location. |
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. Glcd side, x-axis position and page should be set first. See the functions SPI_Glcd_Set_Side, SPI_Glcd_Set_X, and SPI_Glcd_Set_Page. |
| Example |
char data; ... data = SPI_Glcd_Read_Data(); |
SPI_Glcd_Write_Data
| Prototype |
void SPI_Glcd_Write_Data(char Ddata); |
|---|---|
| Returns |
Nothing. |
| Description |
Writes one byte to the current location in Glcd memory and moves to the next location. Parameters :
|
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. Glcd side, x-axis position and page should be set first. See the functions SPI_Glcd_Set_Side, SPI_Glcd_Set_X, and SPI_Glcd_Set_Page. |
| Example |
char data_; ... SPI_Glcd_Write_Data(data_); |
SPI_Glcd_Set_Ext_Buffer
| Prototype |
void SPI_Glcd_Set_Ext_Buffer(char* (*getExtDataPtr)(unsigned long offset, unsigned long count, unsigned long* num)); |
|---|---|
| Returns |
Nothing. |
| Description |
Function sets pointer to the user function which manipulates the external resource. Parameters :
|
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routine. Glcd side, x-axis position and page should be set first. See the functions SPI_Glcd_Set_Side, SPI_Glcd_Set_X, and SPI_Glcd_Set_Page. |
| Example |
char* ReadExternalBuffer(unsigned long offset, unsigned int count, unsigned int *num){
unsigned long start_sector;
unsigned int pos;
start_sector = Mmc_Get_File_Write_Sector() + offset/512;
pos = (unsigned long)offset%512;
if(start_sector == currentSector+1){
Mmc_Multi_Read_Buffer(EXT_BUFFER);
currentSector = start_sector;
}else
if(start_sector != currentSector){
Mmc_Multi_Read_Stop();
Mmc_Multi_Read_Start(start_sector);
Mmc_Multi_Read_Buffer(EXT_BUFFER);
currentSector = start_sector;
}
if(count>512-pos){
*num = 512-pos;
}
else
*num = count;
return EXT_BUFFER+pos;
}
SPI_Glcd_Set_Ext_Buffer(ReadExternalBuffer);
|
SPI_Glcd_Fill
| Prototype |
void SPI_Glcd_Fill(char pattern); |
|---|---|
| Returns |
Nothing. |
| Description |
Fills Glcd memory with byte Parameters :
To clear the Glcd screen, use To fill the screen completely, use |
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. |
| Example |
// Clear screen SPI_Glcd_Fill(0); |
SPI_Glcd_Dot
| Prototype |
void SPI_Glcd_Dot(char x_pos, char y_pos, char color); |
|---|---|
| Returns |
Nothing. |
| Description |
Draws a dot on Glcd at coordinates ( Parameters :
The parameter Note :
For side, x and y axis and page layout explanation see schematic at the bottom of this page.
|
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. |
| Example |
// Invert the dot in the upper left corner SPI_Glcd_Dot(0, 0, 2); |
SPI_Glcd_Line
| Prototype |
void SPI_Glcd_Line(int x_start, int y_start, int x_end, int y_end, char color); |
|---|---|
| Returns |
Nothing. |
| Description |
Draws a line on Glcd. Parameters :
Parameter |
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. |
| Example |
// Draw a line between dots (0,0) and (20,30) SPI_Glcd_Line(0, 0, 20, 30, 1); |
SPI_Glcd_V_Line
| Prototype |
void SPI_Glcd_V_Line(char y_start, char y_end, char x_pos, char color); |
|---|---|
| Returns |
Nothing. |
| Description |
Draws a vertical line on Glcd. Parameters :
Parameter |
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. |
| Example |
// Draw a vertical line between dots (10,5) and (10,25) SPI_Glcd_V_Line(5, 25, 10, 1); |
SPI_Glcd_H_Line
| Prototype |
void SPI_Glcd_H_Line(char x_start, char x_end, char y_pos, char color); |
|---|---|
| Returns |
Nothing. |
| Description |
Draws a horizontal line on Glcd. Parameters :
The parameter |
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. |
| Example |
// Draw a horizontal line between dots (10,20) and (50,20) SPI_Glcd_H_Line(10, 50, 20, 1); |
SPI_Glcd_Rectangle
| Prototype |
void SPI_Glcd_Rectangle(char x_upper_left, char y_upper_left, char x_bottom_right, char y_bottom_right, char color); |
|---|---|
| Returns |
Nothing. |
| Description |
Draws a rectangle on Glcd. Parameters :
The parameter |
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. |
| Example |
// Draw a rectangle between dots (5,5) and (40,40) SPI_Glcd_Rectangle(5, 5, 40, 40, 1); |
SPI_Glcd_Rectangle_Round_Edges
| Prototype |
void SPI_Glcd_Rectangle_Round_Edges(unsigned short x_upper_left, unsigned short y_upper_left, unsigned short x_bottom_right, unsigned short y_bottom_right, unsigned short round_radius, unsigned short color); |
|---|---|
| Returns |
Nothing. |
| Description |
Draws a rounded edge rectangle on Glcd. Parameters :
The parameter |
| Requires |
Glcd needs to be initialized, see SPI_Glcd_Init routine. |
| Example |
// Draw a rounded edge rectangle between dots (5,5) and (40,40) with the radius of 12 SPI_Glcd_Rectangle_Round_Edges(5, 5, 40, 40, 12, 1); |
SPI_Glcd_Rectangle_Round_Edges_Fill
| Prototype |
void SPI_Glcd_Rectangle_Round_Edges_Fill(unsigned short x_upper_left, unsigned short y_upper_left, unsigned short x_bottom_right, unsigned short y_bottom_right, unsigned short round_radius, unsigned short color); |
|---|---|
| Returns |
Nothing. |
| Description |
Draws a filled rounded edge rectangle on Glcd with color. Parameters :
The parameter |
| Requires |
Glcd needs to be initialized, see SPI_Glcd_Init routine. |
| Example |
// Draws a filled rounded edge rectangle between dots (5,5) and (40,40) with the radius of 12 SPI_Glcd_Rectangle_Round_Edges_Fill(5, 5, 40, 40, 12, 1); |
SPI_Glcd_Box
| Prototype |
void SPI_Glcd_Box(char x_upper_left, char y_upper_left, char x_bottom_right, char y_bottom_right, char color); |
|---|---|
| Returns |
Nothing. |
| Description |
Draws a box on Glcd. Parameters :
The parameter |
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. |
| Example |
// Draw a box between dots (5,15) and (20,40) SPI_Glcd_Box(5, 15, 20, 40, 1); |
SPI_Glcd_Circle
| Prototype |
void SPI_Glcd_Circle(int x_center, int y_center, int radius, char color); |
|---|---|
| Returns |
Nothing. |
| Description |
Draws a circle on Glcd. Parameters :
The parameter |
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routine. |
| Example |
// Draw a circle with center in (50,50) and radius=10 SPI_Glcd_Circle(50, 50, 10, 1); |
SPI_Glcd_Circle_FIll
| Prototype |
void SPI_Glcd_Circle_Fill(int x_center, int y_center, int radius, char color); |
|---|---|
| Returns |
Nothing. |
| Description |
Draws a filled circle on Glcd. Parameters :
The parameter |
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routine. |
| Example |
// Draw a circle with center in (50,50) and radius=10 SPI_Glcd_Circle_Fill(50, 50, 10, 1); |
SPI_Glcd_Set_Font
| Prototype |
void SPI_Glcd_Set_Font(const code char *activeFont, char aFontWidth, char aFontHeight, unsigned int aFontOffs); |
|---|---|
| Returns |
Nothing. |
| Description |
Sets font that will be used with SPI_Glcd_Write_Char and SPI_Glcd_Write_Text routines. Parameters :
The user can use fonts given in the file
For the sake of the backward compatibility, these fonts are supported also:
|
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. |
| Example |
// Use the custom 5x7 font "myfont" which starts with space (32): SPI_Glcd_Set_Font(myfont, 5, 7, 32); |
SPI_Glcd_Set_Font_Adv
| Prototype |
void SPI_Glcd_Set_Font_Adv(const char *activeFont, unsigned char font_color, char font_orientation); |
|---|---|
| Description |
Sets font that will be used with SPI_Glcd_Write_Char_Adv and SPI_Glcd_Write_Text_Adv routines. Font is located in an external resource. |
| Parameters |
|
| Returns |
Nothing. |
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routine. |
| Example |
Glcd_Set_Font_Adv(&myfont, 0, 0); |
| Notes |
None. |
SPI_Glcd_Set_Ext_Font_Adv
| Prototype |
void SPI_Glcd_Set_Ext_Font_Adv(unsigned long activeFont, unsigned short aFontWidth, unsigned short aFontHeight, unsigned int aFontOffs); |
|---|---|
| Description |
Sets font that will be used with SPI_Glcd_Write_Char_Adv and SPI_Glcd_Write_Text_Adv routines. Font is located in an external resource. |
| Parameters |
|
| Returns |
Nothing. |
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routine. |
| Example |
SPI_Glcd_Set_Ext_Font_Adv(173296, 5, 7, 32); |
| Notes |
None. |
SPI_Glcd_Write_Char
| Prototype |
void SPI_Glcd_Write_Char(char chr1, char x_pos, char page_num, char color); |
|---|---|
| Returns |
Nothing. |
| Description |
Prints character on Glcd. Parameters :
The parameter Note :
For side, x axis and page layout explanation see schematic at the bottom of this page.
|
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. Use the SPI_Glcd_Set_Font
to specify the font for display; if no font is specified, then the default |
| Example |
// Write character 'C' on the position 10 inside the page 2:
SPI_Glcd_Write_Char('C', 10, 2, 1);
|
SPI_Glcd_Write_Char_Adv
| Prototype |
void SPI_Glcd_Write_Char_Adv(unsigned int c, unsigned int x, unsigned int y); |
|---|---|
| Returns |
Nothing. |
| Description |
Writes a char on the glcd at coordinates (x, y).
|
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routine. |
| Example |
SPI_Glcd_Write_Char_Adv('A',22,23);
|
SPI_Glcd_Write_Text
| Prototype |
void SPI_Glcd_Write_Text(char text[], char x_pos, char page_num, char color); |
|---|---|
| Returns |
Nothing. |
| Description |
Prints text on Glcd. Parameters :
The parameter Note :
For side, x axis and page layout explanation see schematic at the bottom of this page.
|
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. Use the SPI_Glcd_Set_Font
to specify the font for display; if no font is specified, then the default |
| Example |
// Write text "Hello world!" on the position 10 inside the page 2:
SPI_Glcd_Write_Text("Hello world!", 10, 2, 1);
|
SPI_Glcd_Write_Text_Adv
| Prototype |
void SPI_Glcd_Write_Text_Adv(unsigned char *text, unsigned int x, unsigned int y); |
|---|---|
| Returns |
Nothing. |
| Description |
Writes text on the glcd at coordinates (x, y). Parameters :
|
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routine. |
| Example |
SPI_Glcd_Write_Text_Adv("GLCD LIBRARY DEMO, WELCOME !", 0, 0);
|
SPI_Glcd_Write_Const_Text_Adv
| Prototype |
void SPI_Glcd_Write_Const_Text_Adv(const far char *text, unsigned int x, unsigned int y); |
|---|---|
| Returns |
Nothing. |
| Description |
Writes text located in the program memory on the glcd at coordinates (x, y). Parameters :
|
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routine. |
| Example |
const char ctext[] = "mikroElektronika"; ... SPI_Glcd_Write_Const_Text_Adv(ctext, 0, 0); |
SPI_Glcd_Image
| Prototype |
void SPI_Glcd_Image(const code char *image); |
|---|---|
| Returns |
Nothing. |
| Description |
Displays bitmap on Glcd. Parameters :
Use the integrated Glcd Bitmap Editor (menu option Tools › Glcd Bitmap Editor) to convert image to a constant array suitable for displaying on Glcd. |
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. |
| Example |
// Draw image my_image on Glcd SPI_Glcd_Image(my_image); |
SPI_Glcd_Ext_Image
| Prototype |
void SPI_Glcd_Ext_Image(unsigned long image); |
|---|---|
| Description |
Displays a bitmap from an external resource on a desired address. |
| Parameters |
|
| Returns |
Nothing. |
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routine. |
| Example |
SPI_Glcd_Ext_Image(153608); |
| Notes |
Use the mikroC PRO for AVR integrated Glcd Bitmap Editor, Tools > Glcd Bitmap Editor, to convert image to a constant array suitable for displaying on Glcd. |
SPI_Glcd_PartialImage
| Prototype |
void SPI_Glcd_PartialImage(unsigned int x_left, unsigned int y_top, unsigned int width, unsigned int height, unsigned int picture_width, unsigned int picture_height, code const unsigned short * image); |
|---|---|
| Returns |
Nothing. |
| Description |
Displays a partial area of the image on a desired location. Parameters :
Use the integrated Glcd Bitmap Editor (menu option Tools › Glcd Bitmap Editor) to convert image to a constant array suitable for displaying on Glcd. |
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routines. |
| Example |
// Draws a 10x15 part of the image starting from the upper left corner on the coordinate (10,12). Original image size is 16x32. SPI_Glcd_PartialImage(10, 12, 10, 15, 16, 32, image); |
SPI_Glcd_Ext_PartialImage
| Prototype |
void SPI_Glcd_Ext_PartialImage(unsigned int x_left, unsigned int y_top, unsigned int width, unsigned int height, unsigned int picture_width, unsigned int picture_height, unsigned long image); |
|---|---|
| Description |
Displays a partial area of the image, located on an external resource, on a desired location of the screen. |
| Parameters |
|
| Returns |
Nothing. |
| Requires |
Glcd needs to be initialized for SPI communication, see SPI_Glcd_Init routine. |
| Example |
SPI_Glcd_Ext_PartialImage(10, 12, 10, 15, 16, 32, 0); |
| Notes |
Use the mikroC PRO for AVR integrated Glcd Bitmap Editor, Tools > Glcd Bitmap Editor, to convert image to a constant array suitable for displaying on Glcd. |
Library Example
The example demonstrates how to communicate to KS0108 Glcd via the SPI module, using serial to parallel convertor MCP23S17.
const code char truck_bmp[1024];
// Port Expander module connections
sbit SPExpanderRST at PORTB0_bit;
sbit SPExpanderCS at PORTB1_bit;
sbit SPExpanderRST_Direction at DDB0_bit;
sbit SPExpanderCS_Direction at DDB1_bit;
// End Port Expander module connections
void Delay2s(){ // 2 seconds delay function
Delay_ms(2000);
}
void main() {
char counter;
char *someText;
// If Port Expander Library uses SPI1 module
SPI1_Init_Advanced(_SPI_MASTER, _SPI_FCY_DIV2, _SPI_CLK_HI_TRAILING); // Initialize SPI module used with PortExpander
// // If Port Expander Library uses SPI2 module
// SPI2_Init_Advanced(_SPI_MASTER, _SPI_FCY_DIV2, _SPI_CLK_HI_TRAILING); // Initialize SPI module used with PortExpander
SPI_Glcd_Init(0); // Initialize Glcd via SPI
SPI_Glcd_Fill(0x00); // Clear Glcd
while(1) {
SPI_Glcd_Image(truck_bmp); // Draw image
Delay2s(); Delay2s();
SPI_Glcd_fill(0x00); // Clear GLCD
SPI_Glcd_PartialImage(0,0,68,30,128,64,truck_bmp); // Partial image
Delay_ms(500);
SPI_Glcd_PartialImage(24,16,68,30,128,64,truck_bmp);
Delay_ms(500);
SPI_Glcd_PartialImage(56,34,68,30,128,64,truck_bmp);
Delay2s(); Delay2s();
SPI_Glcd_Fill(0x00); // Clear GLCD
SPI_Glcd_Box(62,40,124,56,1); // Draw box
SPI_Glcd_Rectangle(5,5,84,35,1); // Draw rectangle
Delay_ms(1000);
SPI_Glcd_Rectangle_Round_Edges(2,2,87,38,7,1);
Delay_ms(1000);
SPI_Glcd_Rectangle_Round_Edges_Fill(8,8,81,32,12,1);
Delay_ms(1000);
SPI_Glcd_Line(0, 0, 127, 63, 1); // Draw line
Delay2s();
for(counter = 5; counter < 60; counter+=5 ) { // Draw horizontal and vertical lines
Delay_ms(250);
SPI_Glcd_V_Line(2, 54, counter, 1);
SPI_Glcd_H_Line(2, 120, counter, 1);
}
Delay2s();
SPI_Glcd_Fill(0x00); // Clear Glcd
SPI_Glcd_Set_Font(Character8x7, 8, 7, 32); // Choose font, see __Lib_GLCDFonts.c in Uses folder
SPI_Glcd_Write_Text("mikroE", 5, 7, 2); // Write string
for (counter = 1; counter <= 10; counter++) // Draw circles
SPI_Glcd_Circle(63,32, 3*counter, 1);
Delay2s();
SPI_Glcd_Circle_Fill(63,32, 30, 1); // Draw circles
Delay2S();
SPI_Glcd_Box(12,20, 70,63, 2); // Draw box
Delay2s();
SPI_Glcd_Fill(0xFF); // Fill Glcd
SPI_Glcd_Set_Font(Character8x7, 8, 7, 32); // Change font
someText = "8x7 Font";
SPI_Glcd_Write_Text(someText, 5, 0, 2); // Write string
Delay2s();
SPI_Glcd_Set_Font(System3x5, 3, 5, 32); // Change font
someText = "3X5 CAPITALS ONLY";
SPI_Glcd_Write_Text(someText, 60, 2, 2); // Write string
Delay2s();
SPI_Glcd_Set_Font(font5x7, 5, 7, 32); // Change font
someText = "5x7 Font";
SPI_Glcd_Write_Text(someText, 5, 4, 2); // Write string
Delay2s();
SPI_Glcd_Set_Font(FontSystem5x7_v2, 5, 7, 32); // Change font
someText = "5x7 Font (v2)";
SPI_Glcd_Write_Text(someText, 5, 6, 2); // Write string
Delay2s();
}
}
HW Connection

SPI Glcd HW connection
What do you think about this topic ? Send us feedback!




