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:43:48 2017 +0000
Revision:
6:cff0e772910f
Parent:
5:4f7cdc2ee49a
Child:
7:b0e7ccc9138b
Still adding and fixing Javadoc comments

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