Go Down

Topic: Low-cost graphic Nokia 3310 LCD shield & Joystick (Read 23109 times) previous topic - next topic


We have developed a new shield based on the popular Nokia 3310 graphic LCD.  Nokia 3310 LCD is low-cost, monochrome LCD with 84x48 display.  It also has a 5-direction joystick and 4 blue backlight LED.    

Schematic, library & example application can be downloaded from our website - http://www.nuelectronics.com/

Here are a couple of photos of this shield  :) --



Jul 27, 2009, 05:54 pm Last Edit: Jul 27, 2009, 05:55 pm by TeamMCS Reason: 1
That looks likea great LCD with a fairly reasonable price tag (would be nice to see a lower P+P).

One request I do have is the supporting code isn't well documented. It's hard to understand how, for example, to draw from pixel to pixel or maybe a line for example.

Can you provide any additional code?

Oh in addition, have you considered making some kind of chassies with some kind of connector cables? It would be nice to be able to setup more perminant versions of your products.



Yes, this is definitely something I would be looking for as well. A decent enclosure that fits an Arduino, an LCD display, a battery, a joystick navigation, 4 additional buttons and some place for adding connectors. This would be a killer.

For my projects the biggest issue is actually finding a decent enclosure and then drilling all the holes. If something like this would exist prefabricated I would be more than happy to buy it.
Check out my experiments http://blog.blinkenlight.net



Jul 31, 2009, 11:29 pm Last Edit: Aug 01, 2009, 12:09 am by TeamMCS Reason: 1
@NuElectronics: The lcd.LCD_3310_set_XY has no effect. Can you take a look at your code? Without comments I'm lost

Just for your information. I want to turn on a particular pixel so I can draw without the need of a bitmap


I keep forgetting this thread, but the product looks quite nice, and I have been working on two libraries for the 3310. One is a simple text only one, it can be used exactly like a 16x2 or similar character LCD but with 14x6 characters. The other one is a very heavy one that can do all the things the KS0108 library does and a bit more, like lines, rectangles, ellipses, font upscaling, windowed clearing and inverting, and so on, using about 550 bytes of ram. Also have a python script that makes a header file with an array from a monochrome bitmap. Both libraries can get those bitmaps on the screen although the simple one can't 'edit' them nicely. Anyways, both should be done pretty soon, I just need to get the code cleaned up.


Good man, that would be really helpful.

I was hoping to develop some simple games so I can work on my memory consumption on my own libraries.

I did manage to make some progress on the set_xy. That *actually* means cursor GOTO. I'll post the code later but the location needed a mask on it.

In addition, you need to write a byte to make it display anything. Obviously a byte includes 8 bits which means you have 8 pixels you must also set each time you set your selected pixel.

I'm eager to here from NuElectronics. Turns out he's only around the corner from me based on the return address!


Hi Guy's/Gals I need some help Pleaze. First I'm still learning so bear with me. My end goal is to have the shield display "functions" like a temp reading say from a LM35 but I'm stuck.

The sample code shows how to compile a menu and use  LCD_3310_write_string ,LCD_3310_draw_bmp_pixel etc.

Can some one please explain the charmap sample and LCD_write_byte as per the library. Or maybe guide me to a link were I can learn more.

It would seem that the Nokia_3310_lcd library is more developed, but that just confuse me more as it is written for the color display.

Also the display from this shield is a Nokia 5110 right and not a 3310?



The LCD uses the Philips PCD8544 chip, it is compatible with the 3310 LCD.  Here is a link of the PCD8544 datasheet -
http://www.nxp.com/acrobat/datasheets/PCD8544_1.pdf.   Accessing individual pixel on the LCD is a bit tricky, because the LCD control chip is organized in 84 x 6 bytes (= 84 x 48 pixels).  Therefore a local buffer is needed for pixel read/write, and updating the LCD.   I am in a process of developing the graphic library (most of the code is working).  Will publish the code as soon as I can  ;D


Thanks that would be of great help for a noob like me! Standing by.


There has a MP3 programmer run on SAM3U-EK which could play .wav and .mp3 audio file.
The programmer base on a free OS called Coos,it is similarity to RTX and UCOS.

You can get the source file of MP3 programmer from http://www.coocox.org/EXAMPLE/SAM3U_MP3_CoOS.htm


I´m also an owner of this display. I made some teste and it´s work fine. But i´ve a porblem how can I display som "int"value like the one i get from analog read. The Libary said there ist only CHar or byte to display. In my tests i con only display singele dots wich blink´s like an binary code.

Thx for help
0x2B | ~ 0x2B = 0xFF  


Jun 24, 2010, 07:48 am Last Edit: Jun 24, 2010, 07:50 am by maujabur Reason: 1
I just ported a routine to plot ellipses (the ks0108 library didn't have one) - maybe you could use, just changing the function Plot4EllipsePoints

Code: [Select]
void PlotEllipse(long CX, long  CY, long XRadius,long YRadius, int color) {
// portted the algorithm found at
// http://homepage.smc.edu/kennedy_john/belipse.pdf
// by John Kennedy

 long X, Y;
 long XChange, YChange;
 long EllipseError;
 long TwoASquare,TwoBSquare;
 long StoppingX, StoppingY;
 TwoASquare = 2*XRadius*XRadius;
 TwoBSquare = 2*YRadius*YRadius;
 X = XRadius;
 Y = 0;
 XChange = YRadius*YRadius*(1-2*XRadius);
 YChange = XRadius*XRadius;
 EllipseError = 0;
 StoppingX = TwoBSquare*XRadius;
 StoppingY = 0;

 while ( StoppingX >=StoppingY ) //first set of points,y'>-1
   StoppingY=StoppingY+ TwoASquare;
   EllipseError = EllipseError+ YChange;
   if ((2*EllipseError + XChange) > 0 ) {
     StoppingX=StoppingX- TwoBSquare;
     EllipseError=EllipseError+ XChange;
 //{ first point set is done; start the 2nd set of points }

 Y = YRadius;
 X = 0;
 YChange = XRadius*XRadius*(1-2*YRadius);
 XChange = YRadius*YRadius;
 EllipseError = 0;
 StoppingY = TwoASquare*YRadius;
 StoppingX = 0;
 while ( StoppingY >=StoppingX ) //{2nd set of points, y'< -1}
   StoppingX=StoppingX + TwoBSquare;
   EllipseError=EllipseError+ XChange;
   if ((2*EllipseError + YChange) > 0 ) {
     StoppingY=StoppingY- TwoASquare;
     EllipseError=EllipseError+ YChange;
}; //{procedure PlotEllipse}

void Plot4EllipsePoints(long CX,long  CY, long X, long Y, int color){
 GLCD.SetDot(CX+X, CY+Y, color); //{point in quadrant 1}
 GLCD.SetDot(CX-X, CY+Y, color); //{point in quadrant 2}
 GLCD.SetDot(CX-X, CY-Y, color); //{point in quadrant 3}
 GLCD.SetDot(CX+X, CY-Y, color); //{point in quadrant 4}

Go Up