A class for managing SSD1306 controlled LCD´s (cheap 128x64 models, 0.96'') with more scroll features

Dependents:   2PA2S 2PA2S_v2

Committer:
rodriguj
Date:
Wed Nov 01 16:54:57 2017 +0000
Revision:
7:b0e7ccc9138b
Parent:
6:cff0e772910f
Child:
8:09b1578f93d9
Documenting the class itself...

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
rodriguj 0:3d84b3bfb794 30 #define SSD1306_SETDISPLAYOFFSET 0xD3
rodriguj 0:3d84b3bfb794 31 #define SSD1306_SETCOMPINS 0xDA
rodriguj 0:3d84b3bfb794 32
rodriguj 0:3d84b3bfb794 33 #define SSD1306_SETVCOMDETECT 0xDB
rodriguj 0:3d84b3bfb794 34
rodriguj 0:3d84b3bfb794 35 #define SSD1306_SETDISPLAYCLOCKDIV 0xD5
rodriguj 0:3d84b3bfb794 36 #define SSD1306_SETPRECHARGE 0xD9
rodriguj 0:3d84b3bfb794 37
rodriguj 0:3d84b3bfb794 38 #define SSD1306_SETMULTIPLEX 0xA8
rodriguj 0:3d84b3bfb794 39
rodriguj 0:3d84b3bfb794 40 #define SSD1306_SETLOWCOLUMN 0x00
rodriguj 0:3d84b3bfb794 41 #define SSD1306_SETHIGHCOLUMN 0x10
rodriguj 0:3d84b3bfb794 42
rodriguj 0:3d84b3bfb794 43 #define SSD1306_SETSTARTLINE 0x40
rodriguj 0:3d84b3bfb794 44
rodriguj 0:3d84b3bfb794 45 #define SSD1306_MEMORYMODE 0x20
rodriguj 0:3d84b3bfb794 46
rodriguj 0:3d84b3bfb794 47 #define SSD1306_COMSCANINC 0xC0
rodriguj 0:3d84b3bfb794 48 #define SSD1306_COMSCANDEC 0xC8
rodriguj 0:3d84b3bfb794 49
rodriguj 0:3d84b3bfb794 50 #define SSD1306_SEGREMAP 0xA0
rodriguj 0:3d84b3bfb794 51
rodriguj 0:3d84b3bfb794 52 #define SSD1306_CHARGEPUMP 0x8D
rodriguj 0:3d84b3bfb794 53
rodriguj 0:3d84b3bfb794 54 #define SSD1306_EXTERNALVCC 0x1
rodriguj 0:3d84b3bfb794 55 #define SSD1306_SWITCHCAPVCC 0x2
rodriguj 0:3d84b3bfb794 56
rodriguj 0:3d84b3bfb794 57 // Scrolling #defines
rodriguj 0:3d84b3bfb794 58 #define SSD1306_ACTIVATE_SCROLL 0x2F
rodriguj 0:3d84b3bfb794 59 #define SSD1306_DEACTIVATE_SCROLL 0x2E
rodriguj 0:3d84b3bfb794 60 #define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3
rodriguj 0:3d84b3bfb794 61 #define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26
rodriguj 0:3d84b3bfb794 62 #define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27
rodriguj 0:3d84b3bfb794 63 #define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
rodriguj 0:3d84b3bfb794 64 #define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A
rodriguj 0:3d84b3bfb794 65
rodriguj 7:b0e7ccc9138b 66 /**
rodriguj 7:b0e7ccc9138b 67 * SSD1306. A class for interacting with SSD1306 controlled 128x64 cheap OLED displays
rodriguj 7:b0e7ccc9138b 68 */
rodriguj 4:35757c8b7625 69 class SSD1306 {
rodriguj 0:3d84b3bfb794 70 public:
rodriguj 6:cff0e772910f 71 /**
rodriguj 6:cff0e772910f 72 * PlotStyle. Defines how pixels being plotted interact with existing pixels on the screen
rodriguj 6:cff0e772910f 73 */
rodriguj 0:3d84b3bfb794 74 enum PlotStyle
rodriguj 0:3d84b3bfb794 75 {
rodriguj 0:3d84b3bfb794 76 Normal,
rodriguj 0:3d84b3bfb794 77 Inverse,
rodriguj 0:3d84b3bfb794 78 Xor
rodriguj 0:3d84b3bfb794 79 };
rodriguj 0:3d84b3bfb794 80
rodriguj 6:cff0e772910f 81 /**
rodriguj 6:cff0e772910f 82 * I2CSpeed. Defines the speed of the I2C bus
rodriguj 6:cff0e772910f 83 */
rodriguj 0:3d84b3bfb794 84 enum I2CSpeed
rodriguj 0:3d84b3bfb794 85 {
rodriguj 4:35757c8b7625 86 Slow,
rodriguj 0:3d84b3bfb794 87 Medium,
rodriguj 0:3d84b3bfb794 88 Fast
rodriguj 0:3d84b3bfb794 89 };
rodriguj 0:3d84b3bfb794 90
rodriguj 6:cff0e772910f 91 /**
rodriguj 6:cff0e772910f 92 * Creates an instance of a SSD1306 driver, specifying I2C pins to use
rodriguj 6:cff0e772910f 93 *
rodriguj 6:cff0e772910f 94 * @param sda I2C data line pin
rodriguj 6:cff0e772910f 95 * @param scl I2C clock line pin
rodriguj 6:cff0e772910f 96 */
rodriguj 3:bb6fba3e84ff 97 SSD1306 (PinName sda, PinName scl, char ssd1306_addr = 0x78);
rodriguj 3:bb6fba3e84ff 98
rodriguj 6:cff0e772910f 99 /**
rodriguj 6:cff0e772910f 100 * Creates an instance of a SSD1306 driver using an existing I2C object
rodriguj 6:cff0e772910f 101 *
rodriguj 6:cff0e772910f 102 * @param busi2c I2C object
rodriguj 6:cff0e772910f 103 * @param ssd1306_addr I2C addr of SSD1306 controller
rodriguj 6:cff0e772910f 104 */
rodriguj 3:bb6fba3e84ff 105 SSD1306 (I2C &busi2c, char ssd1306_addr = 0x78);
rodriguj 0:3d84b3bfb794 106
rodriguj 6:cff0e772910f 107 /**
rodriguj 6:cff0e772910f 108 * Set the frequency of the I2C interface
rodriguj 6:cff0e772910f 109 *
rodriguj 6:cff0e772910f 110 * @param hz The bus frequency in hertz
rodriguj 6:cff0e772910f 111 */
rodriguj 0:3d84b3bfb794 112 void speed (I2CSpeed spd);
rodriguj 0:3d84b3bfb794 113
rodriguj 6:cff0e772910f 114 /**
rodriguj 6:cff0e772910f 115 * Initialize the SSD1306 controller
rodriguj 6:cff0e772910f 116 */
rodriguj 0:3d84b3bfb794 117 int init (void);
rodriguj 0:3d84b3bfb794 118
rodriguj 6:cff0e772910f 119 /**
rodriguj 6:cff0e772910f 120 * Scrolls up one text line
rodriguj 6:cff0e772910f 121 *
rodriguj 6:cff0e772910f 122 * @param refresh (optional) Force an actual screen redraw after scrolling
rodriguj 6:cff0e772910f 123 */
rodriguj 1:c5cf4ca5939f 124 void scroll (bool refresh=false);
rodriguj 0:3d84b3bfb794 125
rodriguj 6:cff0e772910f 126 /**
rodriguj 6:cff0e772910f 127 * 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 128 *
rodriguj 6:cff0e772910f 129 * @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 130 * @param refresh (optional) Force an actual screen redraw after scrolling
rodriguj 6:cff0e772910f 131 */
rodriguj 1:c5cf4ca5939f 132 void putchar (char c, bool refresh=false);
rodriguj 0:3d84b3bfb794 133
rodriguj 6:cff0e772910f 134 /**
rodriguj 6:cff0e772910f 135 * Prints a NUL terminated string
rodriguj 6:cff0e772910f 136 *
rodriguj 6:cff0e772910f 137 * @param s C-style string (NUL terminated) to print.
rodriguj 6:cff0e772910f 138 * @param refresh (optional) Force an actual screen redraw after scrolling
rodriguj 6:cff0e772910f 139 */
rodriguj 2:7f1160c1a741 140 void puts (char *s, bool refresh=false);
rodriguj 3:bb6fba3e84ff 141
rodriguj 6:cff0e772910f 142 /**
rodriguj 6:cff0e772910f 143 * printf interface to SSD1306 controller
rodriguj 6:cff0e772910f 144 *
rodriguj 6:cff0e772910f 145 * @param fmt Format string.
rodriguj 6:cff0e772910f 146 */
rodriguj 4:35757c8b7625 147 void printf (const char *fmt,...);
rodriguj 2:7f1160c1a741 148
rodriguj 6:cff0e772910f 149 /**
rodriguj 6:cff0e772910f 150 * Change the text position
rodriguj 6:cff0e772910f 151 *
rodriguj 6:cff0e772910f 152 * @param row Text row (0-7) to print the next character
rodriguj 6:cff0e772910f 153 * @param column Text column (0-15) to print the next character
rodriguj 6:cff0e772910f 154 */
rodriguj 2:7f1160c1a741 155 void locate (char row, char column);
rodriguj 2:7f1160c1a741 156
rodriguj 6:cff0e772910f 157 /**
rodriguj 6:cff0e772910f 158 * Redraw the physical display, sending the content of the display memory to the SSD1306 controller using the I2C bus
rodriguj 6:cff0e772910f 159 */
rodriguj 0:3d84b3bfb794 160 void display (void);
rodriguj 0:3d84b3bfb794 161
rodriguj 6:cff0e772910f 162 /**
rodriguj 6:cff0e772910f 163 * Changes the contrast (actually, pixel brightness) of the screen
rodriguj 6:cff0e772910f 164 *
rodriguj 6:cff0e772910f 165 * @param v Contrast level (0-255)
rodriguj 6:cff0e772910f 166 */
rodriguj 0:3d84b3bfb794 167 void set_contrast (char v);
rodriguj 0:3d84b3bfb794 168
rodriguj 6:cff0e772910f 169 /**
rodriguj 6:cff0e772910f 170 * 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 171 *
rodriguj 6:cff0e772910f 172 * @param bkground If not NULL, should point to a 1024 byte buffer with the image to load to the display
rodriguj 6:cff0e772910f 173 * @param refresh (optional) Force an actual screen redraw after scrolling
rodriguj 6:cff0e772910f 174 */
rodriguj 1:c5cf4ca5939f 175 void cls (char *bkground=NULL, bool refresh=false);
rodriguj 0:3d84b3bfb794 176
rodriguj 6:cff0e772910f 177 /**
rodriguj 6:cff0e772910f 178 * Plots a pixel.
rodriguj 6:cff0e772910f 179 *
rodriguj 6:cff0e772910f 180 * @param x x-coordinate (0-127) of the pixel. X coordinates go left to right.
rodriguj 6:cff0e772910f 181 * @param y y-coordinate (0-63) of the pixel. Y coordinates go up to down.
rodriguj 6:cff0e772910f 182 * @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 6:cff0e772910f 183 * @param refresh (optional) Force an actual screen redraw after scrolling
rodriguj 6:cff0e772910f 184 */
rodriguj 4:35757c8b7625 185 void plot (char x, char y, PlotStyle mode, bool refresh=false);
rodriguj 1:c5cf4ca5939f 186
rodriguj 6:cff0e772910f 187 /**
rodriguj 6:cff0e772910f 188 * Returns the state of a pixel coordinate from screen
rodriguj 6:cff0e772910f 189 *
rodriguj 6:cff0e772910f 190 * @param x x-coordinate (0-127) of the pixel. X coordinates go left to right.
rodriguj 6:cff0e772910f 191 * @param y y-coordinate (0-63) of the pixel. Y coordinates go up to down.
rodriguj 6:cff0e772910f 192 * @return true if the pixel was set, or false otherwise
rodriguj 6:cff0e772910f 193 */
rodriguj 3:bb6fba3e84ff 194 bool point (char x, char y);
rodriguj 3:bb6fba3e84ff 195
rodriguj 6:cff0e772910f 196 /**
rodriguj 6:cff0e772910f 197 * Draws a line using the Bresenham algorithm
rodriguj 6:cff0e772910f 198 *
rodriguj 6:cff0e772910f 199 * @param x0 x-coordinate (0-127) of the starting point
rodriguj 6:cff0e772910f 200 * @param y0 y-coordinate (0-63) of the starting point
rodriguj 6:cff0e772910f 201 * @param x1 x-coordinate (0-127) of the ending point
rodriguj 6:cff0e772910f 202 * @param y1 y-coordinate (0-63) of the ending point
rodriguj 6:cff0e772910f 203 * @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 6:cff0e772910f 204 * @param refresh (optional) Force an actual screen redraw after scrolling
rodriguj 6:cff0e772910f 205 */
rodriguj 4:35757c8b7625 206 void line (char x0, char y0, char x1, char y1, PlotStyle mode, bool refresh=false);
rodriguj 0:3d84b3bfb794 207
rodriguj 6:cff0e772910f 208 /**
rodriguj 6:cff0e772910f 209 * Draws a circle
rodriguj 6:cff0e772910f 210 *
rodriguj 6:cff0e772910f 211 * @param x0 x-coordinate (0-127) of the center point
rodriguj 6:cff0e772910f 212 * @param y0 y-coordinate (0-63) of the center point
rodriguj 6:cff0e772910f 213 * @param r radius of the circle
rodriguj 6:cff0e772910f 214 * @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 6:cff0e772910f 215 * @param refresh (optional) Force an actual screen redraw after scrolling
rodriguj 6:cff0e772910f 216 */
rodriguj 4:35757c8b7625 217 void circle (char x0, char y0, char r, PlotStyle mode, bool refresh=false);
rodriguj 3:bb6fba3e84ff 218
rodriguj 0:3d84b3bfb794 219 virtual ~SSD1306 () {
rodriguj 3:bb6fba3e84ff 220 if (!do_not_delete_bus)
rodriguj 3:bb6fba3e84ff 221 delete bus;
rodriguj 0:3d84b3bfb794 222 delete fb;
rodriguj 0:3d84b3bfb794 223 }
rodriguj 0:3d84b3bfb794 224
rodriguj 0:3d84b3bfb794 225 protected:
rodriguj 4:35757c8b7625 226 I2C *bus; // I2C object
rodriguj 4:35757c8b7625 227 char ssd1306_i2c_addr; // I2C address of SSD1306 controller
rodriguj 4:35757c8b7625 228 char *fb; // pointer to display buffer (1024 bytes)
rodriguj 4:35757c8b7625 229 char do_not_delete_bus; // flag to prevent deletion of bus when destroying SSD1306 object
rodriguj 4:35757c8b7625 230 int idxfb; // Current text position (referred to screen address memory)
rodriguj 4:35757c8b7625 231 int command (char c); // Sends a I2C command to SSD1306
rodriguj 4:35757c8b7625 232 int data (char d); // Sends I2C data to SSD1306
rodriguj 4:35757c8b7625 233 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 234 char scan (); // Scans the I2C bus searcing for I2C id's 0x78 or 0x7A. Currently not used
rodriguj 0:3d84b3bfb794 235 };
rodriguj 0:3d84b3bfb794 236
rodriguj 0:3d84b3bfb794 237 #endif