A CGRAM (Character Generator RAM) é uma memória interna do HD44780 com espaço para 8 caracteres personalizados (slots 0–7). Cada char é uma matriz 5 colunas × 8 linhas de pixels — 1=pixel aceso, 0=apagado.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Ícone de termómetro — 5 colunas × 8 linhas
byte termometro[8] = {
0b00100, // . . # . .
0b01010, // . # . # .
0b01010, // . # . # .
0b01110, // . # # # .
0b01110, // . # # # .
0b11111, // # # # # #
0b11111, // # # # # #
0b01110 // . # # # .
};
void setup() {
lcd.init(); lcd.backlight();
lcd.createChar(0, termometro); // Registar no slot 0
lcd.setCursor(0, 0);
lcd.write(0); // Imprimir o char do slot 0
lcd.print(" Temp: 24.3C");
}
void loop() {{}}// 8 ícones — slots 0 a 7 — prontos a usar
byte grau[8] ={0b00110,0b01001,0b01001,0b00110,0b00000,0b00000,0b00000,0b00000}; // °
byte setaD[8] ={0b00000,0b00100,0b00110,0b11111,0b11111,0b00110,0b00100,0b00000}; // →
byte setaE[8] ={0b00000,0b00100,0b01100,0b11111,0b11111,0b01100,0b00100,0b00000}; // ←
byte setaC[8] ={0b00100,0b01110,0b11111,0b00100,0b00100,0b00100,0b00100,0b00000}; // ↑
byte setaB[8] ={0b00000,0b00100,0b00100,0b00100,0b00100,0b11111,0b01110,0b00100}; // ↓
byte blocoF[8] ={0b11111,0b11111,0b11111,0b11111,0b11111,0b11111,0b11111,0b11111}; // █
byte coracao[8]={0b00000,0b01010,0b11111,0b11111,0b01110,0b00100,0b00000,0b00000}; // ♥
byte eng[8] ={0b01110,0b11111,0b11011,0b11111,0b01110,0b11111,0b11011,0b01110}; // ⚙
void registarIcones() {
lcd.createChar(0,grau); lcd.createChar(1,setaD);
lcd.createChar(2,setaE); lcd.createChar(3,setaC);
lcd.createChar(4,setaB); lcd.createChar(5,blocoF);
lcd.createChar(6,coracao); lcd.createChar(7,eng);
}// Barra de progresso — usa slot 5 (bloco cheio) e espaço
void barra(int linha, int pct) {
int b = pct * 20 / 100;
lcd.setCursor(0, linha);
for(int i=0; i<20; i++)
i < b ? lcd.write(5) : lcd.write(32); // 32 = espaço
}
// Ex: barra(3, map(velocidade, 0, 255, 0, 100));