Hiro Ona / Mbed 2 deprecated Nucleo_073_OLED

Dependencies:   mbed

Committer:
wakabanban
Date:
Tue Nov 26 04:49:45 2019 +0000
Revision:
0:cb63da12fdcc
ADC Sample

Who changed what in which revision?

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