You could use the Createchar function.
This is my method for my bar graph.
// Simple LCD Bar Graph
// By: Andrew Mascolo
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
uint8_t bar0[8] = {
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
uint8_t bar1[8] = {
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};
uint8_t bar2[8] = {
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18};
uint8_t bar3[8] = {
0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C};
uint8_t bar4[8] = {
0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E};
uint8_t bar5[8] = {
0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
int i,j=0, number=1;
LiquidCrystal_I2C lcd(0x20,20,4); // set the LCD address to 0x20 for a 16 chars and 2 line display
void setup()
{
Serial.begin(9600);
lcd.init(); // initialize the lcd
lcd.backlight();
lcd.createChar(0, bar0);
lcd.createChar(1, bar1);
lcd.createChar(2, bar2);
lcd.createChar(3, bar3);
lcd.createChar(4, bar4);
lcd.createChar(5, bar5);
lcd.home();
lcd.print("Hello world...");
delay(1000);
}
void loop()
{
bargraph(analogRead(A6),1,20);
//bargraph(analogRead(A6),3,20);
}
void bargraph(unsigned int data, unsigned int row, unsigned int lcd_size)
{
j = map(data, 0, 1023, 0, (6 * lcd_size));
if(number <= j)
{
for(number; number < j; number++)
{
i = number / 6;
lcd.setCursor(i,row);
lcd.write(number % 6);
}
}
else
{
for(number; number > j; number--)
{
i = number / 6;
lcd.setCursor(i,row);
lcd.write(number % 6);
}
}
//Serial.print(number);
// Serial.print(" ");
//Serial.println(i);
}
You can modify it however you like.