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 11:04:20 2017 +0000
Revision:
3:bb6fba3e84ff
Parent:
2:7f1160c1a741
Child:
4:35757c8b7625
Added printf method; Tiny fixes to use referenced parameters instead of pointers; Dual constructor. Now the library can coexist with other I2C slaves.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rodriguj 0:3d84b3bfb794 1 /*
rodriguj 3:bb6fba3e84ff 2 * ssd1306.h
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 0:3d84b3bfb794 17 #define IS_COMMAND 0x00
rodriguj 0:3d84b3bfb794 18 #define IS_DATA 0x40
rodriguj 0:3d84b3bfb794 19 #define IS_NOT_LAST 0x80
rodriguj 0:3d84b3bfb794 20 #define 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 0:3d84b3bfb794 66 class SSD1306 : private NonCopyable<SSD1306> {
rodriguj 0:3d84b3bfb794 67
rodriguj 0:3d84b3bfb794 68 public:
rodriguj 0:3d84b3bfb794 69 enum PlotStyle
rodriguj 0:3d84b3bfb794 70 {
rodriguj 0:3d84b3bfb794 71 Normal,
rodriguj 0:3d84b3bfb794 72 Inverse,
rodriguj 0:3d84b3bfb794 73 Xor
rodriguj 0:3d84b3bfb794 74 };
rodriguj 0:3d84b3bfb794 75
rodriguj 0:3d84b3bfb794 76 enum I2CSpeed
rodriguj 0:3d84b3bfb794 77 {
rodriguj 0:3d84b3bfb794 78 Low,
rodriguj 0:3d84b3bfb794 79 Medium,
rodriguj 0:3d84b3bfb794 80 Fast
rodriguj 0:3d84b3bfb794 81 };
rodriguj 0:3d84b3bfb794 82
rodriguj 3:bb6fba3e84ff 83 /** Creates an instance of a SSD1306 driver, specifying I2C pins to use
rodriguj 0:3d84b3bfb794 84 *
rodriguj 0:3d84b3bfb794 85 * @param sda I2C data line pin
rodriguj 0:3d84b3bfb794 86 * @param scl I2C clock line pin
rodriguj 0:3d84b3bfb794 87 */
rodriguj 3:bb6fba3e84ff 88 SSD1306 (PinName sda, PinName scl, char ssd1306_addr = 0x78);
rodriguj 3:bb6fba3e84ff 89
rodriguj 3:bb6fba3e84ff 90 /** Creates an instance of a SSD1306 driver using an existing I2C object
rodriguj 3:bb6fba3e84ff 91 *
rodriguj 3:bb6fba3e84ff 92 * @param busi2c I2C object
rodriguj 3:bb6fba3e84ff 93 * @param ssd1306_addr I2C addr of SSD1306 controller
rodriguj 3:bb6fba3e84ff 94 */
rodriguj 3:bb6fba3e84ff 95 SSD1306 (I2C &busi2c, char ssd1306_addr = 0x78);
rodriguj 0:3d84b3bfb794 96
rodriguj 0:3d84b3bfb794 97 /** Set the frequency of the I2C interface
rodriguj 0:3d84b3bfb794 98 *
rodriguj 0:3d84b3bfb794 99 * @param hz The bus frequency in hertz
rodriguj 0:3d84b3bfb794 100 */
rodriguj 0:3d84b3bfb794 101 void speed (I2CSpeed spd);
rodriguj 0:3d84b3bfb794 102
rodriguj 0:3d84b3bfb794 103 int init (void);
rodriguj 0:3d84b3bfb794 104
rodriguj 1:c5cf4ca5939f 105 void scroll (bool refresh=false);
rodriguj 0:3d84b3bfb794 106
rodriguj 1:c5cf4ca5939f 107 void putchar (char c, bool refresh=false);
rodriguj 0:3d84b3bfb794 108
rodriguj 2:7f1160c1a741 109 void puts (char *s, bool refresh=false);
rodriguj 3:bb6fba3e84ff 110
rodriguj 3:bb6fba3e84ff 111 void printf (char *fmt,...);
rodriguj 2:7f1160c1a741 112
rodriguj 2:7f1160c1a741 113 void locate (char row, char column);
rodriguj 2:7f1160c1a741 114
rodriguj 0:3d84b3bfb794 115 void display (void);
rodriguj 0:3d84b3bfb794 116
rodriguj 0:3d84b3bfb794 117 void set_contrast (char v);
rodriguj 0:3d84b3bfb794 118
rodriguj 1:c5cf4ca5939f 119 void cls (char *bkground=NULL, bool refresh=false);
rodriguj 0:3d84b3bfb794 120
rodriguj 1:c5cf4ca5939f 121 void plot (char x, char y, PlotStyle modo, bool refresh=false);
rodriguj 1:c5cf4ca5939f 122
rodriguj 3:bb6fba3e84ff 123 bool point (char x, char y);
rodriguj 3:bb6fba3e84ff 124
rodriguj 1:c5cf4ca5939f 125 void line (char x0, char y0, char x1, char y1, PlotStyle modo, bool refresh=false);
rodriguj 0:3d84b3bfb794 126
rodriguj 3:bb6fba3e84ff 127 void circle (char x0, char y0, char r, PlotStyle modo, bool refresh=false);
rodriguj 3:bb6fba3e84ff 128
rodriguj 0:3d84b3bfb794 129 virtual ~SSD1306 () {
rodriguj 3:bb6fba3e84ff 130 if (!do_not_delete_bus)
rodriguj 3:bb6fba3e84ff 131 delete bus;
rodriguj 0:3d84b3bfb794 132 delete fb;
rodriguj 0:3d84b3bfb794 133 }
rodriguj 0:3d84b3bfb794 134
rodriguj 0:3d84b3bfb794 135 protected:
rodriguj 0:3d84b3bfb794 136 I2C *bus;
rodriguj 0:3d84b3bfb794 137 char ssd1306_i2c_addr;
rodriguj 0:3d84b3bfb794 138 char *fb;
rodriguj 3:bb6fba3e84ff 139 char do_not_delete_bus;
rodriguj 0:3d84b3bfb794 140 int idxfb;
rodriguj 0:3d84b3bfb794 141 int command (char c);
rodriguj 0:3d84b3bfb794 142 int data (char d);
rodriguj 0:3d84b3bfb794 143 int command_data (char c, char c_or_d, char lastitem);
rodriguj 0:3d84b3bfb794 144 char scan ();
rodriguj 0:3d84b3bfb794 145
rodriguj 0:3d84b3bfb794 146 };
rodriguj 0:3d84b3bfb794 147
rodriguj 0:3d84b3bfb794 148 #endif