OLED Display

Dependents:   UltraschallSensor_LowLevelV2

Committer:
marcel1691
Date:
Fri May 27 16:40:07 2016 +0000
Revision:
0:1dee22d82bd2
OLED Display for IoTKit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcel1691 0:1dee22d82bd2 1 /*********************************************************************
marcel1691 0:1dee22d82bd2 2 This is a library for our Monochrome OLEDs based on SSD1306 drivers
marcel1691 0:1dee22d82bd2 3
marcel1691 0:1dee22d82bd2 4 Pick one up today in the adafruit shop!
marcel1691 0:1dee22d82bd2 5 ------> http://www.adafruit.com/category/63_98
marcel1691 0:1dee22d82bd2 6
marcel1691 0:1dee22d82bd2 7 These displays use SPI to communicate, 4 or 5 pins are required to
marcel1691 0:1dee22d82bd2 8 interface
marcel1691 0:1dee22d82bd2 9
marcel1691 0:1dee22d82bd2 10 Adafruit invests time and resources providing this open source code,
marcel1691 0:1dee22d82bd2 11 please support Adafruit and open-source hardware by purchasing
marcel1691 0:1dee22d82bd2 12 products from Adafruit!
marcel1691 0:1dee22d82bd2 13
marcel1691 0:1dee22d82bd2 14 Written by Limor Fried/Ladyada for Adafruit Industries.
marcel1691 0:1dee22d82bd2 15 BSD license, check license.txt for more information
marcel1691 0:1dee22d82bd2 16 All text above, and the splash screen must be included in any redistribution
marcel1691 0:1dee22d82bd2 17 *********************************************************************/
marcel1691 0:1dee22d82bd2 18
marcel1691 0:1dee22d82bd2 19 /*
marcel1691 0:1dee22d82bd2 20 * Modified by Neal Horman 7/14/2012 for use in mbed
marcel1691 0:1dee22d82bd2 21 */
marcel1691 0:1dee22d82bd2 22
marcel1691 0:1dee22d82bd2 23 #ifndef _ADAFRUIT_SSD1306_H_
marcel1691 0:1dee22d82bd2 24 #define _ADAFRUIT_SSD1306_H_
marcel1691 0:1dee22d82bd2 25
marcel1691 0:1dee22d82bd2 26 #include "mbed.h"
marcel1691 0:1dee22d82bd2 27 #include "Adafruit_GFX.h"
marcel1691 0:1dee22d82bd2 28
marcel1691 0:1dee22d82bd2 29 #include <vector>
marcel1691 0:1dee22d82bd2 30 #include <algorithm>
marcel1691 0:1dee22d82bd2 31
marcel1691 0:1dee22d82bd2 32 // A DigitalOut sub-class that provides a constructed default state
marcel1691 0:1dee22d82bd2 33 class DigitalOut2 : public DigitalOut
marcel1691 0:1dee22d82bd2 34 {
marcel1691 0:1dee22d82bd2 35 public:
marcel1691 0:1dee22d82bd2 36 DigitalOut2(PinName pin, bool active = false) : DigitalOut(pin) { write(active); };
marcel1691 0:1dee22d82bd2 37 DigitalOut2& operator= (int value) { write(value); return *this; };
marcel1691 0:1dee22d82bd2 38 DigitalOut2& operator= (DigitalOut2& rhs) { write(rhs.read()); return *this; };
marcel1691 0:1dee22d82bd2 39 operator int() { return read(); };
marcel1691 0:1dee22d82bd2 40 };
marcel1691 0:1dee22d82bd2 41
marcel1691 0:1dee22d82bd2 42 #define SSD1306_EXTERNALVCC 0x1
marcel1691 0:1dee22d82bd2 43 #define SSD1306_SWITCHCAPVCC 0x2
marcel1691 0:1dee22d82bd2 44
marcel1691 0:1dee22d82bd2 45 /** The pure base class for the SSD1306 display driver.
marcel1691 0:1dee22d82bd2 46 *
marcel1691 0:1dee22d82bd2 47 * You should derive from this for a new transport interface type,
marcel1691 0:1dee22d82bd2 48 * such as the SPI and I2C drivers.
marcel1691 0:1dee22d82bd2 49 */
marcel1691 0:1dee22d82bd2 50 class Adafruit_SSD1306 : public Adafruit_GFX
marcel1691 0:1dee22d82bd2 51 {
marcel1691 0:1dee22d82bd2 52 public:
marcel1691 0:1dee22d82bd2 53 Adafruit_SSD1306(PinName RST, uint8_t rawHeight = 32, uint8_t rawWidth = 128)
marcel1691 0:1dee22d82bd2 54 : Adafruit_GFX(rawWidth,rawHeight)
marcel1691 0:1dee22d82bd2 55 , rst(RST,false)
marcel1691 0:1dee22d82bd2 56 {
marcel1691 0:1dee22d82bd2 57 buffer.resize(rawHeight * rawWidth / 8);
marcel1691 0:1dee22d82bd2 58 };
marcel1691 0:1dee22d82bd2 59
marcel1691 0:1dee22d82bd2 60 void begin(uint8_t switchvcc = SSD1306_SWITCHCAPVCC);
marcel1691 0:1dee22d82bd2 61
marcel1691 0:1dee22d82bd2 62 // These must be implemented in the derived transport driver
marcel1691 0:1dee22d82bd2 63 virtual void command(uint8_t c) = 0;
marcel1691 0:1dee22d82bd2 64 virtual void data(uint8_t c) = 0;
marcel1691 0:1dee22d82bd2 65 virtual void drawPixel(int16_t x, int16_t y, uint16_t color);
marcel1691 0:1dee22d82bd2 66
marcel1691 0:1dee22d82bd2 67 /// Clear the display buffer
marcel1691 0:1dee22d82bd2 68 void clearDisplay(void);
marcel1691 0:1dee22d82bd2 69 virtual void invertDisplay(bool i);
marcel1691 0:1dee22d82bd2 70
marcel1691 0:1dee22d82bd2 71 /// Cause the display to be updated with the buffer content.
marcel1691 0:1dee22d82bd2 72 void display();
marcel1691 0:1dee22d82bd2 73 /// Fill the buffer with the AdaFruit splash screen.
marcel1691 0:1dee22d82bd2 74 virtual void splash();
marcel1691 0:1dee22d82bd2 75
marcel1691 0:1dee22d82bd2 76 protected:
marcel1691 0:1dee22d82bd2 77 virtual void sendDisplayBuffer() = 0;
marcel1691 0:1dee22d82bd2 78 DigitalOut2 rst;
marcel1691 0:1dee22d82bd2 79
marcel1691 0:1dee22d82bd2 80 // the memory buffer for the LCD
marcel1691 0:1dee22d82bd2 81 std::vector<uint8_t> buffer;
marcel1691 0:1dee22d82bd2 82 };
marcel1691 0:1dee22d82bd2 83
marcel1691 0:1dee22d82bd2 84
marcel1691 0:1dee22d82bd2 85 /** This is the SPI SSD1306 display driver transport class
marcel1691 0:1dee22d82bd2 86 *
marcel1691 0:1dee22d82bd2 87 */
marcel1691 0:1dee22d82bd2 88 class Adafruit_SSD1306_Spi : public Adafruit_SSD1306
marcel1691 0:1dee22d82bd2 89 {
marcel1691 0:1dee22d82bd2 90 public:
marcel1691 0:1dee22d82bd2 91 /** Create a SSD1306 SPI transport display driver instance with the specified DC, RST, and CS pins, as well as the display dimentions
marcel1691 0:1dee22d82bd2 92 *
marcel1691 0:1dee22d82bd2 93 * Required parameters
marcel1691 0:1dee22d82bd2 94 * @param spi - a reference to an initialized SPI object
marcel1691 0:1dee22d82bd2 95 * @param DC (Data/Command) pin name
marcel1691 0:1dee22d82bd2 96 * @param RST (Reset) pin name
marcel1691 0:1dee22d82bd2 97 * @param CS (Chip Select) pin name
marcel1691 0:1dee22d82bd2 98 *
marcel1691 0:1dee22d82bd2 99 * Optional parameters
marcel1691 0:1dee22d82bd2 100 * @param rawHeight - the vertical number of pixels for the display, defaults to 32
marcel1691 0:1dee22d82bd2 101 * @param rawWidth - the horizonal number of pixels for the display, defaults to 128
marcel1691 0:1dee22d82bd2 102 */
marcel1691 0:1dee22d82bd2 103 Adafruit_SSD1306_Spi(SPI &spi, PinName DC, PinName RST, PinName CS, uint8_t rawHieght = 32, uint8_t rawWidth = 128)
marcel1691 0:1dee22d82bd2 104 : Adafruit_SSD1306(RST, rawHieght, rawWidth)
marcel1691 0:1dee22d82bd2 105 , cs(CS,true)
marcel1691 0:1dee22d82bd2 106 , dc(DC,false)
marcel1691 0:1dee22d82bd2 107 , mspi(spi)
marcel1691 0:1dee22d82bd2 108 {
marcel1691 0:1dee22d82bd2 109 begin();
marcel1691 0:1dee22d82bd2 110 splash();
marcel1691 0:1dee22d82bd2 111 display();
marcel1691 0:1dee22d82bd2 112 };
marcel1691 0:1dee22d82bd2 113
marcel1691 0:1dee22d82bd2 114 virtual void command(uint8_t c)
marcel1691 0:1dee22d82bd2 115 {
marcel1691 0:1dee22d82bd2 116 cs = 1;
marcel1691 0:1dee22d82bd2 117 dc = 0;
marcel1691 0:1dee22d82bd2 118 cs = 0;
marcel1691 0:1dee22d82bd2 119 mspi.write(c);
marcel1691 0:1dee22d82bd2 120 cs = 1;
marcel1691 0:1dee22d82bd2 121 };
marcel1691 0:1dee22d82bd2 122
marcel1691 0:1dee22d82bd2 123 virtual void data(uint8_t c)
marcel1691 0:1dee22d82bd2 124 {
marcel1691 0:1dee22d82bd2 125 cs = 1;
marcel1691 0:1dee22d82bd2 126 dc = 1;
marcel1691 0:1dee22d82bd2 127 cs = 0;
marcel1691 0:1dee22d82bd2 128 mspi.write(c);
marcel1691 0:1dee22d82bd2 129 cs = 1;
marcel1691 0:1dee22d82bd2 130 };
marcel1691 0:1dee22d82bd2 131
marcel1691 0:1dee22d82bd2 132 protected:
marcel1691 0:1dee22d82bd2 133 virtual void sendDisplayBuffer()
marcel1691 0:1dee22d82bd2 134 {
marcel1691 0:1dee22d82bd2 135 cs = 1;
marcel1691 0:1dee22d82bd2 136 dc = 1;
marcel1691 0:1dee22d82bd2 137 cs = 0;
marcel1691 0:1dee22d82bd2 138
marcel1691 0:1dee22d82bd2 139 for(uint16_t i=0, q=buffer.size(); i<q; i++)
marcel1691 0:1dee22d82bd2 140 mspi.write(buffer[i]);
marcel1691 0:1dee22d82bd2 141
marcel1691 0:1dee22d82bd2 142 if(height() == 32)
marcel1691 0:1dee22d82bd2 143 {
marcel1691 0:1dee22d82bd2 144 for(uint16_t i=0, q=buffer.size(); i<q; i++)
marcel1691 0:1dee22d82bd2 145 mspi.write(0);
marcel1691 0:1dee22d82bd2 146 }
marcel1691 0:1dee22d82bd2 147
marcel1691 0:1dee22d82bd2 148 cs = 1;
marcel1691 0:1dee22d82bd2 149 };
marcel1691 0:1dee22d82bd2 150
marcel1691 0:1dee22d82bd2 151 DigitalOut2 cs, dc;
marcel1691 0:1dee22d82bd2 152 SPI &mspi;
marcel1691 0:1dee22d82bd2 153 };
marcel1691 0:1dee22d82bd2 154
marcel1691 0:1dee22d82bd2 155 /** This is the I2C SSD1306 display driver transport class
marcel1691 0:1dee22d82bd2 156 *
marcel1691 0:1dee22d82bd2 157 */
marcel1691 0:1dee22d82bd2 158 class Adafruit_SSD1306_I2c : public Adafruit_SSD1306
marcel1691 0:1dee22d82bd2 159 {
marcel1691 0:1dee22d82bd2 160 public:
marcel1691 0:1dee22d82bd2 161 #define SSD_I2C_ADDRESS 0x78
marcel1691 0:1dee22d82bd2 162 /** Create a SSD1306 I2C transport display driver instance with the specified RST pin name, the I2C address, as well as the display dimensions
marcel1691 0:1dee22d82bd2 163 *
marcel1691 0:1dee22d82bd2 164 * Required parameters
marcel1691 0:1dee22d82bd2 165 * @param i2c - A reference to an initialized I2C object
marcel1691 0:1dee22d82bd2 166 * @param RST - The Reset pin name
marcel1691 0:1dee22d82bd2 167 *
marcel1691 0:1dee22d82bd2 168 * Optional parameters
marcel1691 0:1dee22d82bd2 169 * @param i2cAddress - The i2c address of the display
marcel1691 0:1dee22d82bd2 170 * @param rawHeight - The vertical number of pixels for the display, defaults to 32
marcel1691 0:1dee22d82bd2 171 * @param rawWidth - The horizonal number of pixels for the display, defaults to 128
marcel1691 0:1dee22d82bd2 172 */
marcel1691 0:1dee22d82bd2 173 Adafruit_SSD1306_I2c(I2C &i2c, PinName RST, uint8_t i2cAddress = SSD_I2C_ADDRESS, uint8_t rawHeight = 32, uint8_t rawWidth = 128)
marcel1691 0:1dee22d82bd2 174 : Adafruit_SSD1306(RST, rawHeight, rawWidth)
marcel1691 0:1dee22d82bd2 175 , mi2c(i2c)
marcel1691 0:1dee22d82bd2 176 , mi2cAddress(i2cAddress)
marcel1691 0:1dee22d82bd2 177 {
marcel1691 0:1dee22d82bd2 178 begin();
marcel1691 0:1dee22d82bd2 179 splash();
marcel1691 0:1dee22d82bd2 180 display();
marcel1691 0:1dee22d82bd2 181 };
marcel1691 0:1dee22d82bd2 182
marcel1691 0:1dee22d82bd2 183 virtual void command(uint8_t c)
marcel1691 0:1dee22d82bd2 184 {
marcel1691 0:1dee22d82bd2 185 char buff[2];
marcel1691 0:1dee22d82bd2 186 buff[0] = 0; // Command Mode
marcel1691 0:1dee22d82bd2 187 buff[1] = c;
marcel1691 0:1dee22d82bd2 188 mi2c.write(mi2cAddress, buff, sizeof(buff));
marcel1691 0:1dee22d82bd2 189 }
marcel1691 0:1dee22d82bd2 190
marcel1691 0:1dee22d82bd2 191 virtual void data(uint8_t c)
marcel1691 0:1dee22d82bd2 192 {
marcel1691 0:1dee22d82bd2 193 char buff[2];
marcel1691 0:1dee22d82bd2 194 buff[0] = 0x40; // Data Mode
marcel1691 0:1dee22d82bd2 195 buff[1] = c;
marcel1691 0:1dee22d82bd2 196 mi2c.write(mi2cAddress, buff, sizeof(buff));
marcel1691 0:1dee22d82bd2 197 };
marcel1691 0:1dee22d82bd2 198
marcel1691 0:1dee22d82bd2 199 protected:
marcel1691 0:1dee22d82bd2 200 virtual void sendDisplayBuffer()
marcel1691 0:1dee22d82bd2 201 {
marcel1691 0:1dee22d82bd2 202 char buff[17];
marcel1691 0:1dee22d82bd2 203 buff[0] = 0x40; // Data Mode
marcel1691 0:1dee22d82bd2 204
marcel1691 0:1dee22d82bd2 205 // send display buffer in 16 byte chunks
marcel1691 0:1dee22d82bd2 206 for(uint16_t i=0, q=buffer.size(); i<q; i+=16 )
marcel1691 0:1dee22d82bd2 207 { uint8_t x ;
marcel1691 0:1dee22d82bd2 208
marcel1691 0:1dee22d82bd2 209 // TODO - this will segfault if buffer.size() % 16 != 0
marcel1691 0:1dee22d82bd2 210 for(x=1; x<sizeof(buff); x++)
marcel1691 0:1dee22d82bd2 211 buff[x] = buffer[i+x-1];
marcel1691 0:1dee22d82bd2 212 mi2c.write(mi2cAddress, buff, sizeof(buff));
marcel1691 0:1dee22d82bd2 213 }
marcel1691 0:1dee22d82bd2 214 };
marcel1691 0:1dee22d82bd2 215
marcel1691 0:1dee22d82bd2 216 I2C &mi2c;
marcel1691 0:1dee22d82bd2 217 uint8_t mi2cAddress;
marcel1691 0:1dee22d82bd2 218 };
marcel1691 0:1dee22d82bd2 219
marcel1691 0:1dee22d82bd2 220 #endif