Seeed Studio's 0.96" OLED module

Dependencies:   Adafruit_GFX

Fork of SSD1308_128x64_I2C by Wim Huiskamp

Committer:
Nathan Yonkee
Date:
Thu Aug 03 06:26:07 2017 -0600
Revision:
14:e283a41c5fbc
Parent:
10:74ef7544744e
add Adafruit_GFX library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tulanthoar 7:dcff685d41a5 1 /** @file SSD1308 I2C device class file
tulanthoar 7:dcff685d41a5 2 * Based on Solomon Systech SSD1308 datasheet, rev. 1, 10/2008
tulanthoar 7:dcff685d41a5 3 * The SSD1308 is used for example in the Seeed 128x64 OLED Display
tulanthoar 7:dcff685d41a5 4 * http://www.seeedstudio.com/depot/grove-oled-display-12864-p-781.html?cPath=163_167
tulanthoar 7:dcff685d41a5 5 */
tulanthoar 7:dcff685d41a5 6 // The original code by Andrew Schamp is using (and has been submitted as a part of) Jeff Rowberg's I2Cdevlib library,
tulanthoar 7:dcff685d41a5 7 // which should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib
tulanthoar 7:dcff685d41a5 8 // Some parts also mashed up from Graphic Library for driving monochrome displays based on the PCD8544,
tulanthoar 7:dcff685d41a5 9 // Copyright (c) 2011, Wim De Roeve, who in turn did partial port of code found on
tulanthoar 7:dcff685d41a5 10 // http://serdisplib.sourceforge.net/ser/pcd8544.html#links and by Petras Saduikis <petras@petras.co.uk>
tulanthoar 7:dcff685d41a5 11 //
tulanthoar 7:dcff685d41a5 12 // Changelog:
tulanthoar 7:dcff685d41a5 13 // 2011-08-25 - Initial release by Andrew Schamp <schamp@gmail.com>
tulanthoar 7:dcff685d41a5 14 // 2012-06-19 - Ported to mbed and optimised (WH)
tulanthoar 7:dcff685d41a5 15 // 2013-07-12 - Minor comment fix and placeholder for SSD1306 (WH)
tulanthoar 7:dcff685d41a5 16 // 2015-01-01 - Switch for optimised I2C calls to test on F401 (WH)
tulanthoar 7:dcff685d41a5 17 //
tulanthoar 7:dcff685d41a5 18 /*
tulanthoar 7:dcff685d41a5 19 ================================================================================
tulanthoar 7:dcff685d41a5 20 I2Cdev device library code is placed under the MIT license
tulanthoar 7:dcff685d41a5 21 Copyright (c) 2011 Andrew Schamp
tulanthoar 7:dcff685d41a5 22 Copyright (c) 2012,2013 WH (mbed port)
tulanthoar 7:dcff685d41a5 23
tulanthoar 7:dcff685d41a5 24 Permission is hereby granted, free of charge, to any person obtaining a copy
tulanthoar 7:dcff685d41a5 25 of this software and associated documentation files (the "Software"), to deal
tulanthoar 7:dcff685d41a5 26 in the Software without restriction, including without limitation the rights
tulanthoar 7:dcff685d41a5 27 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
tulanthoar 7:dcff685d41a5 28 copies of the Software, and to permit persons to whom the Software is
tulanthoar 7:dcff685d41a5 29 furnished to do so, subject to the following conditions:
tulanthoar 7:dcff685d41a5 30
tulanthoar 7:dcff685d41a5 31 The above copyright notice and this permission notice shall be included in
tulanthoar 7:dcff685d41a5 32 all copies or substantial portions of the Software.
tulanthoar 7:dcff685d41a5 33
tulanthoar 7:dcff685d41a5 34 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
tulanthoar 7:dcff685d41a5 35 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
tulanthoar 7:dcff685d41a5 36 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
tulanthoar 7:dcff685d41a5 37 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
tulanthoar 7:dcff685d41a5 38 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
tulanthoar 7:dcff685d41a5 39 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
tulanthoar 7:dcff685d41a5 40 THE SOFTWARE.
tulanthoar 7:dcff685d41a5 41 ================================================================================
tulanthoar 7:dcff685d41a5 42 */
tulanthoar 7:dcff685d41a5 43 #include "mbed.h"
tulanthoar 7:dcff685d41a5 44 #include "SSD1308.h"
tulanthoar 7:dcff685d41a5 45
tulanthoar 7:dcff685d41a5 46 //#include "font_3x5.h"
tulanthoar 7:dcff685d41a5 47 //#include "font_5x7.h"
tulanthoar 7:dcff685d41a5 48 //#include "font_6x8.h"
tulanthoar 7:dcff685d41a5 49 #include "font_8x8.h"
tulanthoar 7:dcff685d41a5 50 //#include "font_8x12.h"
tulanthoar 7:dcff685d41a5 51 //#include "font_16x20.h"
tulanthoar 7:dcff685d41a5 52 #include "font_16x24.h"
tulanthoar 7:dcff685d41a5 53
tulanthoar 7:dcff685d41a5 54 #if defined(TARGET_LPC1768)
tulanthoar 7:dcff685d41a5 55 #define I2C_OPTIMIZE 1
tulanthoar 7:dcff685d41a5 56 #else
tulanthoar 7:dcff685d41a5 57 #define I2C_OPTIMIZE 0
tulanthoar 7:dcff685d41a5 58 #endif
tulanthoar 7:dcff685d41a5 59
tulanthoar 7:dcff685d41a5 60 /**
tulanthoar 7:dcff685d41a5 61 *@brief Constructor
tulanthoar 7:dcff685d41a5 62 *@param I2C &i2c reference to i2c
tulanthoar 7:dcff685d41a5 63 *@param uint8_t deviceAddress slaveaddress
tulanthoar 7:dcff685d41a5 64 */
tulanthoar 10:74ef7544744e 65 SSD1308::SSD1308(I2C * i2c, uint8_t deviceAddress) : _i2c(i2c) {
tulanthoar 7:dcff685d41a5 66
tulanthoar 7:dcff685d41a5 67 _writeOpcode = deviceAddress & 0xFE; // low order bit = 0 for write
tulanthoar 7:dcff685d41a5 68 _readOpcode = deviceAddress | 0x01; // low order bit = 1 for read
tulanthoar 7:dcff685d41a5 69
tulanthoar 7:dcff685d41a5 70 initialize();
tulanthoar 7:dcff685d41a5 71 }
tulanthoar 7:dcff685d41a5 72
tulanthoar 7:dcff685d41a5 73 /** @brief High level Init, most settings remain at Power-On reset value
tulanthoar 7:dcff685d41a5 74 */
tulanthoar 7:dcff685d41a5 75 void SSD1308::initialize() {
tulanthoar 7:dcff685d41a5 76 setHorizontalAddressingMode();
tulanthoar 7:dcff685d41a5 77
tulanthoar 7:dcff685d41a5 78 clearDisplay();
tulanthoar 7:dcff685d41a5 79
tulanthoar 7:dcff685d41a5 80 setInverted(false);
tulanthoar 7:dcff685d41a5 81
tulanthoar 7:dcff685d41a5 82 setDisplayOn();
tulanthoar 7:dcff685d41a5 83 }
tulanthoar 7:dcff685d41a5 84
tulanthoar 7:dcff685d41a5 85
tulanthoar 7:dcff685d41a5 86 /** @brief clear the display
tulanthoar 7:dcff685d41a5 87 */
tulanthoar 7:dcff685d41a5 88 #if (I2C_OPTIMIZE == 0)
tulanthoar 7:dcff685d41a5 89 // Standard version
tulanthoar 7:dcff685d41a5 90 void SSD1308::clearDisplay() {
tulanthoar 7:dcff685d41a5 91
tulanthoar 7:dcff685d41a5 92 //setDisplayOff();
tulanthoar 7:dcff685d41a5 93 setPageAddress(0, MAX_PAGE); // all pages
tulanthoar 7:dcff685d41a5 94 setColumnAddress(0, MAX_COL); // all columns
tulanthoar 7:dcff685d41a5 95
tulanthoar 7:dcff685d41a5 96 for (uint8_t page = 0; page < PAGES; page++) {
tulanthoar 7:dcff685d41a5 97 for (uint8_t col = 0; col < COLUMNS; col++) {
tulanthoar 7:dcff685d41a5 98 _sendData(0x00);
tulanthoar 7:dcff685d41a5 99 }
tulanthoar 7:dcff685d41a5 100 }
tulanthoar 7:dcff685d41a5 101
tulanthoar 7:dcff685d41a5 102 //setDisplayOn();
tulanthoar 7:dcff685d41a5 103 }
tulanthoar 7:dcff685d41a5 104 #else
tulanthoar 7:dcff685d41a5 105 //Optimised version
tulanthoar 7:dcff685d41a5 106 // Save lots of I2C S,P, address and datacommands:
tulanthoar 7:dcff685d41a5 107 // Send S, address, DATA_MODE, data, data, data,...., P
tulanthoar 7:dcff685d41a5 108 //
tulanthoar 7:dcff685d41a5 109 void SSD1308::clearDisplay() {
tulanthoar 7:dcff685d41a5 110
tulanthoar 7:dcff685d41a5 111 //setDisplayOff();
tulanthoar 7:dcff685d41a5 112
tulanthoar 7:dcff685d41a5 113 setPageAddress(0, MAX_PAGE); // all pages
tulanthoar 7:dcff685d41a5 114 setColumnAddress(0, MAX_COL); // all columns
tulanthoar 7:dcff685d41a5 115
tulanthoar 10:74ef7544744e 116 _i2c->start();
tulanthoar 10:74ef7544744e 117 _i2c->write(_writeOpcode);
tulanthoar 10:74ef7544744e 118 _i2c->write(DATA_MODE);
tulanthoar 7:dcff685d41a5 119 for (int i=0; i<(PAGES * COLUMNS); i++) {
tulanthoar 10:74ef7544744e 120 _i2c->write(0x00); // Write Data
tulanthoar 7:dcff685d41a5 121 }
tulanthoar 10:74ef7544744e 122 _i2c->stop();
tulanthoar 7:dcff685d41a5 123
tulanthoar 7:dcff685d41a5 124 //setDisplayOn();
tulanthoar 7:dcff685d41a5 125 }
tulanthoar 7:dcff685d41a5 126 #endif
tulanthoar 7:dcff685d41a5 127
tulanthoar 7:dcff685d41a5 128
tulanthoar 7:dcff685d41a5 129 /** @brief fill the display
tulanthoar 7:dcff685d41a5 130 * @param uint8_t pattern fillpattern vertical patch or 8 bits
tulanthoar 7:dcff685d41a5 131 * @param uint8_t start_page begin page (0..MAX_PAGE)
tulanthoar 7:dcff685d41a5 132 * @param uint8_t end_page end page (start_page..MAX_PAGE)
tulanthoar 7:dcff685d41a5 133 * @param uint8_t start_col begin column (0..MAX_COL)
tulanthoar 7:dcff685d41a5 134 * @param uint8_t end_col end column (start_col..MAX_COL)
tulanthoar 7:dcff685d41a5 135 */
tulanthoar 7:dcff685d41a5 136 #if (I2C_OPTIMIZE == 0)
tulanthoar 7:dcff685d41a5 137 //Standard version
tulanthoar 7:dcff685d41a5 138
tulanthoar 7:dcff685d41a5 139 void SSD1308::fillDisplay(uint8_t pattern,
tulanthoar 7:dcff685d41a5 140 uint8_t start_page, uint8_t end_page,
tulanthoar 7:dcff685d41a5 141 uint8_t start_col, uint8_t end_col) {
tulanthoar 7:dcff685d41a5 142
tulanthoar 7:dcff685d41a5 143 int count = (end_page - start_page + 1) * (end_col - start_col + 1);
tulanthoar 7:dcff685d41a5 144
tulanthoar 7:dcff685d41a5 145 //setDisplayOff();
tulanthoar 7:dcff685d41a5 146 setPageAddress(start_page, end_page); // set page window
tulanthoar 7:dcff685d41a5 147 setColumnAddress(start_col, end_col); // set column window
tulanthoar 7:dcff685d41a5 148
tulanthoar 7:dcff685d41a5 149 for (int i=0; i<count; i++) {
tulanthoar 7:dcff685d41a5 150 _sendData(pattern); // Write Data
tulanthoar 7:dcff685d41a5 151 }
tulanthoar 7:dcff685d41a5 152
tulanthoar 7:dcff685d41a5 153 //setDisplayOn();
tulanthoar 7:dcff685d41a5 154 }
tulanthoar 7:dcff685d41a5 155
tulanthoar 7:dcff685d41a5 156 #else
tulanthoar 7:dcff685d41a5 157
tulanthoar 7:dcff685d41a5 158 //Optimised version
tulanthoar 7:dcff685d41a5 159 // Save lots of I2C S,P, address and datacommands:
tulanthoar 7:dcff685d41a5 160 // Send S, address, DATA_MODE, data, data, data,...., P
tulanthoar 7:dcff685d41a5 161 //
tulanthoar 7:dcff685d41a5 162 void SSD1308::fillDisplay(uint8_t pattern,
tulanthoar 7:dcff685d41a5 163 uint8_t start_page, uint8_t end_page,
tulanthoar 7:dcff685d41a5 164 uint8_t start_col, uint8_t end_col) {
tulanthoar 7:dcff685d41a5 165
tulanthoar 7:dcff685d41a5 166 int count = (end_page - start_page + 1) * (end_col - start_col + 1);
tulanthoar 7:dcff685d41a5 167
tulanthoar 7:dcff685d41a5 168 //setDisplayOff();
tulanthoar 7:dcff685d41a5 169 setPageAddress(start_page, end_page); // set page window
tulanthoar 7:dcff685d41a5 170 setColumnAddress(start_col, end_col); // set column window
tulanthoar 7:dcff685d41a5 171
tulanthoar 10:74ef7544744e 172 _i2c->start();
tulanthoar 10:74ef7544744e 173 _i2c->write(_writeOpcode);
tulanthoar 10:74ef7544744e 174 _i2c->write(DATA_MODE);
tulanthoar 7:dcff685d41a5 175 for (int i=0; i<count; i++) {
tulanthoar 10:74ef7544744e 176 _i2c->write(pattern); // Write Data
tulanthoar 7:dcff685d41a5 177 }
tulanthoar 10:74ef7544744e 178 _i2c->stop();
tulanthoar 7:dcff685d41a5 179
tulanthoar 7:dcff685d41a5 180 //setDisplayOn();
tulanthoar 7:dcff685d41a5 181 }
tulanthoar 7:dcff685d41a5 182
tulanthoar 7:dcff685d41a5 183 #endif
tulanthoar 7:dcff685d41a5 184
tulanthoar 7:dcff685d41a5 185
tulanthoar 7:dcff685d41a5 186 /** @brief write a bitmap to the display
tulanthoar 7:dcff685d41a5 187 * @param uint8_t* data pointer to bitmap
tulanthoar 7:dcff685d41a5 188 * @param uint8_t start_page begin page (0..MAX_PAGE)
tulanthoar 7:dcff685d41a5 189 * @param uint8_t end_page end page (start_page..MAX_PAGE)
tulanthoar 7:dcff685d41a5 190 * @param uint8_t start_col begin column (0..MAX_COL)
tulanthoar 7:dcff685d41a5 191 * @param uint8_t end_col end column (start_col..MAX_COL)
tulanthoar 7:dcff685d41a5 192 */
tulanthoar 7:dcff685d41a5 193 #if (I2C_OPTIMIZE == 0)
tulanthoar 7:dcff685d41a5 194 //Standard version
tulanthoar 7:dcff685d41a5 195 void SSD1308::writeBitmap(uint8_t* data,
tulanthoar 7:dcff685d41a5 196 uint8_t start_page, uint8_t end_page,
tulanthoar 7:dcff685d41a5 197 uint8_t start_col, uint8_t end_col) {
tulanthoar 7:dcff685d41a5 198
tulanthoar 7:dcff685d41a5 199 int count = (end_page - start_page + 1) * (end_col - start_col + 1);
tulanthoar 7:dcff685d41a5 200
tulanthoar 7:dcff685d41a5 201 //setDisplayOff();
tulanthoar 7:dcff685d41a5 202 setPageAddress(start_page, end_page); // set page window
tulanthoar 7:dcff685d41a5 203 setColumnAddress(start_col, end_col); // set column window
tulanthoar 7:dcff685d41a5 204
tulanthoar 7:dcff685d41a5 205 for (int i=0; i<count; i++) {
tulanthoar 7:dcff685d41a5 206 _sendData(data[i]); // Write Data
tulanthoar 7:dcff685d41a5 207 }
tulanthoar 7:dcff685d41a5 208
tulanthoar 7:dcff685d41a5 209 //setDisplayOn();
tulanthoar 7:dcff685d41a5 210 }
tulanthoar 7:dcff685d41a5 211
tulanthoar 7:dcff685d41a5 212 #else
tulanthoar 7:dcff685d41a5 213 //Optimised version
tulanthoar 7:dcff685d41a5 214 // Save lots of I2C S,P, address and datacommands:
tulanthoar 7:dcff685d41a5 215 // Send S, address, DATA_MODE, data, data, data,...., P
tulanthoar 7:dcff685d41a5 216 //
tulanthoar 7:dcff685d41a5 217 void SSD1308::writeBitmap(uint8_t* data,
tulanthoar 7:dcff685d41a5 218 uint8_t start_page, uint8_t end_page,
tulanthoar 7:dcff685d41a5 219 uint8_t start_col, uint8_t end_col) {
tulanthoar 7:dcff685d41a5 220
tulanthoar 7:dcff685d41a5 221 int count = (end_page - start_page + 1) * (end_col - start_col + 1);
tulanthoar 7:dcff685d41a5 222
tulanthoar 7:dcff685d41a5 223 //setDisplayOff();
tulanthoar 7:dcff685d41a5 224 setPageAddress(start_page, end_page); // set page window
tulanthoar 7:dcff685d41a5 225 setColumnAddress(start_col, end_col); // set column window
tulanthoar 7:dcff685d41a5 226
tulanthoar 10:74ef7544744e 227 _i2c->start();
tulanthoar 10:74ef7544744e 228 _i2c->write(_writeOpcode);
tulanthoar 10:74ef7544744e 229 _i2c->write(DATA_MODE);
tulanthoar 7:dcff685d41a5 230 for (int i=0; i<count; i++) {
tulanthoar 10:74ef7544744e 231 _i2c->write(data[i]); // Write Data
tulanthoar 7:dcff685d41a5 232 }
tulanthoar 10:74ef7544744e 233 _i2c->stop();
tulanthoar 7:dcff685d41a5 234
tulanthoar 7:dcff685d41a5 235 //setDisplayOn();
tulanthoar 7:dcff685d41a5 236 }
tulanthoar 7:dcff685d41a5 237
tulanthoar 7:dcff685d41a5 238 #endif
tulanthoar 7:dcff685d41a5 239
tulanthoar 7:dcff685d41a5 240
tulanthoar 7:dcff685d41a5 241 /** @brief write a progressbar to the display, Width is (PRG_MAX_SCALE + 2) pixels
tulanthoar 7:dcff685d41a5 242 * @param uint8_t page begin page (0..MAX_PAGE)
tulanthoar 7:dcff685d41a5 243 * @param uint8_t col begin column (0..MAX_COL)
tulanthoar 7:dcff685d41a5 244 * @param int percentage value (0..100)
tulanthoar 7:dcff685d41a5 245 */
tulanthoar 7:dcff685d41a5 246 #define PRG_MAX_SCALE 50
tulanthoar 7:dcff685d41a5 247 #define PRG_LEFT_EDGE 0xFF
tulanthoar 7:dcff685d41a5 248 #define PRG_RIGHT_EDGE 0xFF
tulanthoar 7:dcff685d41a5 249 #define PRG_ACTIVE 0xFF
tulanthoar 7:dcff685d41a5 250 //#define PRG_ACTIVE 0xBD
tulanthoar 7:dcff685d41a5 251 #define PRG_NOT_ACTIVE 0x81
tulanthoar 7:dcff685d41a5 252
tulanthoar 7:dcff685d41a5 253 #if (I2C_OPTIMIZE == 0)
tulanthoar 7:dcff685d41a5 254 //Standard version
tulanthoar 7:dcff685d41a5 255 void SSD1308::writeProgressBar(uint8_t page, uint8_t col, int percentage) {
tulanthoar 7:dcff685d41a5 256 uint8_t scale_value;
tulanthoar 7:dcff685d41a5 257
tulanthoar 7:dcff685d41a5 258 if (percentage <= 0) {
tulanthoar 7:dcff685d41a5 259 scale_value = 0;
tulanthoar 7:dcff685d41a5 260 } else if (percentage >= 100) {
tulanthoar 7:dcff685d41a5 261 scale_value = PRG_MAX_SCALE - 1;
tulanthoar 7:dcff685d41a5 262 } else {
tulanthoar 7:dcff685d41a5 263 scale_value = (percentage * PRG_MAX_SCALE) / 100;
tulanthoar 7:dcff685d41a5 264 }
tulanthoar 7:dcff685d41a5 265
tulanthoar 7:dcff685d41a5 266 //setDisplayOff();
tulanthoar 7:dcff685d41a5 267 setPageAddress(page, page);
tulanthoar 7:dcff685d41a5 268 setColumnAddress(col, MAX_COL);
tulanthoar 7:dcff685d41a5 269
tulanthoar 7:dcff685d41a5 270 _sendData(PRG_LEFT_EDGE);
tulanthoar 7:dcff685d41a5 271
tulanthoar 7:dcff685d41a5 272 for (uint8_t col = 0; col < scale_value; col++) {
tulanthoar 7:dcff685d41a5 273 _sendData(PRG_ACTIVE);
tulanthoar 7:dcff685d41a5 274 }
tulanthoar 7:dcff685d41a5 275
tulanthoar 7:dcff685d41a5 276 _sendData(PRG_ACTIVE);
tulanthoar 7:dcff685d41a5 277
tulanthoar 7:dcff685d41a5 278 for (uint8_t col = (scale_value+1); col < PRG_MAX_SCALE; col++) {
tulanthoar 7:dcff685d41a5 279 _sendData(PRG_NOT_ACTIVE);
tulanthoar 7:dcff685d41a5 280 }
tulanthoar 7:dcff685d41a5 281
tulanthoar 7:dcff685d41a5 282 _sendData(PRG_RIGHT_EDGE);
tulanthoar 7:dcff685d41a5 283
tulanthoar 7:dcff685d41a5 284 //setDisplayOn();
tulanthoar 7:dcff685d41a5 285 }
tulanthoar 7:dcff685d41a5 286 #else
tulanthoar 7:dcff685d41a5 287
tulanthoar 7:dcff685d41a5 288 //Optimised version
tulanthoar 7:dcff685d41a5 289 // Save lots of I2C S,P, address and datacommands:
tulanthoar 7:dcff685d41a5 290 // Send S, address, DATA_MODE, data, data, data,...., P
tulanthoar 7:dcff685d41a5 291 //
tulanthoar 7:dcff685d41a5 292 void SSD1308::writeProgressBar(uint8_t page, uint8_t col, int percentage) {
tulanthoar 7:dcff685d41a5 293 uint8_t scale_value;
tulanthoar 7:dcff685d41a5 294
tulanthoar 7:dcff685d41a5 295 if (percentage <= 0) {
tulanthoar 7:dcff685d41a5 296 scale_value = 0;
tulanthoar 7:dcff685d41a5 297 } else if (percentage >= 100) {
tulanthoar 7:dcff685d41a5 298 scale_value = PRG_MAX_SCALE - 1 ;
tulanthoar 7:dcff685d41a5 299 } else {
tulanthoar 7:dcff685d41a5 300 scale_value = (percentage * PRG_MAX_SCALE) / 100;
tulanthoar 7:dcff685d41a5 301 }
tulanthoar 7:dcff685d41a5 302
tulanthoar 7:dcff685d41a5 303 //setDisplayOff();
tulanthoar 7:dcff685d41a5 304 setPageAddress(page, page);
tulanthoar 7:dcff685d41a5 305 setColumnAddress(col, MAX_COL);
tulanthoar 7:dcff685d41a5 306
tulanthoar 10:74ef7544744e 307 _i2c->start();
tulanthoar 10:74ef7544744e 308 _i2c->write(_writeOpcode);
tulanthoar 10:74ef7544744e 309 _i2c->write(DATA_MODE);
tulanthoar 7:dcff685d41a5 310
tulanthoar 10:74ef7544744e 311 _i2c->write(PRG_LEFT_EDGE); // Write Data
tulanthoar 7:dcff685d41a5 312
tulanthoar 7:dcff685d41a5 313 for (uint8_t col = 0; col < scale_value; col++) {
tulanthoar 10:74ef7544744e 314 _i2c->write(PRG_ACTIVE); // Write Data
tulanthoar 7:dcff685d41a5 315 }
tulanthoar 7:dcff685d41a5 316
tulanthoar 10:74ef7544744e 317 _i2c->write(PRG_ACTIVE); // Write Data
tulanthoar 7:dcff685d41a5 318
tulanthoar 7:dcff685d41a5 319 for (uint8_t col = (scale_value+1); col < PRG_MAX_SCALE; col++) {
tulanthoar 10:74ef7544744e 320 _i2c->write(PRG_NOT_ACTIVE); // Write Data
tulanthoar 7:dcff685d41a5 321 }
tulanthoar 7:dcff685d41a5 322
tulanthoar 10:74ef7544744e 323 _i2c->write(PRG_RIGHT_EDGE); // Write Data
tulanthoar 7:dcff685d41a5 324
tulanthoar 10:74ef7544744e 325 _i2c->stop();
tulanthoar 7:dcff685d41a5 326
tulanthoar 7:dcff685d41a5 327 //setDisplayOn();
tulanthoar 7:dcff685d41a5 328 }
tulanthoar 7:dcff685d41a5 329 #endif
tulanthoar 7:dcff685d41a5 330
tulanthoar 7:dcff685d41a5 331 /** @brief write a level meter to the display, Width is (PRG_MAX_SCALE + 2) pixels
tulanthoar 7:dcff685d41a5 332 * @param uint8_t page begin page (0..MAX_PAGE)
tulanthoar 7:dcff685d41a5 333 * @param uint8_t col begin column (0..MAX_COL)
tulanthoar 7:dcff685d41a5 334 * @param int percentage value (0..100)
tulanthoar 7:dcff685d41a5 335 */
tulanthoar 7:dcff685d41a5 336 #if (I2C_OPTIMIZE == 0)
tulanthoar 7:dcff685d41a5 337 void SSD1308::writeLevelBar(uint8_t page, uint8_t col, int percentage) {
tulanthoar 7:dcff685d41a5 338 uint8_t scale_value;
tulanthoar 7:dcff685d41a5 339
tulanthoar 7:dcff685d41a5 340 if (percentage <= 0) {
tulanthoar 7:dcff685d41a5 341 scale_value = 0;
tulanthoar 7:dcff685d41a5 342 } else if (percentage >= 100) {
tulanthoar 7:dcff685d41a5 343 scale_value = PRG_MAX_SCALE - 1;
tulanthoar 7:dcff685d41a5 344 } else {
tulanthoar 7:dcff685d41a5 345 scale_value = (percentage * PRG_MAX_SCALE) / 100;
tulanthoar 7:dcff685d41a5 346 }
tulanthoar 7:dcff685d41a5 347
tulanthoar 7:dcff685d41a5 348 //setDisplayOff();
tulanthoar 7:dcff685d41a5 349 setPageAddress(page, page);
tulanthoar 7:dcff685d41a5 350 setColumnAddress(col, MAX_COL);
tulanthoar 7:dcff685d41a5 351
tulanthoar 7:dcff685d41a5 352 _sendData(PRG_LEFT_EDGE);
tulanthoar 7:dcff685d41a5 353
tulanthoar 7:dcff685d41a5 354 for (uint8_t col = 0; col < scale_value; col++) {
tulanthoar 7:dcff685d41a5 355 _sendData(PRG_NOT_ACTIVE); // Write Data
tulanthoar 7:dcff685d41a5 356 }
tulanthoar 7:dcff685d41a5 357
tulanthoar 7:dcff685d41a5 358 _sendData(PRG_ACTIVE); // Write Data at active meterlevel
tulanthoar 7:dcff685d41a5 359
tulanthoar 7:dcff685d41a5 360 for (uint8_t col = scale_value+1; col < PRG_MAX_SCALE; col++) {
tulanthoar 7:dcff685d41a5 361 _sendData(PRG_NOT_ACTIVE);
tulanthoar 7:dcff685d41a5 362 }
tulanthoar 7:dcff685d41a5 363
tulanthoar 7:dcff685d41a5 364 _sendData(PRG_RIGHT_EDGE);
tulanthoar 7:dcff685d41a5 365
tulanthoar 7:dcff685d41a5 366 //setDisplayOn();
tulanthoar 7:dcff685d41a5 367 }
tulanthoar 7:dcff685d41a5 368 #else
tulanthoar 7:dcff685d41a5 369 //Optimised version
tulanthoar 7:dcff685d41a5 370 // Save lots of I2C S,P, address and datacommands:
tulanthoar 7:dcff685d41a5 371 // Send S, address, DATA_MODE, data, data, data,...., P
tulanthoar 7:dcff685d41a5 372 //
tulanthoar 7:dcff685d41a5 373 void SSD1308::writeLevelBar(uint8_t page, uint8_t col, int percentage) {
tulanthoar 7:dcff685d41a5 374 uint8_t scale_value;
tulanthoar 7:dcff685d41a5 375
tulanthoar 7:dcff685d41a5 376 if (percentage <= 0) {
tulanthoar 7:dcff685d41a5 377 scale_value = 0;
tulanthoar 7:dcff685d41a5 378 } else if (percentage >= 100) {
tulanthoar 7:dcff685d41a5 379 scale_value = PRG_MAX_SCALE - 1;
tulanthoar 7:dcff685d41a5 380 } else {
tulanthoar 7:dcff685d41a5 381 scale_value = (percentage * PRG_MAX_SCALE) / 100;
tulanthoar 7:dcff685d41a5 382 }
tulanthoar 7:dcff685d41a5 383
tulanthoar 7:dcff685d41a5 384 //setDisplayOff();
tulanthoar 7:dcff685d41a5 385 setPageAddress(page, page);
tulanthoar 7:dcff685d41a5 386 setColumnAddress(col, MAX_COL);
tulanthoar 7:dcff685d41a5 387
tulanthoar 10:74ef7544744e 388 _i2c->start();
tulanthoar 10:74ef7544744e 389 _i2c->write(_writeOpcode);
tulanthoar 10:74ef7544744e 390 _i2c->write(DATA_MODE);
tulanthoar 7:dcff685d41a5 391
tulanthoar 10:74ef7544744e 392 _i2c->write(PRG_LEFT_EDGE); // Write Data
tulanthoar 7:dcff685d41a5 393
tulanthoar 7:dcff685d41a5 394 for (uint8_t col = 0; col < scale_value; col++) {
tulanthoar 10:74ef7544744e 395 _i2c->write(PRG_NOT_ACTIVE); // Write Data
tulanthoar 7:dcff685d41a5 396 }
tulanthoar 7:dcff685d41a5 397
tulanthoar 10:74ef7544744e 398 _i2c->write(PRG_ACTIVE); // Write Data at active meterlevel
tulanthoar 7:dcff685d41a5 399
tulanthoar 7:dcff685d41a5 400 for (uint8_t col = scale_value+1; col < PRG_MAX_SCALE; col++) {
tulanthoar 10:74ef7544744e 401 _i2c->write(PRG_NOT_ACTIVE); // Write Data
tulanthoar 7:dcff685d41a5 402 }
tulanthoar 7:dcff685d41a5 403
tulanthoar 10:74ef7544744e 404 _i2c->write(PRG_RIGHT_EDGE); // Write Data
tulanthoar 7:dcff685d41a5 405
tulanthoar 10:74ef7544744e 406 _i2c->stop();
tulanthoar 7:dcff685d41a5 407
tulanthoar 7:dcff685d41a5 408 //setDisplayOn();
tulanthoar 7:dcff685d41a5 409 }
tulanthoar 7:dcff685d41a5 410 #endif
tulanthoar 7:dcff685d41a5 411
tulanthoar 7:dcff685d41a5 412 /** @brief Write single character to the display using the 8x8 fontable
tulanthoar 7:dcff685d41a5 413 * @brief Start at current cursor location
tulanthoar 7:dcff685d41a5 414 * @param char chr character to write
tulanthoar 7:dcff685d41a5 415 */
tulanthoar 7:dcff685d41a5 416 void SSD1308::writeChar(char chr) {
tulanthoar 7:dcff685d41a5 417
tulanthoar 7:dcff685d41a5 418 const uint8_t char_index = chr - 0x20;
tulanthoar 7:dcff685d41a5 419
tulanthoar 7:dcff685d41a5 420 for (uint8_t i = 0; i < 8; i++) {
tulanthoar 7:dcff685d41a5 421 if (_inverted) {
tulanthoar 7:dcff685d41a5 422 _sendData( ~font_8x8[char_index][i] );
tulanthoar 7:dcff685d41a5 423 } else {
tulanthoar 7:dcff685d41a5 424 _sendData( font_8x8[char_index][i] );
tulanthoar 7:dcff685d41a5 425 }
tulanthoar 7:dcff685d41a5 426 }
tulanthoar 7:dcff685d41a5 427
tulanthoar 7:dcff685d41a5 428 }
tulanthoar 7:dcff685d41a5 429
tulanthoar 7:dcff685d41a5 430
tulanthoar 7:dcff685d41a5 431 /** @brief Write a string to the display using the 8x8 font
tulanthoar 7:dcff685d41a5 432 * @brief Start at selected cursor location, text will wrap around until it is done
tulanthoar 7:dcff685d41a5 433 * @param uint8_t row row number (0...ROWS/FONT_HEIGHT)
tulanthoar 7:dcff685d41a5 434 * @param uint8_t col column number (0...COLUMNS/FONT_WIDTH)
tulanthoar 7:dcff685d41a5 435 * @param const char * text pointer to text
tulanthoar 7:dcff685d41a5 436 */
tulanthoar 7:dcff685d41a5 437 void SSD1308::writeString(uint8_t row, uint8_t col, const char * text) {
tulanthoar 7:dcff685d41a5 438 uint16_t index = 0;
tulanthoar 7:dcff685d41a5 439 uint16_t len = strlen(text);
tulanthoar 7:dcff685d41a5 440
tulanthoar 7:dcff685d41a5 441 setPageAddress(row, MAX_PAGE);
tulanthoar 7:dcff685d41a5 442 const uint8_t col_addr = FONT8x8_WIDTH*col;
tulanthoar 7:dcff685d41a5 443 setColumnAddress(col_addr, MAX_COL);
tulanthoar 7:dcff685d41a5 444
tulanthoar 7:dcff685d41a5 445 while ((col+index) < CHARS && (index < len)) {
tulanthoar 7:dcff685d41a5 446 // write first line, starting at given position
tulanthoar 7:dcff685d41a5 447 writeChar(text[index++]);
tulanthoar 7:dcff685d41a5 448 }
tulanthoar 7:dcff685d41a5 449
tulanthoar 7:dcff685d41a5 450 // write remaining lines
tulanthoar 7:dcff685d41a5 451 // write until the end of memory
tulanthoar 7:dcff685d41a5 452 // then wrap around again from the top.
tulanthoar 7:dcff685d41a5 453 if (index + 1 < len) {
tulanthoar 7:dcff685d41a5 454 setPageAddress(row + 1, MAX_PAGE);
tulanthoar 7:dcff685d41a5 455 setColumnAddress(0, MAX_COL);
tulanthoar 7:dcff685d41a5 456 bool wrapEntireScreen = false;
tulanthoar 7:dcff685d41a5 457 while (index + 1 < len) {
tulanthoar 7:dcff685d41a5 458 writeChar(text[index++]);
tulanthoar 7:dcff685d41a5 459 // if we've written the last character space on the screen,
tulanthoar 7:dcff685d41a5 460 // reset the page and column address so that it wraps around from the top again
tulanthoar 7:dcff685d41a5 461 if (!wrapEntireScreen && (row*CHARS + col + index) > 127) {
tulanthoar 7:dcff685d41a5 462 setPageAddress(0, MAX_PAGE);
tulanthoar 7:dcff685d41a5 463 setColumnAddress(0, MAX_COL);
tulanthoar 7:dcff685d41a5 464 wrapEntireScreen = true;
tulanthoar 7:dcff685d41a5 465 }
tulanthoar 7:dcff685d41a5 466 }
tulanthoar 7:dcff685d41a5 467 }
tulanthoar 7:dcff685d41a5 468 }
tulanthoar 7:dcff685d41a5 469
tulanthoar 7:dcff685d41a5 470
tulanthoar 7:dcff685d41a5 471
tulanthoar 7:dcff685d41a5 472 /** @brief Write large character (16x24 font)
tulanthoar 7:dcff685d41a5 473 * @param uint8_t row row number (0...MAX_ROW)
tulanthoar 7:dcff685d41a5 474 * @param uint8_t col column number (0...MAX_COL)
tulanthoar 7:dcff685d41a5 475 * @param char chr Used for displaying numbers 0 - 9 and '+', '-', '.'
tulanthoar 7:dcff685d41a5 476 */
tulanthoar 7:dcff685d41a5 477 void SSD1308::writeBigChar(uint8_t row, uint8_t col, char chr) {
tulanthoar 7:dcff685d41a5 478
tulanthoar 7:dcff685d41a5 479 writeBitmap((uint8_t*) font_16x24[int(chr) - FONT16x24_START],
tulanthoar 7:dcff685d41a5 480 row, (row + FONT16x24_BYTES - 1),
tulanthoar 7:dcff685d41a5 481 col, (col + FONT16x24_WIDTH - 1));
tulanthoar 7:dcff685d41a5 482 }
tulanthoar 7:dcff685d41a5 483
tulanthoar 7:dcff685d41a5 484
tulanthoar 7:dcff685d41a5 485 /** @brief Write command that has no parameters
tulanthoar 7:dcff685d41a5 486 */
tulanthoar 7:dcff685d41a5 487 void SSD1308::_sendCommand(uint8_t command) {
tulanthoar 7:dcff685d41a5 488 // I2Cdev::writeByte(m_devAddr, COMMAND_MODE, command);
tulanthoar 7:dcff685d41a5 489
tulanthoar 7:dcff685d41a5 490 #if (I2C_OPTIMIZE == 0)
tulanthoar 7:dcff685d41a5 491 char databytes[2];
tulanthoar 7:dcff685d41a5 492
tulanthoar 7:dcff685d41a5 493 databytes[0] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 494 databytes[1] = command;
tulanthoar 10:74ef7544744e 495 _i2c->write(_writeOpcode, databytes, 2); // Write command
tulanthoar 7:dcff685d41a5 496 #else
tulanthoar 7:dcff685d41a5 497
tulanthoar 10:74ef7544744e 498 _i2c->start();
tulanthoar 10:74ef7544744e 499 _i2c->write(_writeOpcode);
tulanthoar 7:dcff685d41a5 500
tulanthoar 10:74ef7544744e 501 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 502 _i2c->write(command); // Write Command
tulanthoar 7:dcff685d41a5 503
tulanthoar 10:74ef7544744e 504 _i2c->stop();
tulanthoar 7:dcff685d41a5 505 #endif
tulanthoar 7:dcff685d41a5 506 }
tulanthoar 7:dcff685d41a5 507
tulanthoar 7:dcff685d41a5 508 /** @brief Write command that has one parameter
tulanthoar 7:dcff685d41a5 509 */
tulanthoar 7:dcff685d41a5 510 void SSD1308::_sendCommand(uint8_t command, uint8_t param1) {
tulanthoar 7:dcff685d41a5 511
tulanthoar 7:dcff685d41a5 512 // Note continuationbit is set, so COMMAND_MODE must be
tulanthoar 7:dcff685d41a5 513 // repeated before each databyte that serves as parameter!
tulanthoar 7:dcff685d41a5 514 #if (I2C_OPTIMIZE == 0)
tulanthoar 7:dcff685d41a5 515 char databytes[4];
tulanthoar 7:dcff685d41a5 516
tulanthoar 7:dcff685d41a5 517 databytes[0] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 518 databytes[1] = command;
tulanthoar 7:dcff685d41a5 519 databytes[2] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 520 databytes[3] = param1;
tulanthoar 10:74ef7544744e 521 _i2c->write(_writeOpcode, databytes, 4); // Write command
tulanthoar 7:dcff685d41a5 522 #else
tulanthoar 7:dcff685d41a5 523
tulanthoar 10:74ef7544744e 524 _i2c->start();
tulanthoar 10:74ef7544744e 525 _i2c->write(_writeOpcode);
tulanthoar 7:dcff685d41a5 526
tulanthoar 10:74ef7544744e 527 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 528 _i2c->write(command); // Write Command
tulanthoar 10:74ef7544744e 529 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 530 _i2c->write(param1); // Write Param1
tulanthoar 7:dcff685d41a5 531
tulanthoar 10:74ef7544744e 532 _i2c->stop();
tulanthoar 7:dcff685d41a5 533 #endif
tulanthoar 7:dcff685d41a5 534 }
tulanthoar 7:dcff685d41a5 535
tulanthoar 7:dcff685d41a5 536 /** @brief Write command that has two parameters
tulanthoar 7:dcff685d41a5 537 */
tulanthoar 7:dcff685d41a5 538 void SSD1308::_sendCommand(uint8_t command, uint8_t param1, uint8_t param2) {
tulanthoar 7:dcff685d41a5 539
tulanthoar 7:dcff685d41a5 540 // Note continuationbit is set, so COMMAND_MODE must be
tulanthoar 7:dcff685d41a5 541 // repeated before each databyte that serves as parameter!
tulanthoar 7:dcff685d41a5 542 #if (I2C_OPTIMIZE == 0)
tulanthoar 7:dcff685d41a5 543 char databytes[6];
tulanthoar 7:dcff685d41a5 544
tulanthoar 7:dcff685d41a5 545 databytes[0] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 546 databytes[1] = command;
tulanthoar 7:dcff685d41a5 547 databytes[2] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 548 databytes[3] = param1;
tulanthoar 7:dcff685d41a5 549 databytes[4] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 550 databytes[5] = param2;
tulanthoar 10:74ef7544744e 551 _i2c->write(_writeOpcode, databytes, 6); // Write command
tulanthoar 7:dcff685d41a5 552 #else
tulanthoar 10:74ef7544744e 553 _i2c->start();
tulanthoar 10:74ef7544744e 554 _i2c->write(_writeOpcode);
tulanthoar 7:dcff685d41a5 555
tulanthoar 10:74ef7544744e 556 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 557 _i2c->write(command); // Write Command
tulanthoar 10:74ef7544744e 558 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 559 _i2c->write(param1); // Write Param1
tulanthoar 10:74ef7544744e 560 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 561 _i2c->write(param2); // Write Param2
tulanthoar 7:dcff685d41a5 562
tulanthoar 10:74ef7544744e 563 _i2c->stop();
tulanthoar 7:dcff685d41a5 564 #endif
tulanthoar 7:dcff685d41a5 565 }
tulanthoar 7:dcff685d41a5 566
tulanthoar 7:dcff685d41a5 567 /** @brief Write command that has five parameters
tulanthoar 7:dcff685d41a5 568 */
tulanthoar 7:dcff685d41a5 569 void SSD1308::_sendCommand(uint8_t command, uint8_t param1, uint8_t param2,
tulanthoar 7:dcff685d41a5 570 uint8_t param3, uint8_t param4,
tulanthoar 7:dcff685d41a5 571 uint8_t param5) {
tulanthoar 7:dcff685d41a5 572
tulanthoar 7:dcff685d41a5 573 // Note continuationbit is set, so COMMAND_MODE must be
tulanthoar 7:dcff685d41a5 574 // repeated before each databyte that serves as parameter!
tulanthoar 7:dcff685d41a5 575 #if (I2C_OPTIMIZE == 0)
tulanthoar 7:dcff685d41a5 576 char databytes[12];
tulanthoar 7:dcff685d41a5 577
tulanthoar 7:dcff685d41a5 578 databytes[0] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 579 databytes[1] = command;
tulanthoar 7:dcff685d41a5 580 databytes[2] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 581 databytes[3] = param1;
tulanthoar 7:dcff685d41a5 582 databytes[4] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 583 databytes[5] = param2;
tulanthoar 7:dcff685d41a5 584 databytes[6] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 585 databytes[7] = param3;
tulanthoar 7:dcff685d41a5 586 databytes[8] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 587 databytes[9] = param4;
tulanthoar 7:dcff685d41a5 588 databytes[10] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 589 databytes[11] = param5;
tulanthoar 10:74ef7544744e 590 _i2c->write(_writeOpcode, databytes, 12); // Write command
tulanthoar 7:dcff685d41a5 591 #else
tulanthoar 10:74ef7544744e 592 _i2c->start();
tulanthoar 10:74ef7544744e 593 _i2c->write(_writeOpcode);
tulanthoar 7:dcff685d41a5 594
tulanthoar 10:74ef7544744e 595 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 596 _i2c->write(command); // Write Command
tulanthoar 10:74ef7544744e 597 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 598 _i2c->write(param1); // Write Param1
tulanthoar 10:74ef7544744e 599 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 600 _i2c->write(param2); // Write Param2
tulanthoar 10:74ef7544744e 601 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 602 _i2c->write(param3); // Write Param3
tulanthoar 10:74ef7544744e 603 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 604 _i2c->write(param4); // Write Param4
tulanthoar 10:74ef7544744e 605 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 606 _i2c->write(param5); // Write Param5
tulanthoar 7:dcff685d41a5 607
tulanthoar 10:74ef7544744e 608 _i2c->stop();
tulanthoar 7:dcff685d41a5 609 #endif
tulanthoar 7:dcff685d41a5 610 }
tulanthoar 7:dcff685d41a5 611
tulanthoar 7:dcff685d41a5 612
tulanthoar 7:dcff685d41a5 613 /** @brief Write command that has six parameters
tulanthoar 7:dcff685d41a5 614 */
tulanthoar 7:dcff685d41a5 615 void SSD1308::_sendCommand(uint8_t command, uint8_t param1, uint8_t param2,
tulanthoar 7:dcff685d41a5 616 uint8_t param3, uint8_t param4,
tulanthoar 7:dcff685d41a5 617 uint8_t param5, uint8_t param6) {
tulanthoar 7:dcff685d41a5 618
tulanthoar 7:dcff685d41a5 619 // Note continuationbit is set, so COMMAND_MODE must be
tulanthoar 7:dcff685d41a5 620 // repeated before each databyte that serves as parameter!
tulanthoar 7:dcff685d41a5 621 #if (I2C_OPTIMIZE == 0)
tulanthoar 7:dcff685d41a5 622 char databytes[14];
tulanthoar 7:dcff685d41a5 623
tulanthoar 7:dcff685d41a5 624 databytes[0] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 625 databytes[1] = command;
tulanthoar 7:dcff685d41a5 626 databytes[2] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 627 databytes[3] = param1;
tulanthoar 7:dcff685d41a5 628 databytes[4] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 629 databytes[5] = param2;
tulanthoar 7:dcff685d41a5 630 databytes[6] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 631 databytes[7] = param3;
tulanthoar 7:dcff685d41a5 632 databytes[8] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 633 databytes[9] = param4;
tulanthoar 7:dcff685d41a5 634 databytes[10] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 635 databytes[11] = param5;
tulanthoar 7:dcff685d41a5 636 databytes[12] = COMMAND_MODE;
tulanthoar 7:dcff685d41a5 637 databytes[13] = param6;
tulanthoar 10:74ef7544744e 638 _i2c->write(_writeOpcode, databytes, 14); // Write command
tulanthoar 7:dcff685d41a5 639 #else
tulanthoar 10:74ef7544744e 640 _i2c->start();
tulanthoar 10:74ef7544744e 641 _i2c->write(_writeOpcode);
tulanthoar 7:dcff685d41a5 642
tulanthoar 10:74ef7544744e 643 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 644 _i2c->write(command); // Write Command
tulanthoar 10:74ef7544744e 645 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 646 _i2c->write(param1); // Write Param1
tulanthoar 10:74ef7544744e 647 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 648 _i2c->write(param2); // Write Param2
tulanthoar 10:74ef7544744e 649 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 650 _i2c->write(param3); // Write Param3
tulanthoar 10:74ef7544744e 651 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 652 _i2c->write(param4); // Write Param4
tulanthoar 10:74ef7544744e 653 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 654 _i2c->write(param5); // Write Param5
tulanthoar 10:74ef7544744e 655 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 656 _i2c->write(param6); // Write Param6
tulanthoar 7:dcff685d41a5 657
tulanthoar 10:74ef7544744e 658 _i2c->stop();
tulanthoar 7:dcff685d41a5 659 #endif
tulanthoar 7:dcff685d41a5 660 }
tulanthoar 7:dcff685d41a5 661
tulanthoar 7:dcff685d41a5 662
tulanthoar 7:dcff685d41a5 663 #if(0)
tulanthoar 7:dcff685d41a5 664 /** @brief Write command that has multiple parameters
tulanthoar 7:dcff685d41a5 665 */
tulanthoar 7:dcff685d41a5 666 void SSD1308::_sendCommands(uint8_t len, uint8_t* commands) {
tulanthoar 7:dcff685d41a5 667
tulanthoar 7:dcff685d41a5 668 // I2Cdev::writeBytes(m_devAddr, COMMAND_MODE, len, commands);
tulanthoar 7:dcff685d41a5 669 // Note this original code is not correct, continuationbit is set,
tulanthoar 7:dcff685d41a5 670 // so COMMAND_MODE must be repeated before each databyte that serves as parameter!
tulanthoar 7:dcff685d41a5 671
tulanthoar 10:74ef7544744e 672 _i2c->start();
tulanthoar 10:74ef7544744e 673 _i2c->write(_writeOpcode);
tulanthoar 7:dcff685d41a5 674
tulanthoar 7:dcff685d41a5 675 for (int i=0; i<len ; i++) {
tulanthoar 10:74ef7544744e 676 _i2c->write(COMMAND_MODE);
tulanthoar 10:74ef7544744e 677 _i2c->write(commands[i]); // Write Commands
tulanthoar 7:dcff685d41a5 678 }
tulanthoar 10:74ef7544744e 679 _i2c->stop();
tulanthoar 7:dcff685d41a5 680
tulanthoar 7:dcff685d41a5 681 }
tulanthoar 7:dcff685d41a5 682 #endif
tulanthoar 7:dcff685d41a5 683
tulanthoar 7:dcff685d41a5 684 /** @brief Write databyte to display
tulanthoar 7:dcff685d41a5 685 * @brief Start at current cursor location
tulanthoar 7:dcff685d41a5 686 * @param uint8_t data databyte to write
tulanthoar 7:dcff685d41a5 687 */
tulanthoar 7:dcff685d41a5 688 void SSD1308::_sendData(uint8_t data) {
tulanthoar 7:dcff685d41a5 689
tulanthoar 7:dcff685d41a5 690 #if (I2C_OPTIMIZE == 0)
tulanthoar 7:dcff685d41a5 691 //I2C Blockwrite versions dont seem to work ?
tulanthoar 7:dcff685d41a5 692 //That may be related to fact that the SSD1308/SSD1306 does NOT return an acknowledge: blockwrite may abort the operation
tulanthoar 7:dcff685d41a5 693 //Noted for mbed lib v63 on 20/7/13
tulanthoar 7:dcff685d41a5 694 char databytes[2];
tulanthoar 7:dcff685d41a5 695
tulanthoar 7:dcff685d41a5 696 databytes[0] = DATA_MODE;
tulanthoar 7:dcff685d41a5 697 databytes[1] = data;
tulanthoar 10:74ef7544744e 698 _i2c->write(_writeOpcode, databytes, 2); // Write Data
tulanthoar 7:dcff685d41a5 699
tulanthoar 7:dcff685d41a5 700 #else
tulanthoar 10:74ef7544744e 701 _i2c->start();
tulanthoar 10:74ef7544744e 702 _i2c->write(_writeOpcode);
tulanthoar 10:74ef7544744e 703 _i2c->write(DATA_MODE);
tulanthoar 10:74ef7544744e 704 _i2c->write(data);
tulanthoar 10:74ef7544744e 705 _i2c->stop();
tulanthoar 7:dcff685d41a5 706 #endif
tulanthoar 7:dcff685d41a5 707
tulanthoar 7:dcff685d41a5 708 }
tulanthoar 7:dcff685d41a5 709
tulanthoar 7:dcff685d41a5 710 /** @brief Write len bytes from buffer data to display,
tulanthoar 7:dcff685d41a5 711 * @brief Start at current cursor location
tulanthoar 7:dcff685d41a5 712 * @param uint8_t len number of bytes to write
tulanthoar 7:dcff685d41a5 713 * @param uint8_t* data pointer to data
tulanthoar 7:dcff685d41a5 714 */
tulanthoar 7:dcff685d41a5 715 void SSD1308::_sendData(uint8_t len, uint8_t* data) {
tulanthoar 7:dcff685d41a5 716 // I2Cdev::writeBytes(m_devAddr, DATA_MODE, len, data);
tulanthoar 7:dcff685d41a5 717 #if (I2C_OPTIMIZE == 0)
tulanthoar 7:dcff685d41a5 718 for (int i=0; i<len ; i++) {
tulanthoar 7:dcff685d41a5 719 _sendData(data[i]); // Write Data
tulanthoar 7:dcff685d41a5 720 }
tulanthoar 7:dcff685d41a5 721 #else
tulanthoar 10:74ef7544744e 722 _i2c->start();
tulanthoar 10:74ef7544744e 723 _i2c->write(_writeOpcode);
tulanthoar 10:74ef7544744e 724 _i2c->write(DATA_MODE);
tulanthoar 7:dcff685d41a5 725 for (int i=0; i<len ; i++) {
tulanthoar 10:74ef7544744e 726 _i2c->write(data[i]); // Write Data
tulanthoar 7:dcff685d41a5 727 }
tulanthoar 10:74ef7544744e 728 _i2c->stop();
tulanthoar 7:dcff685d41a5 729 #endif
tulanthoar 7:dcff685d41a5 730 }
tulanthoar 7:dcff685d41a5 731
tulanthoar 7:dcff685d41a5 732
tulanthoar 7:dcff685d41a5 733 /** @brief Set Horizontal Addressing Mode (cursor incr left-to-right, top-to-bottom)
tulanthoar 7:dcff685d41a5 734 *
tulanthoar 7:dcff685d41a5 735 */
tulanthoar 7:dcff685d41a5 736 void SSD1308::setHorizontalAddressingMode() {
tulanthoar 7:dcff685d41a5 737 setMemoryAddressingMode(HORIZONTAL_ADDRESSING_MODE);
tulanthoar 7:dcff685d41a5 738 }
tulanthoar 7:dcff685d41a5 739
tulanthoar 7:dcff685d41a5 740 /** @brief Set Vertical Addressing Mode (cursor incr top-to-bottom, left-to-right)
tulanthoar 7:dcff685d41a5 741 *
tulanthoar 7:dcff685d41a5 742 */
tulanthoar 7:dcff685d41a5 743 void SSD1308::setVerticalAddressingMode() {
tulanthoar 7:dcff685d41a5 744 setMemoryAddressingMode(VERTICAL_ADDRESSING_MODE);
tulanthoar 7:dcff685d41a5 745 }
tulanthoar 7:dcff685d41a5 746
tulanthoar 7:dcff685d41a5 747 /** @brief Set Page Addressing Mode (cursor incr left-to-right)
tulanthoar 7:dcff685d41a5 748 *
tulanthoar 7:dcff685d41a5 749 */
tulanthoar 7:dcff685d41a5 750 void SSD1308::setPageAddressingMode() {
tulanthoar 7:dcff685d41a5 751 setMemoryAddressingMode(PAGE_ADDRESSING_MODE);
tulanthoar 7:dcff685d41a5 752 }
tulanthoar 7:dcff685d41a5 753
tulanthoar 7:dcff685d41a5 754 /** @brief Set Addressing Mode
tulanthoar 7:dcff685d41a5 755 * @param uint8_t mode
tulanthoar 7:dcff685d41a5 756 */
tulanthoar 7:dcff685d41a5 757 void SSD1308::setMemoryAddressingMode(uint8_t mode) {
tulanthoar 7:dcff685d41a5 758
tulanthoar 7:dcff685d41a5 759 _sendCommand(SET_MEMORY_ADDRESSING_MODE, mode);
tulanthoar 7:dcff685d41a5 760 }
tulanthoar 7:dcff685d41a5 761
tulanthoar 7:dcff685d41a5 762
tulanthoar 7:dcff685d41a5 763 /** @param uint8_t start startpage (valid range 0..MAX_PAGE)
tulanthoar 7:dcff685d41a5 764 * @param uint8_t end endpage (valid range start..MAX_PAGE)
tulanthoar 7:dcff685d41a5 765 */
tulanthoar 7:dcff685d41a5 766 void SSD1308::setPageAddress(uint8_t start, uint8_t end) {
tulanthoar 7:dcff685d41a5 767
tulanthoar 7:dcff685d41a5 768 _sendCommand(SET_PAGE_ADDRESS, start, end);
tulanthoar 7:dcff685d41a5 769 }
tulanthoar 7:dcff685d41a5 770
tulanthoar 7:dcff685d41a5 771
tulanthoar 7:dcff685d41a5 772 /** @param uint8_t start startcolumn (valid range 0..MAX_COL)
tulanthoar 7:dcff685d41a5 773 * @param uint8_t end endcolumn (valid range start..MAX_COL)
tulanthoar 7:dcff685d41a5 774 */
tulanthoar 7:dcff685d41a5 775 void SSD1308::setColumnAddress(uint8_t start, uint8_t end) {
tulanthoar 7:dcff685d41a5 776
tulanthoar 7:dcff685d41a5 777 _sendCommand(SET_COLUMN_ADDRESS, start, end);
tulanthoar 7:dcff685d41a5 778 }
tulanthoar 7:dcff685d41a5 779
tulanthoar 7:dcff685d41a5 780 /**
tulanthoar 7:dcff685d41a5 781 * @brief Set Display StartLine, takes one byte, 0x00-0x3F
tulanthoar 7:dcff685d41a5 782 * @param uint8_t line startline (valid range 0..MAX_ROWS)
tulanthoar 7:dcff685d41a5 783 */
tulanthoar 7:dcff685d41a5 784 void SSD1308::setDisplayStartLine(uint8_t line) {
tulanthoar 7:dcff685d41a5 785
tulanthoar 7:dcff685d41a5 786 line = line & MAX_ROW;
tulanthoar 7:dcff685d41a5 787
tulanthoar 7:dcff685d41a5 788 _sendCommand(SET_DISPLAY_START_LINE | line);
tulanthoar 7:dcff685d41a5 789 }
tulanthoar 7:dcff685d41a5 790
tulanthoar 7:dcff685d41a5 791
tulanthoar 7:dcff685d41a5 792 /**
tulanthoar 7:dcff685d41a5 793 * @brief Set Column Start (for Page Addressing Mode only)
tulanthoar 7:dcff685d41a5 794 * @param uint8_t column column start (valid range 0..MAX_COL)
tulanthoar 7:dcff685d41a5 795 */
tulanthoar 7:dcff685d41a5 796 void SSD1308::setColumnStartForPageAddressingMode(uint8_t column) {
tulanthoar 7:dcff685d41a5 797
tulanthoar 7:dcff685d41a5 798 column = column & MAX_COL;
tulanthoar 7:dcff685d41a5 799
tulanthoar 7:dcff685d41a5 800 _sendCommand(SET_LOWER_COLUMN | ( column & 0x0F)); // lower nibble
tulanthoar 7:dcff685d41a5 801 _sendCommand(SET_HIGHER_COLUMN | ((column>>4) & 0x0F)); // higher nibble
tulanthoar 7:dcff685d41a5 802 }
tulanthoar 7:dcff685d41a5 803
tulanthoar 7:dcff685d41a5 804
tulanthoar 7:dcff685d41a5 805 /**
tulanthoar 7:dcff685d41a5 806 * @brief Set Page Start (for Page Addressing Mode only)
tulanthoar 7:dcff685d41a5 807 * @param uint8_t page page start (valid range PAGE0 - PAGE7)
tulanthoar 7:dcff685d41a5 808 */
tulanthoar 7:dcff685d41a5 809 void SSD1308::setPageStartForPageAddressingMode(uint8_t page) {
tulanthoar 7:dcff685d41a5 810
tulanthoar 7:dcff685d41a5 811 page = page & MAX_PAGE;
tulanthoar 7:dcff685d41a5 812
tulanthoar 7:dcff685d41a5 813 _sendCommand(SET_PAGE_START_ADDRESS | page);
tulanthoar 7:dcff685d41a5 814
tulanthoar 7:dcff685d41a5 815 }
tulanthoar 7:dcff685d41a5 816
tulanthoar 7:dcff685d41a5 817
tulanthoar 7:dcff685d41a5 818 /** @brief Set Contrast
tulanthoar 7:dcff685d41a5 819 * @param uint8_t contrast (valid range 0x00 (lowest) - 0xFF (highest))
tulanthoar 7:dcff685d41a5 820 */
tulanthoar 7:dcff685d41a5 821 void SSD1308::setContrastControl(uint8_t contrast) {
tulanthoar 7:dcff685d41a5 822
tulanthoar 7:dcff685d41a5 823 _sendCommand(SET_CONTRAST, contrast);
tulanthoar 7:dcff685d41a5 824 }
tulanthoar 7:dcff685d41a5 825
tulanthoar 7:dcff685d41a5 826 /** @brief Enable Display
tulanthoar 7:dcff685d41a5 827 */
tulanthoar 7:dcff685d41a5 828 void SSD1308::setDisplayOn() {
tulanthoar 7:dcff685d41a5 829 _sendCommand(SET_DISPLAY_POWER_ON);
tulanthoar 7:dcff685d41a5 830 }
tulanthoar 7:dcff685d41a5 831
tulanthoar 7:dcff685d41a5 832 /** @brief Disable Display
tulanthoar 7:dcff685d41a5 833 */
tulanthoar 7:dcff685d41a5 834 void SSD1308::setDisplayOff() {
tulanthoar 7:dcff685d41a5 835 _sendCommand(SET_DISPLAY_POWER_OFF);
tulanthoar 7:dcff685d41a5 836 }
tulanthoar 7:dcff685d41a5 837
tulanthoar 7:dcff685d41a5 838 /** @brief Enable or Disable Display
tulanthoar 7:dcff685d41a5 839 * @param bool on
tulanthoar 7:dcff685d41a5 840 */
tulanthoar 7:dcff685d41a5 841 void SSD1308::setDisplayPower(bool on) {
tulanthoar 7:dcff685d41a5 842 if (on) {
tulanthoar 7:dcff685d41a5 843 setDisplayOn();
tulanthoar 7:dcff685d41a5 844 } else {
tulanthoar 7:dcff685d41a5 845 setDisplayOff();
tulanthoar 7:dcff685d41a5 846 }
tulanthoar 7:dcff685d41a5 847 }
tulanthoar 7:dcff685d41a5 848
tulanthoar 7:dcff685d41a5 849 /** @brief Show White pixels on Black background
tulanthoar 7:dcff685d41a5 850 */
tulanthoar 7:dcff685d41a5 851 void SSD1308::setDisplayNormal() {
tulanthoar 7:dcff685d41a5 852 _sendCommand(SET_NORMAL_DISPLAY);
tulanthoar 7:dcff685d41a5 853 }
tulanthoar 7:dcff685d41a5 854
tulanthoar 7:dcff685d41a5 855 /** @brief Show Black pixels on White background
tulanthoar 7:dcff685d41a5 856 */
tulanthoar 7:dcff685d41a5 857 void SSD1308::setDisplayInverse() {
tulanthoar 7:dcff685d41a5 858 _sendCommand(SET_INVERSE_DISPLAY);
tulanthoar 7:dcff685d41a5 859 }
tulanthoar 7:dcff685d41a5 860
tulanthoar 7:dcff685d41a5 861 /** @brief Blink display by fading in and out over a set number of frames
tulanthoar 7:dcff685d41a5 862 * @param bool on
tulanthoar 7:dcff685d41a5 863 */
tulanthoar 7:dcff685d41a5 864 void SSD1308::setDisplayBlink(bool on) {
tulanthoar 7:dcff685d41a5 865 if (on) {
tulanthoar 7:dcff685d41a5 866 _sendCommand(SET_FADE_BLINK, (BLINK_ENABLE | FADE_INTERVAL_128_FRAMES));
tulanthoar 7:dcff685d41a5 867 } else {
tulanthoar 7:dcff685d41a5 868 _sendCommand(SET_FADE_BLINK, FADE_BLINK_DISABLE);
tulanthoar 7:dcff685d41a5 869 }
tulanthoar 7:dcff685d41a5 870 }
tulanthoar 7:dcff685d41a5 871
tulanthoar 7:dcff685d41a5 872
tulanthoar 7:dcff685d41a5 873 /** @brief Fade out display in set number of frames
tulanthoar 7:dcff685d41a5 874 * @param bool on
tulanthoar 7:dcff685d41a5 875 */
tulanthoar 7:dcff685d41a5 876 void SSD1308::setDisplayFade(bool on) {
tulanthoar 7:dcff685d41a5 877 if (on) {
tulanthoar 7:dcff685d41a5 878 _sendCommand(SET_FADE_BLINK, (FADE_OUT_ENABLE | FADE_INTERVAL_128_FRAMES));
tulanthoar 7:dcff685d41a5 879 } else {
tulanthoar 7:dcff685d41a5 880 _sendCommand(SET_FADE_BLINK, FADE_BLINK_DISABLE);
tulanthoar 7:dcff685d41a5 881 }
tulanthoar 7:dcff685d41a5 882 }
tulanthoar 7:dcff685d41a5 883
tulanthoar 7:dcff685d41a5 884 /** @brief Display Flip (Left/Right, Up/Down)
tulanthoar 7:dcff685d41a5 885 * @param bool left flip Left/Right
tulanthoar 7:dcff685d41a5 886 * @param bool down flip Up/Down
tulanthoar 7:dcff685d41a5 887 */
tulanthoar 7:dcff685d41a5 888 void SSD1308::setDisplayFlip(bool left, bool down) {
tulanthoar 7:dcff685d41a5 889 if (left) {
tulanthoar 7:dcff685d41a5 890 // column address 0 is mapped to SEG0 (Reset)
tulanthoar 7:dcff685d41a5 891 _sendCommand(SET_SEGMENT_REMAP_0);
tulanthoar 7:dcff685d41a5 892 } else {
tulanthoar 7:dcff685d41a5 893 // column address 127 is mapped to SEG0
tulanthoar 7:dcff685d41a5 894 _sendCommand(SET_SEGMENT_REMAP_127);
tulanthoar 7:dcff685d41a5 895 }
tulanthoar 7:dcff685d41a5 896
tulanthoar 7:dcff685d41a5 897 if (down) {
tulanthoar 7:dcff685d41a5 898 // Reset mode
tulanthoar 7:dcff685d41a5 899 _sendCommand(SET_COMMON_REMAP_0);
tulanthoar 7:dcff685d41a5 900 } else {
tulanthoar 7:dcff685d41a5 901 // Flip Up/Down (Need to rewrite display before H effect shows)
tulanthoar 7:dcff685d41a5 902 _sendCommand(SET_COMMON_REMAP_63);
tulanthoar 7:dcff685d41a5 903 }
tulanthoar 7:dcff685d41a5 904
tulanthoar 7:dcff685d41a5 905 }
tulanthoar 7:dcff685d41a5 906
tulanthoar 7:dcff685d41a5 907 /** @brief Sets Internal Iref
tulanthoar 7:dcff685d41a5 908 */
tulanthoar 7:dcff685d41a5 909 void SSD1308::setInternalIref() {
tulanthoar 7:dcff685d41a5 910 // uint8_t cmds[2] = {SET_IREF_SELECTION, INTERNAL_IREF};
tulanthoar 7:dcff685d41a5 911 // _sendCommands(2, cmds);
tulanthoar 7:dcff685d41a5 912
tulanthoar 7:dcff685d41a5 913 _sendCommand(SET_IREF_SELECTION, INTERNAL_IREF);
tulanthoar 7:dcff685d41a5 914 }
tulanthoar 7:dcff685d41a5 915
tulanthoar 7:dcff685d41a5 916 /** @brief Sets External Iref (default)
tulanthoar 7:dcff685d41a5 917 */
tulanthoar 7:dcff685d41a5 918 void SSD1308::setExternalIref() {
tulanthoar 7:dcff685d41a5 919 // uint8_t cmds[2] = {SET_IREF_SELECTION, EXTERNAL_IREF};
tulanthoar 7:dcff685d41a5 920 // _sendCommands(2, cmds);
tulanthoar 7:dcff685d41a5 921 _sendCommand(SET_IREF_SELECTION, EXTERNAL_IREF);
tulanthoar 7:dcff685d41a5 922 }
tulanthoar 7:dcff685d41a5 923
tulanthoar 7:dcff685d41a5 924
tulanthoar 7:dcff685d41a5 925 /** @brief Shows All Pixels On
tulanthoar 7:dcff685d41a5 926 */
tulanthoar 7:dcff685d41a5 927 void SSD1308::setEntireDisplayOn() {
tulanthoar 7:dcff685d41a5 928 _sendCommand(SET_ENTIRE_DISPLAY_ON);
tulanthoar 7:dcff685d41a5 929 }
tulanthoar 7:dcff685d41a5 930
tulanthoar 7:dcff685d41a5 931 /** @brief Shows Pixels as RAM content
tulanthoar 7:dcff685d41a5 932 */
tulanthoar 7:dcff685d41a5 933 void SSD1308::setEntireDisplayRAM() {
tulanthoar 7:dcff685d41a5 934 _sendCommand(SET_DISPLAY_GDDRAM);
tulanthoar 7:dcff685d41a5 935 }
tulanthoar 7:dcff685d41a5 936
tulanthoar 7:dcff685d41a5 937 /** @brief Shows Pixels On or as RAM content
tulanthoar 7:dcff685d41a5 938 * @param bool on (true is All on, false is RAM content)
tulanthoar 7:dcff685d41a5 939 */
tulanthoar 7:dcff685d41a5 940 void SSD1308::setEntireDisplay(bool on) {
tulanthoar 7:dcff685d41a5 941 if (on) {
tulanthoar 7:dcff685d41a5 942 setEntireDisplayOn(); // All Pixels on
tulanthoar 7:dcff685d41a5 943 } else {
tulanthoar 7:dcff685d41a5 944 setEntireDisplayRAM(); // Pixels are RAM content
tulanthoar 7:dcff685d41a5 945 }
tulanthoar 7:dcff685d41a5 946 }
tulanthoar 7:dcff685d41a5 947
tulanthoar 7:dcff685d41a5 948
tulanthoar 7:dcff685d41a5 949 /** @brief Horizontal scroll by one column per interval
tulanthoar 7:dcff685d41a5 950 * @param bool left select Left/Right scroll
tulanthoar 7:dcff685d41a5 951 * @param uint8_t start_page begin page (0..MAX_PAGE)
tulanthoar 7:dcff685d41a5 952 * @param uint8_t end_page end page (start_page..MAX_PAGE)
tulanthoar 7:dcff685d41a5 953 * @param uint8_t interval scroll interval in frames (see codes above)
tulanthoar 7:dcff685d41a5 954 */
tulanthoar 7:dcff685d41a5 955 void SSD1308::setContinuousHorizontalScroll(bool left, uint8_t start_page, uint8_t end_page, uint8_t interval) {
tulanthoar 7:dcff685d41a5 956 if (left) {
tulanthoar 7:dcff685d41a5 957 _sendCommand(SET_LEFT_HOR_SCROLL, 0x00, start_page, interval, end_page, 0x00, 0xFF); // Scroll Left
tulanthoar 7:dcff685d41a5 958 } else {
tulanthoar 7:dcff685d41a5 959 _sendCommand(SET_RIGHT_HOR_SCROLL, 0x00, start_page, interval, end_page, 0x00, 0xFF); // Scroll Right
tulanthoar 7:dcff685d41a5 960 }
tulanthoar 7:dcff685d41a5 961
tulanthoar 7:dcff685d41a5 962 }
tulanthoar 7:dcff685d41a5 963
tulanthoar 7:dcff685d41a5 964
tulanthoar 7:dcff685d41a5 965 /** @brief Horizontal and Vertical scroll by one column per interval
tulanthoar 7:dcff685d41a5 966 * @param bool left select Left/Right scroll
tulanthoar 7:dcff685d41a5 967 * @param uint8_t start_page begin page (0..MAX_PAGE)
tulanthoar 7:dcff685d41a5 968 * @param uint8_t end_page end page (start_page..MAX_PAGE)
tulanthoar 7:dcff685d41a5 969 * @param uint8_t offset vert offset (0x01..0x63)
tulanthoar 7:dcff685d41a5 970 * @param uint8_t interval scroll interval in frames (see codes above)
tulanthoar 7:dcff685d41a5 971 */
tulanthoar 7:dcff685d41a5 972 void SSD1308::setContinuousVerticalAndHorizontalScroll(bool left, uint8_t start_page, uint8_t end_page,
tulanthoar 7:dcff685d41a5 973 uint8_t offset, uint8_t interval) {
tulanthoar 7:dcff685d41a5 974 if (left) {
tulanthoar 7:dcff685d41a5 975 _sendCommand(SET_VERT_LEFT_HOR_SCROLL, 0x00, start_page, interval, end_page, offset); // Scroll Left
tulanthoar 7:dcff685d41a5 976 } else {
tulanthoar 7:dcff685d41a5 977 _sendCommand(SET_VERT_RIGHT_HOR_SCROLL, 0x00, start_page, interval, end_page, offset); // Scroll Right
tulanthoar 7:dcff685d41a5 978 }
tulanthoar 7:dcff685d41a5 979
tulanthoar 7:dcff685d41a5 980 }
tulanthoar 7:dcff685d41a5 981
tulanthoar 7:dcff685d41a5 982 /** @brief Set Vertical scroll area
tulanthoar 7:dcff685d41a5 983 * @param uint8_t topRowsFixed fixed rows (0..MAX_ROW)
tulanthoar 7:dcff685d41a5 984 * @param uint8_t scrollRowsoffset scroll rows (topRowsFixed..ROWS)
tulanthoar 7:dcff685d41a5 985 */
tulanthoar 7:dcff685d41a5 986 void SSD1308::setVerticalScrollArea(uint8_t topRowsFixed, uint8_t scrollRows) {
tulanthoar 7:dcff685d41a5 987
tulanthoar 7:dcff685d41a5 988 if ((topRowsFixed + scrollRows) > ROWS) {
tulanthoar 7:dcff685d41a5 989 scrollRows = ROWS - topRowsFixed;
tulanthoar 7:dcff685d41a5 990 };
tulanthoar 7:dcff685d41a5 991
tulanthoar 7:dcff685d41a5 992 _sendCommand(SET_VERTICAL_SCROLL_AREA, topRowsFixed, scrollRows);
tulanthoar 7:dcff685d41a5 993 }
tulanthoar 7:dcff685d41a5 994
tulanthoar 7:dcff685d41a5 995 /** @brief Activate or Deactivate Horizontal and Vertical scroll
tulanthoar 7:dcff685d41a5 996 * @brief Note: after deactivating scrolling, the RAM data needs to be rewritten
tulanthoar 7:dcff685d41a5 997 * @param bool on activate scroll
tulanthoar 7:dcff685d41a5 998 */
tulanthoar 7:dcff685d41a5 999 void SSD1308::setDisplayScroll(bool on) {
tulanthoar 7:dcff685d41a5 1000 if (on) {
tulanthoar 7:dcff685d41a5 1001 _sendCommand(SET_ACTIVATE_SCROLL); // Scroll on
tulanthoar 7:dcff685d41a5 1002 } else {
tulanthoar 7:dcff685d41a5 1003 _sendCommand(SET_DEACTIVATE_SCROLL); // Scroll off
tulanthoar 7:dcff685d41a5 1004 }
tulanthoar 7:dcff685d41a5 1005 }
tulanthoar 7:dcff685d41a5 1006
tulanthoar 7:dcff685d41a5 1007
tulanthoar 7:dcff685d41a5 1008
tulanthoar 7:dcff685d41a5 1009 /** @brief Low level Init
tulanthoar 7:dcff685d41a5 1010 * @brief Init the configuration registers in accordance with the datasheet
tulanthoar 7:dcff685d41a5 1011 */
tulanthoar 7:dcff685d41a5 1012 void SSD1308::_init() {
tulanthoar 7:dcff685d41a5 1013
tulanthoar 7:dcff685d41a5 1014 _sendCommand(SET_DISPLAY_POWER_OFF); // 0xAE
tulanthoar 7:dcff685d41a5 1015
tulanthoar 7:dcff685d41a5 1016 // column address 0 is mapped to SEG0 (Reset)
tulanthoar 7:dcff685d41a5 1017 // row address 0 is mapped to COM0 (Reset)
tulanthoar 7:dcff685d41a5 1018 _sendCommand(SET_SEGMENT_REMAP_0); // 0xA0 (Reset)
tulanthoar 7:dcff685d41a5 1019 _sendCommand(SET_COMMON_REMAP_0); // 0xC0 (Reset)
tulanthoar 7:dcff685d41a5 1020
tulanthoar 7:dcff685d41a5 1021 setDisplayStartLine(0); // 0x40 (Reset)
tulanthoar 7:dcff685d41a5 1022
tulanthoar 7:dcff685d41a5 1023 _sendCommand(SET_COMMON_CONF, COMMON_BASE | COMMON_ALTERNATIVE | COMMON_LEFTRIGHT_NORMAL); // 0xDA, 0x12 (Reset)
tulanthoar 7:dcff685d41a5 1024
tulanthoar 7:dcff685d41a5 1025 // Pagemode or Horizontal mode
tulanthoar 7:dcff685d41a5 1026 // setPageAddressingMode(); // 0x20, 0x02 (Reset)
tulanthoar 7:dcff685d41a5 1027 // setColumnStartForPageAddressingMode(0); // 0x00, 0x10 (Reset = Column 0)
tulanthoar 7:dcff685d41a5 1028 // setPageStartForPageAddressingMode(PAGE_0);// 0xBO (Reset = Page 0)
tulanthoar 7:dcff685d41a5 1029 setHorizontalAddressingMode(); // 0x20, 0x00 (Non-Reset)
tulanthoar 7:dcff685d41a5 1030 setColumnAddress(0, MAX_COL); // 0x21, 0x00, 0x37 (Reset)
tulanthoar 7:dcff685d41a5 1031 setPageAddress(0, MAX_PAGE); // 0x22, 0x00, 0x07 (Reset)
tulanthoar 7:dcff685d41a5 1032
tulanthoar 7:dcff685d41a5 1033 setExternalIref(); // 0xAD, 0x10 (Reset)
tulanthoar 7:dcff685d41a5 1034
tulanthoar 7:dcff685d41a5 1035 _sendCommand(SET_DISPLAY_CLOCK, 0x70); // 0xD5, 0x70 (Reset = 0x80)
tulanthoar 7:dcff685d41a5 1036 _sendCommand(SET_PRECHARGE_TIME, 0x21); // 0xD9, 0x21 (Reset = 0x22)
tulanthoar 7:dcff685d41a5 1037 _sendCommand(SET_VCOMH_DESELECT_LEVEL, 0x30); // 0xDB, 0x30 (Reset = 0x20)
tulanthoar 7:dcff685d41a5 1038 _sendCommand(SET_MULTIPLEX_RATIO, 0x3F); // 0xA8, 0x3F (Reset)
tulanthoar 7:dcff685d41a5 1039 _sendCommand(SET_DISPLAY_OFFSET, 0x00); // 0xD3, 0x00 (Reset)
tulanthoar 7:dcff685d41a5 1040
tulanthoar 7:dcff685d41a5 1041 _sendCommand(SET_CONTRAST, 0x7F); // 0x81, 0x7F (Reset)
tulanthoar 7:dcff685d41a5 1042
tulanthoar 7:dcff685d41a5 1043 _sendCommand(SET_NORMAL_DISPLAY); // 0xA6 (Reset)
tulanthoar 7:dcff685d41a5 1044
tulanthoar 7:dcff685d41a5 1045 setEntireDisplayRAM(); // 0xA4 (Reset)
tulanthoar 7:dcff685d41a5 1046 setDisplayScroll(false);
tulanthoar 7:dcff685d41a5 1047
tulanthoar 7:dcff685d41a5 1048 clearDisplay();
tulanthoar 7:dcff685d41a5 1049
tulanthoar 7:dcff685d41a5 1050 _sendCommand(SET_DISPLAY_POWER_ON); // 0xAF
tulanthoar 7:dcff685d41a5 1051 }
tulanthoar 7:dcff685d41a5 1052