Fork of Adafruit OLED driver to debug integration with RedBear Nano SPI driver

Dependents:   SPI_GFX_nano

Fork of Adafruit_GFX by Neal Horman

Committer:
tsh
Date:
Thu Feb 26 11:27:37 2015 +0000
Revision:
22:6fc21acc8311
Parent:
21:c7e6b6d6e296
Constructor only calls begin, doesn't perform any SPI transfers

Who changed what in which revision?

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