13

I have a 16x2 LCD and I want to show a temperature: 23 ºC.

But the º symbol is not properly shown. It shows a strange character instead of the º symbol .

Roby Sottini
  • 448
  • 2
  • 10
  • 23

4 Answers4

17

It depends on the exact model of LCD you are using. Or more exactly, on the Dot Matrix Liquid Crystal Display Controller/Driver, like the Hitachi HD44780U that is used in many 16x2 LCD.

For that driver, you have a table of native chars, like this:

LCD Character Set - source: mil.ufl.edu

In this table, the char "°" is at col 0b1101, row 1111, (0xDF, or 223). But, you have to cast that value to a char before displaying, otherwise you will get the value (223), not the symbol.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd 
  lcd.backlight();
  lcd.print("temp 27");
  lcd.print((char) 223);
  lcd.print(" ");
  lcd.print(223);

}

void loop()
{
}
Greenonline
  • 3,152
  • 7
  • 36
  • 48
5

Some displays have different characters above 128. It is best to make your own character.

That is what @dannyf ment with "CGRAM". The custom characters are stored in CGRAM. There is no need to read the datasheet though, because there is a function in the Arduino LiquidCrystal library for it.

Start here: Arduino CreateChar reference
There are even websites that help you to create the character: omerk and maxpromer.

Jot
  • 3,276
  • 1
  • 14
  • 21
0

Easy.

  1. Pull up the datasheet and pick the character that most resembles your symbol. Char 0b11011111 looks the best to me but 0b10110000 isn't bad.

  2. While you are in the datasheet, check out CGRAM.

Majenko
  • 105,851
  • 5
  • 82
  • 139
dannyf
  • 2,813
  • 11
  • 13
0

do lcd.write(223); Transform the Decimal into an ASCII symbol.

A user
  • 1