The commonly used 16x2 LCD can also display custom made characters besides numbers, alphabets & special characters. Any character can be made to appear on a 5x8 pixel matrix element without knowledge of its ASCII value. The idea explained here demonstrates the principle and operation of a simple LCD custom character display using 8051 microcontroller (AT89C51).
When the ASCII code for any character, say ‘A’, is sent to be displayed on LCD module, the module’s controller looks up the appropriate 5×8-pixel pattern in ROM (read-only memory) and displays that pattern on the LCD. There are 8 symbol locations where a custom character can be stored as shown in the following right table. These locations will have a particular bitmap layout corresponding to the custom character. To display an arrow sign, the bitmap values are mapped to a base address location, say 64 (ASCII code 0).
The symbol locations with their base addresses are given below:
ASCII Code
|
Base Address
|
0
|
64
|
1
|
72
|
2
|
80
|
3
|
88
|
4
|
96
|
5
|
104
|
6
|
112
|
7
|
120
|

- Set RS (Register Select) and R/W (Read/Write) pins of the LCD to initialize the LCD to accept instructions
- Set the CG RAM address by sending an instruction byte from 64 to 127 (locations 0-63 in CG RAM).
- Switch to Data Mode by changing the setting of RS pin
- Send bytes with the bit patterns for your symbol(s). The LCD controller automatically increments CG RAM addresses, in the same way as it increments cursor positions on the display.
- To leave CG RAM, switch to Command Mode to set address counter to a valid display address (e.g. 128, 1st character of 1st line); the clear-screen instruction (byte 1); or the home instruction (byte 2). Now bytes are once again being written to the visible portion of the display.
- To display the defined custom character print ASCII codes 0 through 7.
Project Source Code
###
//Program to create and display custom characters smilies, heart, musical note symbol #include<reg51.h> sfr lcd_data_pin=0xA0; sbit rs=P3^0; //Register select pin sbit rw=P3^1; // Read write pin sbit en=P3^6; //Enable pin void delay(unsigned int count) // Function to provide time delay in msec. { int i,j; for(i=0;i<count;i++) for(j=0;j<1275;j++); } void lcd_command(unsigned char comm) //Function to send commands to LCD. { lcd_data_pin=comm; en=1; rs=0; rw=0; delay(1); en=0; } void lcd_data(unsigned char disp) //Function to send data to LCD { lcd_data_pin=disp; en=1; rs=1; rw=0; delay(1); en=0; } void lcd_ini() //Function to initialize the LCD { lcd_command(0x38); delay(2); lcd_command(0x0F); delay(2); lcd_command(0x82); //Set cursor to blink at line 1 positon 2 delay(2); } void character() { lcd_command(64); //Address where values of the first custom character is stored lcd_data(0); lcd_data(10); lcd_data(21); lcd_data(17); lcd_data(10); lcd_data(4); lcd_data(0); lcd_data(0); lcd_command(0xC0); //Address of the location where the character is to be displayed lcd_data(0); // Displaying the character created at address 0x64 delay(10); lcd_command(72); lcd_data(0); lcd_data(0); lcd_data(0); lcd_data(10); lcd_data(0); lcd_data(4); lcd_data(17); lcd_data(14); lcd_command(0x80); lcd_data(1); delay(10); lcd_command(80); lcd_data(0); lcd_data(0); lcd_data(10); lcd_data(0); lcd_data(4); lcd_data(0); lcd_data(14); lcd_data(17); lcd_command(0x82); lcd_data(2); delay(10); lcd_command(88); lcd_data(1); lcd_data(3); lcd_data(5); lcd_data(9); lcd_data(9); lcd_data(11); lcd_data(27); lcd_data(24); lcd_command(0x84); lcd_data(3); delay(10); lcd_command(96); lcd_data(0); lcd_data(10); lcd_data(0); lcd_data(31); lcd_data(17); lcd_data(14); lcd_data(0); lcd_data(0); lcd_command(0x86); lcd_data(4); delay(10); lcd_command(104); lcd_data(10); lcd_data(0); lcd_data(4); lcd_data(0); lcd_data(14); lcd_data(17); lcd_data(17); lcd_data(14); lcd_command(0xC2); lcd_data(5); delay(10); lcd_command(112); lcd_data(0); lcd_data(10); lcd_data(0); lcd_data(0); lcd_data(4); lcd_data(0); lcd_data(31); lcd_data(0); lcd_command(0xC4); lcd_data(6); delay(10); lcd_command(120); lcd_data(0); lcd_data(17); lcd_data(10); lcd_data(17); lcd_data(4); lcd_data(0); lcd_data(14); lcd_data(17); lcd_command(0xC6); lcd_data(7); delay(10); } void main() { lcd_ini(); character(); }###
Circuit Diagrams
Project Components
Project Video
Filed Under: 8051 Microcontroller
Filed Under: 8051 Microcontroller
Questions related to this article?
👉Ask and discuss on Electro-Tech-Online.com and EDAboard.com forums.
Tell Us What You Think!!
You must be logged in to post a comment.