Compiles against mbed OS 5
Fork of Adafruit_GFX_1351 by
Revision 17:0a4bb1070fd5, committed 2015-04-22
- Comitter:
- lionello
- Date:
- Wed Apr 22 02:14:36 2015 +0000
- Parent:
- 16:7fb1d4d3525d
- Child:
- 18:8606e2c579f1
- Commit message:
- Added SSD1351 support
Changed in this revision
--- a/Adafruit_GFX.h Tue Nov 11 22:08:20 2014 +0000
+++ b/Adafruit_GFX.h Wed Apr 22 02:14:36 2015 +0000
@@ -171,7 +171,7 @@
inline uint8_t getRotation(void) { rotation %= 4; return rotation; };
protected:
- int16_t _rawWidth, _rawHeight; // this is the 'raw' display w/h - never changes
+ const int16_t _rawWidth, _rawHeight; // this is the 'raw' display w/h - never changes
int16_t _width, _height; // dependent on rotation
int16_t cursor_x, cursor_y;
uint16_t textcolor, textbgcolor;
--- a/Adafruit_GFX_Config.h Tue Nov 11 22:08:20 2014 +0000 +++ b/Adafruit_GFX_Config.h Wed Apr 22 02:14:36 2015 +0000 @@ -2,7 +2,7 @@ #define _ADAFRUIT_GFX_CONFIG_H_ // Uncomment this to turn off the builtin splash -//#define NO_SPLASH_ADAFRUIT +#define NO_SPLASH_ADAFRUIT // Uncomment this to enable all functionality //#define GFX_WANT_ABSTRACTS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Adafruit_SSD1351.cpp Wed Apr 22 02:14:36 2015 +0000
@@ -0,0 +1,402 @@
+#include "Adafruit_SSD1351.h"
+
+#include <stdarg.h>
+
+#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
+
+
+Adafruit_SSD1351::Adafruit_SSD1351(PinName cs, PinName rs, PinName dc, PinName clk, PinName data)
+ : Adafruit_GFX(SSD1351WIDTH, SSD1351HEIGHT),
+ _spi(data, NC, clk),
+ _cs(cs),
+ _reset(rs),
+ _dc(dc)
+{
+}
+
+void Adafruit_SSD1351::writeCommand(uint8_t code)
+{
+ _cs = 1;
+ _dc = 0;
+ _cs = 0;
+ _spi.write(code);
+ _cs = 1;
+}
+
+void Adafruit_SSD1351::writeData(uint8_t value)
+{
+ _cs = 1;
+ _dc = 1;
+ _cs = 0;
+ _spi.write(value);
+ _cs = 1;
+}
+
+void Adafruit_SSD1351::off()
+{
+ writeCommand(0xAE);
+}
+
+void Adafruit_SSD1351::on()
+{
+ writeCommand(0xAF);
+}
+
+void Adafruit_SSD1351::goTo(int x, int y) {
+ if ((x >= SSD1351WIDTH) || (y >= SSD1351HEIGHT)) return;
+
+ // set x and y coordinate
+ writeCommand(SSD1351_CMD_SETCOLUMN);
+ writeData(x);
+ writeData(SSD1351WIDTH-1);
+
+ writeCommand(SSD1351_CMD_SETROW);
+ writeData(y);
+ writeData(SSD1351HEIGHT-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, SSD1351WIDTH, SSD1351HEIGHT, 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 >= SSD1351WIDTH) || (y >= SSD1351HEIGHT))
+ return;
+
+ // Y bounds check
+ if (y+h > SSD1351HEIGHT)
+ {
+ h = SSD1351HEIGHT - y - 1;
+ }
+
+ // X bounds check
+ if (x+w > SSD1351WIDTH)
+ {
+ w = SSD1351WIDTH - 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);
+ }
+}
+
+/**************************************************************************/
+/*!
+ @brief Draws a filled rectangle using HW acceleration
+*/
+/**************************************************************************/
+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 >= SSD1351WIDTH) || (y >= SSD1351HEIGHT))
+ return;
+
+ // X bounds check
+ if (x+w > SSD1351WIDTH)
+ {
+ w = SSD1351WIDTH - 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 >= SSD1351WIDTH) || (y >= SSD1351HEIGHT))
+ return;
+
+ // X bounds check
+ if (y+h > SSD1351HEIGHT)
+ {
+ h = SSD1351HEIGHT - 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::drawPixel(int16_t x, int16_t y, uint16_t color)
+{
+ // Transform x and y based on current rotation.
+ switch (getRotation()) {
+ // Case 0: No rotation
+ 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;
+ }
+
+ // Bounds check.
+ if ((x >= SSD1351WIDTH) || (y >= SSD1351HEIGHT)) return;
+ if ((x < 0) || (y < 0)) return;
+
+ goTo(x, y);
+
+ writeData(color >> 8);
+ writeData(color);
+}
+
+void Adafruit_SSD1351::begin(void) {
+#if 0
+ // set pin directions
+ pinMode(_rs, OUTPUT);
+
+ if (_sclk) {
+ pinMode(_sclk, OUTPUT);
+
+ pinMode(_sid, OUTPUT);
+ } else {
+ // using the hardware SPI
+ SPI.begin();
+ SPI.setDataMode(SPI_MODE3);
+ }
+
+ // Toggle RST low to reset; CS low so it'll listen to us
+ pinMode(_cs, OUTPUT);
+ digitalWrite(_cs, LOW);
+
+ if (_rst) {
+ pinMode(_rst, OUTPUT);
+ digitalWrite(_rst, HIGH);
+ delay(500);
+ digitalWrite(_rst, LOW);
+ delay(500);
+ digitalWrite(_rst, HIGH);
+ delay(500);
+ }
+#endif
+
+ _spi.format(8,3);
+ //_spi.format(9,3);// no D/C# pin
+ //_spi.frequency(2000000);
+
+ _cs = 0;
+ _reset = 1;
+ wait(0.1f);
+ _reset = 0;
+ wait(0.1f);
+ _reset = 1;
+ wait(0.1f);
+
+ // 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 (SSD1351HEIGHT == 96) {
+ writeData(96);
+ } else {
+ writeData(0);
+ }
+
+
+ writeCommand(SSD1351_CMD_DISPLAYOFFSET); // 0xA2
+ writeData(0x0);
+
+ 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);
+ writeData(0x80);
+ writeData(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);
+ }
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Adafruit_SSD1351.h Wed Apr 22 02:14:36 2015 +0000
@@ -0,0 +1,117 @@
+/***************************************************
+ This is a library for the 1.5" & 1.27" 16-bit Color OLEDs
+ with SSD1331 driver chip
+
+ Pick one up today in the adafruit shop!
+ ------> http://www.adafruit.com/products/1431
+ ------> http://www.adafruit.com/products/1673
+
+ 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, all text above must be included in any redistribution
+ ****************************************************/
+#pragma once
+
+#include <mbed.h>
+
+#include "Adafruit_GFX.h"
+
+#define swap(a, b) { uint16_t t = a; a = b; b = t; }
+
+#define SSD1351WIDTH 128
+#define SSD1351HEIGHT 128 // SET THIS TO 96 FOR 1.27"!
+
+// Select one of these defines to set the pixel color order
+#define SSD1351_COLORORDER_RGB
+// #define SSD1351_COLORORDER_BGR
+
+#if defined SSD1351_COLORORDER_RGB && defined SSD1351_COLORORDER_BGR
+ #error "RGB and BGR can not both be defined for SSD1351_COLORODER."
+#endif
+
+// Timing Delays
+#define SSD1351_DELAYS_HWFILL (3)
+#define SSD1351_DELAYS_HWLINE (1)
+
+// 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
+#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
+
+
+class Adafruit_SSD1351 : public virtual Adafruit_GFX
+{
+ public:
+ Adafruit_SSD1351(PinName cs, PinName rs, PinName dc, PinName clk, PinName data);
+
+ void on();
+ void off();
+
+ uint16_t Color565(uint8_t r, uint8_t g, uint8_t b);
+
+ // drawing primitives!
+ virtual void drawPixel(int16_t x, int16_t y, uint16_t color);
+ void fillRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);
+ void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
+ void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
+ void fillScreen(uint16_t fillcolor);
+
+ void invert(bool);
+ // commands
+ void begin(void);
+ void goTo(int x, int y);
+
+ void reset(void);
+
+ /* low level */
+
+ void writeData(uint8_t d);
+ void writeCommand(uint8_t c);
+
+
+ void writeData_unsafe(uint16_t d);
+
+ void setWriteDir(void);
+ void write8(uint8_t d);
+
+ private:
+ SPI _spi;
+ DigitalOut _cs, _dc, _reset;
+
+ void rawFillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t fillcolor);
+ void rawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
+ void rawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
+};
