Created
August 8, 2012 22:01
-
-
Save RC1140/3299197 to your computer and use it in GitHub Desktop.
Arduino LCD Scrolling
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <LiquidCrystal.h> | |
#include <string.h> | |
// initialize the library with the numbers of the interface pins | |
LiquidCrystal lcd(7, 8, 9, 10, 11, 12); | |
char message[] = "This is some long message that will end up scrolling"; | |
int previous = 0; | |
int pos = 0; | |
void setup() { | |
// set up the LCD's number of columns and rows: | |
lcd.begin(16, 2); | |
// Print a message to the LCD. | |
//lcd.print(message); | |
} | |
void printLine(int refreshSeconds){ | |
//Check if the current second since restart is a mod of refresh seconds , | |
//if it is then update the display , it must also not equal the previously | |
//stored value to prevent duplicate refreshes | |
if((millis()/1000) % refreshSeconds == 0 && previous != (millis()/1000)){ | |
previous = (millis()/1000);//Store the current time we entered for comparison on the next cycle | |
lcd.setCursor(0, 1);//Set our draw position , set second param to 0 to use the top line | |
char lcdTop[16];//Create a char array to store the text for the line | |
int copySize = 16; // What is the size of our screen , this could probably be moved outside the loop but its more dynamic like this | |
if(strlen(message) < 16) | |
{ | |
//if the message is bigger than the current buffer use its length instead; | |
copySize = strlen(message); | |
} | |
//Store the current position temporarily and invert its sign if its negative since we are going in reverse | |
int tempPos = pos; | |
if(tempPos < 0) | |
{ | |
tempPos = -(tempPos); | |
} | |
//Build the lcd text by copying the required text out of our template message variable | |
memcpy(&lcdTop[0],&message[tempPos],copySize); | |
lcd.print(lcdTop);//Print it from position 0 | |
//Increase the current position and check if the position + 16 (screen size) would be larger than the message length , if it is go in reverse by inverting the sign. | |
pos += 1; | |
if(pos +16 >= strlen(message)) | |
{ | |
pos = -(pos); | |
} | |
} | |
} | |
void loop() { | |
printLine(1); | |
} |
Thank you for sharing your code
The following line causes he text to stop scrolling at the end
if(pos +16 >= strlen(message))
when changed to
if(pos +16 == strlen(message))
It scrolls back and forth
Hi tks u for sharing! works Great! I think its better change the variable refreshSeconds by refreshMiliSeconds, one second is a to large period refresh, also you must change:
if((millis()/1000) % refresMilihSeconds == 0 && previous != (millis()/1000))
by:
if((millis()) % refreshMiliSeconds == 0 && previous != (millis()))
this i think alow to have better control on time scroll.
Thanks for your code but I have problems:
Display of line 2 collum 0 is missing.
I don't know where is a change in the code?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
A nice way to do it :-)
But, on my 20 char wide lcd I found that line 43 needed to be changed to "if (pos + 20 >= (int)strlen(message))" or the display wouldnt reverse properly.
You also need lcdTop to be one byte bigger with the last byte initialised to 0 - otherwise "lcd.print(lcdTop)" puts one or more garbage characters on the screen, in my case, since print() is expecting a null terminated string. You may not notice this on a 16 char display because of the way the LCD memory is mapped.