//---------------------------------------------------------
/*
Program for writing to Newhaven Display NHD-1.8-160128B with SSD1353 controller.
This code is written for the Arduino Due.
This code will initialize the display and fill the screen with different colors
Copyright (c) 2025 - Newhaven Display International, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
//---------------------------------------------
/*---------------Pinout Table--------------
NHD-1.8-160128B Arduino Due
1
2
3
4 GND
5 GND
6
7
8 3.3V
9
10
11 3.3V
12 3.3V
13 D40
14 D41
15
16 D38
17 D37
18 D25
19 D26
20 D27
21 D28
22 D29
23 D30
24 D31
25 D32
26 D33
27 D34
28 D35
29
30 GND
31 GND
32
33
34
----------------------------------------------*/
//--------------Interface Selection-----------------------------------------------------------
const unsigned char interface = 0; //0 = Parallel 6800 1 = Parallel 8080 2 = 4-Wire SPI
//--------------------------------------------------------------------------------------------
#define RS 25 //RS
#define RW 26 //R/W
#define E 27 //E
#define SCLK 28 //DB0
#define SDIN 29 //DB1
#define DB2 30 //DB2
#define DB3 31 //DB3
#define DB4 32 //DB4
#define DB5 33 //DB5
#define DB6 34 //DB6
#define DB7 35 //DB7
#define RES 37 //RES
#define CS 38 //CS
#define BS1 40 //BS1
#define BS2 41 //BS2
#define WHITE 0xFFFF
#define RED 0xF800
#define ORANGE 0xFBE0
#define YELLOW 0xFFE0
#define GREEN 0x07E0
#define BLUE 0x001F
#define VIOLET 0x781F
#define BLACK 0x0000
void write_8bit(unsigned char c){
for(int i =35;i>=28;i--){
if((c&0x80) ==0x80){
digitalWrite(i,HIGH);
}
else {
digitalWrite(i,LOW);
}
c= c<<1;
}
}
void command(unsigned char c) // send command to OLED
{
unsigned char i;
unsigned char mask = 0x80;
switch(interface)
{
case 0: digitalWrite(RS, LOW); // D/C set to LOW for comm_out_2
delayMicroseconds(1);
write_8bit(c);
digitalWrite(RW, LOW); // R/W set to LOW for writing
digitalWrite(E, HIGH); //E set HIGH for latch
delayMicroseconds(1);
digitalWrite(E, LOW); // E set LOW for latch
break;
case 1: digitalWrite(RS, LOW); //D/C LOW
digitalWrite(E, HIGH); //RD# HIGH
delayMicroseconds(1);
write_8bit(c);
digitalWrite(RW, LOW); //WR LOW
digitalWrite(RW, HIGH); //WR HIGH
break;
case 2: digitalWrite(RS, LOW); //command
for(i=0;i<8;i++)
{
digitalWrite(SCLK, LOW);
if((c & mask) >> 7 == 1)
{
digitalWrite(SDIN, HIGH);
}
else
{
digitalWrite(SDIN, LOW);
}
digitalWrite(SCLK, HIGH);
c = c << 1;
}
break;
}
}
void data(unsigned char d) // send data to OLED
{
unsigned char i;
unsigned char mask = 0x80;
switch (interface)
{
case 0: write_8bit(d);
digitalWrite(RS, HIGH); // D/C set to HIGH for data_out_2
delayMicroseconds(1);
digitalWrite(RW, LOW); // R/W set to LOW for writing
digitalWrite(E, HIGH); //E set HIGH for latch
delayMicroseconds(1);
digitalWrite(E, LOW); // E set LOW for latch
break;
case 1: digitalWrite(RS, HIGH); //DC HIGH
digitalWrite(E, HIGH); //RD# HIGH
write_8bit(d);
digitalWrite(RW, LOW); //WR LOW
digitalWrite(RW, HIGH); //WR HIGH
break;
case 2: digitalWrite(RS, HIGH);
for(i=0;i<8;i++)
{
digitalWrite(SCLK, LOW);
if((d & mask) >> 7 == 1)
{
digitalWrite(SDIN, HIGH);
}
else
{
digitalWrite(SDIN, LOW);
}
digitalWrite(SCLK, HIGH);
d = d << 1;
}
break;
}
}
void SetColumnAddress(unsigned char x_start, unsigned char x_end) // set column address start + end
{
command(0x15);
data(x_start);
data(x_end);
}
void SetRowAddress(unsigned char y_start, unsigned char y_end) // set row address start + end
{
command(0x75);
data(y_start);
data(y_end);
}
void WriteMemoryStart(void) // write to RAM command
{
command(0x5c);
}
void SetPosition(unsigned int x_pos, unsigned int y_pos) // set x,y address
{
command(0x20);
data(x_pos);
command(0x21);
data(y_pos);
}
void FillScreen(uint16_t a) //fill screen with a given color
{
unsigned char i, j,x1,x2;
SetColumnAddress(0x00,0x9F); //Columns 0-159
SetRowAddress(0x00,0x7f); //Rows 0-127
SetPosition(0,0);
WriteMemoryStart();
x1=(a>>8);
x2=(a & 0x00FF);
for (i = 0; i < 128; i++)
{
for (j = 0; j < 160; j++)
{
data(x1);
data(x2);
}
}
}
void Init_OLED()
{
command(0xAE); //Set Display OFF
command(0xA8); //Set MUX ratio
data(0x7F);
command(0xA2); //Set Display offset
data(0x00);
command(0xA1); //Set display start line
data(0x00);
command(0xA4); //Normal display
command(0xA0); //Set Re-map, color depth
data(0x64);
command(0x81); //Set Contrast for color"A" segment
data(0x75);
command(0x82); //Set Contrast for color"B" segment
data(0x60);
command(0x83); //Set Contrast for color"C" segment
data(0x6A);
command(0x87); //Master Contrast Current Control
data(0x0F);
command(0xB9); //use linear grayscale table
command(0xB1); //Set Phase1 and phase2 period adjustment
data(0x22);
command(0xB3); //Set Display Clock Divide Ratio (internal clock selection)
data(0x40);
command(0xBB); //Set Pre-charge Voltage
data(0x08);
command(0xBE); //Set VCOMH
data(0x2F);
command(0xAF); //Set Display ON in mormal mode
}
void Init_Pins()
{
pinMode(RS, OUTPUT);//RS
pinMode(RW, OUTPUT);//R/W
pinMode(E, OUTPUT);//E
pinMode(SCLK, OUTPUT);//DB0
pinMode(SDIN, OUTPUT);//DB1
pinMode(DB2, OUTPUT);//DB2
pinMode(DB3,OUTPUT);//DB3
pinMode(DB4,OUTPUT);//DB4
pinMode(DB5,OUTPUT);//DB5
pinMode(DB6,OUTPUT);//DB6
pinMode(DB7,OUTPUT);//DB7
pinMode(RES,OUTPUT);//RES
pinMode(CS,OUTPUT);//CS
pinMode(BS1,OUTPUT);//BS1
pinMode(BS2,OUTPUT);//BS2
digitalWrite(RES,HIGH);
digitalWrite(CS,LOW);
switch(interface)
{
case 0: digitalWrite(BS1,LOW);//6800 PARALLEL INTERFACE
digitalWrite(BS2,HIGH);//6800 PARALLEL INTERFACE
break;
case 1: digitalWrite(BS1,HIGH);//8080 PARALLEL INTERFACE
digitalWrite(BS2,HIGH);//8080 PARALLEL INTERFACE
break;
case 2: digitalWrite(BS1,LOW);//4-Wire SPI INTERFACE
digitalWrite(BS2,LOW);//4-Wire SPI INTERFACE
digitalWrite(DB2, LOW);
digitalWrite(DB3, LOW);
digitalWrite(DB4, LOW);
digitalWrite(DB5, LOW);
digitalWrite(DB6, LOW);
digitalWrite(DB7, LOW);
digitalWrite(RW, LOW);
digitalWrite(E, LOW);
break;
}
digitalWrite(RES,LOW);
delay(100);
digitalWrite(RES,HIGH);
delay(1000);
}
void setup() {
Init_Pins();
Init_OLED();
}
void loop()
{
FillScreen(WHITE);
FillScreen(RED);
FillScreen(ORANGE);
FillScreen(YELLOW);
FillScreen(GREEN);
FillScreen(BLUE);
FillScreen(VIOLET);
FillScreen(BLACK);
}