initial working
This commit is contained in:
commit
e4e050bc63
10 changed files with 896 additions and 0 deletions
46
.github/ISSUE_TEMPLATE.md
vendored
Normal file
46
.github/ISSUE_TEMPLATE.md
vendored
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
Thank you for opening an issue on an Adafruit Arduino library repository. To
|
||||
improve the speed of resolution please review the following guidelines and
|
||||
common troubleshooting steps below before creating the issue:
|
||||
|
||||
- **Do not use GitHub issues for troubleshooting projects and issues.** Instead use
|
||||
the forums at http://forums.adafruit.com to ask questions and troubleshoot why
|
||||
something isn't working as expected. In many cases the problem is a common issue
|
||||
that you will more quickly receive help from the forum community. GitHub issues
|
||||
are meant for known defects in the code. If you don't know if there is a defect
|
||||
in the code then start with troubleshooting on the forum first.
|
||||
|
||||
- **If following a tutorial or guide be sure you didn't miss a step.** Carefully
|
||||
check all of the steps and commands to run have been followed. Consult the
|
||||
forum if you're unsure or have questions about steps in a guide/tutorial.
|
||||
|
||||
- **For Arduino projects check these very common issues to ensure they don't apply**:
|
||||
|
||||
- For uploading sketches or communicating with the board make sure you're using
|
||||
a **USB data cable** and **not** a **USB charge-only cable**. It is sometimes
|
||||
very hard to tell the difference between a data and charge cable! Try using the
|
||||
cable with other devices or swapping to another cable to confirm it is not
|
||||
the problem.
|
||||
|
||||
- **Be sure you are supplying adequate power to the board.** Check the specs of
|
||||
your board and plug in an external power supply. In many cases just
|
||||
plugging a board into your computer is not enough to power it and other
|
||||
peripherals.
|
||||
|
||||
- **Double check all soldering joints and connections.** Flakey connections
|
||||
cause many mysterious problems. See the [guide to excellent soldering](https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools) for examples of good solder joints.
|
||||
|
||||
- **Ensure you are using an official Arduino or Adafruit board.** We can't
|
||||
guarantee a clone board will have the same functionality and work as expected
|
||||
with this code and don't support them.
|
||||
|
||||
If you're sure this issue is a defect in the code and checked the steps above
|
||||
please fill in the following fields to provide enough troubleshooting information.
|
||||
You may delete the guideline and text above to just leave the following details:
|
||||
|
||||
- Arduino board: **INSERT ARDUINO BOARD NAME/TYPE HERE**
|
||||
|
||||
- Arduino IDE version (found in Arduino -> About Arduino menu): **INSERT ARDUINO
|
||||
VERSION HERE**
|
||||
|
||||
- List the steps to reproduce the problem below (if possible attach a sketch or
|
||||
copy the sketch code in too): **LIST REPRO STEPS BELOW**
|
||||
26
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
26
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
Thank you for creating a pull request to contribute to Adafruit's GitHub code!
|
||||
Before you open the request please review the following guidelines and tips to
|
||||
help it be more easily integrated:
|
||||
|
||||
- **Describe the scope of your change--i.e. what the change does and what parts
|
||||
of the code were modified.** This will help us understand any risks of integrating
|
||||
the code.
|
||||
|
||||
- **Describe any known limitations with your change.** For example if the change
|
||||
doesn't apply to a supported platform of the library please mention it.
|
||||
|
||||
- **Please run any tests or examples that can exercise your modified code.** We
|
||||
strive to not break users of the code and running tests/examples helps with this
|
||||
process.
|
||||
|
||||
Thank you again for contributing! We will try to test and integrate the change
|
||||
as soon as we can, but be aware we have many GitHub repositories to manage and
|
||||
can't immediately respond to every request. There is no need to bump or check in
|
||||
on a pull request (it will clutter the discussion of the request).
|
||||
|
||||
Also don't be worried if the request is closed or not integrated--sometimes the
|
||||
priorities of Adafruit's GitHub code (education, ease of use) might not match the
|
||||
priorities of the pull request. Don't fret, the open source community thrives on
|
||||
forks and GitHub makes it easy to keep your changes in a forked repo.
|
||||
|
||||
After reviewing the guidelines above you can delete this text from the pull request.
|
||||
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
# Our handy .gitignore for automation ease
|
||||
Doxyfile*
|
||||
doxygen_sqlite3.db
|
||||
html
|
||||
23
.travis.yml
Normal file
23
.travis.yml
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
language: c
|
||||
sudo: false
|
||||
cache:
|
||||
directories:
|
||||
- ~/arduino_ide
|
||||
- ~/.arduino15/packages/
|
||||
git:
|
||||
depth: false
|
||||
quiet: true
|
||||
env:
|
||||
global:
|
||||
- PRETTYNAME="Adafruit SSD1306"
|
||||
|
||||
before_install:
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/install.sh)
|
||||
|
||||
script:
|
||||
- build_main_platforms
|
||||
|
||||
# Generate and deploy documentation
|
||||
after_success:
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/library_check.sh)
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/doxy_gen_and_deploy.sh)
|
||||
533
Adafruit_SH110X.cpp
Normal file
533
Adafruit_SH110X.cpp
Normal file
|
|
@ -0,0 +1,533 @@
|
|||
/*!
|
||||
* @file Adafruit_SSD1306.cpp
|
||||
*
|
||||
* @mainpage Arduino library for monochrome OLEDs based on SSD1306 drivers.
|
||||
*
|
||||
* @section intro_sec Introduction
|
||||
*
|
||||
* This is documentation for Adafruit's SSD1306 library for monochrome
|
||||
* OLED displays: http://www.adafruit.com/category/63_98
|
||||
*
|
||||
* These displays use I2C or SPI to communicate. I2C requires 2 pins
|
||||
* (SCL+SDA) and optionally a RESET pin. SPI requires 4 pins (MOSI, SCK,
|
||||
* select, data/command) and optionally a reset pin. Hardware SPI or
|
||||
* 'bitbang' software SPI are both supported.
|
||||
*
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* @section dependencies Dependencies
|
||||
*
|
||||
* This library depends on <a href="https://github.com/adafruit/Adafruit-GFX-Library">
|
||||
* Adafruit_GFX</a> being present on your system. Please make sure you have
|
||||
* installed the latest version before using this library.
|
||||
*
|
||||
* @section author Author
|
||||
*
|
||||
* Written by Limor Fried/Ladyada for Adafruit Industries, with
|
||||
* contributions from the open source community.
|
||||
*
|
||||
* @section license License
|
||||
*
|
||||
* BSD license, all text above, and the splash screen included below,
|
||||
* must be included in any redistribution.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef __AVR__
|
||||
#include <avr/pgmspace.h>
|
||||
#elif defined(ESP8266) || defined(ESP32)
|
||||
#include <pgmspace.h>
|
||||
#else
|
||||
#define pgm_read_byte(addr) \
|
||||
(*(const unsigned char *)(addr)) ///< PROGMEM workaround for non-AVR
|
||||
#endif
|
||||
|
||||
#if !defined(__ARM_ARCH) && !defined(ENERGIA) && !defined(ESP8266) && !defined(ESP32) && !defined(__arc__)
|
||||
#include <util/delay.h>
|
||||
#endif
|
||||
|
||||
#include <Adafruit_GFX.h>
|
||||
#include "Adafruit_SH110X.h"
|
||||
#include "splash.h"
|
||||
|
||||
// SOME DEFINES AND STATIC VARIABLES USED INTERNALLY -----------------------
|
||||
|
||||
#define sh110x_swap(a, b) \
|
||||
(((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))) ///< No-temp-var swap operation
|
||||
|
||||
// CONSTRUCTORS, DESTRUCTOR ------------------------------------------------
|
||||
|
||||
/*!
|
||||
@brief Constructor for I2C-interfaced SH110X displays.
|
||||
@param w
|
||||
Display width in pixels
|
||||
@param h
|
||||
Display height in pixels
|
||||
@param twi
|
||||
Pointer to an existing TwoWire instance (e.g. &Wire, the
|
||||
microcontroller's primary I2C bus).
|
||||
@param rst_pin
|
||||
Reset pin (using Arduino pin numbering), or -1 if not used
|
||||
(some displays might be wired to share the microcontroller's
|
||||
reset pin).
|
||||
@param clkDuring
|
||||
Speed (in Hz) for Wire transmissions in SH110X library calls.
|
||||
Defaults to 400000 (400 KHz), a known 'safe' value for most
|
||||
microcontrollers, and meets the SH110X datasheet spec.
|
||||
Some systems can operate I2C faster (800 KHz for ESP32, 1 MHz
|
||||
for many other 32-bit MCUs), and some (perhaps not all)
|
||||
SH110X's can work with this -- so it's optionally be specified
|
||||
here and is not a default behavior. (Ignored if using pre-1.5.7
|
||||
Arduino software, which operates I2C at a fixed 100 KHz.)
|
||||
@param clkAfter
|
||||
Speed (in Hz) for Wire transmissions following SH110X library
|
||||
calls. Defaults to 100000 (100 KHz), the default Arduino Wire
|
||||
speed. This is done rather than leaving it at the 'during' speed
|
||||
because other devices on the I2C bus might not be compatible
|
||||
with the faster rate. (Ignored if using pre-1.5.7 Arduino
|
||||
software, which operates I2C at a fixed 100 KHz.)
|
||||
@return Adafruit_SH110X object.
|
||||
@note Call the object's begin() function before use -- buffer
|
||||
allocation is performed there!
|
||||
*/
|
||||
Adafruit_SH110X::Adafruit_SH110X(uint8_t w, uint8_t h, TwoWire *twi,
|
||||
int8_t rst_pin) :
|
||||
Adafruit_GFX(w, h), buffer(NULL), dcPin(-1), csPin(-1), rstPin(rst_pin)
|
||||
{
|
||||
i2c_dev = NULL;
|
||||
_theWire = twi;
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief Constructor for SPI SH110X displays, using software (bitbang)
|
||||
SPI.
|
||||
@param w
|
||||
Display width in pixels
|
||||
@param h
|
||||
Display height in pixels
|
||||
@param mosi_pin
|
||||
MOSI (master out, slave in) pin (using Arduino pin numbering).
|
||||
This transfers serial data from microcontroller to display.
|
||||
@param sclk_pin
|
||||
SCLK (serial clock) pin (using Arduino pin numbering).
|
||||
This clocks each bit from MOSI.
|
||||
@param dc_pin
|
||||
Data/command pin (using Arduino pin numbering), selects whether
|
||||
display is receiving commands (low) or data (high).
|
||||
@param rst_pin
|
||||
Reset pin (using Arduino pin numbering), or -1 if not used
|
||||
(some displays might be wired to share the microcontroller's
|
||||
reset pin).
|
||||
@param cs_pin
|
||||
Chip-select pin (using Arduino pin numbering) for sharing the
|
||||
bus with other devices. Active low.
|
||||
@return Adafruit_SH110X object.
|
||||
@note Call the object's begin() function before use -- buffer
|
||||
allocation is performed there!
|
||||
*/
|
||||
Adafruit_SH110X::Adafruit_SH110X(uint8_t w, uint8_t h,
|
||||
int8_t mosi_pin, int8_t sclk_pin, int8_t dc_pin, int8_t rst_pin,
|
||||
int8_t cs_pin) : Adafruit_GFX(w, h), dcPin(dc_pin), csPin(cs_pin),
|
||||
rstPin(rst_pin) {
|
||||
|
||||
spi_dev = new Adafruit_SPIDevice(cs_pin, sclk_pin, -1, mosi_pin, 1000000);
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief Constructor for SPI SH110X displays, using native hardware SPI.
|
||||
@param w
|
||||
Display width in pixels
|
||||
@param h
|
||||
Display height in pixels
|
||||
@param spi
|
||||
Pointer to an existing SPIClass instance (e.g. &SPI, the
|
||||
microcontroller's primary SPI bus).
|
||||
@param dc_pin
|
||||
Data/command pin (using Arduino pin numbering), selects whether
|
||||
display is receiving commands (low) or data (high).
|
||||
@param rst_pin
|
||||
Reset pin (using Arduino pin numbering), or -1 if not used
|
||||
(some displays might be wired to share the microcontroller's
|
||||
reset pin).
|
||||
@param cs_pin
|
||||
Chip-select pin (using Arduino pin numbering) for sharing the
|
||||
bus with other devices. Active low.
|
||||
@param bitrate
|
||||
SPI clock rate for transfers to this display. Default if
|
||||
unspecified is 8000000UL (8 MHz).
|
||||
@return Adafruit_SH110X object.
|
||||
@note Call the object's begin() function before use -- buffer
|
||||
allocation is performed there!
|
||||
*/
|
||||
Adafruit_SH110X::Adafruit_SH110X(uint8_t w, uint8_t h, SPIClass *spi,
|
||||
int8_t dc_pin, int8_t rst_pin, int8_t cs_pin, uint32_t bitrate) :
|
||||
Adafruit_GFX(w, h), dcPin(dc_pin), csPin(cs_pin), rstPin(rst_pin) {
|
||||
|
||||
spi_dev = new Adafruit_SPIDevice(cs_pin, bitrate, SPI_BITORDER_MSBFIRST,
|
||||
SPI_MODE0, spi);
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief Destructor for Adafruit_SH110X object.
|
||||
*/
|
||||
Adafruit_SH110X::~Adafruit_SH110X(void) {
|
||||
if(buffer) {
|
||||
free(buffer);
|
||||
buffer = NULL;
|
||||
}
|
||||
if (spi_dev) delete spi_dev;
|
||||
if (i2c_dev) delete i2c_dev;
|
||||
}
|
||||
|
||||
// LOW-LEVEL UTILS ---------------------------------------------------------
|
||||
|
||||
// Issue single byte out SPI, either soft or hardware as appropriate.
|
||||
// SPI transaction/selection must be performed in calling function.
|
||||
inline void Adafruit_SH110X::SPIwrite(uint8_t d) {
|
||||
spi_dev->transfer(d);
|
||||
}
|
||||
|
||||
// Issue single command to SH110X, using I2C or hard/soft SPI as needed.
|
||||
// Because command calls are often grouped, SPI transaction and selection
|
||||
// must be started/ended in calling function for efficiency.
|
||||
// This is a private function, not exposed (see ssd1306_command() instead).
|
||||
void Adafruit_SH110X::sh110x_command(uint8_t c) {
|
||||
if(i2c_dev) { // I2C
|
||||
uint8_t buf[2] = {0x00, c}; // Co = 0, D/C = 0
|
||||
i2c_dev->write(buf, 2);
|
||||
} else { // SPI (hw or soft) -- transaction started in calling function
|
||||
digitalWrite(dcPin, LOW);
|
||||
spi_dev->write(&c, 1);
|
||||
}
|
||||
}
|
||||
|
||||
// Issue list of commands to SH110X, same rules as above re: transactions.
|
||||
// This is a private function, not exposed.
|
||||
bool Adafruit_SH110X::sh110x_commandList(const uint8_t *c, uint8_t n) {
|
||||
if (i2c_dev) { // I2C
|
||||
uint8_t dc_byte = 0x00; // Co = 0, D/C = 0
|
||||
if (! i2c_dev->write(c, n, true, &dc_byte, 1)) {
|
||||
return false;
|
||||
}
|
||||
} else { // SPI -- transaction started in calling function
|
||||
digitalWrite(dcPin, LOW);
|
||||
while(n--) {
|
||||
uint8_t b = pgm_read_byte(c++);
|
||||
spi_dev->write(&b, 1);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// ALLOCATE & INIT DISPLAY -------------------------------------------------
|
||||
|
||||
/*!
|
||||
@brief Allocate RAM for image buffer, initialize peripherals and pins.
|
||||
@param vcs
|
||||
VCC selection. Pass SH110X_SWITCHCAPVCC to generate the display
|
||||
voltage (step up) from the 3.3V source, or SH110X_EXTERNALVCC
|
||||
otherwise. Most situations with Adafruit SH110X breakouts will
|
||||
want SH110X_SWITCHCAPVCC.
|
||||
@param addr
|
||||
I2C address of corresponding SH110X display (or pass 0 to use
|
||||
default of 0x3C for 128x32 display, 0x3D for all others).
|
||||
SPI displays (hardware or software) do not use addresses, but
|
||||
this argument is still required (pass 0 or any value really,
|
||||
it will simply be ignored). Default if unspecified is 0.
|
||||
@param reset
|
||||
If true, and if the reset pin passed to the constructor is
|
||||
valid, a hard reset will be performed before initializing the
|
||||
display. If using multiple SH110X displays on the same bus, and
|
||||
if they all share the same reset pin, you should only pass true
|
||||
on the first display being initialized, false on all others,
|
||||
else the already-initialized displays would be reset. Default if
|
||||
unspecified is true.
|
||||
@param periphBegin
|
||||
If true, and if a hardware peripheral is being used (I2C or SPI,
|
||||
but not software SPI), call that peripheral's begin() function,
|
||||
else (false) it has already been done in one's sketch code.
|
||||
Cases where false might be used include multiple displays or
|
||||
other devices sharing a common bus, or situations on some
|
||||
platforms where a nonstandard begin() function is available
|
||||
(e.g. a TwoWire interface on non-default pins, as can be done
|
||||
on the ESP8266 and perhaps others).
|
||||
@return true on successful allocation/init, false otherwise.
|
||||
Well-behaved code should check the return value before
|
||||
proceeding.
|
||||
@note MUST call this function before any drawing or updates!
|
||||
*/
|
||||
bool Adafruit_SH110X::begin(uint8_t vcs, uint8_t addr, boolean reset) {
|
||||
|
||||
// attempt to malloc the bitmap framebuffer
|
||||
if((!buffer) && !(buffer = (uint8_t *)malloc(WIDTH * ((HEIGHT + 7) / 8)))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Setup pin directions
|
||||
if (_theWire) { // using I2C
|
||||
i2c_dev = new Adafruit_I2CDevice(addr, _theWire);
|
||||
// look for i2c address:
|
||||
if (!i2c_dev || !i2c_dev->begin()) {
|
||||
return false;
|
||||
}
|
||||
} else { // Using one of the SPI modes, either soft or hardware
|
||||
if (!spi_dev || !spi_dev->begin()) {
|
||||
return;
|
||||
}
|
||||
pinMode(dcPin, OUTPUT); // Set data/command pin as output
|
||||
}
|
||||
|
||||
clearDisplay();
|
||||
if(HEIGHT > 32) {
|
||||
drawBitmap((WIDTH - splash1_width) / 2, (HEIGHT - splash1_height) / 2,
|
||||
splash1_data, splash1_width, splash1_height, 1);
|
||||
} else {
|
||||
drawBitmap((WIDTH - splash2_width) / 2, (HEIGHT - splash2_height) / 2,
|
||||
splash2_data, splash2_width, splash2_height, 1);
|
||||
}
|
||||
|
||||
vccstate = vcs;
|
||||
|
||||
// Reset SH110X if requested and reset pin specified in constructor
|
||||
if(reset && (rstPin >= 0)) {
|
||||
pinMode(rstPin, OUTPUT);
|
||||
digitalWrite(rstPin, HIGH);
|
||||
delay(1); // VDD goes high at start, pause for 1 ms
|
||||
digitalWrite(rstPin, LOW); // Bring reset low
|
||||
delay(10); // Wait 10 ms
|
||||
digitalWrite(rstPin, HIGH); // Bring out of reset
|
||||
delay(10);
|
||||
}
|
||||
|
||||
// Init sequence, make sure its under 32 bytes, or split into multiples!
|
||||
static const uint8_t init[] = {
|
||||
SH110X_DISPLAYOFF, // 0xAE
|
||||
SH110X_SETDISPSTARTLINE, 0x0, // 0xDC 0x00
|
||||
SH110X_SETCONTRAST, 0x2F, // 0x81, 0x2F
|
||||
SH110X_MEMORYMODE, // 0x20
|
||||
SH110X_SEGREMAP, // 0xA0
|
||||
SH110X_COMSCANINC, // 0xC0
|
||||
SH110X_SETMULTIPLEX, 0x7F, // 0xa8, 0x7f,
|
||||
SH110X_SETDISPLAYOFFSET, 0x60, // 0xd3, 0x60,
|
||||
SH110X_SETDISPLAYCLOCKDIV, 0x51, // 0xd5, 0x51,
|
||||
SH110X_SETPRECHARGE, 0x22, // 0xd9, 0x22,
|
||||
SH110X_SETVCOMDETECT, 0x35, // 0xdb, 0x35,
|
||||
SH110X_SETPAGEADDR, // 0xb0
|
||||
SH110X_SETCOMPINS, 0x12, // 0xda, 0x12,
|
||||
SH110X_DISPLAYALLON_RESUME, // 0xa4
|
||||
SH110X_NORMALDISPLAY, // 0xa6
|
||||
SH110X_DISPLAYON, // 0xaf
|
||||
};
|
||||
|
||||
if (! sh110x_commandList(init, sizeof(init))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true; // Success
|
||||
}
|
||||
|
||||
// DRAWING FUNCTIONS -------------------------------------------------------
|
||||
|
||||
/*!
|
||||
@brief Set/clear/invert a single pixel. This is also invoked by the
|
||||
Adafruit_GFX library in generating many higher-level graphics
|
||||
primitives.
|
||||
@param x
|
||||
Column of display -- 0 at left to (screen width - 1) at right.
|
||||
@param y
|
||||
Row of display -- 0 at top to (screen height -1) at bottom.
|
||||
@param color
|
||||
Pixel color, one of: SH110X_BLACK, SH110X_WHITE or SH110X_INVERT.
|
||||
@return None (void).
|
||||
@note Changes buffer contents only, no immediate effect on display.
|
||||
Follow up with a call to display(), or with other graphics
|
||||
commands as needed by one's own application.
|
||||
*/
|
||||
void Adafruit_SH110X::drawPixel(int16_t x, int16_t y, uint16_t color) {
|
||||
if((x >= 0) && (x < width()) && (y >= 0) && (y < height())) {
|
||||
// Pixel is in-bounds. Rotate coordinates if needed.
|
||||
switch(getRotation()) {
|
||||
case 1:
|
||||
sh110x_swap(x, y);
|
||||
x = WIDTH - x - 1;
|
||||
break;
|
||||
case 2:
|
||||
x = WIDTH - x - 1;
|
||||
y = HEIGHT - y - 1;
|
||||
break;
|
||||
case 3:
|
||||
sh110x_swap(x, y);
|
||||
y = HEIGHT - y - 1;
|
||||
break;
|
||||
}
|
||||
switch(color) {
|
||||
case SH110X_WHITE: buffer[x + (y/8)*WIDTH] |= (1 << (y&7)); break;
|
||||
case SH110X_BLACK: buffer[x + (y/8)*WIDTH] &= ~(1 << (y&7)); break;
|
||||
case SH110X_INVERSE: buffer[x + (y/8)*WIDTH] ^= (1 << (y&7)); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief Clear contents of display buffer (set all pixels to off).
|
||||
@return None (void).
|
||||
@note Changes buffer contents only, no immediate effect on display.
|
||||
Follow up with a call to display(), or with other graphics
|
||||
commands as needed by one's own application.
|
||||
*/
|
||||
void Adafruit_SH110X::clearDisplay(void) {
|
||||
memset(buffer, 0, WIDTH * ((HEIGHT + 7) / 8));
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief Return color of a single pixel in display buffer.
|
||||
@param x
|
||||
Column of display -- 0 at left to (screen width - 1) at right.
|
||||
@param y
|
||||
Row of display -- 0 at top to (screen height -1) at bottom.
|
||||
@return true if pixel is set (usually SH110X_WHITE, unless display invert mode
|
||||
is enabled), false if clear (SH110X_BLACK).
|
||||
@note Reads from buffer contents; may not reflect current contents of
|
||||
screen if display() has not been called.
|
||||
*/
|
||||
boolean Adafruit_SH110X::getPixel(int16_t x, int16_t y) {
|
||||
if((x >= 0) && (x < width()) && (y >= 0) && (y < height())) {
|
||||
// Pixel is in-bounds. Rotate coordinates if needed.
|
||||
switch(getRotation()) {
|
||||
case 1:
|
||||
sh110x_swap(x, y);
|
||||
x = WIDTH - x - 1;
|
||||
break;
|
||||
case 2:
|
||||
x = WIDTH - x - 1;
|
||||
y = HEIGHT - y - 1;
|
||||
break;
|
||||
case 3:
|
||||
sh110x_swap(x, y);
|
||||
y = HEIGHT - y - 1;
|
||||
break;
|
||||
}
|
||||
return (buffer[x + (y / 8) * WIDTH] & (1 << (y & 7)));
|
||||
}
|
||||
return false; // Pixel out of bounds
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief Get base address of display buffer for direct reading or writing.
|
||||
@return Pointer to an unsigned 8-bit array, column-major, columns padded
|
||||
to full byte boundary if needed.
|
||||
*/
|
||||
uint8_t *Adafruit_SH110X::getBuffer(void) {
|
||||
return buffer;
|
||||
}
|
||||
|
||||
// REFRESH DISPLAY ---------------------------------------------------------
|
||||
|
||||
/*!
|
||||
@brief Push data currently in RAM to SH110X display.
|
||||
@return None (void).
|
||||
@note Drawing operations are not visible until this function is
|
||||
called. Call after each graphics command, or after a whole set
|
||||
of graphics commands, as best needed by one's own application.
|
||||
*/
|
||||
void Adafruit_SH110X::display(void) {
|
||||
/*
|
||||
static const uint8_t dlist1[] = {
|
||||
SH110X_PAGEADDR,
|
||||
0, // Page start address
|
||||
0xFF, // Page end (not really, but works here)
|
||||
SH110X_COLUMNADDR,
|
||||
0 }; // Column start address
|
||||
sh110x_commandList(dlist1, sizeof(dlist1));
|
||||
sh110x_command(WIDTH - 1); // Column end address
|
||||
*/
|
||||
|
||||
#if defined(ESP8266)
|
||||
// ESP8266 needs a periodic yield() call to avoid watchdog reset.
|
||||
// With the limited size of SH110X displays, and the fast bitrate
|
||||
// being used (1 MHz or more), I think one yield() immediately before
|
||||
// a screen write and one immediately after should cover it. But if
|
||||
// not, if this becomes a problem, yields() might be added in the
|
||||
// 32-byte transfer condition below.
|
||||
yield();
|
||||
#endif
|
||||
uint16_t count = WIDTH * ((HEIGHT + 7) / 8);
|
||||
uint8_t *ptr = buffer;
|
||||
uint8_t dc_byte = 0x40;
|
||||
uint8_t pages = ((HEIGHT + 7) / 8);
|
||||
|
||||
uint8_t bytes_per_page = WIDTH;
|
||||
|
||||
uint16_t maxbuff = i2c_dev->maxBufferSize() - 1;
|
||||
|
||||
if (i2c_dev) { // I2C
|
||||
// how many buffers-worth are we sending?
|
||||
uint8_t buffs = (bytes_per_page / maxbuff);
|
||||
if (count % maxbuff) {
|
||||
buffs++;
|
||||
}
|
||||
Serial.print("Have to send "); Serial.print(buffs);
|
||||
Serial.println(" buffs per page");
|
||||
|
||||
for (uint8_t p=0; p<pages; p++) {
|
||||
uint8_t bytes_remaining = bytes_per_page;
|
||||
|
||||
Serial.print(F("Writing page addr "));
|
||||
Serial.println(p);
|
||||
|
||||
uint8_t cmd[] = {0x00, SH110X_SETPAGEADDR + p, 0x10, 0x00};
|
||||
i2c_dev->write(cmd, 4);
|
||||
|
||||
while (bytes_remaining) {
|
||||
uint8_t to_write = min(bytes_remaining, maxbuff);
|
||||
i2c_dev->write(ptr, to_write, true, &dc_byte, 1);
|
||||
ptr += to_write;
|
||||
bytes_remaining -= to_write;
|
||||
#if defined(ESP8266)
|
||||
yield();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
} else { // SPI
|
||||
//SH110X_MODE_DATA
|
||||
//while(count--) SPIwrite(*ptr++);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// OTHER HARDWARE SETTINGS -------------------------------------------------
|
||||
|
||||
/*!
|
||||
@brief Enable or disable display invert mode (white-on-black vs
|
||||
black-on-white).
|
||||
@param i
|
||||
If true, switch to invert mode (black-on-white), else normal
|
||||
mode (white-on-black).
|
||||
@return None (void).
|
||||
@note This has an immediate effect on the display, no need to call the
|
||||
display() function -- buffer contents are not changed, rather a
|
||||
different pixel mode of the display hardware is used. When
|
||||
enabled, drawing SH110X_BLACK (value 0) pixels will actually draw white,
|
||||
SH110X_WHITE (value 1) will draw black.
|
||||
*/
|
||||
void Adafruit_SH110X::invertDisplay(boolean i) {
|
||||
sh110x_command(i ? SH110X_INVERTDISPLAY : SH110X_NORMALDISPLAY);
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief Dim the display.
|
||||
@param dim
|
||||
true to enable lower brightness mode, false for full brightness.
|
||||
@return None (void).
|
||||
@note This has an immediate effect on the display, no need to call the
|
||||
display() function -- buffer contents are not changed.
|
||||
*/
|
||||
void Adafruit_SH110X::dim(boolean dim) {
|
||||
// the range of contrast to too small to be really useful
|
||||
// it is useful to dim the display
|
||||
sh110x_command(SH110X_SETCONTRAST);
|
||||
sh110x_command(dim ? 0 : contrast);
|
||||
}
|
||||
120
Adafruit_SH110X.h
Normal file
120
Adafruit_SH110X.h
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
/*!
|
||||
* @file Adafruit_SH110X.h
|
||||
*
|
||||
* This is part of for Adafruit's SSD1306 library for monochrome
|
||||
* OLED displays: http://www.adafruit.com/category/63_98
|
||||
*
|
||||
* These displays use I2C or SPI to communicate. I2C requires 2 pins
|
||||
* (SCL+SDA) and optionally a RESET pin. SPI requires 4 pins (MOSI, SCK,
|
||||
* select, data/command) and optionally a reset pin. Hardware SPI or
|
||||
* 'bitbang' software SPI are both supported.
|
||||
*
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* Written by Limor Fried/Ladyada for Adafruit Industries, with
|
||||
* contributions from the open source community.
|
||||
*
|
||||
* BSD license, all text above, and the splash screen header file,
|
||||
* must be included in any redistribution.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _Adafruit_SH110X_H_
|
||||
#define _Adafruit_SH110X_H_
|
||||
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
#include <Adafruit_GFX.h>
|
||||
#include <Adafruit_I2CDevice.h>
|
||||
#include <Adafruit_SPIDevice.h>
|
||||
|
||||
/// fit into the SH110X_ naming scheme
|
||||
#define SH110X_BLACK 0 ///< Draw 'off' pixels
|
||||
#define SH110X_WHITE 1 ///< Draw 'on' pixels
|
||||
#define SH110X_INVERSE 2 ///< Invert pixels
|
||||
|
||||
#define SH110X_MEMORYMODE 0x20 ///< See datasheet
|
||||
#define SH110X_COLUMNADDR 0x21 ///< See datasheet
|
||||
#define SH110X_PAGEADDR 0x22 ///< See datasheet
|
||||
#define SH110X_SETCONTRAST 0x81 ///< See datasheet
|
||||
#define SH110X_CHARGEPUMP 0x8D ///< See datasheet
|
||||
#define SH110X_SEGREMAP 0xA0 ///< See datasheet
|
||||
#define SH110X_DISPLAYALLON_RESUME 0xA4 ///< See datasheet
|
||||
#define SH110X_DISPLAYALLON 0xA5 ///< Not currently used
|
||||
#define SH110X_NORMALDISPLAY 0xA6 ///< See datasheet
|
||||
#define SH110X_INVERTDISPLAY 0xA7 ///< See datasheet
|
||||
#define SH110X_SETMULTIPLEX 0xA8 ///< See datasheet
|
||||
#define SH110X_DISPLAYOFF 0xAE ///< See datasheet
|
||||
#define SH110X_DISPLAYON 0xAF ///< See datasheet
|
||||
#define SH110X_SETPAGEADDR 0xB0 ///< Specify page address to load display RAM data to page address register
|
||||
#define SH110X_COMSCANINC 0xC0 ///< Not currently used
|
||||
#define SH110X_COMSCANDEC 0xC8 ///< See datasheet
|
||||
#define SH110X_SETDISPLAYOFFSET 0xD3 ///< See datasheet
|
||||
#define SH110X_SETDISPLAYCLOCKDIV 0xD5 ///< See datasheet
|
||||
#define SH110X_SETPRECHARGE 0xD9 ///< See datasheet
|
||||
#define SH110X_SETCOMPINS 0xDA ///< See datasheet
|
||||
#define SH110X_SETVCOMDETECT 0xDB ///< See datasheet
|
||||
#define SH110X_SETDISPSTARTLINE 0xDC ///< Specify Column address to determine the initial display line or COM0.
|
||||
|
||||
#define SH110X_SETLOWCOLUMN 0x00 ///< Not currently used
|
||||
#define SH110X_SETHIGHCOLUMN 0x10 ///< Not currently used
|
||||
#define SH110X_SETSTARTLINE 0x40 ///< See datasheet
|
||||
|
||||
#define SH110X_EXTERNALVCC 0x01 ///< External display voltage source
|
||||
#define SH110X_SWITCHCAPVCC 0x02 ///< Gen. display voltage from 3.3V
|
||||
|
||||
#define SH110X_RIGHT_HORIZONTAL_SCROLL 0x26 ///< Init rt scroll
|
||||
#define SH110X_LEFT_HORIZONTAL_SCROLL 0x27 ///< Init left scroll
|
||||
#define SH110X_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29 ///< Init diag scroll
|
||||
#define SH110X_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A ///< Init diag scroll
|
||||
#define SH110X_DEACTIVATE_SCROLL 0x2E ///< Stop scroll
|
||||
#define SH110X_ACTIVATE_SCROLL 0x2F ///< Start scroll
|
||||
#define SH110X_SET_VERTICAL_SCROLL_AREA 0xA3 ///< Set scroll range
|
||||
|
||||
|
||||
/*!
|
||||
@brief Class that stores state and functions for interacting with
|
||||
SH110X OLED displays.
|
||||
*/
|
||||
class Adafruit_SH110X : public Adafruit_GFX {
|
||||
public:
|
||||
// NEW CONSTRUCTORS -- recommended for new projects
|
||||
Adafruit_SH110X(uint8_t w, uint8_t h, TwoWire *twi=&Wire, int8_t rst_pin=-1);
|
||||
Adafruit_SH110X(uint8_t w, uint8_t h, int8_t mosi_pin, int8_t sclk_pin,
|
||||
int8_t dc_pin, int8_t rst_pin, int8_t cs_pin);
|
||||
Adafruit_SH110X(uint8_t w, uint8_t h, SPIClass *spi,
|
||||
int8_t dc_pin, int8_t rst_pin, int8_t cs_pin, uint32_t bitrate=8000000UL);
|
||||
|
||||
~Adafruit_SH110X(void);
|
||||
|
||||
bool begin(uint8_t switchvcc=SH110X_SWITCHCAPVCC,
|
||||
uint8_t i2caddr=0x3C, boolean reset=true);
|
||||
void display(void);
|
||||
void clearDisplay(void);
|
||||
void invertDisplay(boolean i);
|
||||
void dim(boolean dim);
|
||||
void drawPixel(int16_t x, int16_t y, uint16_t color);
|
||||
boolean getPixel(int16_t x, int16_t y);
|
||||
uint8_t *getBuffer(void);
|
||||
|
||||
private:
|
||||
void SPIwrite(uint8_t d);
|
||||
|
||||
void sh110x_command(uint8_t c);
|
||||
bool sh110x_commandList(const uint8_t *c, uint8_t n);
|
||||
|
||||
Adafruit_SPIDevice *spi_dev = NULL;
|
||||
Adafruit_I2CDevice *i2c_dev = NULL;
|
||||
TwoWire *_theWire = NULL;
|
||||
int dcPin, csPin, rstPin;
|
||||
uint8_t *buffer = NULL;
|
||||
int8_t i2caddr, vccstate, page_end;
|
||||
|
||||
uint8_t contrast; // normal contrast setting for this device
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // _Adafruit_SH110X_H_
|
||||
BIN
Desktop.ini
Normal file
BIN
Desktop.ini
Normal file
Binary file not shown.
10
library.properties
Normal file
10
library.properties
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
name=Adafruit SH110X
|
||||
version=0.0.1
|
||||
author=Adafruit
|
||||
maintainer=Adafruit <info@adafruit.com>
|
||||
sentence=SH110X oled driver library for monochrome displays
|
||||
paragraph=SH110X oled driver library for monochrome displays
|
||||
category=Display
|
||||
url=https://github.com/adafruit/Adafruit_SH110X
|
||||
architectures=*
|
||||
depends=Adafruit GFX Library
|
||||
26
license.txt
Normal file
26
license.txt
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
Software License Agreement (BSD License)
|
||||
|
||||
Copyright (c) 2012, Adafruit Industries
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
3. Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
108
splash.h
Normal file
108
splash.h
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
|
||||
#define splash1_width 82
|
||||
#define splash1_height 64
|
||||
|
||||
const uint8_t PROGMEM splash1_data[] = {
|
||||
B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B10000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B10000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11100000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11110000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00011111,B11111000,B01111111,B11110000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00111111,B11111110,B01111111,B11110000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00111111,B11111111,B01111111,B11110000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00011111,B11111111,B11111011,B11100000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00001111,B11111111,B11111001,B11111111,B11000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00001111,B11111111,B11111001,B11111111,B11111000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000111,B11111111,B11110001,B11111111,B11111111,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000011,B11111100,B01110011,B11111111,B11111111,B10000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000001,B11111110,B00111111,B11111111,B11111111,B10000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B11111111,B00011110,B00001111,B11111111,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B01111111,B11111110,B00011111,B11111100,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111111,B11111000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00001111,B11011111,B11111111,B11100000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00011111,B00011001,B11111111,B11000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00111111,B00111100,B11111111,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B01111110,B01111100,B11111000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B01111111,B11111110,B01111100,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11111100,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11111110,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11111110,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000001,B11111111,B11101111,B11111110,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000001,B11111111,B11001111,B11111110,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000011,B11111111,B00000111,B11111110,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000011,B11111100,B00000111,B11111110,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000011,B11110000,B00000011,B11111110,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000001,B10000000,B00000000,B11111110,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111110,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001100,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B00000111,B10000000,B00000000,B11111100,B00000000,B00000000,B00000011,B11000000,B00000000,
|
||||
B00000000,B00000000,B00000111,B10000000,B00000001,B11111100,B00000000,B00000000,B00000011,B11000000,B00000000,
|
||||
B00000000,B00000000,B00000111,B10000000,B00000001,B11111100,B00000000,B00000000,B00000011,B11000000,B00000000,
|
||||
B00000000,B00000000,B00000111,B10000000,B00000001,B11100000,B00000000,B00000000,B00000000,B00011110,B00000000,
|
||||
B00000000,B00000000,B00000111,B10000000,B00000001,B11100000,B00000000,B00000000,B00000000,B00011110,B00000000,
|
||||
B01111111,B11100011,B11110111,B10011111,B11111001,B11111101,B11100111,B01111000,B01111011,B11011111,B11000000,
|
||||
B11111111,B11110111,B11111111,B10111111,B11111101,B11111101,B11111111,B01111000,B01111011,B11011111,B11000000,
|
||||
B11111111,B11110111,B11111111,B10111111,B11111101,B11111101,B11111111,B01111000,B01111011,B11011111,B11000000,
|
||||
B11110000,B11110111,B10000111,B10111100,B00111101,B11100001,B11111111,B01111000,B01111011,B11011110,B00000000,
|
||||
B11110000,B11110111,B10000111,B10111100,B00111101,B11100001,B11110000,B01111000,B01111011,B11011110,B00000000,
|
||||
B00000000,B11110111,B10000111,B10000000,B00111101,B11100001,B11100000,B01111000,B01111011,B11011110,B00000000,
|
||||
B01111111,B11110111,B10000111,B10011111,B11111101,B11100001,B11100000,B01111000,B01111011,B11011110,B00000000,
|
||||
B11111111,B11110111,B10000111,B10111111,B11111101,B11100001,B11100000,B01111000,B01111011,B11011110,B00000000,
|
||||
B11110000,B11110111,B10000111,B10111100,B00111101,B11100001,B11100000,B01111000,B01111011,B11011110,B00000000,
|
||||
B11110000,B11110111,B10000111,B10111100,B00111101,B11100001,B11100000,B01111000,B01111011,B11011110,B00000000,
|
||||
B11110000,B11110111,B10000111,B10111100,B00111101,B11100001,B11100000,B01111000,B01111011,B11011110,B00000000,
|
||||
B11111111,B11110111,B11111111,B10111111,B11111101,B11100001,B11100000,B01111111,B11111011,B11011111,B11000000,
|
||||
B11111111,B11110111,B11111111,B10111111,B11111101,B11100001,B11100000,B01111111,B11111011,B11011111,B11000000,
|
||||
B01111100,B11110011,B11110011,B10011111,B00111101,B11100001,B11100000,B00111110,B01111011,B11001111,B11000000,
|
||||
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11000000,
|
||||
B11111111,B11111111,B11111111,B11111111,B11111101,B01101000,B11011011,B00010001,B00011010,B00110001,B11000000,
|
||||
B11111111,B11111111,B11111111,B11111111,B11111101,B00101011,B01011010,B11111011,B01101010,B11101111,B11000000,
|
||||
B11111111,B11111111,B11111111,B11111111,B11111101,B01001011,B01011011,B00111011,B00011010,B00110011,B11000000,
|
||||
B11111111,B11111111,B11111111,B11111111,B11111101,B01101011,B01011011,B11011011,B01101010,B11111101,B11000000,
|
||||
};
|
||||
|
||||
#define splash2_width 115
|
||||
#define splash2_height 32
|
||||
|
||||
const uint8_t PROGMEM splash2_data[] = {
|
||||
B00000000,B00000000,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000000,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000001,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000011,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00000111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00000000,B00001111,B11111000,B00000000,B00000000,B00000000,B00000011,B11000000,B00000000,B01111110,B00000000,B00000000,B00000001,B11100000,B00000000,
|
||||
B01111111,B00001111,B11111000,B00000000,B00000000,B00000000,B00000011,B11000000,B00000000,B11111110,B00000000,B00000000,B00000001,B11100000,B00000000,
|
||||
B11111111,B11101111,B11111000,B00000000,B00000000,B00000000,B00000011,B11000000,B00000000,B11111110,B00000000,B00000000,B00000001,B11100000,B00000000,
|
||||
B11111111,B11111111,B11111000,B00000000,B00000000,B00000000,B00000011,B11000000,B00000000,B11110000,B00000000,B00000000,B00000000,B00001111,B00000000,
|
||||
B01111111,B11111110,B01111111,B11000000,B00000000,B00000000,B00000011,B11000000,B00000000,B11110000,B00000000,B00000000,B00000000,B00001111,B00000000,
|
||||
B00111111,B11111110,B01111111,B11111000,B00111111,B11110001,B11111011,B11001111,B11111100,B11111110,B11110011,B10111100,B00111101,B11101111,B11100000,
|
||||
B00011111,B11111110,B01111111,B11111111,B01111111,B11111011,B11111111,B11011111,B11111110,B11111110,B11111111,B10111100,B00111101,B11101111,B11100000,
|
||||
B00011111,B11000110,B11111111,B11111111,B01111111,B11111011,B11111111,B11011111,B11111110,B11111110,B11111111,B10111100,B00111101,B11101111,B11100000,
|
||||
B00001111,B11100011,B11000111,B11111110,B01111000,B01111011,B11000011,B11011110,B00011110,B11110000,B11111111,B10111100,B00111101,B11101111,B00000000,
|
||||
B00000111,B11111111,B10000111,B11111100,B01111000,B01111011,B11000011,B11011110,B00011110,B11110000,B11111000,B00111100,B00111101,B11101111,B00000000,
|
||||
B00000001,B11111111,B11111111,B11110000,B00000000,B01111011,B11000011,B11000000,B00011110,B11110000,B11110000,B00111100,B00111101,B11101111,B00000000,
|
||||
B00000001,B11110011,B01111111,B11100000,B00111111,B11111011,B11000011,B11001111,B11111110,B11110000,B11110000,B00111100,B00111101,B11101111,B00000000,
|
||||
B00000011,B11100011,B00111111,B10000000,B01111111,B11111011,B11000011,B11011111,B11111110,B11110000,B11110000,B00111100,B00111101,B11101111,B00000000,
|
||||
B00000111,B11100111,B00111100,B00000000,B01111000,B01111011,B11000011,B11011110,B00011110,B11110000,B11110000,B00111100,B00111101,B11101111,B00000000,
|
||||
B00000111,B11111111,B10111110,B00000000,B01111000,B01111011,B11000011,B11011110,B00011110,B11110000,B11110000,B00111100,B00111101,B11101111,B00000000,
|
||||
B00000111,B11111111,B11111110,B00000000,B01111000,B01111011,B11000011,B11011110,B00011110,B11110000,B11110000,B00111100,B00111101,B11101111,B00000000,
|
||||
B00001111,B11111111,B11111110,B00000000,B01111111,B11111011,B11111111,B11011111,B11111110,B11110000,B11110000,B00111111,B11111101,B11101111,B11100000,
|
||||
B00001111,B11111111,B11111111,B00000000,B01111111,B11111011,B11111111,B11011111,B11111110,B11110000,B11110000,B00111111,B11111101,B11101111,B11100000,
|
||||
B00001111,B11111001,B11111111,B00000000,B00111110,B01111001,B11111001,B11001111,B10011110,B11110000,B11110000,B00011111,B00111101,B11100111,B11100000,
|
||||
B00011111,B11110001,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
|
||||
B00011111,B10000000,B11111111,B00000000,B01111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,
|
||||
B00011100,B00000000,B01111111,B00000000,B01111111,B11111111,B11111111,B11111111,B11111110,B10110100,B01101101,B10001000,B10001101,B00011000,B11100000,
|
||||
B00000000,B00000000,B00011111,B00000000,B01111111,B11111111,B11111111,B11111111,B11111110,B10010101,B10101101,B01111101,B10110101,B01110111,B11100000,
|
||||
B00000000,B00000000,B00001111,B00000000,B01111111,B11111111,B11111111,B11111111,B11111110,B10100101,B10101101,B10011101,B10001101,B00011001,B11100000,
|
||||
B00000000,B00000000,B00000110,B00000000,B01111111,B11111111,B11111111,B11111111,B11111110,B10110101,B10101101,B11101101,B10110101,B01111110,B11100000,
|
||||
};
|
||||
Loading…
Reference in a new issue