// include the library code:
#include <LiquidCrystal.h>
// Pin definitions
#define RS 19
#define E 23
#define D4 18
#define D5 17
#define D6 16
#define D7 15
#define delayTime 300
// Small delay helpers
void pulseEnable() {
digitalWrite(E, LOW);
delayMicroseconds(1);
digitalWrite(E, HIGH);
delayMicroseconds(1); // Enable pulse must be >450ns
digitalWrite(E, LOW);
delayMicroseconds(100); // Command needs time to process
}
void write4Bits(uint8_t nibble) {
digitalWrite(D4, (nibble >> 0) & 1);
digitalWrite(D5, (nibble >> 1) & 1);
digitalWrite(D6, (nibble >> 2) & 1);
digitalWrite(D7, (nibble >> 3) & 1);
pulseEnable();
}
void sendByte(uint8_t value, bool isData) {
digitalWrite(RS, isData ? HIGH : LOW);
// Send high nibble
write4Bits(value >> 4);
// Send low nibble
write4Bits(value & 0x0F);
}
void sendCommand(uint8_t cmd) {
sendByte(cmd, false);
}
void sendChar(char c) {
sendByte(c, true);
}
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(19, 23, 18, 17, 16, 15);
void setup() {
delay(50); // Wait for LCD to power up
digitalWrite(RS, LOW);
digitalWrite(E, LOW);
// Initialize into 4-bit mode
write4Bits(0x03);
delay(5);
write4Bits(0x03);
delayMicroseconds(150);
write4Bits(0x03);
write4Bits(0x02); // Set 4-bit mode
// Function set: 4-bit, 2 line, 5x8 font
sendCommand(0x28);
// Display ON, cursor OFF
sendCommand(0x0C);
// Clear display
sendCommand(0x01);
delay(2);
// Entry mode set (increment cursor)
sendCommand(0x06);
}
void loop() {
sendCommand(0x01); // clear display
delay(2); // IMPORTANT (needs ~2ms)
sendCommand(0x90);
sendChar('H');
sendChar('E');
sendChar('L');
sendChar('L');
sendChar('O');
sendChar(' ');
sendChar('W');
sendChar('O');
sendChar('R');
sendChar('L');
sendChar('D');
sendChar('!');
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0xD0); // now guaranteed correct position
sendChar('H');
delay(delayTime);
sendChar('o');
delay(delayTime);
sendChar('o');
delay(delayTime);
sendChar('k');
delay(delayTime);
sendChar(' ');
delay(delayTime/2);
sendChar('\'');
delay(delayTime);
sendChar('E');
delay(delayTime);
sendChar('m');
delay(delayTime);
sendChar('!');
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
sendCommand(0x18);
delay(delayTime);
}