16x2 LCD Right Scroll without library

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);
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.