Go Down

Topic: Nokia 6100 LCD Display - Arduino Playground (Read 56500 times) previous topic - next topic


Sep 18, 2009, 11:20 pm Last Edit: Sep 18, 2009, 11:21 pm by tkj Reason: 1
I'm not sure, so I won't recommend it!

?LED Backlight - 7V @ 40-50mA (very bright)


Definately don't want to put 9v to the board directly. The board should have DC to DC converter to raise 5 volts to the 7v required to run the backlight. (I believe it'll work with 3.3 volts as well)

But any higher than that you're risking it. You can use a voltage divider to bring it down to 5v if you NEED to use the 9v. (Keep in mind, 9v batteries don't have very much power.. you'll have a dead battery fairly quick, especially with an LCD connected, you'd be better off to use multiple AA batteries, or another supply:D)

Well.. I've been using the LCD for a base station for my RF kits, just to use it for debugging. I went through the whole PDF that explains how to interface it in like, 140 pages.. I tried to steal the Circle code from the example, but it's not working as expected. When I try draw the circle, it just draws a line at the top of the LCD, *shrug*.

Also on the LCD controller, it shows that there is some EEPROM you can use, how exciting. But anyways, best of luck!


Sep 22, 2009, 06:03 am Last Edit: Sep 22, 2009, 06:06 am by jbeuckm Reason: 1
Thanks for the tips!  I used a 7805l and powered the screen and arduino fine for a while until the 9v ran out.

I made some optimizations and posted the updated code here: http://www.beigerecords.com/joe/?p=378

Has anyone gotten this thing into 8-bit color mode with the sparkfun breakout board?  I tried a handful of things in setup and have only seen 12-bit mode.


Hi again.
Now I found my Nokia LCD one more time, connected it, and tried the code again, but I'm still experiencing the same problems as blip (look at his image)
Does anyone know how to fix that, or at least why it is happening?


If it weighed more and wasn't wired to my computer I would have thrown it across the room.

Loaded up cougar's mandelbrott demo and got the blue screen of nothingness.

Loaded up the gravitech code with phokur's changes and got a sorta kinda good result.  There seem to be bleeding pixels in the middle of the blocks.

with the code below, trying to us the 16bit color interface, I get something more than nothing, but less useful.  With a line in the middle that I don't understand at all.

Code: [Select]
/* Nokia 6100 LCD interface
rev - = basically copy of Gravitech LCD6610 (epson) program


const byte DISON = 0xaf; //Display On, 0 byte
const byte DISOFF = 0xae; //Display Off, 0 byte
const byte DISNOR = 0xa6; //Normal Display, 0 byte
const byte DISINV = 0xa7; //Inverse Display, 0 byte
const byte COMSCN = 0xbb; //Common Scan Direction, 1 byte
const byte DISCTL = 0xca; //Display control, 3 bytes
const byte SLPIN = 0x95; //Sleep in, 0 bytes
const byte SLPOUT = 0x94; //Sleep Out, 0 bytes
const byte PASET = 0x75; //Page Address Set, 2 bytes
const byte CASET = 0x15; //Column Address Set, 2 bytes
const byte DATCTL = 0xbc; //Data Scan Direction, 3 bytes
const byte RGBSET8 = 0xce; // 256 color position set, 20 bytes
const byte RAMWR = 0x5c; //Writing to memory, Data
const byte RAMRD = 0x5d; //Reading from memory, Data
const byte PTLIN = 0xa8; //Partial Display in, 2 Bytes
const byte PTLOUT = 0xa9; //Paritial Display out, 0 byte
const byte RMWIN = 0xe0; //Read and modify Write, 0 bytes
const byte RMWOUT = 0xee; //End (?), 0 bytes
const byte ASCSET = 0xaa; //Area scroll set, 4 bytes
const byte SCSTART = 0xab; //Scroll start set, 1 byte
const byte OSCON = 0xd1; //Interfnal Osciallation On. 0 byte
const byte OSCOFF = 0xd2; //Internal Osciallation Off, 0 byte
const byte PWRCTR = 0x20; //Power Control, 1 byte
const byte VOLCTR = 0x81; //Electronic volume control, 2 bytes
const byte VOLUP = 0xd6; //Inscrement electronic volume control by 1, 0 byte
const byte VOLDOWN = 0xd7; //Decrement electronic volume control by 1, 0 byte
const byte TMPGRD = 0x82; //Temperature gradient set, 14 bytes
const byte EPCTIN = 0xcd; //Control EEPROM, 1 byte
const byte EPCOUT = 0xcc; //Cancel EEPROM Control, 0 byte
const byte EPMWR = 0xfc; //Write into EEPROM, 0 byte
const byte EPMRD = 0xfd; //Read from EEPROM, 0 byte
const byte EPSRRD1 = 0x7c; //Read Register 1, 0 byte
const byte EPSRRD2 = 0x7d; //REad Register 2, 0 byte
const byte NOP = 0x25; //No Operation

//Arduino pins for control of LCD, using all PORTD pins for now
int LCDCS = 3;
int LCDSCK = 4;
int LCDDIO = 5;
int LCDRST = 6;

const byte pmin = 2;
const byte pmax = 131;
const byte cmin = 0;
const byte cmax = 129;

boolean d = true;
int j=1;

#define cbi(reg, bit) (reg&=~(1<<bit))
#define sbi(reg, bit) (reg|= (1<<bit))

#define setCS cbi(PORTD,LCDCS); //Chip select on
#define clearCS sbi(PORTD,LCDCS); //Chip select off
#define clearSCK cbi(PORTD,LCDSCK); //Clock low
#define setSCK sbi(PORTD,LCDSCK); //clock high
#define clearDIO cbi(PORTD,LCDDIO); //data low
#define setDIO sbi(PORTD,LCDDIO); //data high
#define setReset cbi(PORTD,LCDRST); //enable reset
#define clearReset sbi(PORTD,LCDRST); //disable reset

//#define BL0 cbi(PORTD,BL);
//#define BL1 sbi(PORTD,BL);

void lcdData(byte _b){
void lcdCmd(byte _b){

void writeToLCD(byte _b){

 if((_b&B10000000)!=0){setDIO} else {clearDIO}
 if((_b&B01000000)!=0){setDIO} else {clearDIO}
 if((_b&B00100000)!=0){setDIO} else {clearDIO}
 if((_b&B00010000)!=0){setDIO} else {clearDIO}
 if((_b&B00001000)!=0){setDIO} else {clearDIO}
 if((_b&B00000100)!=0){setDIO} else {clearDIO}
 if((_b&B00000010)!=0){setDIO} else {clearDIO}
 if((_b&B00000001)!=0){setDIO} else {clearDIO}
void setBox(byte c1,byte c2,byte p1,byte p2){

void fillBox(byte color, byte c1, byte c2, byte p1, byte p2)
 uint16_t total_bytes1;
 uint16_t total_bytes2;
 uint16_t total_bytes;

 setBox(c1, c2, p1, p2);

 total_bytes1 = (c2 - c1 + 1);
 total_bytes2 = (p2 - p1 + 1);
 total_bytes = total_bytes1 * total_bytes2;
 for (unsigned int i = 0; i < total_bytes; i++){

void fillScreen(byte color){
 fillBox(color,cmin, cmax,pmin,pmax);

//LCD Initialize------------------------------------
void lcdInit(){
 lcdCmd(DISCTL); //Display Control ---------------------------------
 lcdData(0x0A);  //CL dividing ratio
 lcdData(0x20);  //130 line display
 lcdData(0x11);  //no inversely highlighted lines
 lcdData(0x01);  //dispersion
 lcdCmd(COMSCN); //Com Scan ----------------------------------------
 lcdCmd(OSCON);  //Oscillator On -----------------------------------
 lcdCmd(SLPOUT); //Sleep Out ---------------------------------------
 lcdCmd(VOLCTR); //Voltage Control----------------------------------
 //Temperature Gradient
//  lcdCmd(TMPGRD);
//  lcdData(0);
//  lcdData(0);
//  lcdData(0);
//  lcdData(0);
//  lcdData(0);
//  lcdData(0);
//  lcdData(0);
//  lcdData(0);
//  lcdData(0);
//  lcdData(0);
//  lcdData(0);
//  lcdData(0);
//  lcdData(0);
//  lcdData(0);
 //Power Control -----------------------------------
 //Invert Display-----------------------------------
 //Clear Partial disply data------------------------
 //Autoscroll clearing (I hope)
 //Data Scan Direction------------------------------
 lcdData(0x04); //1 = 8 bit, 2 = 12 bit, 3=12 of 16 bit
 //RGB Mapping--------------------------------------
//  lcdCmd(RGBSET8);
//    lcdData(0x00);
//    lcdData(0x02);
//    lcdData(0x04);
//    lcdData(0x06);
//    lcdData(0x08);
//    lcdData(0x0A);
//    lcdData(0x0C);
//    lcdData(0x0F);
//    lcdData(0x00);      // 000 GREEN
//    lcdData(0x02);      // 001  
//    lcdData(0x04);      // 010
//    lcdData(0x06);      // 011
//    lcdData(0x08);      // 100
//    lcdData(0x0a);      // 101
//    lcdData(0x0c);      // 110
//    lcdData(0x0f);      // 111
//    lcdData(0x00);      //  00 BLUE
//    lcdData(0x06);      //  01
//    lcdData(0x09);      //  10
//    lcdData(0x0f);      //  11




void setup(){
 DDRD |= B01111100;   // Set SPI pins as output
 PORTD |= B01111100;  // Set SPI pins HIGH

 //Make some shit happen

 d = false;

void loop(){
 d = false;
 byte C = 0xFF;
 int dC=30;
 if(C > dC){


When I use Phokur's updates, well, nothing works the same as before.. and not in a good way! lol pixels galore..

I've been trying to implement how to use a BMP.. but that's proving to be a bigger pain in the ass than I normally expected. :P


Hello everyone,

I got the SparkFun Nokia knock-off break out board just like Phokur and I am having the same problems with weird colors and text. After I applied his mods (especially for the text size) I got some results, meaning the text is legible but the colors are all messed up. I am using the library you guys made and I am making the tweaks you guys recommend to see what's working. I have a few questions:

- why aren't we using the hardware SPI?
- why aren't we using the 12 bit color scheme instead of the 8 bit one?
- is there a possibility to flip the image 90 degrees?

I am using diodes and pull-up resistors for voltage converting, unfortunately I did not had shotky diodes handy, so there might be a timing problem for the communication.

Another weird thing, the LCD seems like looping through the DATCTL settings because I got solid color bars (black yellow blue cyan) then garbled color bars (black magenta cyan white) and the text changes colors too. When is garbled, each color bar has vertical lines, one line color, one line black and they alternate from one color to the other, that means if for the first color the black lines (columns) are even, for the second color the black lines are odd. The text appears with vertical lines too, like the LCD has less resolution or something like that. Sometimes the text has red lines above and below each text line. All these are looping over about 15 cycles or so.

At this time I wish I had bought the Nuelectronics Color Arduino Shield instead of the Sparkfun's board or the one CaptainObvious has.


Anything new on this? Is anyone making some progress? Should I toss out this color LCD and buy another one that works?



I gave up on the color settings, so I can actually use the thing on my robot. I finally succeeded writing the code for a scan and display map module. I used the Ping sensor, which makes the objects be wider than they are, but is crazy fast. I wish same speed could be achieved with Sharp sensors. I can post up the code if someone needs it.

Here is a video:

Anyway, looking for ways to properly set up the display, I found this amazing code written in C++ for Mega8, 16, 32... 644. It does everything, but it's a bit over my head to understand it. I would like to port it to Arduino as a library. Can anyone help with this?

Here is the link:


Hi, I'm using this Nokia 6610 LCD (Green PCB -> Epson) over an Olimex board (http://www.olimex.com/dev/mod-nokia6610.html) equipped with a DC-DC converter to have the correct 7V to power the backlight.

I've wired this board to my Arduino Duemilanove working with an AtMega328 and the 0017 version of the IDE.

I'm experiencing the same Blip's and other users problems, that consists in wrong/mismatch visualization of the data sent over the SPI bus.

I'm checking the data over the bus by a logis state analyzer and it seems the data was correct, but I'm still analyzing...

I also checked the new Epson controller datasheet to be sure the command sent to the lcd was correct, but none is working.

Somebody have some news about to control this device?

Today I'll try to compile my simple source code with another IDE version (0011>)... grrr...


Hi, finally I was able to correctly drive this LCD. The issues was the following:

1. new Epson LCD are equipped with a new Epson clone controller that doesn't supports 8 bit color driving
2. it's necessary to set the P3 parameter of the DATCTL command to the value 4 instead of 2.
3. new datasheet's revision of the Epson controller (S1D15G10) that can be found via Google search, now contains the info of the point 2 that isn't contained in the old revision (S1D15G00).

More info here:



Hi, finally I was able to correctly drive this LCD. The issues was the following:

1. new Epson LCD are equipped with a new Epson clone controller that doesn't supports 8 bit color driving
2. it's necessary to set the P3 parameter of the DATCTL command to the value 4 instead of 2.
3. new datasheet's revision of the Epson controller (S1D15G10) that can be found via Google search, now contains the info of the point 2 that isn't contained in the old revision (S1D15G00).

More info here:



I'm astounded by the work done on this board.

I'm pretty new to Arduino's, and I'm chugging through my first real project (after playing with a bunch of tutorials).

I'm trying to print numerical values generated by the Arduino (Longs):

nokiaLcd.lcd_draw_text(MAGENTA, BLACK, 7, 90, text);
strcpy(text,"0");  // <--------  I want to replace this "0" with a Long variable
nokiaLcd.lcd_draw_text(CYAN, BLACK, 40, 90, text);

I've tried various methods of swapping out the "0" with the variable velocity.  I keep getting:
error: invalid conversion from 'long int' to 'const char*'
when I replace the line above with:

I've tried a couple of other permutations, including changing the next line to:
nokiaLcd.lcd_draw_text(CYAN, BLACK, 40, 90, shots);

I get:
error: invalid conversion from 'long int' to 'char*'

I'm using a Diecimila to drive the board, and so far things have been flawless.  I've looked for ways to "Cast" the variable, but char(shots) doesn't seem to work either.

Thank you


Hi...i got the LCD to show up text and clear up fine. Thank you so much everyone. I was wondering if the library can be used to show photos?


Hi. I just got the SparkFun breakout board working wih Arduino.

I used the code from Arduino Playground -- Epson S1D15G10 Nokia LCD (Work In Progress)

I can see the test pattern (Purple Yellow Orange) when I view the display from an angle. But if I look at the display straight-on, all I see is Blue -- or maybe 3 shades of Blue.

Any ideas what I need to do to get display o look right?



Go Up