Only numbers on screen, no characters

Hi all,

Yesterday i bought my first arduino (uno), I got led blinking and fading working, but I still had a 16x2 character display lying around here. So I thought; hey can i maybe use this in combo with my brand new arduino and that program called LCD smartie? :) After a few minutes of google i found this thread: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1256721775 I followed all the steps in the thread but all i got was this: What there should be is: Hello Arduino

Problem is: I'm a complete noob but i want get this to work. LCD smartie is communicating with the arduino ( I can tell by the RX light)

I hope someone knows a solution. Thanks

Also don't mind my bad soldering :P

Seeing your code and your circuit would help

Looks like you are printing characters as integers.

104 h 101 e 108 l 108 l 111 o

Old style (pre 1.0) is .print(character, BYTE); New style is .write(character);

johnwasser:
Looks like you are printing characters as integers.

104 h
101 e
108 l
108 l
111 o

Old style (pre 1.0) is .print(character, BYTE);
New style is .write(character);

It looks like that is the problem. But as is said; im a noob. So what do i have to change now to get it to work properly?

Hard to say what to change without seeing the code but you could try adding the ", BYTE" in your print call.

johnwasser:
Hard to say what to change without seeing the code but you could try adding the “, BYTE” in your print call.

Sorry, the code was in the link, thoutgh it was clear but here it is:

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(5, 6, 7, 8, 9, 10, 11);

void setup() {
 // set up the LCD's number of columns and rows: 
 lcd.begin(2, 16);
 Serial.begin(9600);
}


byte serial_getch(){
 
 int incoming;  
 while (Serial.available()==0){}
     // read the incoming byte:
 incoming = Serial.read();

 return (byte) (incoming &0xff);
}
       


void loop(){
 
 byte rxbyte;
 byte temp;
 
 rxbyte = serial_getch();

 if (rxbyte == 254) //Matrix Orbital uses 254 prefix for commands
     {
           switch (serial_getch())
           {
                 case 66: //backlight on (at previously set brightness)
                               // not implemented                        

                       break;
                 case 70: //backlight off
                       // not implemented                        
                               break;
                 case 71:  //set cursor position
                       temp = (serial_getch() - 1);  //get column byte
                       switch (serial_getch())  //get row byte
                       {
                             //line 1 is already set up
                             case 2:
                                   temp += 0x40;
                                   break;
                             case 3:
                                   temp += 0x14;
                                   break;
                             case 4:
                                   temp += 0x54;
                                   break;
                             default:
                                   break;
                       }
                       lcd.command(0b10000000 + temp);
                       break;
                 case 72:  //cursor home (reset display position)
                       lcd.command(2);
                       break;
                 case 74:  //show underline cursor
                       lcd.command(0b00001110);
                       break;
                 case 75:  //underline cursor off
                 case 84:  //block cursor off
                       lcd.command(0b00001100);
                       break;
                 case 76:  //move cursor left
                       lcd.command(16);
                       break;
                 case 77:  //move cursor right
                       lcd.command(20);
                       break;
                 case 78:  //define custom char
                       lcd.command(64 + (serial_getch() * 8));  //get+set char address
                       for (temp = 7; temp != 0; temp--)
                       {
                             lcd.print(serial_getch()); //get each pattern byte
                       }
                       break;
                 case 83:  //show blinking block cursor
                       lcd.command(0b00001111);
                       break;
                 case 86:  //GPO OFF
                       //implement later
                       break;
                 case 87:  //GPO ON
                       /*temp = serial_getch();
                       if (temp == 1)
                       {
                             GPO1 = GPO_ON;
                       }*/
                       break;
                 case 88:  //clear display, cursor home
                       lcd.command(1);
                       break;
                 case 152: //set and remember (doesn't save value, though)
                 case 153: //set backlight brightness
                       //not implemented
                       break;

                 //these commands ignored (no parameters)
                 case 35: //read serial number
                 case 36: //read version number
                 case 55: //read module type
                 case 59: //exit flow-control mode
                 case 65: //auto transmit keypresses
                 case 96: //auto-repeat mode off (keypad)
                 case 67: //auto line-wrap on
                 case 68: //auto line-wrap off
                 case 81: //auto scroll on
                 case 82: //auto scroll off
                 case 104: //init horiz bar graph
                 case 109: //init med size digits
                 case 115: //init narrow vert bar graph
                 case 118: //init wide vert bar graph
                       break;
                 default:
                       //all other commands ignored and parameter byte discarded
                       temp = serial_getch();  //dump the command code
                       break;
           }
           return;
     } //END OF COMMAND HANDLER

     //change accented char to plain, detect and change descenders
     //NB descenders only work on 5x10 displays. This lookup table works
     //  with my DEM-20845 (Display Elektronik GmbH) LCD using KS0066 chip.
     switch (rxbyte)
     {
           //chars that have direct equivalent in LCD charmap
/*            case 0x67: //g
                 rxbyte = 0xE7;
                 break;
           case 0x6A: //j
                 rxbyte = 0xEA;
                 break;
           case 0x70: //p
                 rxbyte = 0xF0;
                 break;
           case 0x71: //q
                 rxbyte = 0xF1;
                 break;
           case 0x79: //y
                 rxbyte = 0xF9;
                 break;
*/            case 0xE4: //ASCII "a" umlaut
                 rxbyte = 0xE1;
                 break;
           case 0xF1: //ASCII "n" tilde
                 rxbyte = 0xEE;
                 break;
           case 0xF6: //ASCII "o" umlaut
                 rxbyte = 0xEF; //was wrong in v0.86
                 break;
           case 0xFC: //ASCII "u" umlaut
                 rxbyte = 0xF5;
                 break;

           //accented -> plain equivalent
           //and misc symbol translation
           case 0xA3: //sterling (pounds)
                 rxbyte = 0xED;
                 break;
/*            case 0xB0: //degrees symbol
                 rxbyte = 0xDF;
                 break;
*/            case 0xB5: //mu
                 rxbyte = 0xE4;
                 break;
           case 0xC0: //"A" variants
           case 0xC1:
           case 0xC2:
           case 0xC3:
           case 0xC4:
           case 0xC5:
                 rxbyte = 0x41;
                 break;
           case 0xC8: //"E" variants
           case 0xC9:
           case 0xCA:
           case 0xCB:
                 rxbyte = 0x45;
                 break;
           case 0xCC: //"I" variants
           case 0xCD:
           case 0xCE:
           case 0xCF:
                 rxbyte = 0x49;
                 break;
           case 0xD1: //"N" tilde -> plain "N"
                 rxbyte = 0x43;
                 break;
           case 0xD2: //"O" variants
           case 0xD3:
           case 0xD4:
           case 0xD5:
           case 0xD6:
           case 0xD8:
                 rxbyte = 0x4F;
                 break;
           case 0xD9: //"U" variants
           case 0xDA:
           case 0xDB:
           case 0xDC:
                 rxbyte = 0x55;
                 break;
           case 0xDD: //"Y" acute -> "Y"
                 rxbyte = 0x59;
                 break;
/*            case 0xDF: //beta  //mucks up LCDSmartie's degree symbol??
                 rxbyte = 0xE2;
                 break;
*/            case 0xE0: //"a" variants except umlaut
           case 0xE1:
           case 0xE2:
           case 0xE3:
           case 0xE5:
                 rxbyte = 0x61;
                 break;
           case 0xE7: //"c" cedilla -> "c"
                 rxbyte = 0x63;
                 break;
           case 0xE8: //"e" variants
           case 0xE9:
           case 0xEA:
           case 0xEB:
                 rxbyte = 0x65;
                 break;
           case 0xEC: //"i" variants
           case 0xED:
           case 0xEE:
           case 0xEF:
                 rxbyte = 0x69;
                 break;
           case 0xF2: //"o" variants except umlaut
           case 0xF3:
           case 0xF4:
           case 0xF5:
           case 0xF8:
                 rxbyte = 0x6F;
                 break;
           case 0xF7: //division symbol
                 rxbyte = 0xFD;
                 break;
           case 0xF9: //"u" variants except umlaut
           case 0xFA:
           case 0xFB:
                 rxbyte = 0x75;
                 break;
           default:
                 break;
     }

     lcd.print(rxbyte);  //otherwise a plain char so we print it to lcd
     return;


}

Try changing

lcd.print(rxbyte); //otherwise a plain char so we print it to lcd

to

lcd.print(rxbyte, BYTE); //otherwise a plain char so we print it to lcd

johnwasser: Try changing

lcd.print(rxbyte); //otherwise a plain char so we print it to lcd

to

lcd.print(rxbyte, BYTE); //otherwise a plain char so we print it to lcd

but BYTE does not exist in Arduino 1.0 (Another one of those non backward compatible changes in 1.0) So it is safest to simply cast rxbyte (which is declared as an unsigned char) as a char so it works in both pre 1.0 and 1.0

lcd.print((char)rxbyte);  //otherwise a plain char so we print it to lcd

or directly call the write() routine:

lcd.write(rxbyte);  //otherwise a plain char so we print it to lcd

using write() on pre 1.0 will eliminate the printNumber() routine which really isn't needed in this case.


This is an area that changed from pre 1.0 to 1.0 in pre 1.0, calling print() with a char or a an unsigned char and no "base" qualifier argument behaved the same. (The "base" was BYTE or 0, which meant print it a character). In 1.0 the default "base" for an unsigned char is now DEC or 10 which means unsigned chars print as a decimal number rather than a character.

--- bill

It works!! Thanks.

But ofcourse, another problem showed up :stuck_out_tongue:

This is how it looks:

This is how it should look:

I completely rebuilt the circuit thinking it was a broken wire, but unfortunately the problem still shows up, I think its the code again, because normal characters do show up the right way.

EDIT: I just plugged it into another usb port, but the strange thing is that the blocks are now wrong in a different way, more complete though

Hi! I have the same problem as you. Have you figured it out, the character problem?
Thanks!