SSD1306 LCD 96x16 model

Dependents:   testSoftware8_alles_display

Fork of ssd1306_library by Miguel Angel Rodriguez Jodar

Committer:
mikevd1
Date:
Thu Aug 09 12:41:15 2018 +0000
Revision:
11:1b5a69808460
Parent:
10:346065d26cc9
Child:
13:e52c5cb758ca
Werkend display

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rodriguj 0:3d84b3bfb794 1 /*
rodriguj 4:35757c8b7625 2 * ssd1306.cpp
rodriguj 0:3d84b3bfb794 3 *
rodriguj 0:3d84b3bfb794 4 * Created on: 20 oct. 2017
rodriguj 3:bb6fba3e84ff 5 * Author: Miguel Angel Rodriguez Jodar
rodriguj 3:bb6fba3e84ff 6 *
rodriguj 3:bb6fba3e84ff 7 * Based upon Adafruit library.
rodriguj 3:bb6fba3e84ff 8 * GPL licensed.
rodriguj 3:bb6fba3e84ff 9 *
rodriguj 0:3d84b3bfb794 10 */
rodriguj 3:bb6fba3e84ff 11
rodriguj 0:3d84b3bfb794 12 #ifndef MBED_SSD1306_LIBRARY
rodriguj 0:3d84b3bfb794 13 #define MBED_SSD1306_LIBRARY
rodriguj 0:3d84b3bfb794 14
rodriguj 0:3d84b3bfb794 15 #include "mbed.h"
rodriguj 0:3d84b3bfb794 16
rodriguj 4:35757c8b7625 17 #define SSD1306_IS_COMMAND 0x00
rodriguj 4:35757c8b7625 18 #define SSD1306_IS_DATA 0x40
rodriguj 4:35757c8b7625 19 #define SSD1306_IS_NOT_LAST 0x80
rodriguj 4:35757c8b7625 20 #define SSD1306_IS_LAST 0x00
rodriguj 0:3d84b3bfb794 21
rodriguj 0:3d84b3bfb794 22 #define SSD1306_SETCONTRAST 0x81
rodriguj 0:3d84b3bfb794 23 #define SSD1306_DISPLAYALLON_RESUME 0xA4
rodriguj 0:3d84b3bfb794 24 #define SSD1306_DISPLAYALLON 0xA5
rodriguj 0:3d84b3bfb794 25 #define SSD1306_NORMALDISPLAY 0xA6
rodriguj 0:3d84b3bfb794 26 #define SSD1306_INVERTDISPLAY 0xA7
rodriguj 0:3d84b3bfb794 27 #define SSD1306_DISPLAYOFF 0xAE
rodriguj 0:3d84b3bfb794 28 #define SSD1306_DISPLAYON 0xAF
rodriguj 0:3d84b3bfb794 29
mikevd1 11:1b5a69808460 30 #define SSD1306_SETCOLUMNADRESS 0x21
mikevd1 11:1b5a69808460 31 #define SSD1306_SETPAGEADRESS 0x22
mikevd1 11:1b5a69808460 32
rodriguj 0:3d84b3bfb794 33 #define SSD1306_SETDISPLAYOFFSET 0xD3
rodriguj 0:3d84b3bfb794 34 #define SSD1306_SETCOMPINS 0xDA
rodriguj 0:3d84b3bfb794 35
rodriguj 0:3d84b3bfb794 36 #define SSD1306_SETVCOMDETECT 0xDB
rodriguj 0:3d84b3bfb794 37
rodriguj 0:3d84b3bfb794 38 #define SSD1306_SETDISPLAYCLOCKDIV 0xD5
rodriguj 0:3d84b3bfb794 39 #define SSD1306_SETPRECHARGE 0xD9
rodriguj 0:3d84b3bfb794 40
rodriguj 0:3d84b3bfb794 41 #define SSD1306_SETMULTIPLEX 0xA8
rodriguj 0:3d84b3bfb794 42
rodriguj 0:3d84b3bfb794 43 #define SSD1306_SETLOWCOLUMN 0x00
rodriguj 0:3d84b3bfb794 44 #define SSD1306_SETHIGHCOLUMN 0x10
rodriguj 0:3d84b3bfb794 45
rodriguj 0:3d84b3bfb794 46 #define SSD1306_SETSTARTLINE 0x40
rodriguj 0:3d84b3bfb794 47
rodriguj 0:3d84b3bfb794 48 #define SSD1306_MEMORYMODE 0x20
rodriguj 0:3d84b3bfb794 49
rodriguj 0:3d84b3bfb794 50 #define SSD1306_COMSCANINC 0xC0
rodriguj 0:3d84b3bfb794 51 #define SSD1306_COMSCANDEC 0xC8
rodriguj 0:3d84b3bfb794 52
rodriguj 0:3d84b3bfb794 53 #define SSD1306_SEGREMAP 0xA0
rodriguj 0:3d84b3bfb794 54
rodriguj 0:3d84b3bfb794 55 #define SSD1306_CHARGEPUMP 0x8D
rodriguj 0:3d84b3bfb794 56
rodriguj 0:3d84b3bfb794 57 #define SSD1306_EXTERNALVCC 0x1
rodriguj 0:3d84b3bfb794 58 #define SSD1306_SWITCHCAPVCC 0x2
rodriguj 0:3d84b3bfb794 59
rodriguj 0:3d84b3bfb794 60 // Scrolling #defines
rodriguj 0:3d84b3bfb794 61 #define SSD1306_ACTIVATE_SCROLL 0x2F
rodriguj 0:3d84b3bfb794 62 #define SSD1306_DEACTIVATE_SCROLL 0x2E
rodriguj 0:3d84b3bfb794 63 #define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3
rodriguj 0:3d84b3bfb794 64 #define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26
rodriguj 0:3d84b3bfb794 65 #define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27
rodriguj 0:3d84b3bfb794 66 #define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
rodriguj 0:3d84b3bfb794 67 #define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A
rodriguj 0:3d84b3bfb794 68
rodriguj 7:b0e7ccc9138b 69 /**
rodriguj 7:b0e7ccc9138b 70 * SSD1306. A class for interacting with SSD1306 controlled 128x64 cheap OLED displays
rodriguj 8:09b1578f93d9 71 *
rodriguj 8:09b1578f93d9 72 * Example of use:
rodriguj 8:09b1578f93d9 73 * @code
rodriguj 8:09b1578f93d9 74 * #include "mbed.h"
rodriguj 8:09b1578f93d9 75 * #include "ssd1306.h"
rodriguj 8:09b1578f93d9 76 *
rodriguj 8:09b1578f93d9 77 * SSD1306 lcd (I2C_SDA, I2C_SCL); // assumes default I2C address of 0x78
rodriguj 8:09b1578f93d9 78 * AnalogIn knob (A0); // potentiometer to analog pin A0
rodriguj 8:09b1578f93d9 79 *
rodriguj 8:09b1578f93d9 80 * int main()
rodriguj 8:09b1578f93d9 81 * {
rodriguj 8:09b1578f93d9 82 * lcd.speed (SSD1306::Medium); // set working frequency
rodriguj 8:09b1578f93d9 83 * lcd.init(); // initialize SSD1306
rodriguj 8:09b1578f93d9 84 * lcd.cls(); // clear frame buffer
rodriguj 8:09b1578f93d9 85 * lcd.locate (3,1); // set text cursor to line 3, column 1
rodriguj 8:09b1578f93d9 86 * lcd.printf ("Hello, world!"); // print to frame buffer
rodriguj 9:57209a7e9cba 87 * lcd.line ( 6, 22, 114, 22, SSD1306::Normal); //
rodriguj 9:57209a7e9cba 88 * lcd.line (114, 22, 114, 33, SSD1306::Normal); // Surrounds text with
rodriguj 9:57209a7e9cba 89 * lcd.line (114, 33, 6, 33, SSD1306::Normal); // a rectangle
rodriguj 9:57209a7e9cba 90 * lcd.line ( 6, 33, 6, 22, SSD1306::Normal); //
rodriguj 8:09b1578f93d9 91 * lcd.fill (0, 0); // fills screen outside rectangle
rodriguj 8:09b1578f93d9 92 * lcd.redraw(); // updates actual display transferring frame buffer over I2C bus
rodriguj 8:09b1578f93d9 93 * while (1) {
rodriguj 8:09b1578f93d9 94 * unsigned char level = 255*knob.read(); // reads pot. Scales to 0-255
rodriguj 8:09b1578f93d9 95 * lcd.set_contrast (level); // set contrast
rodriguj 8:09b1578f93d9 96 * wait_ms (20); // waits a little to prevent excesive I2C traffic
rodriguj 8:09b1578f93d9 97 * }
rodriguj 8:09b1578f93d9 98 * }
rodriguj 8:09b1578f93d9 99 * @endcode
rodriguj 7:b0e7ccc9138b 100 */
rodriguj 4:35757c8b7625 101 class SSD1306 {
rodriguj 0:3d84b3bfb794 102 public:
rodriguj 6:cff0e772910f 103 /**
rodriguj 6:cff0e772910f 104 * PlotStyle. Defines how pixels being plotted interact with existing pixels on the screen
rodriguj 6:cff0e772910f 105 */
rodriguj 0:3d84b3bfb794 106 enum PlotStyle
rodriguj 0:3d84b3bfb794 107 {
rodriguj 8:09b1578f93d9 108 Normal, /**< The point is set on the display */
rodriguj 8:09b1578f93d9 109 Inverse, /**< The point is erased on the display */
rodriguj 8:09b1578f93d9 110 Xor /**< The point is erased on the display if it was already set, otherwise, it is set */
rodriguj 0:3d84b3bfb794 111 };
rodriguj 0:3d84b3bfb794 112
rodriguj 6:cff0e772910f 113 /**
rodriguj 6:cff0e772910f 114 * I2CSpeed. Defines the speed of the I2C bus
rodriguj 6:cff0e772910f 115 */
rodriguj 0:3d84b3bfb794 116 enum I2CSpeed
rodriguj 0:3d84b3bfb794 117 {
rodriguj 8:09b1578f93d9 118 Slow, /**< I2C frequency is set to 100 kHz */
rodriguj 8:09b1578f93d9 119 Medium, /**< I2C frequency is set to 400 kHz */
rodriguj 8:09b1578f93d9 120 Fast /**< I2C frequency is set to 1 MHz. Use it only with short connections to host */
rodriguj 0:3d84b3bfb794 121 };
rodriguj 0:3d84b3bfb794 122
rodriguj 6:cff0e772910f 123 /**
rodriguj 6:cff0e772910f 124 * Creates an instance of a SSD1306 driver, specifying I2C pins to use
rodriguj 6:cff0e772910f 125 *
rodriguj 6:cff0e772910f 126 * @param sda I2C data line pin
rodriguj 6:cff0e772910f 127 * @param scl I2C clock line pin
rodriguj 6:cff0e772910f 128 */
rodriguj 3:bb6fba3e84ff 129 SSD1306 (PinName sda, PinName scl, char ssd1306_addr = 0x78);
rodriguj 3:bb6fba3e84ff 130
rodriguj 6:cff0e772910f 131 /**
rodriguj 6:cff0e772910f 132 * Creates an instance of a SSD1306 driver using an existing I2C object
rodriguj 6:cff0e772910f 133 *
rodriguj 6:cff0e772910f 134 * @param busi2c I2C object
rodriguj 6:cff0e772910f 135 * @param ssd1306_addr I2C addr of SSD1306 controller
rodriguj 6:cff0e772910f 136 */
rodriguj 3:bb6fba3e84ff 137 SSD1306 (I2C &busi2c, char ssd1306_addr = 0x78);
rodriguj 0:3d84b3bfb794 138
rodriguj 6:cff0e772910f 139 /**
rodriguj 6:cff0e772910f 140 * Set the frequency of the I2C interface
rodriguj 6:cff0e772910f 141 *
rodriguj 6:cff0e772910f 142 * @param hz The bus frequency in hertz
rodriguj 6:cff0e772910f 143 */
rodriguj 0:3d84b3bfb794 144 void speed (I2CSpeed spd);
rodriguj 0:3d84b3bfb794 145
rodriguj 6:cff0e772910f 146 /**
rodriguj 6:cff0e772910f 147 * Initialize the SSD1306 controller
rodriguj 6:cff0e772910f 148 */
rodriguj 0:3d84b3bfb794 149 int init (void);
rodriguj 0:3d84b3bfb794 150
rodriguj 6:cff0e772910f 151 /**
mikevd1 10:346065d26cc9 152 * Initialize the SSD1306 controller
mikevd1 10:346065d26cc9 153 */
mikevd1 10:346065d26cc9 154 int initAll (void);
mikevd1 10:346065d26cc9 155
mikevd1 10:346065d26cc9 156 /**
rodriguj 6:cff0e772910f 157 * Scrolls up one text line
rodriguj 6:cff0e772910f 158 *
rodriguj 6:cff0e772910f 159 * @param refresh (optional) Force an actual screen redraw after scrolling
rodriguj 6:cff0e772910f 160 */
rodriguj 1:c5cf4ca5939f 161 void scroll (bool refresh=false);
rodriguj 0:3d84b3bfb794 162
rodriguj 6:cff0e772910f 163 /**
rodriguj 6:cff0e772910f 164 * Print a character at the current text position. Updates the text position and forces a scroll if at the end of the screen
rodriguj 6:cff0e772910f 165 *
rodriguj 6:cff0e772910f 166 * @param c ASCII code of the character to print (8-bit ASCII code, use original IBM code page 437. No control codes.
rodriguj 6:cff0e772910f 167 * @param refresh (optional) Force an actual screen redraw after scrolling
rodriguj 6:cff0e772910f 168 */
rodriguj 1:c5cf4ca5939f 169 void putchar (char c, bool refresh=false);
rodriguj 0:3d84b3bfb794 170
rodriguj 6:cff0e772910f 171 /**
rodriguj 6:cff0e772910f 172 * Prints a NUL terminated string
rodriguj 6:cff0e772910f 173 *
rodriguj 6:cff0e772910f 174 * @param s C-style string (NUL terminated) to print.
rodriguj 8:09b1578f93d9 175 * @param refresh (optional) Force an actual screen redraw after the operation
rodriguj 6:cff0e772910f 176 */
rodriguj 2:7f1160c1a741 177 void puts (char *s, bool refresh=false);
rodriguj 3:bb6fba3e84ff 178
rodriguj 6:cff0e772910f 179 /**
rodriguj 6:cff0e772910f 180 * printf interface to SSD1306 controller
rodriguj 6:cff0e772910f 181 *
rodriguj 6:cff0e772910f 182 * @param fmt Format string.
rodriguj 6:cff0e772910f 183 */
rodriguj 4:35757c8b7625 184 void printf (const char *fmt,...);
rodriguj 2:7f1160c1a741 185
rodriguj 6:cff0e772910f 186 /**
rodriguj 6:cff0e772910f 187 * Change the text position
rodriguj 6:cff0e772910f 188 *
rodriguj 6:cff0e772910f 189 * @param row Text row (0-7) to print the next character
rodriguj 6:cff0e772910f 190 * @param column Text column (0-15) to print the next character
rodriguj 6:cff0e772910f 191 */
rodriguj 2:7f1160c1a741 192 void locate (char row, char column);
rodriguj 2:7f1160c1a741 193
rodriguj 6:cff0e772910f 194 /**
rodriguj 8:09b1578f93d9 195 * (Deprecated: use redraw instead) Redraws the physical display, sending the content of the display memory to the SSD1306 controller using the I2C bus.
rodriguj 6:cff0e772910f 196 */
rodriguj 0:3d84b3bfb794 197 void display (void);
rodriguj 0:3d84b3bfb794 198
rodriguj 6:cff0e772910f 199 /**
rodriguj 8:09b1578f93d9 200 * Redraws the physical display, sending the content of the display memory to the SSD1306 controller using the I2C bus
rodriguj 8:09b1578f93d9 201 */
rodriguj 8:09b1578f93d9 202 void redraw (void);
rodriguj 8:09b1578f93d9 203
rodriguj 8:09b1578f93d9 204 /**
rodriguj 6:cff0e772910f 205 * Changes the contrast (actually, pixel brightness) of the screen
rodriguj 6:cff0e772910f 206 *
rodriguj 6:cff0e772910f 207 * @param v Contrast level (0-255)
rodriguj 6:cff0e772910f 208 */
rodriguj 0:3d84b3bfb794 209 void set_contrast (char v);
rodriguj 0:3d84b3bfb794 210
rodriguj 6:cff0e772910f 211 /**
rodriguj 6:cff0e772910f 212 * Clear screen and optionally, fills it with a predefined picture (in 128x64 OLED format, see display datasheet). Also resets the text position.
rodriguj 6:cff0e772910f 213 *
rodriguj 6:cff0e772910f 214 * @param bkground If not NULL, should point to a 1024 byte buffer with the image to load to the display
rodriguj 8:09b1578f93d9 215 * @param refresh (optional) Force an actual screen redraw after the operation
rodriguj 6:cff0e772910f 216 */
rodriguj 1:c5cf4ca5939f 217 void cls (char *bkground=NULL, bool refresh=false);
rodriguj 0:3d84b3bfb794 218
mikevd1 10:346065d26cc9 219
mikevd1 10:346065d26cc9 220 /**
mikevd1 10:346065d26cc9 221 * fills screen
mikevd1 10:346065d26cc9 222 *
mikevd1 10:346065d26cc9 223 * @param bkground If not NULL, should point to a 1024 byte buffer with the image to load to the display
mikevd1 10:346065d26cc9 224 * @param refresh (optional) Force an actual screen redraw after the operation
mikevd1 10:346065d26cc9 225 */
mikevd1 10:346065d26cc9 226 void bitMap (char *bkground=NULL, bool refresh=false);
mikevd1 10:346065d26cc9 227
rodriguj 6:cff0e772910f 228 /**
rodriguj 6:cff0e772910f 229 * Plots a pixel.
rodriguj 6:cff0e772910f 230 *
rodriguj 6:cff0e772910f 231 * @param x x-coordinate (0-127) of the pixel. X coordinates go left to right.
rodriguj 6:cff0e772910f 232 * @param y y-coordinate (0-63) of the pixel. Y coordinates go up to down.
rodriguj 6:cff0e772910f 233 * @param mode. Plot style mode: Normal (pixel is drawn), Inverse (pixel is erased), or Xor (pixel is erased if background position is already set, otherwise is drawn)
rodriguj 8:09b1578f93d9 234 * @param refresh (optional) Force an actual screen redraw after plotting
rodriguj 6:cff0e772910f 235 */
rodriguj 4:35757c8b7625 236 void plot (char x, char y, PlotStyle mode, bool refresh=false);
rodriguj 1:c5cf4ca5939f 237
rodriguj 6:cff0e772910f 238 /**
rodriguj 6:cff0e772910f 239 * Returns the state of a pixel coordinate from screen
rodriguj 6:cff0e772910f 240 *
rodriguj 6:cff0e772910f 241 * @param x x-coordinate (0-127) of the pixel. X coordinates go left to right.
rodriguj 6:cff0e772910f 242 * @param y y-coordinate (0-63) of the pixel. Y coordinates go up to down.
rodriguj 6:cff0e772910f 243 * @return true if the pixel was set, or false otherwise
rodriguj 6:cff0e772910f 244 */
rodriguj 3:bb6fba3e84ff 245 bool point (char x, char y);
rodriguj 3:bb6fba3e84ff 246
rodriguj 6:cff0e772910f 247 /**
rodriguj 6:cff0e772910f 248 * Draws a line using the Bresenham algorithm
rodriguj 6:cff0e772910f 249 *
rodriguj 6:cff0e772910f 250 * @param x0 x-coordinate (0-127) of the starting point
rodriguj 6:cff0e772910f 251 * @param y0 y-coordinate (0-63) of the starting point
rodriguj 6:cff0e772910f 252 * @param x1 x-coordinate (0-127) of the ending point
rodriguj 6:cff0e772910f 253 * @param y1 y-coordinate (0-63) of the ending point
rodriguj 6:cff0e772910f 254 * @param mode. Plot style mode: Normal (pixel is drawn), Inverse (pixel is erased), or Xor (pixel is erased if background position is already set, otherwise is drawn)
rodriguj 8:09b1578f93d9 255 * @param refresh (optional) Force an actual screen redraw after drawing the line
rodriguj 6:cff0e772910f 256 */
rodriguj 4:35757c8b7625 257 void line (char x0, char y0, char x1, char y1, PlotStyle mode, bool refresh=false);
rodriguj 0:3d84b3bfb794 258
rodriguj 6:cff0e772910f 259 /**
rodriguj 6:cff0e772910f 260 * Draws a circle
rodriguj 6:cff0e772910f 261 *
rodriguj 6:cff0e772910f 262 * @param x0 x-coordinate (0-127) of the center point
rodriguj 6:cff0e772910f 263 * @param y0 y-coordinate (0-63) of the center point
rodriguj 6:cff0e772910f 264 * @param r radius of the circle
rodriguj 6:cff0e772910f 265 * @param mode. Plot style mode: Normal (pixel is drawn), Inverse (pixel is erased), or Xor (pixel is erased if background position is already set, otherwise is drawn)
rodriguj 8:09b1578f93d9 266 * @param refresh (optional) Force an actual screen redraw after drawing the shape
rodriguj 6:cff0e772910f 267 */
rodriguj 4:35757c8b7625 268 void circle (char x0, char y0, char r, PlotStyle mode, bool refresh=false);
rodriguj 3:bb6fba3e84ff 269
rodriguj 8:09b1578f93d9 270 /**
rodriguj 8:09b1578f93d9 271 * Flood fills an area surrounded by the screen edge and/or a closed shape.
rodriguj 8:09b1578f93d9 272 *
rodriguj 8:09b1578f93d9 273 * @param x x-coordinate (0-127) of a point inside the area to fill, not plotted
rodriguj 8:09b1578f93d9 274 * @param y y-coordinate (0-63) of a point inside the area to fill, not plotted
rodriguj 8:09b1578f93d9 275 * @param refresh (optional) Force an actual screen redraw after the operation
rodriguj 8:09b1578f93d9 276 */
rodriguj 8:09b1578f93d9 277 void fill (char x, char y, bool refresh=false);
rodriguj 8:09b1578f93d9 278
rodriguj 0:3d84b3bfb794 279 virtual ~SSD1306 () {
rodriguj 3:bb6fba3e84ff 280 if (!do_not_delete_bus)
rodriguj 3:bb6fba3e84ff 281 delete bus;
rodriguj 0:3d84b3bfb794 282 delete fb;
rodriguj 0:3d84b3bfb794 283 }
rodriguj 0:3d84b3bfb794 284
rodriguj 0:3d84b3bfb794 285 protected:
rodriguj 4:35757c8b7625 286 I2C *bus; // I2C object
rodriguj 4:35757c8b7625 287 char ssd1306_i2c_addr; // I2C address of SSD1306 controller
rodriguj 4:35757c8b7625 288 char *fb; // pointer to display buffer (1024 bytes)
rodriguj 4:35757c8b7625 289 char do_not_delete_bus; // flag to prevent deletion of bus when destroying SSD1306 object
rodriguj 4:35757c8b7625 290 int idxfb; // Current text position (referred to screen address memory)
rodriguj 4:35757c8b7625 291 int command (char c); // Sends a I2C command to SSD1306
rodriguj 4:35757c8b7625 292 int data (char d); // Sends I2C data to SSD1306
rodriguj 4:35757c8b7625 293 int command_data (char c, char c_or_d, char lastitem); // Sends a command or data and signal if it is not the last command/data in a list
rodriguj 4:35757c8b7625 294 char scan (); // Scans the I2C bus searcing for I2C id's 0x78 or 0x7A. Currently not used
rodriguj 0:3d84b3bfb794 295 };
rodriguj 0:3d84b3bfb794 296
rodriguj 0:3d84b3bfb794 297 #endif