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

wb2dyb

  • Jr. Member
  • **
  • Posts: 26
  • Karma: 0
    • View Profile
Library that works fine on the NHD-0420CW-A*3
« on: March 16, 2015, 11:23:21 PM »
I found a library that works very nicely with the 420CW displays.

https://github.com/gadjet/1602-OLED-Arduino-Library/blob/master/OLedI2C.cpp

There is one modification needed,

original:
 void OLedI2C::cursPos(uint8_t col, uint8_t row)
 {
 int row_offsets[] = { 0x00, 0x20};
 sendCommand(0x80 | (col + row_offsets[row]));
 }
 
The above works fine with two lines.

For four lines:

 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
 }
 

And the init has an error:

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

needed this change:

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

The only missing function, at least one I'd like to see is a custom character. Most controllers allow for this, and the NHD420CW does. Just not in this library. And I speak entirely about Arduino Uno. But it is doing what I needed, with the exception of needing 8 custom characters I need to represent with letters. I tried adding it but while I think I got the character creation right, for all I've looked, I cannot see how to select a custom character (anybody give me a pointer on THAT??

GeorgeC



Paul_B

  • Administrator
  • Sr. Member
  • *****
  • Posts: 248
  • Karma: 16
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #1 on: March 17, 2015, 07:45:13 AM »
Hello George,

Thanks for sharing and posting your solution!

Regarding custom characters please have a look at the displays controller spec, see page 28. User defined characters can be loaded via 512 bits (8 characters) Character Generator RAM (CGRAM).

Link: http://www.newhavendisplay.com/app_notes/US2066.pdf

You will need to call the Set CGRAM address command, also take a look at the command description listed on page 39.

Hope this helps and please keep me posted on your progress  :)
« Last Edit: March 17, 2015, 08:04:51 AM by Paul_B »

wb2dyb

  • Jr. Member
  • **
  • Posts: 26
  • Karma: 0
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #2 on: March 18, 2015, 04:49:30 PM »
Hi Paul, I understand that, but I'm not a programmer. I tried some copying from others for this same purpose but part of a different controller's library. (HD44780). But I just don't have what it takes to figure this out. Also, when I thought I had that part working I spent hours and just didn't see how to access a custom font. I know default CGROM is the third one "C", and eventually figured out how to change that, but I just didn't see how to get "at it". I'll eventually figure it out. And the project I wanted this for is now working on breadboard with the OLedI2C (modified for four line) library.

It's fun anyhow! And at 62 I'm learning...

GeorgeC

wb2dyb

  • Jr. Member
  • **
  • Posts: 26
  • Karma: 0
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3 sample photos
« Reply #3 on: March 18, 2015, 04:58:32 PM »
Here's what it looks like.

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #4 on: March 20, 2015, 10:36:35 PM »
Quote
The only missing function, at least one I'd like to see is a custom character. Most controllers allow for this, and the NHD420CW does. Just not in this library. And I speak entirely about Arduino Uno. But it is doing what I needed, with the exception of needing 8 custom characters I need to represent with letters. I tried adding it but while I think I got the character creation right, for all I've looked, I cannot see how to select a custom character (anybody give me a pointer on THAT??

Hi
I hope this will help.
It's for my arduino-matrixorbital
A software emulator for Matrix Orbital character display commands on Arduino.
Example sketch that uses Matrix Orbital type commands, look at case 78: // Define custom character

Code: [Select]
#include <OLEDFourBit.h> // Works with NewHAVEN NHD-0420DZW-AY5-ND
// Added fixes by Chris O. to OLEDFourBit library, Compatibility with previous versions of IDE. NOTE tested on Aduino 023 IDE <---> Aduino 1.0.4 IDE
// NOTE: Arduino Micro Pin Mapping i used.
OLEDFourBit lcd(12, A0, A1, A2, A3, A4, A5); //with rw pin (12, 11, 10, 5, 4, 3, 2);
//OLEDFourBit lcd(12, 14, 15, 16, 17, 18, 19);

// these constants won't change.  But you can change the size of
// your LCD using them:
const int numRows = 4; // 4x20 LCD
const int numCols = 20;
//
byte rxbyte = 0; // incoming data storage

void setup() {
  Serial.begin(19200); // Default baudrate.
  lcd.begin(numCols, numRows); // Change this for other screen sizes. 
  lcd.print("Arduino Emulator for");
  lcd.setCursor(1, 1);
  lcd.print("Matrix Orbital!");
  lcd.setCursor(2, 2);
  lcd.print("Character Display!");
  lcd.command(0b00010000); //Moves the cursor back one space before the blinking cursor
  lcd.command(0b00001101); // 0b00001DCB Show Blinking Block Cursor with out Underscore

  delay(5000); //delay 5 sec
  // while (serial_getch() == 0 ){   //delay [ Wait for OS to load ]
  //   rxbyte = serial_getch();
  //}
  lcd.command(0b00001100); //Turn off the blinking cursor: on exit
  //lcd.noBlink(); // Turn off the blinking cursor: on exit / no good it will turn off the display ????????? lib. problem?

  lcd.clear(); // clear the screen
  lcd.setCursor(0,0);
}
void loop() {
  // incoming data storage
  byte temp; // Parameter storage
  byte temp2; //2nd Parameter storage

  rxbyte = serial_getch(); //get byte and store in rxbyte

  if (rxbyte == 254) { //Matrix Orbital uses 254 prefix for commands
    switch (serial_getch()) { //get byte

    case 71:  //set cursor position
      temp = (serial_getch() - 1);  //get column byte
      switch (serial_getch())  //get row byte
      {
        //line 1 is already set up
      case 2:
        temp += 0x40;
        break;
      case 3:
        temp += 0x14;
        break;
      case 4:
        temp += 0x54;
        break;
      default:
        break;
      }
      lcd.command(0b10000000 + temp);
      delay(1);
      break;

    case 72: // Cursor home (doesn't clear the screen!)
      //lcd.home();
      lcd.setCursor(0,0);
      break;

    case 76: // Move cursor left  0b00010000 / dec16 /hex10
      lcd.command(16);//Cursor/Display Shift  hex(0x10); //set cursor position one character to the left
      break;

    case 77: // Move cursor right 0b00010100 / dec20 /hex14
      lcd.command(20);
      break;

    case 78: // Define custom character (2 parameters, id, data)
      lcd.command(64 + (serial_getch() * 8));
      for (temp = 8; temp != 0; temp--) {
        lcd.write(serial_getch()); //works with Adafruit_CharacterOLED library
      }
      break;
    }
    return; // Stop and start again.
  }

  // Otherwise its a plain char so we print it to the LCD.
  //lcd.write(rxbyte);
  lcd.print((char)rxbyte);  //otherwise a plain char so we print it to lcd
} // END of main loop

// ***********************************************************************************************************
// *           Get byte
// *             
// *           Waits for a byte to be available, reads and returns it.
// *
// ***********************************************************************************************************
byte serial_getch() { // Get byte from Serial
  while (Serial.available() == 0);
  return Serial.read();
}

NOTE: This is not a complete code its missing many commands.
« Last Edit: March 20, 2015, 10:49:31 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 #5 on: March 21, 2015, 11:18:35 PM »
Chris, I found similar language from a VFD display using HD44780 controller.

 // 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(VFD_SETCGRAMADDR | (location << 3));
  for (int i=0; i<8; i++) {
   write(charmap);
 }

My problem is that "write" isn't defined anywhere, and in the library it came from VFD_SPI.cpp it isn't defined, I just don't know where that would come from

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #6 on: March 22, 2015, 06:13:15 PM »
Hmm ok
Can you try this.

Code: [Select]
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

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

void setup() {
    lcd.createChar(0, newChar);
    lcd.begin(20, 4);
    lcd.write(0);
}

void loop() {}

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #7 on: March 22, 2015, 06:52:13 PM »
Two Custom Characters
Code: [Select]

#include <OLEDFourBit.h> //  NewHAVEN NHD-0420DZW-AY5-ND
//#include <LiquidCrystal.h>
OLEDFourBit lcd(7, 4, 10, 5, A3, A4, A5);
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

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

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

void setup() {
  lcd.createChar(0, newChar1);
  lcd.createChar(1, newChar2);
  lcd.begin(20, 4);
 

}
void loop() {
  lcd.setCursor(2,0);
  lcd.write(0); //PRINT
  lcd.setCursor(2,1);
  lcd.write(1); //PRINT

  delay(1000);
}
« Last Edit: March 22, 2015, 07:00:48 PM 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 #8 on: March 22, 2015, 07:03:52 PM »
Liquid Crystal Display Custom Character Designer

http://mikeyancey.com/hamcalc/lcd_characters.php

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #9 on: March 22, 2015, 08:52:57 PM »
This is other way of printing a  char
lcd.print((char)1); //print char

Code: [Select]
#include <OLEDFourBit.h> // Works with NewHAVEN NHD-0420DZW-AY5-ND
//#include <LiquidCrystal.h>
OLEDFourBit lcd(7, 4, 10, 5, A3, A4, A5);
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

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

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

byte newChar15[8] = {
  B10001,
  B01010,
  B01110,
  B00100,
  B00100,
  B01110,
  B01010,
  B10001
};
void setup() {
  lcd.createChar(0, newChar0);
  lcd.createChar(1, newChar1);
  lcd.createChar(15, newChar15);
  lcd.begin(20, 4);


}
void loop() {
  lcd.setCursor(2,0); //line 1
  lcd.write(1); //PRINT
  lcd.setCursor(0,1); ////line 2

  lcd.write(0); //PRINT
  lcd.setCursor(0,2); //line 3
  lcd.print("lcd.print((char)15)");
  lcd.setCursor(10,3); //line 4
  lcd.print((char)15); //other way of printing a  char
  delay(1000);
}

wb2dyb

  • Jr. Member
  • **
  • Posts: 26
  • Karma: 0
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #10 on: March 23, 2015, 01:08:56 AM »
Not sure if this makes a diff, but I'm using the OLedI2C library, needed to use no more then 3 lines to the diaplay. Though, what's in the cpp file for create craracter I did put in the OLedI2C.cpp file, but it errors on compile on the "write(charmap);" The library I used was for the one wire link. That part works fine, except the custom character part.Thanks for the poiinters, one of them has the lines I'm already trying to use, but I really need I2C communication.

GeorgeC


Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #11 on: March 25, 2015, 10:11:48 PM »
Hi

I do not own this display so it's hard to do testing.
Please test this sketch for me, not sure if this will print H and then Clear the display.
Code: [Select]
// Test print [ H ] and then Clear display with Wire Library.

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


void setup() {
  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("Test print >", 4, 0);    //("String", col, row)
  delay(2000); //2sec

  // test 1 / print H
  // For the US2066, the slave address is either “b0111100”/0x3c or “b0111101”/0x3d
  Wire.beginTransmission(I2C_ADDR); // start condition + Define I2C Address where the US2066 is, and set  R/W# bit to logic “0” write mode.

  // 5) After the transmission of the slave address, either the control byte or the data byte may be sent across the SDA. A control
  // byte mainly consists of Co and D/C# bits following by six “0”’s.
  // a. If the Co bit is set as logic “0”, the transmission of the following information will contain data bytes only.
  // b. The D/C# bit determines the next data byte is acted as a command or a data. If the D/C# bit is set to logic “0”,
  // it defines the following data byte as a command. If the D/C# bit is set to logic “1”, it defines the following data
  // byte as a data which will be stored at the DDRAM. The DDRAM address counter will be increased by one
  // automatically after each data write.

  // Co bit is set as logic “0”data bytes only,  D/C# bit is set to logic “1”[data]
  ////////////cd+6“0”’s.  // Co & D/C# bits
  Wire.write(B01000000); // control byte or the data byte, Co and D/C# bits following by six “0”’s.
  Wire.write(B01001000); // print H  [8bit (hi bit 0100/low bit 1000
  Wire.endTransmission(); // stop condition, 7) The write mode will be finished when a stop condition is applied.
  delay(5000); // 5sec. delay

  // test 2 / Clear display
  LCD.sendString("Clear dis.in 2sec.", 1, 1);
  delay(2000);
  //Clear display
  Wire.beginTransmission(I2C_ADDR); //Define I2C Address where the US2066 is
  // control byte or the data byte, Co and D/C# bits following by six “0”’s.
  Wire.write(B10000000); //  Co bit is set to logic “1”, D/C# bit is set to logic “0”, it defines the following data byte as a command.
  Wire.write(B00000001);  // Clear display
  Wire.endTransmission(); // stop condition.
  delay(5000); // 5sec. delay
}

wb2dyb

  • Jr. Member
  • **
  • Posts: 26
  • Karma: 0
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #12 on: March 29, 2015, 03:34:10 PM »
Chris, thanks for the effort. I need to figure out the addressing for this, how to store custom font data in those 8 memory locations. I am not 100% sure how to but I think I can see how to get them out after they are stored. But the command structure seems limited, or I'm just not getting how to set either/or IS RE SD RW or DC. I thank you for the help. I'm just not getting how to "command" it to store the 8 8(really 5) bit font info, and exactly how to get it back when writing text to the display. I think I see that I can use Wire.write to accomplish it, but now sure what the addressing would be then unsure of addressing or commands to use the character. You definitely seeded some ideas, but I fear I'm just not getting it.

Thanks!

GeorgeC

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #13 on: March 29, 2015, 10:42:44 PM »
Hay, don't worry
I was just trying to figure out how to use the i2c wire library,  it just a hobby of mine. ;)

Does the arduino sketch work?
Print H and then Clear the display?

Yes / no ?

Chris O.

  • Jr. Member
  • **
  • Posts: 35
  • Karma: 5
    • View Profile
Re: Library that works fine on the NHD-0420CW-A*3
« Reply #14 on: March 29, 2015, 10:58:00 PM »
By the way  I've just spent a day trying to figure out how to use 1Mbit MR25H10MDF Magnetoresistive random-access memory (MRAM) with SPI on Teensy 3.0 ARM dev board..
« Last Edit: April 03, 2015, 03:41:59 PM by Chris O. »

 

NHD‐0420CW‐AB3 I2C Interface

Started by andersonpdBoard OLEDs

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

Started by RichardRBoard OLEDs

Replies: 2
Views: 2026
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: 2147
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: 2955
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: 1962
Last post March 11, 2016, 07:51:03 AM
by Saurabh_B