A derived version of the BSD licensed Adafrut GFX library for the SSD1351 controller for an OLED 128x 96or 128x128 display using SPI
Fork of Adafruit_GFX by
You can print russian. (font edited).
class SPIPreInit : public SPI { public: SPIPreInit(PinName mosi, PinName miso, PinName clk) : SPI(mosi,miso,clk) { format(8,3); frequency(25000000); }; }; SPIPreInit gSpi(PB_15,NC,PB_13); PinName mosi(sda), PinName miso, PinName clk(scl) Adafruit_SSD1351_Spi oled(gSpi,PB_14,PB_1,PB_2); PinName DC, PinName RST, PinName CS
Adafruit_SSD1351.cpp
- Committer:
- Dzhafarkhanov
- Date:
- 2016-02-24
- Revision:
- 17:56015e4834e6
- Parent:
- Adafruit_SSD1306.cpp@ 16:7fb1d4d3525d
File content as of revision 17:56015e4834e6:
/*********************************************************************
This is a library for our Monochrome OLEDs based on SSD1351 drivers
Pick one up today in the adafruit shop!
------> http://www.adafruit.com/category/63_98
These displays use SPI to communicate, 4 or 5 pins are required to
interface
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, check license.txt for more information
All text above, and the splash screen below must be included in any redistribution
*********************************************************************/
/*
* Modified by Neal Horman 7/14/2012 for use in mbed
*/
#include "mbed.h"
#include "Adafruit_SSD1351.h"
#ifndef _BV
#define _BV(bit) (1<<(bit))
#endif
#define SSD1351_COLORORDER_BGR
// Timing Delays
#define SSD1351_DELAYS_HWFILL (3)
#define SSD1351_DELAYS_HWLINE (1)
//old
#define SSD1351_SETHIGHCOLUMN 0x10
// SSD1351 Commands
#define SSD1351_CMD_SETCOLUMN 0x15
#define SSD1351_CMD_SETROW 0x75
#define SSD1351_CMD_WRITERAM 0x5C
#define SSD1351_CMD_READRAM 0x5D
#define SSD1351_CMD_SETREMAP 0xA0
#define SSD1351_CMD_STARTLINE 0xA1 //Set display start line
#define SSD1351_CMD_DISPLAYOFFSET 0xA2
#define SSD1351_CMD_DISPLAYALLOFF 0xA4
#define SSD1351_CMD_DISPLAYALLON 0xA5
#define SSD1351_CMD_NORMALDISPLAY 0xA6
#define SSD1351_CMD_INVERTDISPLAY 0xA7
#define SSD1351_CMD_FUNCTIONSELECT 0xAB
#define SSD1351_CMD_DISPLAYOFF 0xAE
#define SSD1351_CMD_DISPLAYON 0xAF
#define SSD1351_CMD_PRECHARGE 0xB1
#define SSD1351_CMD_DISPLAYENHANCE 0xB2
#define SSD1351_CMD_CLOCKDIV 0xB3
#define SSD1351_CMD_SETVSL 0xB4
#define SSD1351_CMD_SETGPIO 0xB5
#define SSD1351_CMD_PRECHARGE2 0xB6
#define SSD1351_CMD_SETGRAY 0xB8
#define SSD1351_CMD_USELUT 0xB9
#define SSD1351_CMD_PRECHARGELEVEL 0xBB
#define SSD1351_CMD_VCOMH 0xBE
#define SSD1351_CMD_CONTRASTABC 0xC1
#define SSD1351_CMD_CONTRASTMASTER 0xC7
#define SSD1351_CMD_MUXRATIO 0xCA
#define SSD1351_CMD_COMMANDLOCK 0xFD
#define SSD1351_CMD_HORIZSCROLL 0x96
#define SSD1351_CMD_STOPSCROLL 0x9E
#define SSD1351_CMD_STARTSCROLL 0x9F
void Adafruit_SSD1351::begin(void)//oled init
{
rst = 1;
// VDD (3.3V) goes high at start, lets just chill for a ms
wait_ms(10);
// bring reset low
rst = 0;
// wait 10ms
wait_ms(10);
// bring out of reset
rst = 1;
// turn on VCC (13V?)
wait_ms(10);
// Initialization Sequence
writeCommand(SSD1351_CMD_COMMANDLOCK); // set command lock
writeData(0x12);
writeCommand(SSD1351_CMD_COMMANDLOCK); // set command lock
writeData(0xB1);
writeCommand(SSD1351_CMD_DISPLAYOFF); // 0xAE
writeCommand(SSD1351_CMD_CLOCKDIV); // 0xB3
writeCommand(0xF1); // 7:4 = Oscillator Frequency, 3:0 = CLK Div Ratio (A[3:0]+1 = 1..16)
writeCommand(SSD1351_CMD_MUXRATIO);
writeData(127);
writeCommand(SSD1351_CMD_SETREMAP);
writeData(0x74);
writeCommand(SSD1351_CMD_SETCOLUMN);
writeData(0x00);
writeData(0x7F);
writeCommand(SSD1351_CMD_SETROW);
writeData(0x00);
writeData(0x7F);
writeCommand(SSD1351_CMD_STARTLINE); // 0xA1
if (height() == 96) {
writeData(96);
} else {
writeData(0);
}
writeCommand(SSD1351_CMD_DISPLAYOFFSET); // 0xA2
writeData(0x00);
writeCommand(SSD1351_CMD_SETGPIO);
writeData(0x00);
writeCommand(SSD1351_CMD_FUNCTIONSELECT);
writeData(0x01); // internal (diode drop)
//writeData(0x01); // external bias
// writeCommand(SSSD1351_CMD_SETPHASELENGTH);
// writeData(0x32);
writeCommand(SSD1351_CMD_PRECHARGE); // 0xB1
writeCommand(0x32);
writeCommand(SSD1351_CMD_VCOMH); // 0xBE
writeCommand(0x05);
writeCommand(SSD1351_CMD_NORMALDISPLAY); // 0xA6
writeCommand(SSD1351_CMD_CONTRASTABC);
writeData(0xC8); //0x8A //0xC8)
writeData(0x80);//0x51 //0x80
writeData(0xC8);// 0x8A //0xC8
writeCommand(SSD1351_CMD_CONTRASTMASTER);
writeData(0x0F);
writeCommand(SSD1351_CMD_SETVSL );
writeData(0xA0);
writeData(0xB5);
writeData(0x55);
writeCommand(SSD1351_CMD_PRECHARGE2);
writeData(0x01);
writeCommand(SSD1351_CMD_DISPLAYON); //--turn on oled panel
}
void Adafruit_SSD1351::invert(bool v) {
if (v) {
writeCommand(SSD1351_CMD_INVERTDISPLAY);
} else {
writeCommand(SSD1351_CMD_NORMALDISPLAY);
}
}
void Adafruit_SSD1351::goTo(int x, int y) {
if ((x >= width()) || (y >= height())) return;
// set x and y coordinate
writeCommand(SSD1351_CMD_SETCOLUMN);
writeData(x);
writeData(width()-1);
writeCommand(SSD1351_CMD_SETROW);
writeData(y);
writeData(height()-1);
writeCommand(SSD1351_CMD_WRITERAM);
}
uint16_t Adafruit_SSD1351::Color565(uint8_t r, uint8_t g, uint8_t b) {
uint16_t c;
c = r >> 3;
c <<= 6;
c |= g >> 2;
c <<= 5;
c |= b >> 3;
return c;
}
void Adafruit_SSD1351::fillScreen(uint16_t fillcolor) {
fillRect(0, 0, width(), height(), fillcolor);
}
// Draw a filled rectangle with no rotation.
void Adafruit_SSD1351::rawFillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t fillcolor) {
// Bounds check
if ((x >= width()) || (y >= height()))
return;
// Y bounds check
if (y+h > height())
{
h = height() - y - 1;
}
// X bounds check
if (x+w > width())
{
w = width() - x - 1;
}
/*
Serial.print(x); Serial.print(", ");
Serial.print(y); Serial.print(", ");
Serial.print(w); Serial.print(", ");
Serial.print(h); Serial.println(", ");
*/
// set location
writeCommand(SSD1351_CMD_SETCOLUMN);
writeData(x);
writeData(x+w-1);
writeCommand(SSD1351_CMD_SETROW);
writeData(y);
writeData(y+h-1);
// fill!
writeCommand(SSD1351_CMD_WRITERAM);
for (uint16_t i=0; i < w*h; i++) {
writeData(fillcolor >> 8);
writeData(fillcolor);
}
}
void Adafruit_SSD1351::fillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t fillcolor) {
// Transform x and y based on current rotation.
switch (getRotation()) {
case 0: // No rotation
rawFillRect(x, y, w, h, fillcolor);
break;
case 1: // Rotated 90 degrees clockwise.
swap(x, y);
x = _rawWidth - x - h;
rawFillRect(x, y, h, w, fillcolor);
break;
case 2: // Rotated 180 degrees clockwise.
x = _rawWidth - x - w;
y = _rawHeight - y - h;
rawFillRect(x, y, w, h, fillcolor);
break;
case 3: // Rotated 270 degrees clockwise.
swap(x, y);
y = _rawHeight - y - w;
rawFillRect(x, y, h, w, fillcolor);
break;
}
}
// Draw a horizontal line ignoring any screen rotation.
void Adafruit_SSD1351::rawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
// Bounds check
if ((x >= width()) || (y >= height()))
return;
// X bounds check
if (x+w > width())
{
w = width() - x - 1;
}
if (w < 0) return;
// set location
writeCommand(SSD1351_CMD_SETCOLUMN);
writeData(x);
writeData(x+w-1);
writeCommand(SSD1351_CMD_SETROW);
writeData(y);
writeData(y);
// fill!
writeCommand(SSD1351_CMD_WRITERAM);
for (uint16_t i=0; i < w; i++) {
writeData(color >> 8);
writeData(color);
}
}
// Draw a vertical line ignoring any screen rotation.
void Adafruit_SSD1351::rawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
// Bounds check
if ((x >= width()) || (y >= height()))
return;
// X bounds check
if (y+h > height())
{
h = height() - y - 1;
}
if (h < 0) return;
// set location
writeCommand(SSD1351_CMD_SETCOLUMN);
writeData(x);
writeData(x);
writeCommand(SSD1351_CMD_SETROW);
writeData(y);
writeData(y+h-1);
// fill!
writeCommand(SSD1351_CMD_WRITERAM);
for (uint16_t i=0; i < h; i++) {
writeData(color >> 8);
writeData(color);
}
}
void Adafruit_SSD1351::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
// Transform x and y based on current rotation.
switch (getRotation()) {
case 0: // No rotation
rawFastVLine(x, y, h, color);
break;
case 1: // Rotated 90 degrees clockwise.
swap(x, y);
x = _rawWidth - x - h;
rawFastHLine(x, y, h, color);
break;
case 2: // Rotated 180 degrees clockwise.
x = _rawWidth - x - 1;
y = _rawHeight - y - h;
rawFastVLine(x, y, h, color);
break;
case 3: // Rotated 270 degrees clockwise.
swap(x, y);
y = _rawHeight - y - 1;
rawFastHLine(x, y, h, color);
break;
}
}
void Adafruit_SSD1351::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
// Transform x and y based on current rotation.
switch (getRotation()) {
case 0: // No rotation.
rawFastHLine(x, y, w, color);
break;
case 1: // Rotated 90 degrees clockwise.
swap(x, y);
x = _rawWidth - x - 1;
rawFastVLine(x, y, w, color);
break;
case 2: // Rotated 180 degrees clockwise.
x = _rawWidth - x - w;
y = _rawHeight - y - 1;
rawFastHLine(x, y, w, color);
break;
case 3: // Rotated 270 degrees clockwise.
swap(x, y);
y = _rawHeight - y - w;
rawFastVLine(x, y, w, color);
break;
}
}
void Adafruit_SSD1351::setContrastControl(uint8_t contrast) {
writeCommand(SSD1351_CMD_CONTRASTMASTER);
//writeData(0x0F);
writeData(contrast);
}
// Set a single pixel
void Adafruit_SSD1351::drawPixel(int16_t x, int16_t y, uint16_t color)
{
if ((x < 0) || (x >= width()) || (y < 0) || (y >= height())) // Bounds check.
return;
// check rotation, move pixel around if necessary
switch (getRotation())
{
case 1: // Rotated 90 degrees clockwise.
swap(x, y);
x = _rawWidth - x - 1;
break;
case 2: // Rotated 180 degrees clockwise.
x = _rawWidth - x - 1;
y = _rawHeight - y - 1;
break;
case 3: // Rotated 270 degrees clockwise.
swap(x, y);
y = _rawHeight - y - 1;
break;
}
{
}
goTo(x, y);
writeData(color >> 8) ;
writeData(color);
}
