HD44780 16x2 Character LCD
The classic two-line character display behind every vending machine, arcade panel, and lab instrument — driven directly from a microcontroller in 4-bit mode.
Difficulty: Breadboard. Estimated build time: about 30 minutes. Estimated parts cost: about US$5.80. 6-line bill of materials. Compare supplier offers when available. A two-line, sixteen-character display that any microcontroller can drive directly — no module, no extra driver chip.
Solder a header and wire power + contrast
Most LCD modules ship without a pin header — solder a 16-pin male header into the row at the top edge. Connect VSS to ground, VDD to 5 V. Wire a 10 k pot between 5 V and ground with its wiper to V0; this is the contrast control. Tie RW to ground (write-only mode). If your module has a backlight, connect A (anode) through a 220 ohm series resistor to 5 V and K (cathode) to ground.
Wire RS, EN, and the four data lines
Connect RS (register select) and EN (enable) each to a free MCU GPIO. Then wire the four high-order data pins D4, D5, D6, D7 to four more GPIOs. Leave D0..D3 floating — in 4-bit mode they are unused. RS picks between command mode (low) and character data mode (high); EN clocks each nibble in on its falling edge.
Initialise, then write text
Use the LiquidCrystal library on Arduino (or u8g2 / lcd-i2c on other platforms). Call lcd.begin(16, 2), then lcd.print("Hello, world") and turn the contrast pot until the text becomes crisp. To move the cursor, call lcd.setCursor(col, row). The LCD has its own RAM, so you only rewrite what changed — perfect for a clock updating seconds without flicker. If you ever see two rows of black squares, the library probably never received the magic Function Set command. A short reset script (delay 50 ms, write 0x33, 0x32, then 0x28) usually fixes it.