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

Dependents:   2PA2S 2PA2S_v2

Committer:
rodriguj
Date:
Thu Oct 26 16:07:21 2017 +0000
Revision:
2:7f1160c1a741
Parent:
1:c5cf4ca5939f
Child:
3:bb6fba3e84ff
Added function "locate". Minor tweakes.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rodriguj 0:3d84b3bfb794 1 /*
rodriguj 0:3d84b3bfb794 2 * ssd1306.cpp
rodriguj 0:3d84b3bfb794 3 *
rodriguj 0:3d84b3bfb794 4 * Created on: 20 oct. 2017
rodriguj 0:3d84b3bfb794 5 * Author: rodriguj
rodriguj 0:3d84b3bfb794 6 */
rodriguj 0:3d84b3bfb794 7 #ifndef MBED_SSD1306_LIBRARY
rodriguj 0:3d84b3bfb794 8 #define MBED_SSD1306_LIBRARY
rodriguj 0:3d84b3bfb794 9
rodriguj 0:3d84b3bfb794 10 #include "mbed.h"
rodriguj 0:3d84b3bfb794 11
rodriguj 0:3d84b3bfb794 12 #define IS_COMMAND 0x00
rodriguj 0:3d84b3bfb794 13 #define IS_DATA 0x40
rodriguj 0:3d84b3bfb794 14 #define IS_NOT_LAST 0x80
rodriguj 0:3d84b3bfb794 15 #define IS_LAST 0x00
rodriguj 0:3d84b3bfb794 16
rodriguj 0:3d84b3bfb794 17 #define SSD1306_SETCONTRAST 0x81
rodriguj 0:3d84b3bfb794 18 #define SSD1306_DISPLAYALLON_RESUME 0xA4
rodriguj 0:3d84b3bfb794 19 #define SSD1306_DISPLAYALLON 0xA5
rodriguj 0:3d84b3bfb794 20 #define SSD1306_NORMALDISPLAY 0xA6
rodriguj 0:3d84b3bfb794 21 #define SSD1306_INVERTDISPLAY 0xA7
rodriguj 0:3d84b3bfb794 22 #define SSD1306_DISPLAYOFF 0xAE
rodriguj 0:3d84b3bfb794 23 #define SSD1306_DISPLAYON 0xAF
rodriguj 0:3d84b3bfb794 24
rodriguj 0:3d84b3bfb794 25 #define SSD1306_SETDISPLAYOFFSET 0xD3
rodriguj 0:3d84b3bfb794 26 #define SSD1306_SETCOMPINS 0xDA
rodriguj 0:3d84b3bfb794 27
rodriguj 0:3d84b3bfb794 28 #define SSD1306_SETVCOMDETECT 0xDB
rodriguj 0:3d84b3bfb794 29
rodriguj 0:3d84b3bfb794 30 #define SSD1306_SETDISPLAYCLOCKDIV 0xD5
rodriguj 0:3d84b3bfb794 31 #define SSD1306_SETPRECHARGE 0xD9
rodriguj 0:3d84b3bfb794 32
rodriguj 0:3d84b3bfb794 33 #define SSD1306_SETMULTIPLEX 0xA8
rodriguj 0:3d84b3bfb794 34
rodriguj 0:3d84b3bfb794 35 #define SSD1306_SETLOWCOLUMN 0x00
rodriguj 0:3d84b3bfb794 36 #define SSD1306_SETHIGHCOLUMN 0x10
rodriguj 0:3d84b3bfb794 37
rodriguj 0:3d84b3bfb794 38 #define SSD1306_SETSTARTLINE 0x40
rodriguj 0:3d84b3bfb794 39
rodriguj 0:3d84b3bfb794 40 #define SSD1306_MEMORYMODE 0x20
rodriguj 0:3d84b3bfb794 41
rodriguj 0:3d84b3bfb794 42 #define SSD1306_COMSCANINC 0xC0
rodriguj 0:3d84b3bfb794 43 #define SSD1306_COMSCANDEC 0xC8
rodriguj 0:3d84b3bfb794 44
rodriguj 0:3d84b3bfb794 45 #define SSD1306_SEGREMAP 0xA0
rodriguj 0:3d84b3bfb794 46
rodriguj 0:3d84b3bfb794 47 #define SSD1306_CHARGEPUMP 0x8D
rodriguj 0:3d84b3bfb794 48
rodriguj 0:3d84b3bfb794 49 #define SSD1306_EXTERNALVCC 0x1
rodriguj 0:3d84b3bfb794 50 #define SSD1306_SWITCHCAPVCC 0x2
rodriguj 0:3d84b3bfb794 51
rodriguj 0:3d84b3bfb794 52 // Scrolling #defines
rodriguj 0:3d84b3bfb794 53 #define SSD1306_ACTIVATE_SCROLL 0x2F
rodriguj 0:3d84b3bfb794 54 #define SSD1306_DEACTIVATE_SCROLL 0x2E
rodriguj 0:3d84b3bfb794 55 #define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3
rodriguj 0:3d84b3bfb794 56 #define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26
rodriguj 0:3d84b3bfb794 57 #define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27
rodriguj 0:3d84b3bfb794 58 #define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
rodriguj 0:3d84b3bfb794 59 #define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A
rodriguj 0:3d84b3bfb794 60
rodriguj 0:3d84b3bfb794 61 class SSD1306 : private NonCopyable<SSD1306> {
rodriguj 0:3d84b3bfb794 62
rodriguj 0:3d84b3bfb794 63 public:
rodriguj 0:3d84b3bfb794 64 enum PlotStyle
rodriguj 0:3d84b3bfb794 65 {
rodriguj 0:3d84b3bfb794 66 Normal,
rodriguj 0:3d84b3bfb794 67 Inverse,
rodriguj 0:3d84b3bfb794 68 Xor
rodriguj 0:3d84b3bfb794 69 };
rodriguj 0:3d84b3bfb794 70
rodriguj 0:3d84b3bfb794 71 enum I2CSpeed
rodriguj 0:3d84b3bfb794 72 {
rodriguj 0:3d84b3bfb794 73 Low,
rodriguj 0:3d84b3bfb794 74 Medium,
rodriguj 0:3d84b3bfb794 75 Fast
rodriguj 0:3d84b3bfb794 76 };
rodriguj 0:3d84b3bfb794 77
rodriguj 0:3d84b3bfb794 78 /** Crea una interfaz al display OLED usando el bus I2C
rodriguj 0:3d84b3bfb794 79 *
rodriguj 0:3d84b3bfb794 80 * @param sda I2C data line pin
rodriguj 0:3d84b3bfb794 81 * @param scl I2C clock line pin
rodriguj 0:3d84b3bfb794 82 */
rodriguj 0:3d84b3bfb794 83 SSD1306 (PinName sda, PinName scl);
rodriguj 0:3d84b3bfb794 84
rodriguj 0:3d84b3bfb794 85 /** Set the frequency of the I2C interface
rodriguj 0:3d84b3bfb794 86 *
rodriguj 0:3d84b3bfb794 87 * @param hz The bus frequency in hertz
rodriguj 0:3d84b3bfb794 88 */
rodriguj 0:3d84b3bfb794 89 void speed (I2CSpeed spd);
rodriguj 0:3d84b3bfb794 90
rodriguj 0:3d84b3bfb794 91 int init (void);
rodriguj 0:3d84b3bfb794 92
rodriguj 1:c5cf4ca5939f 93 void scroll (bool refresh=false);
rodriguj 0:3d84b3bfb794 94
rodriguj 1:c5cf4ca5939f 95 void putchar (char c, bool refresh=false);
rodriguj 0:3d84b3bfb794 96
rodriguj 2:7f1160c1a741 97 void puts (char *s, bool refresh=false);
rodriguj 2:7f1160c1a741 98
rodriguj 2:7f1160c1a741 99 void locate (char row, char column);
rodriguj 2:7f1160c1a741 100
rodriguj 0:3d84b3bfb794 101 void display (void);
rodriguj 0:3d84b3bfb794 102
rodriguj 0:3d84b3bfb794 103 void set_contrast (char v);
rodriguj 0:3d84b3bfb794 104
rodriguj 1:c5cf4ca5939f 105 void cls (char *bkground=NULL, bool refresh=false);
rodriguj 0:3d84b3bfb794 106
rodriguj 1:c5cf4ca5939f 107 void plot (char x, char y, PlotStyle modo, bool refresh=false);
rodriguj 1:c5cf4ca5939f 108
rodriguj 1:c5cf4ca5939f 109 void line (char x0, char y0, char x1, char y1, PlotStyle modo, bool refresh=false);
rodriguj 0:3d84b3bfb794 110
rodriguj 0:3d84b3bfb794 111 virtual ~SSD1306 () {
rodriguj 0:3d84b3bfb794 112 delete bus;
rodriguj 0:3d84b3bfb794 113 delete fb;
rodriguj 0:3d84b3bfb794 114 }
rodriguj 0:3d84b3bfb794 115
rodriguj 0:3d84b3bfb794 116 protected:
rodriguj 0:3d84b3bfb794 117 I2C *bus;
rodriguj 0:3d84b3bfb794 118 char ssd1306_i2c_addr;
rodriguj 0:3d84b3bfb794 119 char *fb;
rodriguj 0:3d84b3bfb794 120 int idxfb;
rodriguj 0:3d84b3bfb794 121 int command (char c);
rodriguj 0:3d84b3bfb794 122 int data (char d);
rodriguj 0:3d84b3bfb794 123 int command_data (char c, char c_or_d, char lastitem);
rodriguj 0:3d84b3bfb794 124 char scan ();
rodriguj 0:3d84b3bfb794 125
rodriguj 0:3d84b3bfb794 126 };
rodriguj 0:3d84b3bfb794 127
rodriguj 0:3d84b3bfb794 128 #endif
rodriguj 1:c5cf4ca5939f 129