I want to write a message on a 16x2 LCD running in 4bit mode with an UNO, and after 16 characters I want it to scroll to the right as new characters come in without using LiquidCrystal.
This is what I'm working with,
#include <string.h>
#define RS 12 //register/command pin
#define E 11 //enable trigger pin
#define D4 13 //data pin 4
#define D5 10 //data pin 5
#define D6 9 //data pin 6
#define D7 0 //data pin 7
void setup() {
pinMode(RS, OUTPUT);
pinMode(E, OUTPUT);
pinMode(D4, OUTPUT);
pinMode(D5, OUTPUT);
pinMode(D6, OUTPUT);
pinMode(D7, OUTPUT);
delay(150);
lcd_initialization();
lcdwrite(1, "This is a sample message");
}
void loop() {
// put your main code here, to run repeatedly:
}
void lcdwrite(int select, char *data_1) {
char data;
int len = strlen(data_1);
for (int i = 0; i < len; i++) {
// // if (i == 16) {
// // lcdcmdwrite(0, 0xC0);
// // }
data = data_1[i]; //"This is a sample message"
digitalWrite(RS, select);
//for 4 high order bits
digitalWrite(D4, (data & 0b00010000) >> 4);
digitalWrite(D5, (data & 0b00100000) >> 5);
digitalWrite(D6, (data & 0b01000000) >> 6);
digitalWrite(D7, (data & 0b10000000) >> 7);
delay(15);
digitalWrite(E, HIGH);
delay(15);
digitalWrite(E, LOW);
delay(15);
//for 4 low order bits
digitalWrite(D4, (data & 0b00000001) >> 0);
digitalWrite(D5, (data & 0b00000010) >> 1);
digitalWrite(D6, (data & 0b00000100) >> 2);
digitalWrite(D7, (data & 0b00001000) >> 3);
delay(15);
digitalWrite(E, HIGH);
delay(15);
digitalWrite(E, LOW);
delay(15);
}
}
void lcd_initialization() {
lcdcmdwrite(0, 0x32); //send for 4 bit init of lcd
delay(15);
lcdcmdwrite(0, 0x28); //2 line, 5x7 matrix in 4bit mode
delay(15);
lcdcmdwrite(0, 0x01); //clear display screen
delay(15);
lcdcmdwrite(0, 0x0C); //display on cursor off
delay(15);
lcdcmdwrite(0, 0x06); //increment cursor (shift cursor to right)
delay(15);
lcdcmdwrite(0, 0x80); //cursor to the begin of 1st line
delay(15);
}
void lcdcmdwrite(int select, char data) { //for writing cmds
digitalWrite(RS, select); //change RS for cmd/data
digitalWrite(D4, (data & 0b00010000) >> 4);
digitalWrite(D5, (data & 0b00100000) >> 5);
digitalWrite(D6, (data & 0b01000000) >> 6);
digitalWrite(D7, (data & 0b10000000) >> 7);
delay(15);
digitalWrite(E, HIGH);
delay(15);
digitalWrite(E, LOW);
delay(15);
digitalWrite(D4, (data & 0b00000001) >> 0);
digitalWrite(D5, (data & 0b00000010) >> 1);
digitalWrite(D6, (data & 0b00000100) >> 2);
digitalWrite(D7, (data & 0b00001000) >> 3);
delay(15);
digitalWrite(E, HIGH);
delay(15);
digitalWrite(E, LOW);
delay(15);
}