Go Down

Topic: Serial input to LCD problem (Read 695 times) previous topic - next topic

REPthe603

Apr 19, 2009, 10:50 pm Last Edit: Apr 19, 2009, 10:54 pm by REPthe603 Reason: 1
I'm using a standard HDD4780 (or something like that, i forget the exact model) compliant LCD for this project, and it does work with simpler programs.  My problem is that it seems to overwrite itself sometimes.  I assume its my code, but I can't be sure.  Here's the code:

Code: [Select]

#include <LCD4Bit.h>

LCD4Bit lcd = LCD4Bit(2);


int x = 0;
int i =0;
int button = 13;
char g[53]="";
char u[25]="";
char ut[25]="";
char l[25]="";
char lt[25]="";
char b[25]="                       ";
int scrolled=0;


void setup()
{
 lcd.init();
 Serial.begin(19200);
}

void loop()
{
 // Serial data waiting?
 if (Serial.available())
 {
   delay(100);
   
   // Read in the serial data to g
   while(Serial.available()>0)
   {
     g[x]=Serial.read();
     x++;
   }
   x=0;
   char ch = g[x];
   
   // Begin filling the upper temp, until the % character
   while (g[x] != '%')
   {
     ut[x-1]=g[x];
     x++;
   }
   
   // Was that actually wanted data?
   if (g[0] != '$')
   {
     // If not, clear the upper temp
     for(int i = 0; i < 25; i++)
     {
       ut[i]=' ';
     }
   }
   
   // Fill the rest to the lower temp until ^ character
   while(g[x+1] != '^')
   {
     x++;
     lt[i]=g[x];
     i++;
   }
   x=0;
   i=0;
   
   // Clear g
   for(int i = 0; i < 53; i++)
   {
     g[i]=' ';
   }
 
   // Upper temp not empty?
   if (ut[0] != ' ')
   {
     // Clear upper line
     lcd.cursorTo(1,0);
     delay(1);
     lcd.printIn(b);
     delay(10);
     // Print new data
     lcd.cursorTo(1,0);
     delay(1);
     lcd.printIn(ut);
     delay(10);
     // Save temp
     for(int i = 0; i < 25; i++)
     {
       u[i]=ut[i];
       ut[i]=' ';
     }
   }
   
   // Lower temp not empty?
   if (lt[0] != ' ')
   {
     // Clear lower line
     lcd.cursorTo(2,0);
     delay(1);
     lcd.printIn(b);
     delay(10);
     // Print new data
     lcd.cursorTo(2,0);
     delay(1);
     lcd.printIn(lt);
     delay(10);
     // Save temp
     for(int i = 0; i < 25; i++)
     {
       l[i]=lt[i];
       lt[i]=' ';
     }
   }
 }
 
 // Otherwise, check if we should be scrolling
 while(!(Serial.available() > 0))
 {
   delay(1500);
   // Scroll if the string is off the screen
   if((u[16] != ' ')||(u[17] != ' ')||(l[16] != ' ')||(l[17] != ' '))
   {
     lcd.leftScroll(10,750);
     scrolled=1;
   }
   // If scrolled, redraw the text
   if (scrolled == 1)
   {
     lcd.clear();
     lcd.cursorTo(1,0);
     lcd.printIn(u);
     delay(1);
     lcd.cursorTo(2,0);
     lcd.printIn(l);
     scrolled=0;
   }
 }
}



This works in the way that data can be sent, 2 lines at a time in 1 string. The first character has to be $ to get first line data, the % character denotes the end of the first line, and ^ is the endline character.  Each line is held to 25 characters, while the input buffer (g) is 53, to account for 50 characters and 3 delimiters. The b string is for blanking a line when I want to write new data, in case the new data is shorter than the old (it overwrites, so I have to make sure nothing is left over to screw up what i see).

The problem is this:  when I first send data, it all displays, but scrolls.  That i can live with, but the second (and ever after) data send does not display correctly.  The first line seems to get blanked, first 8 characters then 16 then probably 32, but I dont go that high anyway.  It is supposed to be able to write a single line (top if send $(text)%^, bottom is sent %(text)^), but wont do it.  The bottom always writes correctly, the top is giving me real problems.  Any ideas?

[edit]
Many of the delays are probably not needed, I was just trying before to see if it was overwriting itself on a timing problem or something.
[/edit]
Whats a warranty?

kevin duino

#1
Apr 21, 2009, 01:14 am Last Edit: Apr 21, 2009, 01:16 am by kev Reason: 1
Quote
My problem is that it seems to overwrite itself sometimes



try inserting lcd.clear();

in some cases that might help :)

Try This, I Think I Fixed It For You :P



Code: [Select]
#include <LCD4Bit.h>

LCD4Bit lcd = LCD4Bit(2);


int x = 0;
int i =0;
int button = 13;
char g[53]="";
char u[25]="";
char ut[25]="";
char l[25]="";
char lt[25]="";
char b[25]="                       ";
int scrolled=0;


void setup()
{
 lcd.init();
 Serial.begin(19200);
}

void loop()
{
lcd.clear();
 // Serial data waiting?
 if (Serial.available())
 {
   delay(100);
   
   // Read in the serial data to g
   while(Serial.available()>0)
   {
     g[x]=Serial.read();
     x++;
   }
   x=0;
   char ch = g[x];
   
   // Begin filling the upper temp, until the % character
   while (g[x] != '%')
   {
     ut[x-1]=g[x];
     x++;
   }
   
   // Was that actually wanted data?
   if (g[0] != '$')
   {
     // If not, clear the upper temp
     for(int i = 0; i < 25; i++)
     {
       ut[i]=' ';
     }
   }
   
   // Fill the rest to the lower temp until ^ character
   while(g[x+1] != '^')
   {
     x++;
     lt[i]=g[x];
     i++;
   }
   x=0;
   i=0;
   
   // Clear g
   for(int i = 0; i < 53; i++)
   {
     g[i]=' ';
   }
 
   // Upper temp not empty?
   if (ut[0] != ' ')
   {
     // Clear upper line
     lcd.cursorTo(1,0);
     delay(1);
     lcd.printIn(b);
     delay(10);
     // Print new data
     lcd.cursorTo(1,0);
     delay(1);
     lcd.printIn(ut);
     delay(10);
     // Save temp
     for(int i = 0; i < 25; i++)
     {
       u[i]=ut[i];
       ut[i]=' ';
     }
   }
   
   // Lower temp not empty?
   if (lt[0] != ' ')
   {
     // Clear lower line
     lcd.cursorTo(2,0);
     delay(1);
     lcd.printIn(b);
     delay(10);
     // Print new data
     lcd.cursorTo(2,0);
     delay(1);
     lcd.printIn(lt);
     delay(10);
     // Save temp
     for(int i = 0; i < 25; i++)
     {
       l[i]=lt[i];
       lt[i]=' ';
     }
   }
 }
 
 // Otherwise, check if we should be scrolling
 while(!(Serial.available() > 0))
 {
lcd.clear();
   delay(1500);
   // Scroll if the string is off the screen
   if((u[16] != ' ')||(u[17] != ' ')||(l[16] != ' ')||(l[17] != ' '))
   {
     lcd.leftScroll(10,750);
     scrolled=1;
   }
   // If scrolled, redraw the text
   if (scrolled == 1)
   {
     lcd.clear();
     lcd.cursorTo(1,0);
     lcd.printIn(u);
     delay(1);
     lcd.cursorTo(2,0);
     lcd.printIn(l);
     scrolled=0;
   }
 }
}


[ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618]

kevin duino

and if that dont work, tell me what you mean by (overwriting its self)
[ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618]

REPthe603

Thanks, i tried it but not quite working how i want/how it should.  I'm not sure if you did anything else but the clears, but I'm using the code you reposted without the clear at the beginning of the loop{} and the beginning of the while(!Serial) loop, just to make sure.  Anyway, what happens is after the third time sending data, the first 3 characters of the top line are blanked.  Say i send $Hello%World^ first.  It shows up, on both lines as expected, but scrolls.  That i can live with.  the 2nd thing i send is $TOP%BOTTOM^.  That works fine, both lines no scrolling.  Even if I sent $%Hello bottom^, it does as expected and only modifies the bottom line.  But now, the third send has issues.  Say i send $Helloooooo%Again!^, all that prints is    loooooo Again!, but on two lines like how it should.  Thereafter, the first line is missing 3 characters (blanked).  Also, I can't overwrite the top line without clearing the bottom, but I can overwrite the bottom without clearing the top.  Thanks for the try though  :-/
Whats a warranty?

kevin duino

try printing"   hello world"

maby you have to put 3 or 4 or 5 spaces before your print :)
[ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618][ch9618]

Go Up