OLED

Dependents:   nucled_L476RG_OLED_Display

Fork of L152RE_OLED_SSD1306 by Charles Fhda

Committer:
garryzheng
Date:
Thu Nov 17 19:08:49 2016 +0000
Revision:
1:e03d94d28ce5
Parent:
0:761e771590e5
OLED SSD1306 SPI STM32 L476RG

Who changed what in which revision?

UserRevisionLine numberNew contents of line
charlesfhda 0:761e771590e5 1 #ifndef __SSD1306_H__
charlesfhda 0:761e771590e5 2 #define __SSD1306_H__
charlesfhda 0:761e771590e5 3
charlesfhda 0:761e771590e5 4 #define FONT_START ' ' /* First character value in the font table */
charlesfhda 0:761e771590e5 5
charlesfhda 0:761e771590e5 6 /** SSD1306 Controller Driver
charlesfhda 0:761e771590e5 7 *
charlesfhda 0:761e771590e5 8 * This class provides a buffered display for the SSD1306 OLED controller.
charlesfhda 0:761e771590e5 9 *
charlesfhda 0:761e771590e5 10 * TODO:
charlesfhda 0:761e771590e5 11 * - At the moment, the driver assumes a 128x64 pixel display.
charlesfhda 0:761e771590e5 12 * - Only fonts of 8 pixel height are supported (different widths can be used).
charlesfhda 0:761e771590e5 13 * - Pretty much no drawing functions are provided as yet.
charlesfhda 0:761e771590e5 14 * - Possible "auto-update", automatically calling update() after a printf etc.
charlesfhda 0:761e771590e5 15 *
charlesfhda 0:761e771590e5 16 * Information taken from the datasheet at:
charlesfhda 0:761e771590e5 17 * http://www.adafruit.com/datasheets/SSD1306.pdf
charlesfhda 0:761e771590e5 18 *
charlesfhda 0:761e771590e5 19 */
charlesfhda 0:761e771590e5 20 class SSD1306
charlesfhda 0:761e771590e5 21 {
charlesfhda 0:761e771590e5 22 public:
charlesfhda 0:761e771590e5 23 /** Construct a new SSD1306 object.
charlesfhda 0:761e771590e5 24 * @param cs The connected C/S pin.
charlesfhda 0:761e771590e5 25 * @param rs The connected RS pin.
charlesfhda 0:761e771590e5 26 * @param dc The connected DC pin.
charlesfhda 0:761e771590e5 27 * @param clk The connected CLK pin.
charlesfhda 0:761e771590e5 28 * @param data The connected Data pin.
charlesfhda 0:761e771590e5 29 */
charlesfhda 0:761e771590e5 30 SSD1306(PinName cs, PinName rs, PinName dc, PinName clk, PinName data);
charlesfhda 0:761e771590e5 31
charlesfhda 0:761e771590e5 32 // ----- HARDWARE CONTROL -----
charlesfhda 0:761e771590e5 33
charlesfhda 0:761e771590e5 34 /** Initialise the display with defaults.*/
charlesfhda 0:761e771590e5 35 void initialise();
charlesfhda 0:761e771590e5 36
charlesfhda 0:761e771590e5 37 /** Force a refresh of the display. Copies the buffer to the controller. */
charlesfhda 0:761e771590e5 38 void update();
charlesfhda 0:761e771590e5 39
charlesfhda 0:761e771590e5 40 /** Turn the whole display off. This will reset all configuration settings on the controller to their defaults. */
charlesfhda 0:761e771590e5 41 void off();
charlesfhda 0:761e771590e5 42
charlesfhda 0:761e771590e5 43 /** Turn the whole display on. Used during initialisation. */
charlesfhda 0:761e771590e5 44 void on();
charlesfhda 0:761e771590e5 45
charlesfhda 0:761e771590e5 46 /** Sends the display to sleep, but leaves RAM intact. */
charlesfhda 0:761e771590e5 47 void sleep();
charlesfhda 0:761e771590e5 48
charlesfhda 0:761e771590e5 49 /** Wakes up this display following a sleep() call.
charlesfhda 0:761e771590e5 50 * @see sleep()
charlesfhda 0:761e771590e5 51 */
charlesfhda 0:761e771590e5 52 void wake();
charlesfhda 0:761e771590e5 53
charlesfhda 0:761e771590e5 54 /** Set the display contrast.
charlesfhda 0:761e771590e5 55 * @param value The contrast, from 1 to 256.
charlesfhda 0:761e771590e5 56 */
charlesfhda 0:761e771590e5 57 void set_contrast(unsigned char value); // 1-256
charlesfhda 0:761e771590e5 58
charlesfhda 0:761e771590e5 59 /** Set the display to normal or inverse.
charlesfhda 0:761e771590e5 60 * @param value 0 for normal mode, or 1 for inverse mode.
charlesfhda 0:761e771590e5 61 */
charlesfhda 0:761e771590e5 62 void set_inverse(unsigned char value); // 0 or 1
charlesfhda 0:761e771590e5 63
charlesfhda 0:761e771590e5 64 /** Set the display start line. This is the line at which the display will start rendering.
charlesfhda 0:761e771590e5 65 * @param value A value from 0 to 63 denoting the line to start at.
charlesfhda 0:761e771590e5 66 */
charlesfhda 0:761e771590e5 67 void set_display_start_line(unsigned char value); // 0-63
charlesfhda 0:761e771590e5 68
charlesfhda 0:761e771590e5 69 /** Set the segment remap state. This allows the module to be addressed as if flipped horizontally.
charlesfhda 0:761e771590e5 70 * NOTE: Changing this setting has no effect on data already in the module's GDDRAM.
charlesfhda 0:761e771590e5 71 * @param value 0 = column address 0 = segment 0 (the default), 1 = column address 127 = segment 0 (flipped).
charlesfhda 0:761e771590e5 72 */
charlesfhda 0:761e771590e5 73 void set_segment_remap(unsigned char value); // 0 or 1
charlesfhda 0:761e771590e5 74
charlesfhda 0:761e771590e5 75 /** Set the vertical shift by COM.
charlesfhda 0:761e771590e5 76 * @param value The number of rows to shift, from 0 - 63.
charlesfhda 0:761e771590e5 77 */
charlesfhda 0:761e771590e5 78 void set_display_offset(unsigned char value); // 0-63
charlesfhda 0:761e771590e5 79
charlesfhda 0:761e771590e5 80 /** Set the multiplex ratio.
charlesfhda 0:761e771590e5 81 * @param value MUX will be set to (value+1). Valid values range from 15 to 63 - MUX 16 to 64.
charlesfhda 0:761e771590e5 82 */
charlesfhda 0:761e771590e5 83 void set_multiplex_ratio(unsigned char value); // 15-63 (value+1 mux)
charlesfhda 0:761e771590e5 84
charlesfhda 0:761e771590e5 85 /** Set COM output scan direction. If the display is active, this will immediately vertically
charlesfhda 0:761e771590e5 86 * flip the display.
charlesfhda 0:761e771590e5 87 * @param value 0 = Scan from COM0 (default), 1 = reversed (scan from COM[N-1]).
charlesfhda 0:761e771590e5 88 */
charlesfhda 0:761e771590e5 89 void set_com_output_scan_direction(unsigned char value); // 0 or 1
charlesfhda 0:761e771590e5 90
charlesfhda 0:761e771590e5 91 /** Set COM pins hardware configuration.
charlesfhda 0:761e771590e5 92 * @param sequential 0 = Sequental COM pin configuration, 1 = Alternative COM pin configuration (default).
charlesfhda 0:761e771590e5 93 * @param lr_remap 0 = Disable COM left/right remap (default), 1 = enable COM left/right remap.
charlesfhda 0:761e771590e5 94 */
charlesfhda 0:761e771590e5 95 void set_com_pins_hardware_configuration(unsigned char sequential, unsigned char lr_remap); // 0 or 1 for both parametrs
charlesfhda 0:761e771590e5 96
charlesfhda 0:761e771590e5 97 /** Set up and start a continuous horizontal scroll.
charlesfhda 0:761e771590e5 98 * Once you have set up the scrolling, you can deactivate it with stop_scroll().
charlesfhda 0:761e771590e5 99 * @param direction 0 for right, 1 for left.
charlesfhda 0:761e771590e5 100 * @param start Start page address, 0 - 5.
charlesfhda 0:761e771590e5 101 * @param end End page address, 0 - 5.
charlesfhda 0:761e771590e5 102 * @param interval Interval in frame frequency. Valid values are: 2, 3, 4, 5, 25, 64, 128, 256.
charlesfhda 0:761e771590e5 103 * @see stop_scrol
charlesfhda 0:761e771590e5 104 */
charlesfhda 0:761e771590e5 105 void start_horizontal_scroll(unsigned char direction, unsigned char start, unsigned char end, unsigned char interval);
charlesfhda 0:761e771590e5 106
charlesfhda 0:761e771590e5 107 /** Set up and start a continuous horizontal and vertical scroll.
charlesfhda 0:761e771590e5 108 * NOTE: No continuous vertical scroll is available.
charlesfhda 0:761e771590e5 109 * Once you have set up the scrolling, you can deactivate it with stop_scroll().
charlesfhda 0:761e771590e5 110 * @param direction 0 for vertical and right horizontal scroll, 1 for vertical and left horizontal scroll.
charlesfhda 0:761e771590e5 111 * @param start Start page address, 0 - 5.
charlesfhda 0:761e771590e5 112 * @param end End page address, 0 - 5.
charlesfhda 0:761e771590e5 113 * @param interval Interval in frame frequency. Valid values are: 2, 3, 4, 5, 25, 64, 128, 256.
charlesfhda 0:761e771590e5 114 * @param vertical_offset Offset of vertical scroll, 1 - 63.
charlesfhda 0:761e771590e5 115 * @see stop_scroll
charlesfhda 0:761e771590e5 116 */
charlesfhda 0:761e771590e5 117 void start_vertical_and_horizontal_scroll(unsigned char direction, unsigned char start, unsigned char end, unsigned char interval, unsigned char vertical_offset);
charlesfhda 0:761e771590e5 118
charlesfhda 0:761e771590e5 119 /** Deactivate the continuous scroll set up with start_horizontal_scroll() or
charlesfhda 0:761e771590e5 120 * start_vertical_and_horizontal_scroll().
charlesfhda 0:761e771590e5 121 * @see set_horizontal_scroll, set_vertical_and_horizontal_scroll
charlesfhda 0:761e771590e5 122 */
charlesfhda 0:761e771590e5 123 void stop_scroll();
charlesfhda 0:761e771590e5 124
charlesfhda 0:761e771590e5 125 // ----- ADDRESSING -----
charlesfhda 0:761e771590e5 126
charlesfhda 0:761e771590e5 127 /** Set memory addressing mode to the given value.
charlesfhda 0:761e771590e5 128 * @param mode 0 for Horizontal addressing mode, 1 for Vertical addressing mode, or 2 for Page addressing mode (PAM). 2 is the default.
charlesfhda 0:761e771590e5 129 */
charlesfhda 0:761e771590e5 130 void set_memory_addressing_mode(unsigned char mode);
charlesfhda 0:761e771590e5 131
charlesfhda 0:761e771590e5 132 /** Page Addressing Mode: Set the column start address register for
charlesfhda 0:761e771590e5 133 * page addressing mode.
charlesfhda 0:761e771590e5 134 * @param address The address (full byte).
charlesfhda 0:761e771590e5 135 */
charlesfhda 0:761e771590e5 136 void pam_set_start_address(unsigned char address);
charlesfhda 0:761e771590e5 137
charlesfhda 0:761e771590e5 138 /** Set the GDDRAM page start address for page addressing mode.
charlesfhda 0:761e771590e5 139 * @param address The start page, 0 - 7.
charlesfhda 0:761e771590e5 140 */
charlesfhda 0:761e771590e5 141 void pam_set_page_start(unsigned char address);
charlesfhda 0:761e771590e5 142
charlesfhda 0:761e771590e5 143 /** Set page start and end address for horizontal/vertical addressing mode.
charlesfhda 0:761e771590e5 144 * @param start The start page, 0 - 7.
charlesfhda 0:761e771590e5 145 * @param end The end page, 0 - 7.
charlesfhda 0:761e771590e5 146 */
charlesfhda 0:761e771590e5 147 void hv_set_page_address(unsigned char start, unsigned char end);
charlesfhda 0:761e771590e5 148
charlesfhda 0:761e771590e5 149 /** Set column address range for horizontal/vertical addressing mode.
charlesfhda 0:761e771590e5 150 * @param start Column start address, 0 - 127.
charlesfhda 0:761e771590e5 151 * @param end Column end address, 0 - 127.
charlesfhda 0:761e771590e5 152 */
charlesfhda 0:761e771590e5 153 void hv_set_column_address(unsigned char start, unsigned char end);
charlesfhda 0:761e771590e5 154
charlesfhda 0:761e771590e5 155 // ----- TIMING & DRIVING -----
charlesfhda 0:761e771590e5 156 /** Set the display clock divide ratio and the oscillator frequency.
charlesfhda 0:761e771590e5 157 * @param ratio The divide ratio, default is 0.
charlesfhda 0:761e771590e5 158 * @param frequency The oscillator frequency, 0 - 127. Default is 8.
charlesfhda 0:761e771590e5 159 */
charlesfhda 0:761e771590e5 160 void set_display_clock_ratio_and_frequency(unsigned char ratio, unsigned char frequency);
charlesfhda 0:761e771590e5 161
charlesfhda 0:761e771590e5 162 /** Set the precharge period.
charlesfhda 0:761e771590e5 163 * @param phase1 Phase 1 period in DCLK clocks. 1 - 15, default is 2.
charlesfhda 0:761e771590e5 164 * @param phase2 Phase 2 period in DCLK clocks. 1 - 15, default is 2.
charlesfhda 0:761e771590e5 165 */
charlesfhda 0:761e771590e5 166 void set_precharge_period(unsigned char phase1, unsigned char phase2);
charlesfhda 0:761e771590e5 167
charlesfhda 0:761e771590e5 168 /** Set the Vcomh deselect level.
charlesfhda 0:761e771590e5 169 * @param level 0 = 0.65 x Vcc, 1 = 0.77 x Vcc (default), 2 = 0.83 x Vcc.
charlesfhda 0:761e771590e5 170 */
charlesfhda 0:761e771590e5 171 void set_vcomh_deselect_level(unsigned char level);
charlesfhda 0:761e771590e5 172
charlesfhda 0:761e771590e5 173 /** Perform a "no operation".
charlesfhda 0:761e771590e5 174 */
charlesfhda 0:761e771590e5 175 void nop();
charlesfhda 0:761e771590e5 176
charlesfhda 0:761e771590e5 177 /** Enable/disable charge pump.
charlesfhda 0:761e771590e5 178 @param enable 0 to disable, 1 to enable the internal charge pump.
charlesfhda 0:761e771590e5 179 */
charlesfhda 0:761e771590e5 180 void set_charge_pump_enable(unsigned char enable);
charlesfhda 0:761e771590e5 181
charlesfhda 0:761e771590e5 182 // ----- BUFFER EDITING -----
charlesfhda 0:761e771590e5 183
charlesfhda 0:761e771590e5 184 void clear();
charlesfhda 0:761e771590e5 185 void drawBitmap(int x, int y, const unsigned char *bitmap, int w, int h, int color = 1);
charlesfhda 0:761e771590e5 186 void set_pixel(int x, int y);
charlesfhda 0:761e771590e5 187 void clear_pixel(int x, int y);
charlesfhda 0:761e771590e5 188 void line(int x0, int y0, int x1, int y1);
charlesfhda 0:761e771590e5 189
charlesfhda 0:761e771590e5 190 /** Set the current console font.
charlesfhda 0:761e771590e5 191 * @param font Font data, layed out vertically!
charlesfhda 0:761e771590e5 192 * @param width Width of the font characters in pixels.
charlesfhda 0:761e771590e5 193 * Fonts are always (at present) 8 pixels in height.
charlesfhda 0:761e771590e5 194 */
charlesfhda 0:761e771590e5 195 void set_font(unsigned char *font, unsigned int width);
charlesfhda 0:761e771590e5 196
charlesfhda 0:761e771590e5 197 /** Set double height text output.
charlesfhda 0:761e771590e5 198 * @param double_height If 1, calls to putc(), printf() etc will
charlesfhda 0:761e771590e5 199 * result in text taking up 2 lines instead of 1.
charlesfhda 0:761e771590e5 200 */
charlesfhda 0:761e771590e5 201 void set_double_height_text(unsigned int double_height);
charlesfhda 0:761e771590e5 202
charlesfhda 0:761e771590e5 203 /** Put a single character to the screen buffer.
charlesfhda 0:761e771590e5 204 * Repeated calls to putc() will cause the cursor to move across and
charlesfhda 0:761e771590e5 205 * then down as needed, with scrolling.
charlesfhda 0:761e771590e5 206 * @param c The character to write.
charlesfhda 0:761e771590e5 207 */
charlesfhda 0:761e771590e5 208 void putc(unsigned char c);
charlesfhda 0:761e771590e5 209
charlesfhda 0:761e771590e5 210 /** Print to the screen buffer.
charlesfhda 0:761e771590e5 211 * printf() will wrap and scroll the screen as needed to display the text given.
charlesfhda 0:761e771590e5 212 * @param format Format specifier, same as printf() in normal C.
charlesfhda 0:761e771590e5 213 */
charlesfhda 0:761e771590e5 214 void printf(const char *format, ...);
charlesfhda 0:761e771590e5 215
charlesfhda 0:761e771590e5 216 /** Scroll the screen buffer up by one line. */
charlesfhda 0:761e771590e5 217 void scroll_up();
charlesfhda 0:761e771590e5 218
charlesfhda 0:761e771590e5 219 private:
charlesfhda 0:761e771590e5 220 SPI _spi;
charlesfhda 0:761e771590e5 221 DigitalOut _cs, _reset, _dc;
charlesfhda 0:761e771590e5 222 unsigned char _screen[1024];
charlesfhda 0:761e771590e5 223
charlesfhda 0:761e771590e5 224 int _cursor_x, _cursor_y;
charlesfhda 0:761e771590e5 225
charlesfhda 0:761e771590e5 226 void _send_command(unsigned char code);
charlesfhda 0:761e771590e5 227 void _send_data(unsigned char value);
charlesfhda 0:761e771590e5 228
charlesfhda 0:761e771590e5 229 unsigned char *_console_font_data;
charlesfhda 0:761e771590e5 230 unsigned int _console_font_width;
charlesfhda 0:761e771590e5 231 unsigned int _double_height_text;
charlesfhda 0:761e771590e5 232 };
charlesfhda 0:761e771590e5 233
charlesfhda 0:761e771590e5 234 #define SSD1306_LCDWIDTH 128
charlesfhda 0:761e771590e5 235 #define SSD1306_LCDHEIGHT 64
charlesfhda 0:761e771590e5 236
charlesfhda 0:761e771590e5 237 #endif