vit petrik / Mbed 2 deprecated OLEDMag

Dependencies:   mbed

Committer:
vitpetrik
Date:
Thu Apr 21 13:19:41 2022 +0000
Revision:
4:3618abce1646
Share for Stepan Oslejsek

Who changed what in which revision?

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