Author Topic: Library that works fine on the NHD-0420CW-A*3  (Read 14658 times)

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #30 on: April 01, 2015, 06:29:34 PM »
What does CGRAM stand for?
Acronym     Definition
CGRAM     Character Generator RAM -Random-access memory

In OLedI2C.cpp
Yours is actually setting  // **** Set ROM A and 0 CGRAM / 256 CGROM
But clearly it was on ROM C ?

Change this:
Code: [Select]
// **** CGROM/CGRAM Management *** //
 sendCommand(0x72);     // **** Set ROM
 sendData(B00000011);     // **** Set ROM A and 8 CGRAM This selects CGROM A, 00000000 selects CGROM C


To:
Code: [Select]
  // CGROM/CGRAM Management
  sendCommand(0x72);     // **** Set ROM // Function Selection B
  sendData(B00000001);   // **** Set ROM A and 8 CGRAM / 248 CGROM
Restart your Arduino IDE and try agine.
« Last Edit: April 01, 2015, 06:42:56 PM by Chris O. »

wb2dyb

  • Jr. Member
  • **
  • Posts: 26
  • Karma: 0
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #31 on: April 01, 2015, 07:01:03 PM »
LCD.sendData(0)

Sends that character from ROM C

LCD.sendData(1)

Likewise sends that from ROM C, if I make it

LCD.sendData(8)

It sends the lefty pointing arrow, etc

George

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #32 on: April 01, 2015, 08:31:26 PM »
I am not sure if it matters, but you change the i2c initialization sequence.
Code: [Select]
// original:
 // **** Set OLED Characterization *** //
 // sendCommand(0x2A);  // **** Set "RE"=1
 // sendCommand(0x79);  // **** Set "SD"=1
 // **** CGROM/CGRAM Management *** //
 // sendCommand(0x72);  // **** Set ROM
 // sendCommand(0x00);  // **** Set ROM A and 8 CGRAM

 // **** CGROM/CGRAM Management *** //
 sendCommand(0x72);     // **** Set ROM
 sendData(B00000011);     // **** Set ROM A and 8 CGRAM This selects CGROM A, 00000000 selects CGROM C
 // **** Set OLED Characterization *** //
 sendCommand(0x2A);     // **** Set "RE"=1
 sendCommand(0x79);     // **** Set "SD"=1
Perhaps setting the **** Set OLED Characterization *** should be first
Then set the **** CGROM/CGRAM Management ***
Just as it was in the original code.

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #33 on: April 01, 2015, 09:33:06 PM »
New test  ;) code
Let's try change Function Selection B on the fly, in void setup(); .

Code: [Select]
// Test print [ custom fonts ].

// Wire Library, This library allows you to communicate with I2C / TWI devices
// Board           I2C / TWI pins
// Uno, Ethernet   A4 (SDA), A5 (SCL)
// Mega2560        20 (SDA), 21 (SCL)
// Leonardo         2 (SDA),  3 (SCL)
// Due             20 (SDA), 21 (SCL), SDA1, SCL1

#include <Wire.h>
#define I2C_ADDR 0x3c  // Define I2C Address, For the US2066 0x3c or 0x3d
// NOTE: Important to include Wire.h before OLedI2C.h
#include <OLedI2C.h>  // OLedI2C library http://gadjetsblog.blogspot.com/2013/09/oled-1602-display-and-library-for.html
//library by Phil Grant 2013 www.gadjet.co.uk
OLedI2C LCD;

byte newChar0[8] = {
  B00000,
  B00000,
  B10101,
  B11101,
  B11101,
  B10101,
  B00000,
  B00000
};

byte newChar1[8] = {
  B10000,
  B01000,
  B00101,
  B00100,
  B00100,
  B00101,
  B01000,
  B10000
};

byte newChar2[8] = {
  B10001,
  B01010,
  B01110,
  B00100,
  B00100,
  B01110,
  B01010,
  B10001
};

byte newChar3[8] = {
  B11111,
  B11111,
  B11111,
  B00100,
  B00100,
  B11111,
  B11111,
  B11111
};

void setup() {
  Wire.begin(); // Start Wire Library
  LCD.init(); // initialize the lcd
 
 
  delay(100);
  // TEST
  // change Function Selection B on the fly
  // CGROM/CGRAM Management
  LCD.sendCommand(0x72);     // **** Set ROM // Function Selection B
  LCD.sendData(B00000001);   // **** Set ROM A and 8 CGRAM / 248 CGROM

  delay(100);
  LCD.createChar(0, newChar0); // Store custom font data in 420CW Oled
  delay(100);
  LCD.createChar(1, newChar1);
  delay(100);
  LCD.createChar(2, newChar2);
  delay(100);
  LCD.createChar(3,newChar3);
  delay(100);
}

void loop() {

  //Set cursor position to col and row, top row is 0, first col is 0
  // no longer required LCD.cursPos(4,0); //(col,row)
  LCD.sendString("test 1 Wire.h", 0, 0);    //("String", col, row)
  LCD.cursPos(1,1); //(col,row)
 
  // Test 1 / Print custom font 4
  Wire.beginTransmission(I2C_ADDR); // start condition + Define I2C Address where the US2066 is, and set  R/W# bit to logic “0” write mode.
  // Print custom font 4
  Wire.write(B01000000); // control byte or the data byte, Co and D/C# bits following by six “0”’s.
  Wire.write(B00000011); //DEC 3 // print custom font 4  [8bit (hi bit 0000/low bit 0011
  Wire.endTransmission(); // stop condition / 7) The write mode will be finished when a stop condition is applied.

  delay(3000); // 3sec. delay
  LCD.clearLcd();
  delay(1000);
 
  LCD.sendString("test 2 sendData", 0, 0);    //("String", col, row)
  LCD.cursPos(1,1); //(col,row)
  // Zero-based numbering
  LCD.sendData(0); //Print custom font 1
  LCD.sendData(char(1)); //Print custom font 2
 
  delay(3000); // 3sec. delay
  LCD.clearLcd();
  delay(1000);
}
« Last Edit: April 01, 2015, 09:44:34 PM by Chris O. »

wb2dyb

  • Jr. Member
  • **
  • Posts: 26
  • Karma: 0
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #34 on: April 01, 2015, 11:56:26 PM »
Success! I was getting no results yet. So I cut and paste the init from the OLED pdf instead of what I had. Your last app ran first time, pictures enclosed...

My cpp file: (it's a real mess, but it works

Code: [Select]
// 1602-OLED-Arduino-Library/OLedI2C.cpp
// keywords.txt / OLedI2C.cpp / OLedI2C.h
// The 3 files should be in %your arduino dir%\libraries\OLedI2C\
// The directory name must match the library name for libraries to work.

/*
This is my first Library to make writing to the OLED 1602
Display much easier, the display is based on the SSD1311.
The display has 16 characters and 2 lines.
The library is far from complete and may be prone to errors.
Feedback welcome, visit www.gadjet.co.uk
Phil Grant 2013
Scrolling contributed by Nathan Chantrell http://nathan.chantrell.net/
Updated 06/11/2013 to include the cursPos data in the sendString function
sendString("string", col, row)
*/
#include "OLedI2C.h"

// NEW
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include "Arduino.h"

#include "Wire.h"
#define OLED_Address 0x3c
#define OLED_Command_Mode 0x80
#define OLED_Data_Mode 0x40

OLedI2C::OLedI2C(){}
OLedI2C::~OLedI2C(){}


void OLedI2C::init() {
   // *** I2C initial *** //
 delay(100);
 sendCommand(0x2A); //function set (extended command set)
sendCommand(0x71); //function selection A
sendData(0x00); // disable internal VDD regulator (2.8V I/O). data(0x5C) = enable regulator (5V I/O)
sendCommand(0x28); //function set (fundamental sendCommand set)
sendCommand(0x08); //display off, cursor off, blink off
sendCommand(0x2A); //function set (extended command set)
sendCommand(0x79); //OLED command set enabled
sendCommand(0xD5); //set display clock divide ratio/oscillator frequency
sendCommand(0x70); //set display clock divide ratio/oscillator frequency
sendCommand(0x78); //OLED command set disabled
sendCommand(0x09); //extended function set 4 line
sendCommand(0x06); //COM SEG direction
sendCommand(0x72); //function selection B
sendData(0x00); //ROM CGRAM selection
sendCommand(0x2A); //function set (extended command set)
sendCommand(0x79); //OLED command set enabled
sendCommand(0xDA); //set SEG pins hardware configuration
sendCommand(0x10); //set SEG pins hardware configuration
sendCommand(0xDC); //function selection C
sendCommand(0x00); //function selection C
sendCommand(0x81); //set contrast control
sendCommand(0x7F); //set contrast control
sendCommand(0xD9); //set phase length
sendCommand(0xF1); //set phase length
sendCommand(0xDB); //set VCOMH deselect level
sendCommand(0x40); //set VCOMH deselect level
sendCommand(0x78); //OLED command set disabled
sendCommand(0x28); //function set (fundamental command set)
sendCommand(0x01); //clear display
sendCommand(0x80); //set DDRAM address to 0x00
sendCommand(0x0C); //display ON
 
 /*
sendCommand(0x2A);  //function set (extended command set)
sendCommand(0x71);  //function selection A, disable internal Vdd regualtor
sendCommand(0x00);
sendCommand(0x28);  //function set (fundamental command set)
sendCommand(0x08);  //display off, cursor off, blink off
sendCommand(0x2A);  //function set (extended command set)
sendCommand(0x79);  //OLED command set enabled
sendCommand(0x72);  //function selection B, disable internal Vdd regualtor
sendCommand(0x00);     //ROM CGRAM selection
sendCommand(0xD5);  //set display clock divide ratio/oscillator frequency
sendCommand(0x70);  //set display clock divide ratio/oscillator frequency
sendCommand(0x78);  //OLED command set disabled
sendCommand(0x09);  //extended function set (4-lines)
        sendCommand(0x06);  //COM SEG direction
sendCommand(0x72);  //function selection B, disable internal Vdd regualtor
sendCommand(0x00);     //ROM CGRAM selection
sendCommand(0x2A);  //function set (extended sendCommand set)
sendCommand(0x79);  //OLED sendCommand set enabled
sendCommand(0xDA);  //set SEG pins hardware configuration
sendCommand(0x10);  //set SEG pins hardware configuration   // <--------- Change
sendCommand(0xDC);  //function selection C
sendCommand(0x00);  //function selection C
sendCommand(0x81);  //set contrast control
sendCommand(0xff);  //set contrast control
sendCommand(0xD9);  //set phase length
sendCommand(0xF1);  //set phase length
sendCommand(0xDB);  //set VCOMH deselect level
sendCommand(0x40);  //set VCOMH deselect level
sendCommand(0x78);  //OLED sendCommand set disabled
sendCommand(0x28);  //function set (fundamental sendCommand set)
sendCommand(0x01);  //clear display
sendCommand(0x80);  //set DDRAM address to 0x00
sendCommand(0x0C);  //display ON
 */
 /*
 sendCommand(0x2A); // **** Set "RE"=1 00101010B
 sendCommand(0x71);
 sendCommand(0x5C);
 sendCommand(0x28);

 sendCommand(0x08); // **** Set Sleep Mode On
 sendCommand(0x2A); // **** Set "RE"=1 00101010B
 sendCommand(0x79); // **** Set "SD"=1 01111001B

 sendCommand(0xD5);
 sendCommand(0x70);
 sendCommand(0x78); // **** Set "SD"=0  01111000B

 sendCommand(0x09); // **** Set 5-dot, 3 or 4 line(0x09), 1 or 2 line(0x08)

 sendCommand(0x06); // **** Set Com31-->Com0  Seg0-->Seg99

 // original:
 // **** Set OLED Characterization *** //
 // sendCommand(0x2A);  // **** Set "RE"=1
 // sendCommand(0x79);  // **** Set "SD"=1
 // **** CGROM/CGRAM Management *** //
 // sendCommand(0x72);  // **** Set ROM
 // sendCommand(0x00);  // **** Set ROM A and 8 CGRAM

 // **** CGROM/CGRAM Management *** //
 sendCommand(0x72);     // **** Set ROM
 sendData(B00000011);     // **** Set ROM A and 8 CGRAM This selects CGROM A, 00000000 selects CGROM C
 // **** Set OLED Characterization *** //
 sendCommand(0x2A);     // **** Set "RE"=1
 sendCommand(0x79);     // **** Set "SD"=1

 sendCommand(0xDA); // **** Set Seg Pins HW Config
 sendCommand(0x10);   

 sendCommand(0x81);  // **** Set Contrast
 sendCommand(0xFF);

 sendCommand(0xDB);  // **** Set VCOM deselect level
 sendCommand(0x30);  // **** VCC x 0.83

 sendCommand(0xDC);  // **** Set gpio - turn EN for 15V generator on.
 sendCommand(0x03);

 sendCommand(0x78);  // **** Exiting Set OLED Characterization
 sendCommand(0x28);
 sendCommand(0x2A);
 sendCommand(0x05); // **** Set Entry Mode
 sendCommand(0x06); // **** Set Entry Mode
 sendCommand(0x08); 
 sendCommand(0x28); // **** Set "IS"=0 , "RE" =0 //28
 sendCommand(0x01);
 sendCommand(0x80); // **** Set DDRAM Address to 0x80 (line 1 start)

 */
 
 
 delay(100);
 sendCommand(0x0C);  // **** Turn on Display
 }
 
 // void OLedI2C::cursPos(uint8_t col, uint8_t row)
 // {
 // int row_offsets[] = { 0x00, 0x40 };
 // sendCommand(0x80 | (col + row_offsets[row]));
 // }

 void OLedI2C::cursPos(uint8_t col, uint8_t row)
 {
 int row_offsets[] = { 0x00, 0x20, 0x40, 0x60 };// **************THIS WAS THE CHANGE FOR 4 LINES
 sendCommand(0x80 | (col + row_offsets[row])); //was 0x80
 }
 
 // NEW 03-23-2015
 // cloumn, row / setCursor
  //void OLedI2C::setCursor(uint8_t col, uint8_t row)
  //{
  // int row_offsets[] = { 0x00, 0x20, 0x40, 0x60 };// **************
  //sendCommand(0x80 | (col + row_offsets[row]));
  //}
 
void OLedI2C::clearLcd()
{
sendCommand(0x01);
}

void OLedI2C::lcdOff()
{
sendCommand(0x08);  // **** Turn on Off
}

void OLedI2C::lcdOn()
{
sendCommand(0x0C);  // **** Turn on On
}

 void OLedI2C::sendCommand(unsigned char command)
{
    Wire.beginTransmission(OLED_Address); // **** Start I2C
    Wire.write(OLED_Command_Mode);      // **** Set OLED Command mode
    Wire.write(command);
    Wire.endTransmission();                  // **** End I2C
      delay(10);
}
void OLedI2C::sendFloat(float digit, uint8_t dec, uint8_t nad, uint8_t col, uint8_t row)
{
char line[10];//Ten characters, I hope that's enough
dtostrf(digit,dec,nad,line);//Convert the float value to a string
sendString(line, col, row);

}

 void OLedI2C::setContrast(unsigned char contrast) // contrast as 0x00 to 0xFF
{
     //Set OLED Command set
sendCommand(0x2A);
sendCommand(0x79);

sendCommand(0x81);  // Set Contrast
sendCommand(contrast); // send contrast value
sendCommand(0x78);  // Exiting Set OLED Command set
   sendCommand(0x28);

}

void OLedI2C::sendString(const char *String, uint8_t col, uint8_t row)
{
  cursPos(col, row);
  unsigned char i=0;
  while(String[i])
  {
    sendData(String[i]);      // *** Show String to OLED
    i++;
  }
}
void OLedI2C::sendData(unsigned char data)
{
  Wire.beginTransmission(OLED_Address);  // **** Start I2C
  Wire.write(OLED_Data_Mode);      // **** Set OLED Data mode
  Wire.write(data);
  Wire.endTransmission();                     // **** End I2C
}
void OLedI2C::scrollString(char* message, byte row, unsigned int time)//written by Nathan Chantrell http://nathan.chantrell.net/
{
 char buffer[16];
 for (byte i=0;i<strlen(message)+16;i++) {
  byte pos = i+1;
  for (byte j=0;j<16;j++) {
   if ((pos<16)||(pos>strlen(message)+15)) { // pad and trail with blank spaces
     buffer[j]=' ';
   }
   else buffer[j]=message[pos-16];
   pos++;
  }
 //cursPos(0,row); removed by PG
 sendString(buffer, 0, row); //Edited by PG tho include the cursor pos within the sendString command
 delay(time);
 }
}

/*

// NEW 03-23-2015
// Allows us to fill the first 8 CGRAM locations
// with custom characters
void OLedI2C::createChar(uint8_t location, uint8_t charmap[])
{
  location &= 0x7; // we only have 8 locations 0-7
  Wire.beginTransmission(OLED_Address);
    Wire.write(OLED_Data_Mode | (location << 3)); // SETCGRAMADDR 0x40  [ Wire.write(B01000000); ]
    delayMicroseconds(30);
    //Wire.write(location);
  for (uint8_t i = 0 ; i < 8 ; i++) {
    Wire.write(charmap[i]);
    //Wire.write(OLED_Data_Mode);
    delayMicroseconds(40);
  }
  Wire.endTransmission();
  delay(50);
}
*/

// NEW 03-31-2015
// Allows us to fill the first 8 CGRAM locations
// with custom characters
void OLedI2C::createChar(uint8_t location, uint8_t charmap[])
{
   location &= 0x7;            // we only have 8 locations 0-7
   
   sendCommand(0x40 | (location << 3));
   delayMicroseconds(30);
   
   for (int i=0; i<8; i++)
   {
      sendData(charmap[i]);      // you're missing [i] in you're code // call the virtual write method
      delayMicroseconds(40);
   }
}


Thank you very much.

GeorgeC

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #35 on: April 02, 2015, 12:00:38 AM »
 :o :)

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #36 on: April 02, 2015, 12:09:51 AM »
I'm glad you figured that out. ;)

 

NHD‐0420CW‐AB3 I2C Interface

Started by andersonpdBoard OLEDs

Replies: 1
Views: 2638
Last post January 23, 2015, 10:00:06 AM
by Michael_L
NHD‐0420CW‐AG3 Contrast question

Started by RichardRBoard OLEDs

Replies: 2
Views: 2155
Last post January 16, 2016, 09:52:02 AM
by RichardR
NHD‐0420CW‐AG3: blinking part of text?

Started by RichardRBoard OLEDs

Replies: 2
Views: 2315
Last post February 28, 2017, 03:27:02 PM
by BobG
NHD‐0420CW‐AG3 + I2C + PIC assembly code: trouble getting started

Started by RichardRBoard OLEDs

Replies: 4
Views: 3162
Last post December 17, 2015, 03:12:49 AM
by RichardR
MOVED: NHD-0420CW-AY3 display, text is mirror image

Started by Saurabh_BBoard Character LCDs

Replies: 0
Views: 2075
Last post March 11, 2016, 07:51:03 AM
by Saurabh_B