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

wb2dyb

  • Jr. Member
  • **
  • Posts: 26
  • Karma: 0
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #15 on: March 29, 2015, 11:15:31 PM »
Chris, forgot to answer your question. Works fine. Just as written. The initial delay fooled me, compiled/loaded and it was dark then as I was typing something the display lit up. That 5 second delay got me.

See, my hangup on hacking on the OLedI2C.cpp file is the use of write, or rather Wire.write to send the binary patterns for the special fonts to the display. And of course, getting them back out. It would have been ideal (In my mind) if they'd just occupy the bottom 8 memory locations and be addressed like any other character.

Thanks, Chris.

GeorgeC

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #16 on: March 30, 2015, 09:44:24 PM »
Chris, forgot to answer your question. Works fine. Just as written. The initial delay fooled me, compiled/loaded and it was dark then as I was typing something the display lit up. That 5 second delay got me.

See, my hangup on hacking on the OLedI2C.cpp file is the use of write, or rather Wire.write to send the binary patterns for the special fonts to the display. And of course, getting them back out. It would have been ideal (In my mind) if they'd just occupy the bottom 8 memory locations and be addressed like any other character.

Thanks, Chris.

GeorgeC

Getting custom fonts back out its easy, i think this will do it.
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
};

void setup() {
  LCD.createChar(0, newChar0); // Store custom font data in 420CW Oled
  LCD.createChar(1, newChar1);
  LCD.createChar(2, newChar2);
 
  Wire.begin(); // Start Wire Library
  LCD.init(); // initialize the lcd
}

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("Print custom font", 1, 0);    //("String", col, row)
  LCD.cursPos(1,1); //(col,row)
 
  // Test 1 / Print custom font
  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 1
  Wire.write(B01000000); // control byte or the data byte, Co and D/C# bits following by six “0”’s.
  Wire.write(B00000000); // print custom font 0  [8bit (hi bit 0000/low bit 0000
 
  //Print custom font 2
  Wire.write(B01000000); // control byte or the data byte, Co and D/C# bits following by six “0”’s.
  Wire.write(B00000001); // print custom font 1  [8bit (hi bit 0000/low bit 0001

  //Print custom font 3
  Wire.write(B01000000); // control byte or the data byte, Co and D/C# bits following by six “0”’s.
  Wire.write(B00000010); // print custom font 2  [8bit (hi bit 0000/low bit 0010
 
  //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); // print custom font 3  [8bit (hi bit 0000/low bit 0011

  //Print custom font 5
  Wire.write(B01000000); // control byte or the data byte, Co and D/C# bits following by six “0”’s.
  Wire.write(B00000100); // print custom font 4  [8bit (hi bit 0000/low bit 0100

  //Print custom font 6
  Wire.write(B01000000); // control byte or the data byte, Co and D/C# bits following by six “0”’s.
  Wire.write(B00000101); // print custom font 5  [8bit (hi bit 0000/low bit 0101

  //Print custom font 7
  Wire.write(B01000000); // control byte or the data byte, Co and D/C# bits following by six “0”’s.
  Wire.write(B00000110); // print custom font 6  [8bit (hi bit 0000/low bit 0110

  //Print custom font 8   
  Wire.write(B01000000); // control byte or the data byte, Co and D/C# bits following by six “0”’s.
  Wire.write(B00000111); // print custom font 7  [8bit (hi bit 0000/low bit 0111
 
  Wire.endTransmission(); // stop condition / 7) The write mode will be finished when a stop condition is applied.

  delay(5000); // 5sec. delay
  LCD.clearLcd();
}

Now can you add this to OLedI2C.h
void createChar(uint8_t, uint8_t[]); // NEW 03-23-2015 / Allows us to fill the first 8 CGRAM locations with custom characters

Code: [Select]
// 1602-OLED-Arduino-Library/OLedI2C.h

/*
OLedI2C.h
OLED 1602 Library for the I2C
OLED display from WIDE.HK
Also my first attempt at a Library
Phil Grant Sept 2013
www.gadjet.co.uk
Scrolling contributed by Nathan Chantrell http://nathan.chantrell.net/
Updated 06/11/2013 to include the cursPos data within the sendString function.
*/
#ifndef OLedI2C_h
#define OLedI2C_h
#include "Arduino.h"
#include "Wire.h"

class OLedI2C {
public:
OLedI2C();
~OLedI2C();
void init();
void sendCommand(unsigned char command);
void sendString(const char *String, uint8_t col, uint8_t row);
void sendFloat(float digit, uint8_t dec, uint8_t nad, uint8_t col, uint8_t row);
void sendData(unsigned char data);
void clearLcd();
void cursPos(uint8_t, uint8_t); // cloumn, row
                //void setCursor(uint8_t, uint8_t); // NEW 03-23-2015 / cloumn, row / setCursor
void scrollString(char* message, byte row, unsigned int time); //written by Nathan Chantrell http://nathan.chantrell.net/
void lcdOff();
void lcdOn();
void setContrast(unsigned char contrast); // contrast should be the hex value between 0x00 and 0xFF
void createChar(uint8_t, uint8_t[]); // NEW 03-23-2015 / Allows us to fill the first 8 CGRAM locations with custom characters
};
#endif

And add this to OLedI2C.cpp
NOTE: Not sure if this will work.

// 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);
    //Wire.write(OLED_Data_Mode);
    delayMicroseconds(40);
  }
  Wire.endTransmission();
  delay(50);
}

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); // **** 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(0x08); // **** 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);
}


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.

keywords.txt

Code: [Select]
#######################################
# Syntax Coloring Map For OLedI2C
#######################################

#######################################
# Datatypes (KEYWORD1)
#######################################

OLedI2C KEYWORD1

#######################################
# Methods and Functions (KEYWORD2)
#######################################

init KEYWORD2
sendCommand KEYWORD2
sendString KEYWORD2
sendData KEYWORD2
clearLcd KEYWORD2
cursPos KEYWORD2
createChar KEYWORD2

#######################################
# Constants (LITERAL1)
#######################################
« Last Edit: March 30, 2015, 09:56:18 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 #17 on: March 31, 2015, 01:12:46 PM »
My OLedI2C.cpp attached, with your mod at the bottom. I used your version of the file and while it compiled ok, nothing displayed.
Couldn't wait. Just tried it. Got this error:

  This report would have more information with
  "Show verbose output during compilation"
  enabled in File > Preferences.
Arduino: 1.0.5 (Windows 7), Board: "Arduino Uno"
C:\Users\georgec\Documents\Arduino\libraries\OLEDArduinoLibrarymaster\OLedI2C.cpp: In member function 'void OLedI2C::createChar(uint8_t, uint8_t*)':
C:\Users\georgec\Documents\Arduino\libraries\OLEDArduinoLibrarymaster\OLedI2C.cpp:265: error: call of overloaded 'write(uint8_t*&)' is ambiguous
C:\Program Files (x86)\Arduino\libraries\Wire/Wire.h:64: note: candidates are: virtual size_t TwoWire::write(uint8_t) <near match>
C:\Program Files (x86)\Arduino\libraries\Wire/Wire.h:86: note:                 size_t TwoWire::write(long unsigned int) <near match>
C:\Program Files (x86)\Arduino\libraries\Wire/Wire.h:87: note:                 size_t TwoWire::write(long int) <near match>
C:\Program Files (x86)\Arduino\libraries\Wire/Wire.h:88: note:                 size_t TwoWire::write(unsigned int) <near match>
C:\Program Files (x86)\Arduino\libraries\Wire/Wire.h:89: note:                 size_t TwoWire::write(int) <near match>
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Print.h:49: note:                 size_t Print::write(const char*) <near match>



My OLedI2C.cpp file:

/*
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"
#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);   // **** 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


 // **** CGROM/CGRAM Management *** //
 sendCommand(0x72);     // **** Set ROM
 sendData(B00000011);     // **** Set ROM A and 8 CGRAM

 
 // **** 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(0x09); 
 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, 0x20, 0x40, 0x60 };//**************THIS WAS THE CHANGE FOR 4 LINES
 sendCommand(0x80 | (col + row_offsets[row])); //was 0x80
 }
 
void OLedI2C::clearLcd()
{
sendCommand(0x01);
}

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


 // Allows us to fill the first 8 CGRAM locations
// with custom characters




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)
  {
    sendData(String);      // *** 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);
    //Wire.write(OLED_Data_Mode);
    delayMicroseconds(40);
  }
  Wire.endTransmission();
  delay(50);
}

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #18 on: March 31, 2015, 04:29:15 PM »
Add this to OLedI2C.ccp

/*
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>

#if (ARDUINO <  100)
#include <WProgram.h>
#else
#include <Arduino.h>
#endif

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

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #19 on: March 31, 2015, 06:28:05 PM »
OK here's a new idea

Replace this:
// 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);
    //Wire.write(OLED_Data_Mode);
    delayMicroseconds(40);
  }
  Wire.endTransmission();
  delay(50);
}


With that in OLedI2C.ccp

// 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);      // call the virtual write method
      delayMicroseconds(40);
   }
}

EDIT: it should be like this
Code: [Select]
// 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);
   }
}

The above change still needs
void createChar(uint8_t, uint8_t[]); // NEW 03-23-2015 / Allows us to fill the first 8 CGRAM locations with custom characters
in OLedI2C.h
« Last Edit: April 01, 2015, 12:48:28 AM by Chris O. »

wb2dyb

  • Jr. Member
  • **
  • Posts: 26
  • Karma: 0
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #20 on: March 31, 2015, 10:51:45 PM »
Thanks Chris. The first suggestions made earlier prompted me to just start fresh in a library directory. So made all those changes and now while it compiles nothing happens, and anything on display from previous helloworld stuff freezez till power cycle.

Now the most recent suggestions gets this error:


C:\Program Files (x86)\Arduino\libraries\OLedI2C\OLedI2C.cpp: In member function 'void OLedI2C::createChar(uint8_t, uint8_t*)':
C:\Program Files (x86)\Arduino\libraries\OLedI2C\OLedI2C.cpp:206: error: invalid conversion from 'uint8_t*' to 'unsigned char'
C:\Program Files (x86)\Arduino\libraries\OLedI2C\OLedI2C.cpp:206: error:   initializing argument 1 of 'void OLedI2C::sendData(unsigned char)'


Line 206 is:
     sendData(charmap);      // call the virtual write method






Totally lost now. I sorta followed what you were doing...

GeorgeC
« Last Edit: March 31, 2015, 11:03:28 PM by wb2dyb »

wb2dyb

  • Jr. Member
  • **
  • Posts: 26
  • Karma: 0
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #21 on: March 31, 2015, 11:14:58 PM »
I think I used the wrong OLedI2C.h file. I need to clean this mess up.

So back to where it just sits there blank after loading your test file.

GeorgeC

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #22 on: March 31, 2015, 11:49:01 PM »
hmmm i see a bug.


Code: [Select]
// 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);
   }
}
« Last Edit: April 01, 2015, 12:10:36 AM by Chris O. »

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #23 on: March 31, 2015, 11:52:44 PM »
if you don't use the insert code tag on this forums it will eat this:
Code: [Select]
[i]
from
Code: [Select]
      sendData(charmap[i]);      // call the virtual write method
« Last Edit: April 01, 2015, 12:08:14 AM by Chris O. »

wb2dyb

  • Jr. Member
  • **
  • Posts: 26
  • Karma: 0
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #24 on: April 01, 2015, 12:15:44 AM »
Something tells me that while the writing of the character might be working something is missing in getting it to display.

  // Print custom font 1
  Wire.write(B01000000); // control byte or the data byte, Co and D/C# bits following by six 0s.
  Wire.write(B00000000); // print custom font 0  [8bit (hi bit 0000/low bit 0000
 

Here's where the US2066 data is slim in detail, certainly for the newcomer.

The first line above only sets the CGRAM address to 0x00
The next line, depending on DC or RW can mean to write to B00000000

But shouldn't there be a 0x72 sent before B00000000?

Just not enough in that data...

GeorgeC

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #25 on: April 01, 2015, 12:36:14 AM »
Not sure if this will work but try it anyway.
  LCD.sendData(0); //Print custom font 1

  LCD.sendData(char(1)); //Print custom font 2


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
};

void setup() {
  Wire.begin(); // Start Wire Library
  LCD.init(); // initialize the lcd
  LCD.createChar(0, newChar0); // Store custom font data in 420CW Oled
  LCD.createChar(1, newChar1);
  LCD.createChar(2, newChar2);
 

}

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 1
  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 1
  Wire.write(B01000000); // control byte or the data byte, Co and D/C# bits following by six “0”’s.
  Wire.write(B00000000); // print custom font 0  [8bit (hi bit 0000/low bit 0000
  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, 12:39:09 AM by Chris O. »

wb2dyb

  • Jr. Member
  • **
  • Posts: 26
  • Karma: 0
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #26 on: April 01, 2015, 08:08:20 AM »
Well, that was very different. Attached are pix of the two messages.

What it is displaying is 0000:0000 and 0000:0001 from ROM C in the built in CG

GeorgeC
« Last Edit: April 01, 2015, 02:27:06 PM by wb2dyb »

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #27 on: April 01, 2015, 05:09:08 PM »
OK
Pictures are upside down but that's not a problem.

So the print  Wire.write(Bxxxxxxxx); or  LCD.sendData(x); works good.

Next custom font will be The infinity symbol ∞.
// Zero-based numbering
LCD.sendData(2); //Print custom font 3



Look in US2066 datasheet P.56


Now the problem is it did not store the custom fonts for some reasons.
perhaps you should try to switch the ROM C to ROM A and then try again.

« Last Edit: April 01, 2015, 05:15:29 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 #28 on: April 01, 2015, 05:29:24 PM »
I found this:
http://www.circuitvalley.com/2012/02/lcd-custom-character-hd44780-16x2.html

I know the way this is done is pretty much identical as in the HD44780 controller, among others.

I have to study this more later. It looks like the part to store the character is pretty much the same. The getting it back out part is the issue...

I have to run, back at it in about 5 hours

George

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #29 on: April 01, 2015, 05:47:13 PM »
Problem is ROM C
It's actually in the datasheets
P.29 Function Selection B
zero CGRAM available.
« Last Edit: April 01, 2015, 05:52:58 PM by Chris O. »

 

NHD‐0420CW‐AB3 I2C Interface

Started by andersonpdBoard OLEDs

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

Started by RichardRBoard OLEDs

Replies: 2
Views: 2174
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: 2329
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: 3184
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: 2084
Last post March 11, 2016, 07:51:03 AM
by Saurabh_B