// Arduino Uno + 74HC595 + 16x2 LCD (4-bit mode)
// Displays "Hello, World!"
// Original: https://wokwi.com/projects/447610389064062977
/*
Arduino | general-help
max — 10:39 AM Friday, November 14, 2025
works
*/
#define DATA_PIN 10 // DS (pin 14 on 74HC595)
#define CLOCK_PIN 12 // SH_CP (pin 11 on 74HC595)
#define LATCH_PIN 11 // ST_CP (pin 12 on 74HC595)
// LCD mapping via 74HC595 outputs
// Q0 -> D4, Q1 -> D5, Q2 -> D6, Q3 -> D7
// Q4 -> RS, Q5 -> E
void shiftOut595(byte data) {
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, data);
digitalWrite(LATCH_PIN, HIGH);
}
void lcdWriteNibble(byte nibble, bool rs) {
byte data = 0;
data |= (nibble & 0x0F); // put nibble on Q0-Q3
if (rs) data |= (1 << 4); // RS on Q4
data |= (1 << 5); // E high on Q5
shiftOut595(data); // pulse E high
delayMicroseconds(100);
data &= ~(1 << 5); // E low
shiftOut595(data);
delayMicroseconds(400); // allow LCD to process
}
void lcdCommand(byte cmd) {
lcdWriteNibble(cmd >> 4, false);
lcdWriteNibble(cmd & 0x0F, false);
}
void lcdData(byte value) {
lcdWriteNibble(value >> 4, true);
lcdWriteNibble(value & 0x0F, true);
}
void lcdInit() {
pinMode(DATA_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
delay(50); // wait for LCD power up
lcdCommand(0x02); // 4bit mode
lcdCommand(0x28); // 4-bit mode, 16x2 lines
lcdCommand(0x0C); // Display ON, cursor OFF
lcdCommand(0x06); // Entry mode
lcdCommand(0x01); // Clear display
lcdCommand(0x80); // move cursor to home position
delay(2); // wait for clear
}
void setup() {
lcdInit();
const char *msg = "Hello, World!";
while (*msg) {
lcdData(*msg++);
}
}
void loop() {
// nothing here
}