Sometimes the built-in characters on an LCD are not enough. Custom characters let you show your own shapes or symbols.
Custom characters on LCD in Arduino
Introduction
Syntax
Arduino
byte customChar[8] = {
B00000,
B01010,
B10101,
B10001,
B10101,
B01010,
B00000,
B00000
};
lcd.createChar(location, customChar);
lcd.write(byte(location));byte customChar[8] holds 8 rows of 5 pixels each (bits 0-4 used).
location is a number from 0 to 7 to store the custom character.
Examples
Arduino
byte smiley[8] = { B00000, B01010, B00000, B00000, B10001, B01110, B00000, B00000 }; lcd.createChar(0, smiley); lcd.write(byte(0));
Arduino
byte heart[8] = { B00000, B01010, B11111, B11111, B11111, B01110, B00100, B00000 }; lcd.createChar(1, heart); lcd.write(byte(1));
Sample Program
This program shows the word "Hello" followed by a smiley face on the LCD.
Arduino
#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); byte smiley[8] = { B00000, B01010, B00000, B00000, B10001, B01110, B00000, B00000 }; void setup() { lcd.begin(16, 2); lcd.createChar(0, smiley); lcd.print("Hello "); lcd.write(byte(0)); } void loop() { // Nothing here }
Important Notes
You can only store up to 8 custom characters at a time (locations 0-7).
Each character is 5 pixels wide and 8 pixels tall.
Use lcd.write(byte(location)) to display your custom character.
Summary
Custom characters let you add your own symbols to the LCD.
Define 8 rows of pixels using bytes with bits 0-4 for each row.
Store and show them using createChar and write.
Practice
1. What is the main purpose of using
createChar() in Arduino LCD programming?easy
Solution
Step 1: Understand the function of
This function is used to define a new character pattern by specifying pixel rows for the LCD.createChar()Step 2: Compare with other LCD functions
Functions like clearing the screen, setting cursor, or printing strings are different and not related to defining custom characters.Final Answer:
To define a custom character pattern for the LCD -> Option BQuick Check:
createChar()defines custom characters [OK]
Hint: Remember: createChar defines, write displays [OK]
Common Mistakes:
- Confusing createChar with print or clear functions
- Thinking createChar moves the cursor
- Assuming createChar prints text directly
2. Which of the following is the correct way to declare a custom character array for
createChar()?easy
Solution
Step 1: Check data type and array size
Custom characters require 8 bytes (one for each row) and use the byte type for pixel data.Step 2: Validate array length and type
byte smiley[8] = {0, 10, 0, 0, 17, 14, 0, 0}; uses byte type and 8 elements, matching the LCD custom character format.Final Answer:
byte smiley[8] = {0, 10, 0, 0, 17, 14, 0, 0}; -> Option AQuick Check:
8 bytes array with byte type = correct declaration [OK]
Hint: Custom chars need 8 bytes, not int or fewer elements [OK]
Common Mistakes:
- Using int instead of byte
- Using fewer than 8 elements
- Using char type which is signed and may cause issues
3. What will be the output on the LCD after running this code snippet?
byte heart[8] = {0,10,31,31,31,14,4,0};
lcd.createChar(0, heart);
lcd.setCursor(0,0);
lcd.write(byte(0));medium
Solution
Step 1: Understand createChar and write usage
The code defines a heart pattern, stores it at position 0, then writes character 0 at cursor (0,0).Step 2: Predict LCD output
Writing byte(0) displays the custom character stored at position 0, which is the heart shape.Final Answer:
A heart-shaped custom character appears at the top-left corner -> Option DQuick Check:
createChar + write(byte(0)) = custom char display [OK]
Hint: write(byte(0)) prints custom char stored at 0 [OK]
Common Mistakes:
- Expecting numeric 0 to print
- Forgetting to use byte() cast in write()
- Assuming createChar prints automatically
4. Identify the error in this code snippet for displaying a custom character:
byte star[8] = {4,14,21,4,4,0,4,0};
lcd.createChar(1, star);
lcd.setCursor(0,0);
lcd.write(1);medium
Solution
Step 1: Check usage of lcd.write()
When writing a custom character, the index must be cast to byte, solcd.write(byte(1))is correct.Step 2: Verify other parts
Array size is 8, createChar index 1 is valid (0-7), setCursor(0,0) is valid.Final Answer:
Missing byte cast inlcd.write(1)-> Option AQuick Check:
Use byte() cast in write() for custom chars [OK]
Hint: Always cast index with byte() in lcd.write() [OK]
Common Mistakes:
- Not casting index to byte in lcd.write()
- Thinking createChar index must be zero
- Assuming setCursor(0,0) is invalid
5. You want to display two different custom characters side by side on the LCD. Which sequence correctly creates and displays them?
hard
Solution
Step 1: Understand createChar indexing
Custom characters are stored in slots 0 to 7. To display two different chars, use two slots, e.g., 0 and 1.Step 2: Display characters correctly
Usewrite(byte(0))andwrite(byte(1))to print the two custom characters side by side.Final Answer:
Define two byte arrays, usecreateChar(0, char1)andcreateChar(1, char2), thenwrite(byte(0))andwrite(byte(1))in order. -> Option CQuick Check:
Two createChar slots + write(byte(index)) = display two chars [OK]
Hint: Use slots 0 and 1, write with byte() cast [OK]
Common Mistakes:
- Trying to store both chars in one array
- Using invalid createChar indexes like 2 or higher without checking
- Not casting index to byte in write()
Recommended
Ready to prove it?
Pass the test and this pattern moves unknown
10 questions ~5 mineasy hard
