mamont mamont / Adafruit_GFX

Dependents:   BLE_TemperatureObserver

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Adafruit_UC1601S.cpp Source File

Adafruit_UC1601S.cpp

00001 /*********************************************************************
00002  This is a library for our Monochrome OLEDs based on SSD1306 drivers
00003 
00004  Pick one up today in the adafruit shop!
00005  ------> http://www.adafruit.com/category/63_98
00006 
00007  These displays use SPI to communicate, 4 or 5 pins are required to
00008  interface
00009 
00010  Adafruit invests time and resources providing this open source code,
00011  please support Adafruit and open-source hardware by purchasing
00012  products from Adafruit!
00013 
00014  Written by Limor Fried/Ladyada  for Adafruit Industries.
00015  BSD license, check license.txt for more information
00016  All text above, and the splash screen below must be included in any redistribution
00017  *********************************************************************/
00018 
00019 /*
00020  *  Modified by JojoS 03/07/2015
00021  *   add flipVertical option to constructor
00022  *   add use of 'rst' is optional, maybe NC in constructor
00023  *   add command SSD1306_SETPAGESTARTADDRESS to reset page start address (important when no hardware reset is uesed)
00024  */
00025 
00026 #include "mbed.h"
00027 #include "Adafruit_UC1601S.h"
00028 
00029 Adafruit_UC1601S::Adafruit_UC1601S(PinName reset, uint8_t rawHeight, uint8_t rawWidth, bool flipVertical)
00030     : Adafruit_GFX(rawWidth, rawHeight)
00031     , _reset(reset, false)
00032     , _flipVertical(flipVertical)
00033 {
00034     // display memory is organized in 1 byte = 8 columns
00035     int heightBytes = rawHeight / 8;
00036     if (rawHeight % 8)      // correction if height is not byte aligned
00037         heightBytes++;
00038     buffer.resize(rawWidth * heightBytes);
00039 }
00040 
00041 void Adafruit_UC1601S::begin() {
00042     if (_reset.is_connected()) {// reset input is not present on every UC1601S display board, so usage is optional
00043         _reset = 1;
00044         // VDD (3.3V) goes high at start, lets just chill for a ms
00045         wait_ms(1);
00046         // bring reset low
00047         _reset = 0;
00048         // wait 10ms
00049         wait_ms(10);
00050         // bring out of reset
00051         _reset = 1;
00052         // turn on VCC (9V?)
00053     }
00054 
00055     command(LCD_SET_TEMP_COMP | 0b00);          // Set Temperature Comp. TC[1:0]
00056     command(LCD_SET_POWER_CTRL | 0b110);        // Set Power Control PC[2:0]
00057     command(LCD_SET_LINE_ADDR | 0);         // Set Scroll Line SL[5:0]
00058     command(LCD_SET_BIAS);      // Set VBIAS Potentiometer (Double byte command)
00059     command(0xC0);                              // BIAS value
00060     command(LCD_SET_PARTITIAL_CTRL | 0);
00061     command(LCD_SET_RAM_ADDRESS_CTRL | 0b001);  //
00062     command(LCD_SET_FRAME_RATE | 0);        // Framerate 0: 80 fps  1: 100 fps
00063     command(LCD_SET_MAPPING_CTRL | (_flipVertical ? 0b000 : 0b100));// flip vertical / horizontal
00064     command(LCD_SET_BIAS_RATIO | 0);            // 0: 6  1: 7  2: 8  3: 9
00065     command(LCD_SET_COM_END);
00066     command(21);                                // Rows - 1
00067     command(LCD_ENABLE_DISPLAY | 1);            // enable display)
00068 }
00069 
00070 // Set a single pixel
00071 void Adafruit_UC1601S::drawPixel(int16_t x, int16_t y, uint16_t color) {
00072     if ((x < 0) || (x >= width()) || (y < 0) || (y >= height()))
00073         return;
00074 
00075     // check rotation, move pixel around if necessary
00076     switch (getRotation()) {
00077     case 1:
00078         swap(x, y);
00079         x = _rawWidth - x - 1;
00080         break;
00081     case 2:
00082         x = _rawWidth - x - 1;
00083         y = _rawHeight - y - 1;
00084         break;
00085     case 3:
00086         swap(x, y);
00087         y = _rawHeight - y - 1;
00088         break;
00089     }
00090 
00091     // x is which column
00092     if (color == WHITE)
00093         buffer[x + (y / 8) * _rawWidth] |= _BV((y % 8));
00094     else
00095         // else black
00096         buffer[x + (y / 8) * _rawWidth] &= ~_BV((y % 8));
00097 }
00098 
00099 void Adafruit_UC1601S::invertDisplay(bool i) {
00100     command(i ? LCD_INVERT_DISPLAY | 1 : LCD_INVERT_DISPLAY);
00101 }
00102 
00103 void Adafruit_UC1601S::flipVertical(bool flip) {
00104     _flipVertical = flip;
00105     if (flip) {
00106         command(LCD_SET_MAPPING_CTRL | 0b000);// flip vertical / horizontal
00107         command(LCD_SET_RAM_ADDRESS_CTRL | 0b101);  //
00108         command(LCD_SET_COM_END);
00109         command(21);                                // Rows - 1
00110     } else {
00111         command(LCD_SET_MAPPING_CTRL | 0b100);// flip vertical / horizontal
00112         command(LCD_SET_RAM_ADDRESS_CTRL | 0b001);  //
00113         command(LCD_SET_COM_END);
00114         command(21);                                // Rows - 1
00115     }
00116 }
00117 
00118 // Send the display buffer out to the display
00119 void Adafruit_UC1601S::display(void) {
00120     sendDisplayBuffer();
00121 }
00122 
00123 // Clear the display buffer. Requires a display() call at some point afterwards
00124 void Adafruit_UC1601S::clearDisplay(void) {
00125     std::fill(buffer.begin(), buffer.end(), 0);
00126 }
00127 
00128 void Adafruit_UC1601S::splash(void) {
00129 #ifndef NO_SPLASH_ADAFRUIT
00130     const uint8_t adaFruitLogo[64 * 128 / 8] = {
00131         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00132         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00133         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00134         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
00135         0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00136         0x00, 0x80, 0x80, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00137         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00138         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00139         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00140         0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00,
00141         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
00142         0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xFF,
00143         0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
00144         0x80, 0xFF, 0xFF, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80,
00145         0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x8C, 0x8E, 0x84, 0x00, 0x00, 0x80, 0xF8,
00146         0xF8, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00147         0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80,
00148         0x00, 0xE0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
00149         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xC7, 0x01, 0x01,
00150         0x01, 0x01, 0x83, 0xFF, 0xFF, 0x00, 0x00, 0x7C, 0xFE, 0xC7, 0x01, 0x01, 0x01, 0x01, 0x83, 0xFF,
00151         0xFF, 0xFF, 0x00, 0x38, 0xFE, 0xC7, 0x83, 0x01, 0x01, 0x01, 0x83, 0xC7, 0xFF, 0xFF, 0x00, 0x00,
00152         0x01, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0x07, 0x01, 0x01, 0x01, 0x00, 0x00, 0x7F, 0xFF,
00153         0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0xFF,
00154         0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00155         0x03, 0x0F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC7, 0xC7, 0x8F,
00156         0x8F, 0x9F, 0xBF, 0xFF, 0xFF, 0xC3, 0xC0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFC,
00157         0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x00, 0x01, 0x03, 0x03, 0x03,
00158         0x03, 0x03, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01,
00159         0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x00, 0x00,
00160         0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
00161         0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x03,
00162         0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00163         // 128x32^^^  128x64vvv
00164         0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x0F,
00165         0x87, 0xC7, 0xF7, 0xFF, 0xFF, 0x1F, 0x1F, 0x3D, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0x7C, 0x7D, 0xFF,
00166         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x00, 0x30, 0x30, 0x00, 0x00,
00167         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00168         0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00169         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0x00,
00170         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
00171         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00172         0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F,
00173         0x0F, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xE0,
00174         0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00,
00175         0x00, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x0E, 0xFC, 0xF8, 0x00, 0x00, 0xF0, 0xF8, 0x1C, 0x0E,
00176         0x06, 0x06, 0x06, 0x0C, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFC,
00177         0xFE, 0xFC, 0x00, 0x18, 0x3C, 0x7E, 0x66, 0xE6, 0xCE, 0x84, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x06,
00178         0x06, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x06, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xC0, 0xF8,
00179         0xFC, 0x4E, 0x46, 0x46, 0x46, 0x4E, 0x7C, 0x78, 0x40, 0x18, 0x3C, 0x76, 0xE6, 0xCE, 0xCC, 0x80,
00180         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00181         0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x0F, 0x03,
00182         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00,
00183         0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x03, 0x07, 0x0E, 0x0C,
00184         0x18, 0x18, 0x0C, 0x06, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x01, 0x0F, 0x0E, 0x0C, 0x18, 0x0C, 0x0F,
00185         0x07, 0x01, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00,
00186         0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x07,
00187         0x07, 0x0C, 0x0C, 0x18, 0x1C, 0x0C, 0x06, 0x06, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07,
00188         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00189         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00190         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00191         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00192         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00193         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00194         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00195         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
00196     };
00197 
00198     std::copy(
00199             &adaFruitLogo[0]
00200             , &adaFruitLogo[0] + (_rawHeight == 32 ? sizeof(adaFruitLogo)/2 : sizeof(adaFruitLogo))
00201             , buffer.begin()
00202     );
00203 #endif
00204 }
00205 
00206 /*
00207  *
00208  *  I2C specific implementation
00209  *
00210 */
00211 
00212 Adafruit_UC1601S_I2c::Adafruit_UC1601S_I2c(I2C &i2c, PinName reset,
00213         uint8_t i2cAddress, uint8_t rawHeight,
00214         uint8_t rawWidth, bool flipVertical) :
00215         Adafruit_UC1601S(reset, rawHeight, rawWidth, flipVertical), mi2c(i2c), mi2cAddress(
00216                 i2cAddress) {
00217     begin();
00218     splash();
00219     display();
00220 }
00221 
00222 void Adafruit_UC1601S_I2c::sendDisplayBuffer() {
00223     command(LCD_SET_PAGE_ADDR | 0);
00224     command(LCD_SET_COLUMN_ADDR_LSB | 0);
00225     command(LCD_SET_COLUMN_ADDR_MSB | 0);
00226 
00227     data(&buffer[0], buffer.size());
00228 }
00229 
00230 void Adafruit_UC1601S_I2c::command(uint8_t c) {
00231     mi2c.write(mi2cAddress, (const char*) &c, 1);
00232 }
00233 
00234 void Adafruit_UC1601S_I2c::data(const uint8_t *c, int count) {
00235     mi2c.write(mi2cAddress + 2, (const char*) c, count);
00236 }
00237