Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Adafruit_GFX by
mx_ssd1306.h@27:dd7d538d3849, 2016-08-19 (annotated)
- 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?
| User | Revision | Line number | New 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 |
