-
-
Save RC1140/3299197 to your computer and use it in GitHub Desktop.
#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); | |
} |
No prob , surprised anyone found this
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.
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?
Thanks just what I was looking for, save me reinventing the wheel ;)