# LiquidCrystal Custom Chars Limit

**URL:** <https://forum.arduino.cc/t/liquidcrystal-custom-chars-limit/277844>\
**Category:** Displays\
**Created:** [December 23, 2014, 5:30pm UTC](https://forum.arduino.cc/t/liquidcrystal-custom-chars-limit/277844 "2014-12-23T17:30:48Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![MarkOne](https://avatars.discourse-cdn.com/v4/letter/m/a88e57/32.png) [@MarkOne](https://forum.arduino.cc/u/MarkOne)\
**Post date:** [December 23, 2014, 5:30pm UTC](https://forum.arduino.cc/t/liquidcrystal-custom-chars-limit/277844/1 "2014-12-23T17:30:48Z")

</div>

The HD44780 is limited to 8 custom characters on screen at once:

for example

```cpp
 byte tmpChar[0] = {B10001,
                  B10001,
                  B10001,
                  B10001,
                  B10001,
                  B10001,
                  B10001,};
lcd.createChar(5,tmpChar);
lcd.setCursor(1,0);
lcd.write(5);

delay(1500);

byte tmpChar2[0] = {B00100,
                  B00100,
                  B00100,
                  B00100,
                  B00100,
                  B00100,
                  B10001,};
lcd.createChar(5,tmpChar2);
lcd.setCursor(2,0);
lcd.write(5);

```

will create tmpChar at 1,0 then create tmpChar2 at 1,0 AND at 2,0. ie: I can't use custom character 5 twice.

Is there any work around or is 8 an absolute limitation? Can 're-draw' of previous chars be prevented?

---

<div class="post-metadata">

**Author:** ![HazardsMind](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/hazardsmind/32/215209_2.png) [@HazardsMind](https://forum.arduino.cc/u/HazardsMind)\
**Post date:** [December 23, 2014, 7:22pm UTC](https://forum.arduino.cc/t/liquidcrystal-custom-chars-limit/277844/2 "2014-12-23T19:22:21Z")

</div>

Or you can draw it as you create it, which will only use one custom character space, and allows you make as many as you want.

Downside is you can't go back unless you remake it.

---

<div class="post-metadata">

**Author:** ![el\_supremo](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/el_supremo/32/214787_2.png) [@el\_supremo](https://forum.arduino.cc/u/el_supremo)\
**Post date:** [December 23, 2014, 7:41pm UTC](https://forum.arduino.cc/t/liquidcrystal-custom-chars-limit/277844/3 "2014-12-23T19:41:38Z")

</div>

When you define a custom character, the pattern you define is saved into character memory in the LCD. It draws those characters from that memory.  
If you define custom character 0 to display an A, then wherever you write 0 to the display, an A will be drawn. If you now define custom character 0 to be Z, anywhere that there is a custom character 0 being displayed, it will immediately change from A to Z.

And, yes, there's a limit in the LCD hardware (at least the ones I have used) of 8 custom characters.

Pete

---

<div class="post-metadata">

**Author:** ![Paul\_B](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/paul_b/32/216376_2.png) [@Paul\_B](https://forum.arduino.cc/u/Paul_B)\
**Post date:** [December 23, 2014, 9:01pm UTC](https://forum.arduino.cc/t/liquidcrystal-custom-chars-limit/277844/4 "2014-12-23T21:01:37Z")

</div>

> MarkOne:  
> Is there any work around or is 8 an absolute limitation?

Yes, it is unquestionably an absolute limit. That is the end of the matter.

_However_, the "on screen at once" is the trick. For a 1602 display, that is one quarter of all the on-screen characters, and the font already contains blank, underscore, block (255) and a couple of other promising pieces, so you can do a lot with it already and dynamically change the characters to only those required at a given moment in animation.

[For example](http://jans-arduino.de/projects/16x-lcd-8-bit-mario-animation.html).

---

<div class="post-metadata">

**Author:** ![MarkOne](https://avatars.discourse-cdn.com/v4/letter/m/a88e57/32.png) [@MarkOne](https://forum.arduino.cc/u/MarkOne)\
**Post date:** [December 27, 2014, 2:49pm UTC](https://forum.arduino.cc/t/liquidcrystal-custom-chars-limit/277844/5 "2014-12-27T14:49:40Z")

</div>

Thanks guys, that confirms my suspicion.

I had a full screen splash-screen plan for a 40 x 4 display, I'll just forget it !

---

<div class="post-metadata">

**Author:** ![MarkOne](https://avatars.discourse-cdn.com/v4/letter/m/a88e57/32.png) [@MarkOne](https://forum.arduino.cc/u/MarkOne)\
**Post date:** [December 27, 2014, 2:51pm UTC](https://forum.arduino.cc/t/liquidcrystal-custom-chars-limit/277844/6 "2014-12-27T14:51:35Z")

</div>

> HazardsMind:  
> Or you can draw it as you create it, which will only use one custom character space, and allows you make as many as you want.
> 
> Downside is you can't go back unless you remake it.

for reference, this does not work.

All previously drawn characters will overwrite as you overwrite the custom chars

---

<div class="post-metadata">

**Author:** ![HazardsMind](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/hazardsmind/32/215209_2.png) [@HazardsMind](https://forum.arduino.cc/u/HazardsMind)\
**Post date:** [December 28, 2014, 7:38pm UTC](https://forum.arduino.cc/t/liquidcrystal-custom-chars-limit/277844/7 "2014-12-28T19:38:27Z")

</div>

> All previously drawn characters will overwrite as you overwrite the custom chars

Ah, yes I just tested that and it is true. My mistake.

---

<div class="post-metadata">

**Author:** ![Paul\_B](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/paul_b/32/216376_2.png) [@Paul\_B](https://forum.arduino.cc/u/Paul_B)\
**Post date:** [December 28, 2014, 7:55pm UTC](https://forum.arduino.cc/t/liquidcrystal-custom-chars-limit/277844/8 "2014-12-28T19:55:04Z")

</div>

> MarkOne:  
> I had a full screen splash-screen plan for a 40 x 4 display, I'll just forget it !

Wow! Haven't come across one of those!

---

<div class="post-metadata">

**Author:** ![krupski](https://avatars.discourse-cdn.com/v4/letter/k/c4cdca/32.png) [@krupski](https://forum.arduino.cc/u/krupski)\
**Post date:** [December 29, 2014, 4:00pm UTC](https://forum.arduino.cc/t/liquidcrystal-custom-chars-limit/277844/9 "2014-12-29T16:00:22Z")

</div>

> MarkOne:  
> The HD44780 is limited to 8 custom characters on screen at once:
> 
> for example
> 
> ```arduino
> byte tmpChar[0] = {B10001,
> 
> ```

B10001,  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B10001,  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B10001,  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B10001,  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B10001,  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B10001,};  
lcd.createChar(5,tmpChar);  
lcd.setCursor(1,0);  
lcd.write(5);

delay(1500);

byte tmpChar2[0] = {B00100,  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B00100,  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B00100,  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B00100,  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B00100,  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B00100,  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; B10001,};  
lcd.createChar(5,tmpChar2);  
lcd.setCursor(2,0);  
lcd.write(5);

> ```arduino
> 
> will create tmpChar at 1,0 then create tmpChar2 at 1,0 AND at 2,0. ie: I can't use custom character 5 twice.
> 
> Is there any work around or is 8 an absolute limitation? Can 're-draw' of previous chars be prevented?
> 
> ```

For an HD44780u and compatible LCD controller, the 8 character limit is a hardware limit (that's how much "custom character" ram the chip has).

You can create new characters on the fly as needed, but that will be rather slow. Also, if you change a custom character that's already in use, it will also change.

For example, say you made Slot 0 the "degrees" symbol to display a temperature. Then while displaying the temperature, you re-define Slot 0 as, say, the Sigma symbol. Your display will instantly show the "sigma" character where the degrees symbol was!

Hope this helps.

---

<div class="post-metadata">

**Author:** ![krupski](https://avatars.discourse-cdn.com/v4/letter/k/c4cdca/32.png) [@krupski](https://forum.arduino.cc/u/krupski)\
**Post date:** [December 29, 2014, 4:05pm UTC](https://forum.arduino.cc/t/liquidcrystal-custom-chars-limit/277844/10 "2014-12-29T16:05:44Z")

</div>

> MarkOne:  
> Thanks guys, that confirms my suspicion.
> 
> I had a full screen splash-screen plan for a 40 x 4 display, I'll just forget it !

You may be interested in using a graphics VFD display. Noritake has a really nice 128 x 64 VFD display that you can buy new for $38 USD [**(LINK)**](http://noritake-vfd.com/gu128x64e-u100.aspx)

There is also a driver library for that display, using either the parallel interface or the SPI interface ([**LINK**](https://github.com/krupski/Noritake_VFD_GUU100))

Note that this display is a Vacuum Florescent Display (the kind that glows a blue-green), not an LCD. It's a really nice display and you can't beat the price!

Good luck!

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [May 6, 2021, 3:35am UTC](https://forum.arduino.cc/t/liquidcrystal-custom-chars-limit/277844/11 "2021-05-06T03:35:26Z")

</div>

Closed on May 6, 2021, 3:35am UTC


