SPI Graphic Lcd Library
The mikroPascal PRO for 8051 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.
Notes:
- The library uses the SPI module for communication. User must initialize SPI module before using the SPI Graphic Lcd Library.
- 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.
External dependencies of SPI Graphic LcdLibrary
The implementation of SPI Graphic 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
Advanced routines:
- SPI_Glcd_Fill
- SPI_Glcd_Dot
- SPI_Glcd_Line
- SPI_Glcd_V_Line
- SPI_Glcd_H_Line
- SPI_Glcd_Rectangle
- SPI_Glcd_Box
- SPI_Glcd_Circle
- SPI_Glcd_Set_Font
- SPI_Glcd_Write_Char
- SPI_Glcd_Write_Text
- SPI_Glcd_Image
SPI_Glcd_Init
Prototype |
procedure SPI_Glcd_Init(DeviceAddress : byte); |
---|---|
Returns |
Nothing. |
Description |
Initializes the Glcd module via SPI interface. Parameters :
|
Requires |
The SPI module needs to be initialized. See SPIx_Init and SPIx_Init_Advanced routines. |
Example |
// port expander pinout definition var SPExpanderRST : sbit at P1_0_bit; SPExpanderCS : sbit at P1_1_bit; ... // If Port Expander Library uses SPI1 module : SPI1_Init(); // Initialize SPI module used with PortExpander SPI_Glcd_Init(0); |
SPI_Glcd_Set_Side
Prototype |
procedure SPI_Glcd_Set_Side(x_pos : byte); |
---|---|
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 |
procedure SPI_Glcd_Set_Page(page : byte); |
---|---|
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 |
procedure SPI_Glcd_Set_X(x_pos : byte); |
---|---|
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 |
function SPI_Glcd_Read_Data() : byte; |
---|---|
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 |
var data : byte; ... data := SPI_Glcd_Read_Data(); |
SPI_Glcd_Write_Data
Prototype |
procedure SPI_Glcd_Write_Data(ddata : byte); |
---|---|
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 |
var ddata : byte; ... SPI_Glcd_Write_Data(ddata); |
SPI_Glcd_Fill
Prototype |
procedure SPI_Glcd_Fill(pattern: byte); |
---|---|
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 |
procedure SPI_Glcd_Dot(x_pos : byte; y_pos : byte; color : byte); |
---|---|
Returns |
Nothing. |
Description |
Draws a dot on Glcd at coordinates ( Parameters :
The parameter Note: For x and y axis 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 |
procedure SPI_Glcd_Line(x_start : integer; y_start : integer; x_end : integer; y_end : integer; color : byte); |
---|---|
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 |
procedure SPI_Glcd_V_Line(y_start: byte; y_end: byte; x_pos: byte; color: byte); |
---|---|
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 |
procedure SPI_Glcd_V_Line(x_start : byte; x_end : byte; y_pos : byte; color : byte); |
---|---|
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 |
procedure SPI_Glcd_Rectangle(x_upper_left : byte; y_upper_left : byte; x_bottom_right : byte; y_bottom_right : byte; color : byte); |
---|---|
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_Box
Prototype |
procedure SPI_Glcd_Box(x_upper_left : byte; y_upper_left : byte; x_bottom_right : byte; y_bottom_right : byte; color : byte); |
---|---|
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 |
procedure SPI_Glcd_Circle(x_center : integer; y_center : integer; radius : integer; color : byte); |
---|---|
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_Set_Font
Prototype |
procedure SPI_Glcd_Set_Font(activeFont : longint; aFontWidth : byte; aFontHeight : byte; aFontOffs : word); |
---|---|
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_Write_Char
Prototype |
procedure SPI_Glcd_Write_Char(chr1 : byte; x_pos : byte; page_num : byte; color : byte); |
---|---|
Returns |
Nothing. |
Description |
Prints character on Glcd. Parameters :
The parameter Note: For 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_Text
Prototype |
procedure SPI_Glcd_Write_Text(var text : string; x_pos : byte; page_numb : byte; color : byte); |
---|---|
Returns |
Nothing. |
Description |
Prints text on Glcd. Parameters :
The parameter Note: For 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_Image
Prototype |
procedure SPI_Glcd_Image(const image : ^byte); |
---|---|
Returns |
Nothing. |
Description |
Displays bitmap on Glcd. Parameters :
Use the mikroPascal PRO for 8051 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); |
Library Example
The example demonstrates how to communicate to KS0108 Glcd via the SPI module, using serial to parallel convertor MCP23S17.
program SPI_Lcd; var text : array[16] of char; var counter : byte; // Port Expander module connections var SPExpanderRST : sbit at P1_0_bit; var SPExpanderCS : sbit at P1_1_bit; // End Port Expander module connections procedure Move_Delay(); // Function used for text moving begin Delay_ms(500); // You can change the moving speed here end; begin text := 'mikroElektronika'; SPI1_Init(); // Initialize SPI SPI_Lcd_Config(0); // Initialize LCD over SPI interface SPI_Lcd_Cmd(_LCD_CLEAR); // Clear display SPI_Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off SPI_Lcd_Out(1,6, 'mikroE'); // Print text to LCD, 1st row, 6th column SPI_Lcd_Chr_CP('!'); // Append '!' SPI_Lcd_Out(2,1, text); // Print text to LCD, 2nd row, 1st column // SPI_Lcd_Out(3,1,'mikroE'); // For LCD with more than two rows // SPI_Lcd_Out(4,15,'mikroE'); // For LCD with more than two rows // Moving text for counter := 0 to 3 do // Move text to the right 4 times begin SPI_Lcd_Cmd(_LCD_SHIFT_RIGHT); Move_Delay(); end; while TRUE do // Endless loop begin for counter := 0 to 6 do // Move text to the left 7 times begin SPI_Lcd_Cmd(_LCD_SHIFT_LEFT); Move_Delay(); end; for counter := 0 to 6 do // Move text to the right 7 times begin SPI_Lcd_Cmd(_LCD_SHIFT_RIGHT); Move_Delay(); end; end; end.
HW Connection
SPI Glcd HW connection
What do you think about this topic ? Send us feedback!