Go Down

Topic: OLED 16x2 character display (Read 3204 times) previous topic - next topic

nkcelectronics

Very cool OLED 16x2 character display compatible with the Arduino LiquidCrystal library (8-bit.  To make it work with 4-bit, a small modification is required to the LiquidCrystal library initialization code)

http://www.nkcelectronics.com/OLED-16x2-character-display_p_202.html

floresta

Quote
To make it work with 4-bit, a small modification is required to the LiquidCrystal library initialization code)
Since there's no reference to this modification on your web page and there is no obvious link to a data sheet does this mean that we have to order one of the devices in order to find out the nature of this modification?

Don

nkcelectronics

You are right... I was testing the modification.  I will add the datasheet and publish the modification that is needed to the LiquidCrystal library.

noggin

Hi there

Just ordered a couple of these.  Where do I find the data sheet and modification to the library for 4bit compatibility?

bHogan

Did the modification to the LiquidCrystal lib for 4 bit operation and "additional commands" ever get published?
"Data is not information, information is not knowledge, knowledge is not understanding, understanding is not wisdom."
~ Clifford Stoll

floresta

Quote
Did the modification to the LiquidCrystal lib for 4 bit operation and "additional commands" ever get published?


It doesn't look like they have, at least I still can't find any information.  Maybe you have to invoke some sort of magic word like 'plugh'.

Don

bHogan

#6
Jun 27, 2011, 12:00 am Last Edit: Jun 27, 2011, 12:09 am by bHogan Reason: 1
"Plugh" worked pretty well, although I'm still in a maze of twisty little passages.

You can make the following mod to the "begin" function in LiquidCrystal.cpp (libraries folder) . . .
Code: [Select]

void LiquidCrystal::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) {
 if (lines > 1) {
   _displayfunction |= LCD_2LINE;
 }
 _numlines = lines;
 _currline = 0;

 // for some 1 line displays you can select a 10 pixel high font
 if ((dotsize != 0) && (lines == 1)) {
   _displayfunction |= LCD_5x10DOTS;
 }

 // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!
 // according to datasheet, we need at least 40ms after power rises above 2.7V
 // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50
 delayMicroseconds(50000);
 // Now we pull both RS and R/W low to begin commands
 digitalWrite(_rs_pin, LOW);
 digitalWrite(_enable_pin, LOW);
 if (_rw_pin != 255) {
   digitalWrite(_rw_pin, LOW);
 }
 
 //put the LCD into 4 bit or 8 bit mode
 if (! (_displayfunction & LCD_8BITMODE)) {
   // this is according to the hitachi HD44780 datasheet
   // figure 24, pg 46

// FOR OLED INIT - Runs before regular init - does not affect non-OLED
write4bits(0x00);
   delayMicroseconds(4500); // wait min 4.1ms
write4bits(0x00);
   delayMicroseconds(4500); // wait min 4.1ms
write4bits(0x00);
   delayMicroseconds(4500); // wait min 4.1ms
write4bits(0x00);
   delayMicroseconds(4500); // wait min 4.1ms
write4bits(0x00);
   delayMicroseconds(4500); // wait min 4.1ms

// FOR OLED INIT - must comment out the 3 0x03 commands . . .
   // we start in 8bit mode, try to set 4 bit mode
   //write4bits(0x03);
   //delayMicroseconds(4500); // wait min 4.1ms

   // second try
   //write4bits(0x03);
   //delayMicroseconds(4500); // wait min 4.1ms
   
   // third go!
   //write4bits(0x03);
   //delayMicroseconds(150);

   // finally, set to 4-bit interface
   write4bits(0x02);
 } else {
   // this is according to the hitachi HD44780 datasheet
   // page 45 figure 23

   // Send function set command sequence
   command(LCD_FUNCTIONSET | _displayfunction);
   delayMicroseconds(4500);  // wait more than 4.1ms

   // second try
   command(LCD_FUNCTIONSET | _displayfunction);
   delayMicroseconds(150);

   // third go
   command(LCD_FUNCTIONSET | _displayfunction);
 }

 // finally, set # lines, font size, etc.
 command(LCD_FUNCTIONSET | _displayfunction);  

 // turn the display on with no cursor or blinking default
 _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;  
 display();

 // clear it off
 clear();

 // Initialize to default text direction (for romance languages)
 _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
 // set the entry mode
 command(LCD_ENTRYMODESET | _displaymode);

}


Basically you send 5 (0x00) commands before the standard init and comment out the 3 (0x03) commands.

It needs work however. I see the following issues . . .

  • reset doesn't always work correctly

  • sometimes the line numbers get mixed up

  • the "createChar" function is not working and stops the display from working


I got the above info from NKC, and also a data sheet (attached). The data sheet also has a description of 4 bit init, but I've had no luck with it.

It's a gorgeous display. Highly visable, no contrast or backlight needed, low power.
I hope someone can get the kinks out.
(I was hoping to make an alternate init for this in the sketch and keep the LiquidCrystal lib in tact, but I had no luck with that approach.)



"Data is not information, information is not knowledge, knowledge is not understanding, understanding is not wisdom."
~ Clifford Stoll

floresta

#7
Jun 27, 2011, 02:42 am Last Edit: Jun 27, 2011, 02:44 am by floresta Reason: 1
It looks like that data sheet was written by a committee, some things in there twice and others missing.  I love the flowchart entry: "Wait for power stabilization ??ms".  I can't believe that the data sheet for a device that incorporates OLEDs shows timing diagrams for the interface with 8080 and 6800 processors but not with current microcontrollers.  It seems that they may be ashamed to publish that data sheet on their website.  

I see that they still have this statement:
Therefore, the Busy Flag should be checked to make certain that BF = "0" before sending another instruction from the MPU. If not, the time between the first instruction
and the next instruction is longer than the time it takes to execute the instruction itself.

This means that if you don't read the busy flag then you have to provide time delays, but they do not provide the instruction execution times (all except one are shown as 0) that you need to do this.


Quote
I hope someone can get the kinks out.

I wouldn't mind trying to figure out how to use the module but at this point I wouldn't purchase one in order to be a beta tester.  If NKC sends me a sample I'd be glad to take a stab at it.

I was never able to get all the possible points in Adventure, always shy by just one point.  I think the missing point could have been picked up if I could just figure out how to do everything else efficiently enough so I did not have to buy batteries for my flashlight.


Don

Go Up