// Define LCD pins
#define RS 12
#define EN 14
#define D4 27
#define D5 26
#define D6 25
#define D7 33
// 10-digit counter
char counter[11] = "0000000000";
// Pulse enable
void lcd_pulse() {
digitalWrite(EN, HIGH);
delayMicroseconds(1);
digitalWrite(EN, LOW);
delayMicroseconds(100);
}
// Send 4 bits
void lcd_send4bits(unsigned char data) {
digitalWrite(D4, (data >> 0) & 1);
digitalWrite(D5, (data >> 1) & 1);
digitalWrite(D6, (data >> 2) & 1);
digitalWrite(D7, (data >> 3) & 1);
lcd_pulse();
}
// Send command
void lcd_cmd(unsigned char cmd) {
digitalWrite(RS, LOW);
lcd_send4bits(cmd >> 4); // higher nibble
lcd_send4bits(cmd & 0x0F); // lower nibble
delay(2);
}
// Send data
void lcd_data(unsigned char data) {
digitalWrite(RS, HIGH);
lcd_send4bits(data >> 4);
lcd_send4bits(data & 0x0F);
delay(2);
}
// Initialize LCD
void lcd_init() {
pinMode(RS, OUTPUT);
pinMode(EN, OUTPUT);
pinMode(D4, OUTPUT);
pinMode(D5, OUTPUT);
pinMode(D6, OUTPUT);
pinMode(D7, OUTPUT);
delay(20);
lcd_send4bits(0x03);
delay(5);
lcd_send4bits(0x03);
delayMicroseconds(100);
lcd_send4bits(0x03);
lcd_send4bits(0x02); // 4-bit mode
lcd_cmd(0x28); // 2 lines, 5x7
lcd_cmd(0x0C); // display ON
lcd_cmd(0x06); // increment cursor
lcd_cmd(0x01); // clear display
delay(2);
}
// Set cursor
void lcd_setCursor(int col, int row) {
int addr = (row == 0) ? 0x80 + col : 0xC0 + col;
lcd_cmd(addr);
}
// Print string
void lcd_print(char *str) {
while (*str) {
lcd_data(*str++);
}
}
void setup() {
lcd_init();
lcd_setCursor(0, 0);
lcd_print((char*)"Up Counter");
lcd_setCursor(0, 1);
lcd_print(counter);
}
void loop() {
int i;
// Increment logic
for (i = 9; i >= 0; i--) {
if (counter[i] < '9') {
counter[i]++;
break;
} else {
counter[i] = '0';
}
}
lcd_setCursor(0, 1);
lcd_print(counter);
// Stop at 9999999999
if (i < 0) {
while (1);
}
delay(50); // adjust speed
}