Library for Modtronix im4OLED board with 128x64 OLED and 4 buttons. For details, see product page http://modtronix.com/im4oled.html. Is a clone of Adafruit_GFX library, with some additional code added.

Fork of Adafruit_GFX by Neal Horman

Committer:
modtronix-com
Date:
Fri Aug 19 15:44:25 2016 +1000
Revision:
27:dd7d538d3849
Parent:
26:ef08580c35df
Added tag v1.1 for changeset ef08580c35df

Who changed what in which revision?

UserRevisionLine numberNew contents of line
modtronix-com 22:f63aeb3769b5 1 /*********************************************************************
modtronix-com 22:f63aeb3769b5 2 This is a library for our Monochrome OLEDs based on SSD1306 drivers
modtronix-com 22:f63aeb3769b5 3
modtronix-com 22:f63aeb3769b5 4 Pick one up today in the adafruit shop!
modtronix-com 22:f63aeb3769b5 5 ------> http://www.adafruit.com/category/63_98
modtronix-com 22:f63aeb3769b5 6
modtronix-com 22:f63aeb3769b5 7 These displays use SPI to communicate, 4 or 5 pins are required to
modtronix-com 22:f63aeb3769b5 8 interface
modtronix-com 22:f63aeb3769b5 9
modtronix-com 22:f63aeb3769b5 10 Adafruit invests time and resources providing this open source code,
modtronix-com 22:f63aeb3769b5 11 please support Adafruit and open-source hardware by purchasing
modtronix-com 22:f63aeb3769b5 12 products from Adafruit!
modtronix-com 22:f63aeb3769b5 13
modtronix-com 22:f63aeb3769b5 14 Written by Limor Fried/Ladyada for Adafruit Industries.
modtronix-com 22:f63aeb3769b5 15 BSD license, check license.txt for more information
modtronix-com 22:f63aeb3769b5 16 All text above, and the splash screen must be included in any redistribution
modtronix-com 22:f63aeb3769b5 17 *********************************************************************/
modtronix-com 22:f63aeb3769b5 18
modtronix-com 22:f63aeb3769b5 19 /*
modtronix-com 22:f63aeb3769b5 20 * Modified by Neal Horman 7/14/2012 for use in mbed
modtronix-com 22:f63aeb3769b5 21 */
modtronix-com 22:f63aeb3769b5 22
modtronix-com 22:f63aeb3769b5 23 #ifndef _ADAFRUIT_SSD1306_H_
modtronix-com 22:f63aeb3769b5 24 #define _ADAFRUIT_SSD1306_H_
modtronix-com 26:ef08580c35df 25 #include "im4oled_default_config.h"
modtronix-com 22:f63aeb3769b5 26 #include "mx_gfx.h"
modtronix-com 22:f63aeb3769b5 27
modtronix-com 23:44309099c532 28 #if (OLED_USE_VECTOR==1)
modtronix-com 22:f63aeb3769b5 29 #include <vector>
modtronix-com 22:f63aeb3769b5 30 #endif
modtronix-com 22:f63aeb3769b5 31 #include <algorithm>
modtronix-com 22:f63aeb3769b5 32
modtronix-com 22:f63aeb3769b5 33 #define OLED_HAS_RESET 0
modtronix-com 22:f63aeb3769b5 34
modtronix-com 22:f63aeb3769b5 35 // A DigitalOut sub-class that provides a constructed default state
modtronix-com 22:f63aeb3769b5 36 class DigitalOut2 : public DigitalOut
modtronix-com 22:f63aeb3769b5 37 {
modtronix-com 22:f63aeb3769b5 38 public:
modtronix-com 22:f63aeb3769b5 39 DigitalOut2(PinName pin, bool active = false) : DigitalOut(pin) { write(active); };
modtronix-com 22:f63aeb3769b5 40 DigitalOut2& operator= (int value) { write(value); return *this; };
modtronix-com 22:f63aeb3769b5 41 DigitalOut2& operator= (DigitalOut2& rhs) { write(rhs.read()); return *this; };
modtronix-com 22:f63aeb3769b5 42 operator int() { return read(); };
modtronix-com 22:f63aeb3769b5 43 };
modtronix-com 22:f63aeb3769b5 44
modtronix-com 22:f63aeb3769b5 45 #define SSD1306_EXTERNALVCC 0x1
modtronix-com 22:f63aeb3769b5 46 #define SSD1306_SWITCHCAPVCC 0x2
modtronix-com 22:f63aeb3769b5 47
modtronix-com 22:f63aeb3769b5 48 /** The pure base class for the SSD1306 display driver.
modtronix-com 22:f63aeb3769b5 49 *
modtronix-com 22:f63aeb3769b5 50 * You should derive from this for a new transport interface type,
modtronix-com 22:f63aeb3769b5 51 * such as the SPI and I2C drivers.
modtronix-com 22:f63aeb3769b5 52 */
modtronix-com 22:f63aeb3769b5 53 class MxSSD1306 : public MxGfx
modtronix-com 22:f63aeb3769b5 54 {
modtronix-com 22:f63aeb3769b5 55 public:
modtronix-com 22:f63aeb3769b5 56 #if (OLED_HAS_RESET==1)
modtronix-com 22:f63aeb3769b5 57 MxSSD1306(PinName RST, uint8_t rawHeight = 32, uint8_t rawWidth = 128)
modtronix-com 22:f63aeb3769b5 58 : MxGfx(rawWidth,rawHeight)
modtronix-com 22:f63aeb3769b5 59 , colBlock(0)
modtronix-com 22:f63aeb3769b5 60 , rowBlock(0)
modtronix-com 22:f63aeb3769b5 61 , rst(RST,false)
modtronix-com 22:f63aeb3769b5 62 #else
modtronix-com 22:f63aeb3769b5 63 MxSSD1306(uint8_t rawHeight = 32, uint8_t rawWidth = 128)
modtronix-com 22:f63aeb3769b5 64 : MxGfx(rawWidth,rawHeight)
modtronix-com 22:f63aeb3769b5 65 , colBlock(0)
modtronix-com 22:f63aeb3769b5 66 , rowBlock(0)
modtronix-com 22:f63aeb3769b5 67 #endif
modtronix-com 22:f63aeb3769b5 68 {
modtronix-com 22:f63aeb3769b5 69 //Initialize as all dirty
modtronix-com 22:f63aeb3769b5 70 memset(&dirty[0], 0xff, sizeof(dirty));
modtronix-com 22:f63aeb3769b5 71
modtronix-com 23:44309099c532 72 #if (OLED_USE_VECTOR==0)
modtronix-com 22:f63aeb3769b5 73 memset(&buffer[0], 0, sizeof(buffer));
modtronix-com 22:f63aeb3769b5 74 #else
modtronix-com 22:f63aeb3769b5 75 buffer.resize(rawHeight * rawWidth / 8);
modtronix-com 22:f63aeb3769b5 76 #endif
modtronix-com 22:f63aeb3769b5 77 };
modtronix-com 22:f63aeb3769b5 78
modtronix-com 22:f63aeb3769b5 79 /** Initialize
modtronix-com 22:f63aeb3769b5 80 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 81 */
modtronix-com 22:f63aeb3769b5 82 uint8_t begin(uint8_t switchvcc = SSD1306_SWITCHCAPVCC);
modtronix-com 22:f63aeb3769b5 83
modtronix-com 22:f63aeb3769b5 84 // These must be implemented in the derived transport driver
modtronix-com 22:f63aeb3769b5 85 virtual uint8_t command(uint8_t c) = 0;
modtronix-com 22:f63aeb3769b5 86 virtual uint8_t data(uint8_t c) = 0;
modtronix-com 22:f63aeb3769b5 87 virtual void drawPixel(int16_t x, int16_t y, uint16_t color);
modtronix-com 22:f63aeb3769b5 88
modtronix-com 22:f63aeb3769b5 89 /**
modtronix-com 22:f63aeb3769b5 90 * Clear the display buffer. Requires a display() call at some point afterwards.
modtronix-com 22:f63aeb3769b5 91 * NOTE that this function will make the WHOLE display as dirty! The next display() call will update the
modtronix-com 22:f63aeb3769b5 92 * entire display! This can be prevented by just clearing the required part of the display using fillRect()!
modtronix-com 22:f63aeb3769b5 93 */
modtronix-com 22:f63aeb3769b5 94 void clearDisplay(void);
modtronix-com 22:f63aeb3769b5 95
modtronix-com 22:f63aeb3769b5 96 /** Set display contrast
modtronix-com 22:f63aeb3769b5 97 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 98 */
modtronix-com 22:f63aeb3769b5 99 virtual uint8_t setContrast(uint8_t contrast);
modtronix-com 22:f63aeb3769b5 100
modtronix-com 22:f63aeb3769b5 101 /** Turn display on or off
modtronix-com 22:f63aeb3769b5 102 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 103 */
modtronix-com 22:f63aeb3769b5 104 virtual uint8_t displayOn(bool on);
modtronix-com 22:f63aeb3769b5 105
modtronix-com 22:f63aeb3769b5 106 /** Invert Display
modtronix-com 22:f63aeb3769b5 107 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 108 */
modtronix-com 22:f63aeb3769b5 109 virtual uint8_t invertDisplay(bool i);
modtronix-com 22:f63aeb3769b5 110
modtronix-com 22:f63aeb3769b5 111 /** Cause the display to be updated with the buffer content.
modtronix-com 22:f63aeb3769b5 112 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 113 */
modtronix-com 22:f63aeb3769b5 114 uint8_t display();
modtronix-com 22:f63aeb3769b5 115
modtronix-com 22:f63aeb3769b5 116 // Fill the buffer with the AdaFruit splash screen.
modtronix-com 22:f63aeb3769b5 117 virtual void splash();
modtronix-com 22:f63aeb3769b5 118
modtronix-com 22:f63aeb3769b5 119 protected:
modtronix-com 22:f63aeb3769b5 120 /** Write contents of display buffer to OLED display.
modtronix-com 22:f63aeb3769b5 121 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 122 */
modtronix-com 22:f63aeb3769b5 123 virtual uint8_t sendDisplayBuffer() = 0;
modtronix-com 22:f63aeb3769b5 124
modtronix-com 22:f63aeb3769b5 125 /** Write a block of display data. The 128x64 pixels are divided into:
modtronix-com 22:f63aeb3769b5 126 * - 8 RowBlocks, each with 8 rows. This is 1 page of the SSD1206
modtronix-com 22:f63aeb3769b5 127 * - 8 ColBlocks, each with 16 columns.
modtronix-com 22:f63aeb3769b5 128 *
modtronix-com 22:f63aeb3769b5 129 * @param rowBlock Value 0-7 indicating what block of 8 rows to write. 0=0-7,
modtronix-com 22:f63aeb3769b5 130 * 1=8-15, ...., 7=56-63
modtronix-com 22:f63aeb3769b5 131 * @param colBlock Value 0-7 indicating what block of 16 columns to write. 0=0-15,
modtronix-com 22:f63aeb3769b5 132 * 1=16-31, ...., 7=112-127
modtronix-com 22:f63aeb3769b5 133 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 134 */
modtronix-com 22:f63aeb3769b5 135 virtual uint8_t sendDisplayBuffer(uint8_t rowBlock, uint8_t colBlock) = 0;
modtronix-com 22:f63aeb3769b5 136
modtronix-com 22:f63aeb3769b5 137 public:
modtronix-com 22:f63aeb3769b5 138 // Set whole display as being dirty
modtronix-com 22:f63aeb3769b5 139 virtual void setAllDirty();
modtronix-com 22:f63aeb3769b5 140
modtronix-com 22:f63aeb3769b5 141 // Protected Data
modtronix-com 22:f63aeb3769b5 142 protected:
modtronix-com 22:f63aeb3769b5 143 uint8_t colBlock, rowBlock;
modtronix-com 22:f63aeb3769b5 144
modtronix-com 22:f63aeb3769b5 145 #if (OLED_WIDTH <= 128 )
modtronix-com 22:f63aeb3769b5 146 uint8_t dirty[OLED_HEIGHT/8]; //Each bit marks block of "8 Rows x 16 Columns". So, a single byte is enough for up to 128col. One byte for each 8 rows.
modtronix-com 22:f63aeb3769b5 147 #elif (OLED_WIDTH <= 256 )
modtronix-com 22:f63aeb3769b5 148 uint16_t dirty[OLED_HEIGHT/8]; //Each bit marks block of "8 Rows x 16 Columns". One UINT16 = 16x16 = 256 columns.
modtronix-com 22:f63aeb3769b5 149 #endif
modtronix-com 22:f63aeb3769b5 150
modtronix-com 22:f63aeb3769b5 151 #if (OLED_HAS_RESET==1)
modtronix-com 22:f63aeb3769b5 152 DigitalOut2 rst;
modtronix-com 22:f63aeb3769b5 153 #endif
modtronix-com 22:f63aeb3769b5 154
modtronix-com 22:f63aeb3769b5 155 // the memory buffer for the LCD
modtronix-com 23:44309099c532 156 #if (OLED_USE_VECTOR==1)
modtronix-com 23:44309099c532 157 std::vector<uint8_t> buffer;
modtronix-com 22:f63aeb3769b5 158 #else
modtronix-com 23:44309099c532 159 uint8_t buffer[OLED_HEIGHT * OLED_WIDTH / 8];
modtronix-com 22:f63aeb3769b5 160 #endif
modtronix-com 22:f63aeb3769b5 161 };
modtronix-com 22:f63aeb3769b5 162
modtronix-com 22:f63aeb3769b5 163
modtronix-com 22:f63aeb3769b5 164 /** This is the SPI SSD1306 display driver transport class
modtronix-com 22:f63aeb3769b5 165 *
modtronix-com 22:f63aeb3769b5 166 */
modtronix-com 22:f63aeb3769b5 167 class MxSSD1306_SPI : public MxSSD1306
modtronix-com 22:f63aeb3769b5 168 {
modtronix-com 22:f63aeb3769b5 169 public:
modtronix-com 22:f63aeb3769b5 170 /** Create a SSD1306 SPI transport display driver instance with the specified DC, RST, and CS pins, as well as the display dimentions
modtronix-com 22:f63aeb3769b5 171 *
modtronix-com 22:f63aeb3769b5 172 * Required parameters
modtronix-com 22:f63aeb3769b5 173 * @param spi - a reference to an initialized SPI object
modtronix-com 22:f63aeb3769b5 174 * @param DC (Data/Command) pin name
modtronix-com 22:f63aeb3769b5 175 * @param RST (Reset) pin name
modtronix-com 22:f63aeb3769b5 176 * @param CS (Chip Select) pin name
modtronix-com 22:f63aeb3769b5 177 *
modtronix-com 22:f63aeb3769b5 178 * Optional parameters
modtronix-com 22:f63aeb3769b5 179 * @param rawHeight - the vertical number of pixels for the display, defaults to 32
modtronix-com 22:f63aeb3769b5 180 * @param rawWidth - the horizonal number of pixels for the display, defaults to 128
modtronix-com 22:f63aeb3769b5 181 */
modtronix-com 22:f63aeb3769b5 182 #if (OLED_HAS_RESET==1)
modtronix-com 22:f63aeb3769b5 183 MxSSD1306_SPI(SPI &spi, PinName DC, PinName RST, PinName CS, uint8_t rawHieght = 32, uint8_t rawWidth = 128)
modtronix-com 22:f63aeb3769b5 184 : MxSSD1306(RST, rawHieght, rawWidth)
modtronix-com 22:f63aeb3769b5 185 #else
modtronix-com 22:f63aeb3769b5 186 MxSSD1306_SPI(SPI &spi, PinName DC, PinName CS, uint8_t rawHieght = 32, uint8_t rawWidth = 128)
modtronix-com 22:f63aeb3769b5 187 : MxSSD1306(rawHieght, rawWidth)
modtronix-com 22:f63aeb3769b5 188 #endif
modtronix-com 22:f63aeb3769b5 189 , cs(CS,true)
modtronix-com 22:f63aeb3769b5 190 , dc(DC,false)
modtronix-com 22:f63aeb3769b5 191 , mspi(spi)
modtronix-com 22:f63aeb3769b5 192 {
modtronix-com 22:f63aeb3769b5 193 begin();
modtronix-com 22:f63aeb3769b5 194 splash();
modtronix-com 22:f63aeb3769b5 195 display();
modtronix-com 22:f63aeb3769b5 196 };
modtronix-com 22:f63aeb3769b5 197
modtronix-com 22:f63aeb3769b5 198 /** Send command via SPI
modtronix-com 22:f63aeb3769b5 199 * @param c The command to send
modtronix-com 22:f63aeb3769b5 200 * @return 0 if success, else SPI error
modtronix-com 22:f63aeb3769b5 201 */
modtronix-com 22:f63aeb3769b5 202 virtual uint8_t command(uint8_t c)
modtronix-com 22:f63aeb3769b5 203 {
modtronix-com 22:f63aeb3769b5 204 cs = 1;
modtronix-com 22:f63aeb3769b5 205 dc = 0;
modtronix-com 22:f63aeb3769b5 206 cs = 0;
modtronix-com 22:f63aeb3769b5 207 mspi.write(c);
modtronix-com 22:f63aeb3769b5 208 cs = 1;
modtronix-com 22:f63aeb3769b5 209 return 0;
modtronix-com 22:f63aeb3769b5 210 };
modtronix-com 22:f63aeb3769b5 211
modtronix-com 22:f63aeb3769b5 212 /** Send Data via SPI
modtronix-com 22:f63aeb3769b5 213 * @param c The data to send
modtronix-com 22:f63aeb3769b5 214 * @return 0 if success, else SPI error
modtronix-com 22:f63aeb3769b5 215 */
modtronix-com 22:f63aeb3769b5 216 virtual uint8_t data(uint8_t c)
modtronix-com 22:f63aeb3769b5 217 {
modtronix-com 22:f63aeb3769b5 218 cs = 1;
modtronix-com 22:f63aeb3769b5 219 dc = 1;
modtronix-com 22:f63aeb3769b5 220 cs = 0;
modtronix-com 22:f63aeb3769b5 221 mspi.write(c);
modtronix-com 22:f63aeb3769b5 222 cs = 1;
modtronix-com 22:f63aeb3769b5 223 return 0;
modtronix-com 22:f63aeb3769b5 224 };
modtronix-com 22:f63aeb3769b5 225
modtronix-com 22:f63aeb3769b5 226 protected:
modtronix-com 22:f63aeb3769b5 227 virtual uint8_t sendDisplayBuffer()
modtronix-com 22:f63aeb3769b5 228 {
modtronix-com 22:f63aeb3769b5 229 uint8_t retVal;
modtronix-com 22:f63aeb3769b5 230 cs = 1;
modtronix-com 22:f63aeb3769b5 231 dc = 1;
modtronix-com 22:f63aeb3769b5 232 cs = 0;
modtronix-com 22:f63aeb3769b5 233
modtronix-com 23:44309099c532 234 #if (OLED_USE_VECTOR==0)
modtronix-com 22:f63aeb3769b5 235 for(uint16_t i=0, q=sizeof(buffer); i<q; i++) {
modtronix-com 22:f63aeb3769b5 236 #else
modtronix-com 22:f63aeb3769b5 237 for(uint16_t i=0, q=buffer.size(); i<q; i++) {
modtronix-com 22:f63aeb3769b5 238 #endif
modtronix-com 22:f63aeb3769b5 239 if((retVal=mspi.write(buffer[i])) != 0) {
modtronix-com 22:f63aeb3769b5 240 cs = 1;
modtronix-com 22:f63aeb3769b5 241 return retVal;
modtronix-com 22:f63aeb3769b5 242 }
modtronix-com 22:f63aeb3769b5 243 }
modtronix-com 22:f63aeb3769b5 244
modtronix-com 22:f63aeb3769b5 245 if(height() == 32)
modtronix-com 22:f63aeb3769b5 246 {
modtronix-com 23:44309099c532 247 #if (OLED_USE_VECTOR==0)
modtronix-com 22:f63aeb3769b5 248 for(uint16_t i=0, q=sizeof(buffer); i<q; i++) {
modtronix-com 22:f63aeb3769b5 249 #else
modtronix-com 22:f63aeb3769b5 250 for(uint16_t i=0, q=buffer.size(); i<q; i++) {
modtronix-com 22:f63aeb3769b5 251 #endif
modtronix-com 22:f63aeb3769b5 252 if((retVal=mspi.write(0)) != 0) {
modtronix-com 22:f63aeb3769b5 253 cs = 1;
modtronix-com 22:f63aeb3769b5 254 return retVal;
modtronix-com 22:f63aeb3769b5 255 }
modtronix-com 22:f63aeb3769b5 256 }
modtronix-com 22:f63aeb3769b5 257 }
modtronix-com 22:f63aeb3769b5 258
modtronix-com 22:f63aeb3769b5 259 cs = 1;
modtronix-com 22:f63aeb3769b5 260 return 0;
modtronix-com 22:f63aeb3769b5 261 };
modtronix-com 22:f63aeb3769b5 262
modtronix-com 22:f63aeb3769b5 263 DigitalOut2 cs, dc;
modtronix-com 22:f63aeb3769b5 264 SPI &mspi;
modtronix-com 22:f63aeb3769b5 265 };
modtronix-com 22:f63aeb3769b5 266
modtronix-com 22:f63aeb3769b5 267 /** This is the I2C SSD1306 display driver transport class
modtronix-com 22:f63aeb3769b5 268 *
modtronix-com 22:f63aeb3769b5 269 */
modtronix-com 22:f63aeb3769b5 270 class MxSSD1306_I2C : public MxSSD1306
modtronix-com 22:f63aeb3769b5 271 {
modtronix-com 22:f63aeb3769b5 272 public:
modtronix-com 22:f63aeb3769b5 273 #define SSD_I2C_ADDRESS 0x78
modtronix-com 22:f63aeb3769b5 274 /** Create a SSD1306 I2C transport display driver instance with the specified RST pin name, the I2C address, as well as the display dimensions
modtronix-com 22:f63aeb3769b5 275 *
modtronix-com 22:f63aeb3769b5 276 * Required parameters
modtronix-com 22:f63aeb3769b5 277 * @param i2c - A reference to an initialized I2C object
modtronix-com 22:f63aeb3769b5 278 * @param RST - The Reset pin name
modtronix-com 22:f63aeb3769b5 279 *
modtronix-com 22:f63aeb3769b5 280 * Optional parameters
modtronix-com 22:f63aeb3769b5 281 * @param i2cAddress - The i2c address of the display
modtronix-com 22:f63aeb3769b5 282 * @param rawHeight - The vertical number of pixels for the display, defaults to 32
modtronix-com 22:f63aeb3769b5 283 * @param rawWidth - The horizonal number of pixels for the display, defaults to 128
modtronix-com 22:f63aeb3769b5 284 */
modtronix-com 22:f63aeb3769b5 285 #if (OLED_HAS_RESET==1)
modtronix-com 22:f63aeb3769b5 286 Adafruit_SSD1306_I2c(I2C &i2c, PinName RST, uint8_t i2cAddress = SSD_I2C_ADDRESS, uint8_t rawHeight = 32, uint8_t rawWidth = 128)
modtronix-com 22:f63aeb3769b5 287 : MxSSD1306(RST, rawHeight, rawWidth)
modtronix-com 22:f63aeb3769b5 288 #else
modtronix-com 22:f63aeb3769b5 289 MxSSD1306_I2C(I2C &i2c, uint8_t i2cAddress = SSD_I2C_ADDRESS, uint8_t rawHeight = 32, uint8_t rawWidth = 128)
modtronix-com 22:f63aeb3769b5 290 : MxSSD1306(rawHeight, rawWidth)
modtronix-com 22:f63aeb3769b5 291 #endif
modtronix-com 22:f63aeb3769b5 292 , mi2c(i2c)
modtronix-com 22:f63aeb3769b5 293 , mi2cAddress(i2cAddress)
modtronix-com 22:f63aeb3769b5 294 {
modtronix-com 22:f63aeb3769b5 295 begin();
modtronix-com 22:f63aeb3769b5 296 splash();
modtronix-com 22:f63aeb3769b5 297 display();
modtronix-com 22:f63aeb3769b5 298 };
modtronix-com 22:f63aeb3769b5 299
modtronix-com 22:f63aeb3769b5 300
modtronix-com 22:f63aeb3769b5 301 /**Constructor without doing any initialization requiring I2C object. Use this constructor if the I2C object must still be
modtronix-com 22:f63aeb3769b5 302 * initialized, or used after startup delay.
modtronix-com 22:f63aeb3769b5 303 * !!!!! IMPORTANT !!!!!
modtronix-com 22:f63aeb3769b5 304 * This constructor must be followed by calling the init() function BEFORE using any other functions!
modtronix-com 22:f63aeb3769b5 305 *
modtronix-com 22:f63aeb3769b5 306 * Required parameters
modtronix-com 22:f63aeb3769b5 307 * @param i2cAddress - The i2c address of the display
modtronix-com 22:f63aeb3769b5 308 * @param i2c - A reference to an initialized I2C object
modtronix-com 22:f63aeb3769b5 309 *
modtronix-com 22:f63aeb3769b5 310 * Optional parameters
modtronix-com 22:f63aeb3769b5 311 * @param rawHeight - The vertical number of pixels for the display, defaults to 32
modtronix-com 22:f63aeb3769b5 312 * @param rawWidth - The horizonal number of pixels for the display, defaults to 128
modtronix-com 22:f63aeb3769b5 313 */
modtronix-com 22:f63aeb3769b5 314 MxSSD1306_I2C(uint8_t i2cAddress, I2C &i2c, uint8_t rawHeight = 32, uint8_t rawWidth = 128)
modtronix-com 22:f63aeb3769b5 315 : MxSSD1306(rawHeight, rawWidth), mi2c(i2c), mi2cAddress(i2cAddress)
modtronix-com 22:f63aeb3769b5 316 {
modtronix-com 22:f63aeb3769b5 317 };
modtronix-com 22:f63aeb3769b5 318
modtronix-com 22:f63aeb3769b5 319
modtronix-com 22:f63aeb3769b5 320 /**
modtronix-com 22:f63aeb3769b5 321 * Initialize with given I2C bus.
modtronix-com 22:f63aeb3769b5 322 * !!!!! IMPORTANT !!!!!
modtronix-com 22:f63aeb3769b5 323 * This function must be called after the Adafruit_SSD1306_I2c(rawHeight, rawWidth) constructor!
modtronix-com 22:f63aeb3769b5 324 *
modtronix-com 22:f63aeb3769b5 325 * @param i2c I2C Bus to use
modtronix-com 22:f63aeb3769b5 326 * @return 0 if OK, else error code
modtronix-com 22:f63aeb3769b5 327 */
modtronix-com 22:f63aeb3769b5 328 uint8_t init()
modtronix-com 22:f63aeb3769b5 329 {
modtronix-com 22:f63aeb3769b5 330 uint8_t retVal;
modtronix-com 22:f63aeb3769b5 331 if((retVal=begin()) != 0) {
modtronix-com 22:f63aeb3769b5 332 return retVal; //Return error code
modtronix-com 22:f63aeb3769b5 333 }
modtronix-com 22:f63aeb3769b5 334
modtronix-com 22:f63aeb3769b5 335 //splash();
modtronix-com 22:f63aeb3769b5 336 if((retVal=display()) != 0) {
modtronix-com 22:f63aeb3769b5 337 return retVal; //Return error code
modtronix-com 22:f63aeb3769b5 338 }
modtronix-com 22:f63aeb3769b5 339 return 0;
modtronix-com 22:f63aeb3769b5 340 }
modtronix-com 22:f63aeb3769b5 341
modtronix-com 22:f63aeb3769b5 342 /** Send command via I2C
modtronix-com 22:f63aeb3769b5 343 * @param c The command to send
modtronix-com 22:f63aeb3769b5 344 * @return 0 if success, else I2C error
modtronix-com 22:f63aeb3769b5 345 */
modtronix-com 22:f63aeb3769b5 346 virtual uint8_t command(uint8_t c)
modtronix-com 22:f63aeb3769b5 347 {
modtronix-com 22:f63aeb3769b5 348 char buff[2];
modtronix-com 22:f63aeb3769b5 349 buff[0] = 0; // Command Mode
modtronix-com 22:f63aeb3769b5 350 buff[1] = c;
modtronix-com 22:f63aeb3769b5 351 return mi2c.write(mi2cAddress, buff, sizeof(buff));
modtronix-com 22:f63aeb3769b5 352 }
modtronix-com 22:f63aeb3769b5 353
modtronix-com 22:f63aeb3769b5 354 /** Send Data via I2C
modtronix-com 22:f63aeb3769b5 355 * @param c The data to send
modtronix-com 22:f63aeb3769b5 356 * @return 0 if success, else I2C error
modtronix-com 22:f63aeb3769b5 357 */
modtronix-com 22:f63aeb3769b5 358 virtual uint8_t data(uint8_t c)
modtronix-com 22:f63aeb3769b5 359 {
modtronix-com 22:f63aeb3769b5 360 char buff[2];
modtronix-com 22:f63aeb3769b5 361 buff[0] = 0x40; // Data Mode
modtronix-com 22:f63aeb3769b5 362 buff[1] = c;
modtronix-com 22:f63aeb3769b5 363 return mi2c.write(mi2cAddress, buff, sizeof(buff));
modtronix-com 22:f63aeb3769b5 364 };
modtronix-com 22:f63aeb3769b5 365
modtronix-com 22:f63aeb3769b5 366 protected:
modtronix-com 22:f63aeb3769b5 367 virtual uint8_t sendDisplayBuffer()
modtronix-com 22:f63aeb3769b5 368 {
modtronix-com 22:f63aeb3769b5 369 char buff[17];
modtronix-com 22:f63aeb3769b5 370 buff[0] = 0x40; // Data Mode
modtronix-com 22:f63aeb3769b5 371
modtronix-com 22:f63aeb3769b5 372 // send display buffer in 16 byte chunks
modtronix-com 23:44309099c532 373 #if (OLED_USE_VECTOR==0)
modtronix-com 22:f63aeb3769b5 374 for(uint16_t i=0, q=sizeof(buffer); i<q; i+=16 ) {
modtronix-com 22:f63aeb3769b5 375 #else
modtronix-com 22:f63aeb3769b5 376 for(uint16_t i=0, q=buffer.size(); i<q; i+=16 ) {
modtronix-com 22:f63aeb3769b5 377 #endif
modtronix-com 22:f63aeb3769b5 378 uint8_t retVal;
modtronix-com 22:f63aeb3769b5 379 uint8_t x;
modtronix-com 22:f63aeb3769b5 380
modtronix-com 22:f63aeb3769b5 381 for(x=1; x<sizeof(buff); x++) {
modtronix-com 22:f63aeb3769b5 382 buff[x] = buffer[i+x-1];
modtronix-com 22:f63aeb3769b5 383 }
modtronix-com 22:f63aeb3769b5 384
modtronix-com 22:f63aeb3769b5 385 if((retVal=mi2c.write(mi2cAddress, buff, sizeof(buff))) != 0) {
modtronix-com 22:f63aeb3769b5 386 return retVal; //Return error code
modtronix-com 22:f63aeb3769b5 387 }
modtronix-com 22:f63aeb3769b5 388 }
modtronix-com 22:f63aeb3769b5 389 return 0;
modtronix-com 22:f63aeb3769b5 390 };
modtronix-com 22:f63aeb3769b5 391
modtronix-com 22:f63aeb3769b5 392 /** Write a block of display data. The 128x64 pixels are divided into:
modtronix-com 22:f63aeb3769b5 393 * - 8 RowBlocks, each with 8 rows. This is 1 page of the SSD1206
modtronix-com 22:f63aeb3769b5 394 * - 8 ColBlocks, each with 16 columns.
modtronix-com 22:f63aeb3769b5 395 *
modtronix-com 22:f63aeb3769b5 396 * @param rowBlock Value 0-7 indicating what block of 8 rows to write. 0=0-7,
modtronix-com 22:f63aeb3769b5 397 * 1=8-15, ...., 7=56-63
modtronix-com 22:f63aeb3769b5 398 * @param colBlock Value 0-7 indicating what block of 16 columns to write. 0=0-15,
modtronix-com 22:f63aeb3769b5 399 * 1=16-31, ...., 7=112-127
modtronix-com 22:f63aeb3769b5 400 * @return 0 if success, else I2C or SPI error code
modtronix-com 22:f63aeb3769b5 401 */
modtronix-com 22:f63aeb3769b5 402 uint8_t sendDisplayBuffer(uint8_t rowBlock, uint8_t colBlock) {
modtronix-com 22:f63aeb3769b5 403 uint8_t retVal;
modtronix-com 22:f63aeb3769b5 404 int idxBuffer;
modtronix-com 22:f63aeb3769b5 405 char buff[17];
modtronix-com 22:f63aeb3769b5 406
modtronix-com 22:f63aeb3769b5 407 buff[0] = 0x40; // Data Mode
modtronix-com 22:f63aeb3769b5 408
modtronix-com 22:f63aeb3769b5 409 //Each byte of buffer contains 8pixels for single column, and 8 rows. For example:
modtronix-com 22:f63aeb3769b5 410 //buffer[0] contains row 0-7 for column 0
modtronix-com 22:f63aeb3769b5 411 //buffer[1] contains row 0-7 for column 1
modtronix-com 22:f63aeb3769b5 412 idxBuffer = (rowBlock*128) + (colBlock*16);
modtronix-com 22:f63aeb3769b5 413
modtronix-com 22:f63aeb3769b5 414 // Copy requested "row block" and "column block"
modtronix-com 22:f63aeb3769b5 415 for(uint16_t i=0; i<16; i++) {
modtronix-com 22:f63aeb3769b5 416 buff[i+1] = buffer[idxBuffer+i];
modtronix-com 22:f63aeb3769b5 417 }
modtronix-com 22:f63aeb3769b5 418
modtronix-com 22:f63aeb3769b5 419 //Write all display data
modtronix-com 22:f63aeb3769b5 420 if((retVal=mi2c.write(mi2cAddress, buff, 17)) != 0) {
modtronix-com 22:f63aeb3769b5 421 return retVal; //Return error code
modtronix-com 22:f63aeb3769b5 422 }
modtronix-com 22:f63aeb3769b5 423
modtronix-com 22:f63aeb3769b5 424 return 0;
modtronix-com 22:f63aeb3769b5 425 }
modtronix-com 22:f63aeb3769b5 426
modtronix-com 22:f63aeb3769b5 427 I2C &mi2c;
modtronix-com 22:f63aeb3769b5 428 uint8_t mi2cAddress;
modtronix-com 22:f63aeb3769b5 429 };
modtronix-com 22:f63aeb3769b5 430
modtronix-com 22:f63aeb3769b5 431 #endif