Nokia 6100 LCD Display - Arduino Playground

This has made it functional for me. I'm using lcd_clear to manually draw everything and updated my colors as following.

  // Data control
  sendCMD(DATCTL);
  sendData(0x00);
  sendData(0x01);
  sendData(0x02);
// 12-bit color definitions
#define GREEN                  0xE0
#define RED                  0x1C
#define BLUE                  0x03
#define YELLOW                  0xFC
#define TEAL                  0xE3
#define PINK                  0x1F
#define BLACK                  0x00
#define WHITE                  0xFF

The final piece to the puzzle, the fonts are now working. They're larger then before (not a bad thing).

void draw_text_line(byte fcolor, byte bcolor,byte x, byte y,char c)
{
  lcd_set_box(x,y,x,y+15);
  sendCMD(RAMWR);
  for(unsigned int i=0;i<8;i++)
  {
    if (1<<i & c)
    {
      sendData((fcolor >> 4) & 0xFF);
      sendData(((fcolor & 0xF) << 4) | ((fcolor >> 8) & 0xF));
      sendData(fcolor & 0xFF);
    }
    else
    {
      sendData((bcolor >> 4) & 0xFF);
      sendData(((bcolor & 0xF) << 4) | ((bcolor >> 8) & 0xF));
      sendData(bcolor & 0xFF);
    }
  }
}

So to sum up what you need for the SparkFun Nokia 6100 lcd knockoff to work with the arduino is the Gravitech code with my modified lcd_clear, data control, color definitions, and draw_text_line.

It's good to see that you phokur have "refurbished" the code, making it faster.
When I get home I'll update the library with the changes...
In the meanwhile I hope others can get their display working using this code - but I still don't think I can get mine working :frowning:

Please help...

Woot, thanks for the updates Phokur :slight_smile:
I got a couple questions, I've tried looking up some other libraries from other LCD libraries to see how to create a Menu.. with no luck.. I can generally take some code and tweak it to my own.
I experimented (and failed horribly) with using if and trying to use some switch functions, using a potentiometer to highlight text depending on the value.. and a button to start an application of sorts, haha but yeah.. no luck.
If somebody could point me in the right area, maybe some books, videos, anything for my newbness! :smiley:

(I don't understand how the code made the text bigger.. reading all the 0xFFs and << & | throws me off real fast and I get overwhelmed lol:/)

I've done a few changes to the code, it now all shows up in the right colors on my screen, its not perfect yet, but is a start. Still working out the locations of drawing boxes. Feel free to add/change it. Major changes were I changed the colors to word type rather than byte, allowing it to send in full color (reds were absent before in the initial code), I also changed some of the fill sizes, as for some reason, it only filled when i went from 0 to 160 square in my draw window. I've also added a few comments as to what values have an effect in certain commands.

http://freetexthost.com/3o6alqaspk

@CaptainObvious, best place to look is in the example code on the arduino site. If you have any specific questions on how things work, feel free to ask, but IMHO the most fun part about using arduinos is the ability to experiment and find out new things.

Cory

Hi everybody.
Now I'm home again and I've just set up the LCD project using a 74HC4050 for the level conversion and hurray, it showed me that it was alive!

But still, the LCD shows me the same crap as blip's (look at his image)
Does anyone know how to fix that, or atleast what is causing that?

I'm working on and will post a code update here this weekend. I'm using the Sparkfun breakout board. Can anyone tell me if using 9V to VBat will hurt the board or LCD?
Thanks! :-/

I'm not sure, so I won't recommend it!

http://www.spakfun.com/commerce/product_info.php?products_id=569

?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!

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.

/* 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){
  setSCK
  clearCS
  setCS
  
  clearSCK
  setDIO
  setSCK
  writeToLCD(_b);
}
void lcdCmd(byte _b){
  setSCK
  clearCS
  setCS
  
  clearSCK
  clearDIO
  setSCK
  
  writeToLCD(_b);
 
}
void writeToLCD(byte _b){

  clearSCK
  if((_b&B10000000)!=0){setDIO} else {clearDIO}
  setSCK
  clearSCK
  if((_b&B01000000)!=0){setDIO} else {clearDIO}
  setSCK
  clearSCK
  if((_b&B00100000)!=0){setDIO} else {clearDIO}
  setSCK
  clearSCK
  if((_b&B00010000)!=0){setDIO} else {clearDIO}
  setSCK
  clearSCK
  if((_b&B00001000)!=0){setDIO} else {clearDIO}
  setSCK
  clearSCK
  if((_b&B00000100)!=0){setDIO} else {clearDIO}
  setSCK
  clearSCK
  if((_b&B00000010)!=0){setDIO} else {clearDIO}
  setSCK
  clearSCK
  if((_b&B00000001)!=0){setDIO} else {clearDIO}
  setSCK
  
  clearCS
  
}
void setBox(byte c1,byte c2,byte p1,byte p2){
  
  lcdCmd(CASET);
  lcdData(c1);
  lcdData(c2);
  lcdCmd(PASET);
  lcdData(p1);
  lcdData(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);

  lcdCmd(RAMWR);
  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++){
    lcdData(color);
    lcdData(color);
  }
}

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

//LCD Initialize------------------------------------
void lcdInit(){
  setReset
  delay(10);
  clearReset
  
  clearCS
  setDIO
  setSCK
    
  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 ----------------------------------------
  lcdData(0x01);
    
  lcdCmd(OSCON);  //Oscillator On -----------------------------------
    
  lcdCmd(SLPOUT); //Sleep Out ---------------------------------------
  
  lcdCmd(VOLCTR); //Voltage Control----------------------------------
  lcdData(0x20);
  lcdData(3);
  
  //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 -----------------------------------
  lcdCmd(PWRCTR);
  lcdData(0x0f);
  
  delay(100);
  
  //Invert Display-----------------------------------
  lcdCmd(DISINV);
  
  //Clear Partial disply data------------------------
  lcdCmd(PTLOUT);
  
  //Autoscroll clearing (I hope)
  lcdCmd(ASCSET);
  lcdData(00);
  lcdData(32);
  lcdData(32);
  lcdData(3);
  
  //Data Scan Direction------------------------------
  lcdCmd(DATCTL);
  lcdData(0x00);
  lcdData(0x00);
  lcdData(0x04); //1 = 8 bit, 2 = 12 bit, 3=12 of 16 bit
  lcdData(0);
  
  //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
  


  lcdCmd(NOP);

  delay(100);

  lcdCmd(NOP);
  fillScreen(0x0F);
  lcdCmd(DISON);
}


void setup(){
  DDRD |= B01111100;   // Set SPI pins as output 
  PORTD |= B01111100;  // Set SPI pins HIGH
  
  delay(500);
  
  pinMode(8,INPUT);
  pinMode(9,INPUT);

  
  lcdInit();
  //Make some shit happen
  
  lcdCmd(RAMWR);

  d = false;
}


void loop(){
  d = false;
  byte C = 0xFF;
  int dC=30;
  digitalWrite(11,LOW);
  delay(250);
  fillScreen(C);
  if(C > dC){
    C-=dC;
  }else{
    C=0;
  }
  
}

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. :stuck_out_tongue:

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?

Thanks!

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:
http://www.idleloop.com/robotics/ColorLCD/

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):

strcpy(text,"Speed");
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:
strcpy(text,shots);

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