There are too many different kinds of displays – some of them, you already know. I’d like to help you navigate the hobbyist-accessible display world – let’s take a journey together, technology by technology, get a high-level overview of everything you could want to know about it, and learn all the details you never knew you needed to know. In the end, I’d like you to be able to find the best displays for any project you might have in mind, whatever it could be.
Today, let’s take a look at a well-known LCD technology – the HD44780 displays, a type of display that we hobbyists have been working with since the 1980s. Its name comes from the HD44780 driver chip – a character display driver IC that connects to a raw display panel and provides an easy interface.
HD44780 displays are not known for power efficiency, cutting-edge technology, ultimate flexibility, or small size, for that matter. However, they’re tried and true, easy to drive, require little to no computing power on your MCU, and you will be able to buy them for the foreseeable future. They’re not about to get taken off the market, and they deserve a certain kind of place in our parts boxes, too.
If you work with HD44780 displays for a project or two, you might acquire a new useless superpower – noticing just how many HD44780 displays are still in use in all sorts of user-facing devices, public or private. Going out and about in your day-to-day life, you can encounter a familiar 16 x 2 grid of characters in cash registers, public transport ticket machines, home security panels, industrial and factory equipment, public coffee machines, and other microcontroller-assisted places of all kinds!
Ease Of Use
You really can’t go wrong with a HD44780 display if all you want is some basic text output. We’ve been using them as displays for all sorts of projects, 3D printer UI screens, home server status indicators, robot and other gadget diagnostics, clocks, spectrum analyzers. It used to be that any MCU development board you could buy, would have a HD44780 display on it, or at least a header for it!
Sending data to a HD44780 display is exceptionally easy – at its core, you send it ASCII, and it dutifully shows ASCII you’ve sent it. There’s no framebuffer to render, no fonts to store and handle, just ASCII, with each character taking up a 5 x 8 portion of the screen. Furthermore, six GPIOs are enough to drive such a display – or two, if you use shift register like the 74HC595 or a very simple I2C GPIO expander chip. Oh, and you can find them $1 apiece online – $0.40 more if you want an I2C adapter board to go with it!
As you might guess, the HD44780 IC is hardwired to show characters – you can’t switch arbitrary pixels on a HD44780 display, all you can do is ASCII, oh, and up to eight custom characters you can upload. The display sizes are also standardized – 16×2 is the main one (also searchable as 1602), but you can also get 20×2, 16×4 and 20×4 displays, as well as 8×1 and 8×2 (2002, 1602, 2004, 0801 and 0802 accordingly).
These are characters, of course, not pixels – not that you can control individual pixels, anyway. Sometimes, you can find even wackier displays, like 40×2, 40×4 or even larger – those might use slightly modified controller chips, or even multiple HD44780 on the same board working together and wired up to the same pin header.
Speaking of pin headers, the overwhelming majority these displays have a standardized pinout on a line of 0.1 in / 2.54 mm headers, easy to breadboard or connect to a development board – just 14 pins, or 16 if your HD44780 panel has a backlight. These are still LCDs, after all, and you’ll want them to be backlit. Adafruit has also sold RGB backlit HD44780 displays in the past, you know, in case you’re designing gaming peripherals.
Sometimes, the pin headers are different – 8 x 1 and 8 x 2 displays use the same pinout but transferred onto a 2 x 8 pin header instead. Want to use one of those I2C boards with a 8 x 1 or 8 x 2 display? Here’s an adapter PCB. And, if you have a super wide HD44780 display, it will likely use multiple controller chips, and as a result, it’s probably going to be a dual-row pin header with a more special pinout that has multiple E pins, one per each HD44780-compatible controller it would have onboard
For all these pins, a typical HD44780 display only needs six GPIOs – don’t let the eight data pins fool you! This is because HD44780 displays have two modes you can use to send data, 4-bit mode and 8-bit mode. Nobody uses the 8-bit mode. To be exact, there’s no benefit to using 8-bit mode unless you want to update your display really really quickly, or absolutely guarantee error-free operation! In 4-bit mode, you only need to use pins D4-D7, feel free to leave D0-D3 floating or pull them down to GND. The other two GPIOs go to E and RS inputs – there’s also R/W, which you usually set low, but you can also set high to read data from the display! Nobody uses the read feature. Well, again, you can use it to guarantee quick updates and no-error operation by checking that the display has completed your command before sending the next one, but nobody does that and the displays work just fine!
A typical HD44780 display module tends to have a quirk – it has a single analog input you must use. This is the Vo input, a pin for contrast voltage for the LCD panel itself, and it differs from LCD to LCD – remember, even if all we’re doing ASCII, HD44780 is old enough that you’ll see the bare metal shine here and there.
Thankfully, it’s exceptionally easy to tune Vo to a proper value – connect VCC and GND to your display, then connect a 10K potentiometer between VCC and GND with wiper on Vo, and turn it until you can see the first row (and maybe further rows) fill up with boxes. Stop when the boxes look reasonable – that’s your contrast tuned. It might be that your contrast voltage will end up at 1.2 V, or 0.5 V, or close to 0 V – if you’re working with a display you already know, it might be okay to hardwire the value with a resistor divider, but keeping the potentiometer just in case is a good idea.
Oh, VCC, right. These displays tend to work at 5 V as their main voltage – again, the HD44780 was designed in 1980s, so you typically need to have a 5 V source in your project if you want to use one of these. But 3.3 V GPIOs are okay! There are displays that work with 3.3 V VCC, but they’re rare. The main problem isn’t the HD44780, though – it’s the Vo, it’s referenced to VCC instead of GND, so if you need to set Vo to 1V when using 5 V VCC, you’ll need to have it at -0.7 V for 3.3 V VCC. Thankfully, there’s a solution, and you might have already noticed that some HD44780 displays have a SO8 footprint on the back! They’re never ever populated, but you can populate them with an ICL7660 or similar chip to create negative Vo, and get your HD44780 display to work at 3.3 V VCC! Some displays will need negative Vo even without 5 V. I’ve once disassembled a payphone that used a custom HD44780 display, and if I remember correctly, it used -2 V for Vo by default! It makes sense – Vo varies with temperature, and those payphones were built to be weatherproof.
Software Support Abundant
One place where HD44780 displays shine is the sheer amount of software support – interfacing with a HD44780 display is something you really don’t have to give much thought, as it stands. There is hardly a platform you can find, that doesn’t already have a HD44780 library someone wrote for it; whatever language you’re coding in, chances are, there’s a snippet of code that implements the HD44780 command set and is just waiting for you to download it.
Even on Linux, the LCDProc software works with a wide variety of ways you can connect a HD44780 display to your system, and a good amount of UIs you can use to monitor your system’s state. We’ve had HD44780 displays for almost four decades now, and for good reasons.
HD44780 isn’t the best option in many cases. For instance, you will hardly see a modern devboard with HD44780 support nowadays – they’re somewhat bulky, so manufacturers opt to use lightweight and small SPI and OLED screens that are hardly less expensive. That said, HD44780 have a well-deserved place in our toolboxes, and next time you want to simply display a few lines of clearly readable text without giving the UI and fonts much thought, you should absolutely reach for a time-tested character display, plug an I2C backpack onto its back, and save yourself the effort and pins of anything higher-fidelity. Next time, however, we’ll take a look at other options we can reach for in cases the HD44780 literally outweighs its usefulness.