mirror of https://github.com/arendst/Tasmota.git
SSH1106 driver replaced with uDisplay (#21183)
This commit is contained in:
parent
6492596a10
commit
a006e5fc53
|
@ -249,7 +249,6 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the
|
|||
| USE_DISPLAY | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_LCD | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_MATRIX | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_SH1106 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_EPAPER_29 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_EPAPER_42 | - | - / - | - | - | - | x |
|
||||
| USE_DISPLAY_SSD1351 | - | - / - | - | - | - | x |
|
||||
|
@ -278,6 +277,6 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the
|
|||
| USE_DINGTIAN_RELAY | | / - | | | | |
|
||||
| USE_MATTER_DEVICE | | / x | | | | | See SetOption151 |
|
||||
|
||||
The following specific display drivers are replaced with uDisplay, see [uDisplay/uTouch documentation](https://tasmota.github.io/docs/Universal-Display-Driver/#migrating-to-udisplay): `USE_DISPLAY_ILI9341`, `USE_DISPLAY_SSD1306`
|
||||
The following specific display drivers are replaced with uDisplay, see [uDisplay/uTouch documentation](https://tasmota.github.io/docs/Universal-Display-Driver/#migrating-to-udisplay): `USE_DISPLAY_ILI9341`, `USE_DISPLAY_SSD1306`, `USE_DISPLAY_SH1106`
|
||||
|
||||
- USE_MQTT_TLS is enabled by default in every ESP32 variants
|
||||
|
|
|
@ -27,6 +27,9 @@ All notable changes to this project will be documented in this file.
|
|||
### Removed
|
||||
- Unused `#define MQTT_DATA_STRING` support
|
||||
- ILI9341 driver replaced with uDisplay (#21169)
|
||||
- SSD1306 driver replaced with uDisplay (#21176)
|
||||
- SSD1331 driver replaced with uDisplay (#21177)
|
||||
- SSH1106 driver replaced with uDisplay
|
||||
|
||||
## [13.4.0.3] 20240402
|
||||
### Added
|
||||
|
|
|
@ -13,9 +13,9 @@ Index | Define | Driver | Device | Address(es) | Bus2 | Descrip
|
|||
2 | USE_PCF8574 | xdrv_28 | PCF8574 | 0x20 - 0x26 | | 8-bit I/O expander (address range overridable)
|
||||
2 | USE_PCF8574 | xdrv_28 | PCF8574A | 0x39 - 0x3F | | 8-bit I/O expander (address range overridable)
|
||||
3 | USE_DISPLAY_LCD | xdsp_01 | | 0x27, 0x3F | | LCD display
|
||||
4 | - REMOVED | | | | | USE_DISPLAY_SSD1306 - REMOVED
|
||||
4 | REMOVED | | | | | USE_DISPLAY_SSD1306 - REMOVED
|
||||
5 | USE_DISPLAY_MATRIX | xdsp_03 | HT16K33 | 0x70 - 0x77 | | 8x8 led matrix
|
||||
6 | USE_DISPLAY_SH1106 | xdsp_07 | SH1106 | 0x3C - 0x3D | | Oled display
|
||||
6 | REMOVED | | SH1106 | 0x3C - 0x3D | | USE_DISPLAY_SH1106 - REMOVED
|
||||
7 | USE_ADE7953 | xnrg_07 | ADE7953 | 0x38 | | Energy monitor
|
||||
8 | USE_SHT | xsns_07 | SHT1X | Any | | Temperature and Humidity sensor
|
||||
9 | USE_HTU | xsns_08 | HTU21 | 0x40 | Yes | Temperature and Humidity sensor
|
||||
|
|
|
@ -1,303 +0,0 @@
|
|||
/*********************************************************************
|
||||
This is a library for our Monochrome OLEDs based on SSD1306 drivers
|
||||
|
||||
Pick one up today in the adafruit shop!
|
||||
------> http://www.adafruit.com/category/63_98
|
||||
|
||||
These displays use SPI to communicate, 4 or 5 pins are required to
|
||||
interface
|
||||
|
||||
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.
|
||||
BSD license, check license.txt for more information
|
||||
All text above, and the splash screen below must be included in any redistribution
|
||||
*********************************************************************/
|
||||
|
||||
/*********************************************************************
|
||||
I change the adafruit SSD1306 to SH1106
|
||||
|
||||
SH1106 driver similar to SSD1306 so, just change the display() method.
|
||||
|
||||
However, SH1106 driver don't provide several functions such as scroll commands.
|
||||
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
//#include <avr/pgmspace.h>
|
||||
#ifndef __SAM3X8E__
|
||||
// #include <util/delay.h>
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
#include <Wire.h>
|
||||
//#include <../../sonoff/settings.h>
|
||||
|
||||
#include "Adafruit_SH1106.h"
|
||||
#define DISPLAY_INIT_MODE 0
|
||||
|
||||
// the memory buffer for the LCD
|
||||
|
||||
uint8_t *dbuff;
|
||||
|
||||
Adafruit_SH1106::Adafruit_SH1106(int16_t width, int16_t height) :
|
||||
Renderer(width,height) {
|
||||
}
|
||||
|
||||
void Adafruit_SH1106::DisplayOnff(int8_t on) {
|
||||
if (on) {
|
||||
SH1106_command(SH1106_DISPLAYON);
|
||||
} else {
|
||||
SH1106_command(SH1106_DISPLAYOFF);
|
||||
}
|
||||
}
|
||||
|
||||
void Adafruit_SH1106::Updateframe() {
|
||||
display();
|
||||
}
|
||||
|
||||
void Adafruit_SH1106::DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font) {
|
||||
// ignore update mode
|
||||
//if (p==DISPLAY_INIT_MODE) {
|
||||
// allocate screen buffer
|
||||
setRotation(rot);
|
||||
invertDisplay(false);
|
||||
setTextWrap(false); // Allow text to run off edges
|
||||
cp437(true);
|
||||
setTextFont(font);
|
||||
setTextSize(size);
|
||||
setTextColor(WHITE, BLACK);
|
||||
setCursor(0,0);
|
||||
//fillScreen(BLACK);
|
||||
fillScreen(BLACK);
|
||||
Updateframe();
|
||||
|
||||
disp_bpp = -1;
|
||||
//}
|
||||
}
|
||||
|
||||
void Adafruit_SH1106::Begin(int16_t p1,int16_t p2,int16_t p3) {
|
||||
begin(p1,p2,p3);
|
||||
}
|
||||
|
||||
|
||||
boolean Adafruit_SH1106::begin(uint8_t vccstate, uint8_t i2caddr, bool reset) {
|
||||
_vccstate = vccstate;
|
||||
_i2caddr = i2caddr;
|
||||
|
||||
framebuffer = (uint8_t *)malloc(WIDTH * ((HEIGHT + 7) / 8));
|
||||
if (!framebuffer) return false;
|
||||
|
||||
// I2C Init
|
||||
Wire.begin();
|
||||
|
||||
#if defined SH1106_128_32
|
||||
// Init sequence for 128x32 OLED module
|
||||
SH1106_command(SH1106_DISPLAYOFF); // 0xAE
|
||||
SH1106_command(SH1106_SETDISPLAYCLOCKDIV); // 0xD5
|
||||
SH1106_command(0x80); // the suggested ratio 0x80
|
||||
SH1106_command(SH1106_SETMULTIPLEX); // 0xA8
|
||||
SH1106_command(0x1F);
|
||||
SH1106_command(SH1106_SETDISPLAYOFFSET); // 0xD3
|
||||
SH1106_command(0x0); // no offset
|
||||
SH1106_command(SH1106_SETSTARTLINE | 0x0); // line #0
|
||||
SH1106_command(SH1106_CHARGEPUMP); // 0x8D
|
||||
if (vccstate == SH1106_EXTERNALVCC)
|
||||
{ SH1106_command(0x10); }
|
||||
else
|
||||
{ SH1106_command(0x14); }
|
||||
SH1106_command(SH1106_MEMORYMODE); // 0x20
|
||||
SH1106_command(0x00); // 0x0 act like ks0108
|
||||
SH1106_command(SH1106_SEGREMAP | 0x1);
|
||||
SH1106_command(SH1106_COMSCANDEC);
|
||||
SH1106_command(SH1106_SETCOMPINS); // 0xDA
|
||||
SH1106_command(0x02);
|
||||
SH1106_command(SH1106_SETCONTRAST); // 0x81
|
||||
SH1106_command(0x8F);
|
||||
SH1106_command(SH1106_SETPRECHARGE); // 0xd9
|
||||
if (vccstate == SH1106_EXTERNALVCC)
|
||||
{ SH1106_command(0x22); }
|
||||
else
|
||||
{ SH1106_command(0xF1); }
|
||||
SH1106_command(SH1106_SETVCOMDETECT); // 0xDB
|
||||
SH1106_command(0x40);
|
||||
SH1106_command(SH1106_DISPLAYALLON_RESUME); // 0xA4
|
||||
SH1106_command(SH1106_NORMALDISPLAY); // 0xA6
|
||||
#endif
|
||||
|
||||
#if defined SH1106_128_64
|
||||
// Init sequence for 128x64 OLED module
|
||||
SH1106_command(SH1106_DISPLAYOFF); // 0xAE
|
||||
SH1106_command(SH1106_SETDISPLAYCLOCKDIV); // 0xD5
|
||||
SH1106_command(0x80); // the suggested ratio 0x80
|
||||
SH1106_command(SH1106_SETMULTIPLEX); // 0xA8
|
||||
SH1106_command(0x3F);
|
||||
SH1106_command(SH1106_SETDISPLAYOFFSET); // 0xD3
|
||||
SH1106_command(0x00); // no offset
|
||||
|
||||
SH1106_command(SH1106_SETSTARTLINE | 0x0); // line #0 0x40
|
||||
SH1106_command(SH1106_CHARGEPUMP); // 0x8D
|
||||
if (vccstate == SH1106_EXTERNALVCC)
|
||||
{ SH1106_command(0x10); }
|
||||
else
|
||||
{ SH1106_command(0x14); }
|
||||
SH1106_command(SH1106_MEMORYMODE); // 0x20
|
||||
SH1106_command(0x00); // 0x0 act like ks0108
|
||||
SH1106_command(SH1106_SEGREMAP | 0x1);
|
||||
SH1106_command(SH1106_COMSCANDEC);
|
||||
SH1106_command(SH1106_SETCOMPINS); // 0xDA
|
||||
SH1106_command(0x12);
|
||||
SH1106_command(SH1106_SETCONTRAST); // 0x81
|
||||
if (vccstate == SH1106_EXTERNALVCC)
|
||||
{ SH1106_command(0x9F); }
|
||||
else
|
||||
{ SH1106_command(0xCF); }
|
||||
SH1106_command(SH1106_SETPRECHARGE); // 0xd9
|
||||
if (vccstate == SH1106_EXTERNALVCC)
|
||||
{ SH1106_command(0x22); }
|
||||
else
|
||||
{ SH1106_command(0xF1); }
|
||||
SH1106_command(SH1106_SETVCOMDETECT); // 0xDB
|
||||
SH1106_command(0x40);
|
||||
SH1106_command(SH1106_DISPLAYALLON_RESUME); // 0xA4
|
||||
SH1106_command(SH1106_NORMALDISPLAY); // 0xA6
|
||||
#endif
|
||||
|
||||
#if defined SH1106_96_16
|
||||
// Init sequence for 96x16 OLED module
|
||||
SH1106_command(SH1106_DISPLAYOFF); // 0xAE
|
||||
SH1106_command(SH1106_SETDISPLAYCLOCKDIV); // 0xD5
|
||||
SH1106_command(0x80); // the suggested ratio 0x80
|
||||
SH1106_command(SH1106_SETMULTIPLEX); // 0xA8
|
||||
SH1106_command(0x0F);
|
||||
SH1106_command(SH1106_SETDISPLAYOFFSET); // 0xD3
|
||||
SH1106_command(0x00); // no offset
|
||||
SH1106_command(SH1106_SETSTARTLINE | 0x0); // line #0
|
||||
SH1106_command(SH1106_CHARGEPUMP); // 0x8D
|
||||
if (vccstate == SH1106_EXTERNALVCC)
|
||||
{ SH1106_command(0x10); }
|
||||
else
|
||||
{ SH1106_command(0x14); }
|
||||
SH1106_command(SH1106_MEMORYMODE); // 0x20
|
||||
SH1106_command(0x00); // 0x0 act like ks0108
|
||||
SH1106_command(SH1106_SEGREMAP | 0x1);
|
||||
SH1106_command(SH1106_COMSCANDEC);
|
||||
SH1106_command(SH1106_SETCOMPINS); // 0xDA
|
||||
SH1106_command(0x2); //ada x12
|
||||
SH1106_command(SH1106_SETCONTRAST); // 0x81
|
||||
if (vccstate == SH1106_EXTERNALVCC)
|
||||
{ SH1106_command(0x10); }
|
||||
else
|
||||
{ SH1106_command(0xAF); }
|
||||
SH1106_command(SH1106_SETPRECHARGE); // 0xd9
|
||||
if (vccstate == SH1106_EXTERNALVCC)
|
||||
{ SH1106_command(0x22); }
|
||||
else
|
||||
{ SH1106_command(0xF1); }
|
||||
SH1106_command(SH1106_SETVCOMDETECT); // 0xDB
|
||||
SH1106_command(0x40);
|
||||
SH1106_command(SH1106_DISPLAYALLON_RESUME); // 0xA4
|
||||
SH1106_command(SH1106_NORMALDISPLAY); // 0xA6
|
||||
#endif
|
||||
|
||||
SH1106_command(SH1106_DISPLAYON);//--turn on oled panel
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void Adafruit_SH1106::invertDisplay(uint8_t i) {
|
||||
if (i) {
|
||||
SH1106_command(SH1106_INVERTDISPLAY);
|
||||
} else {
|
||||
SH1106_command(SH1106_NORMALDISPLAY);
|
||||
}
|
||||
}
|
||||
|
||||
void Adafruit_SH1106::SH1106_command(uint8_t c) {
|
||||
|
||||
// I2C
|
||||
uint8_t control = 0x00; // Co = 0, D/C = 0
|
||||
Wire.beginTransmission(_i2caddr);
|
||||
WIRE_WRITE(control);
|
||||
WIRE_WRITE(c);
|
||||
Wire.endTransmission();
|
||||
|
||||
}
|
||||
|
||||
// Dim the display
|
||||
// dim = true: display is dimmed
|
||||
// dim = false: display is normal
|
||||
void Adafruit_SH1106::dim(uint8_t dim) {
|
||||
uint8_t contrast;
|
||||
|
||||
if (dim) {
|
||||
contrast = 0; // Dimmed display
|
||||
} else {
|
||||
if (_vccstate == SH1106_EXTERNALVCC) {
|
||||
contrast = 0x9F;
|
||||
} else {
|
||||
contrast = 0xCF;
|
||||
}
|
||||
}
|
||||
// the range of contrast to too small to be really useful
|
||||
// it is useful to dim the display
|
||||
SH1106_command(SH1106_SETCONTRAST);
|
||||
SH1106_command(contrast);
|
||||
}
|
||||
|
||||
void Adafruit_SH1106::SH1106_data(uint8_t c) {
|
||||
// I2C
|
||||
uint8_t control = 0x40; // Co = 0, D/C = 1
|
||||
Wire.beginTransmission(_i2caddr);
|
||||
WIRE_WRITE(control);
|
||||
WIRE_WRITE(c);
|
||||
Wire.endTransmission();
|
||||
}
|
||||
|
||||
void Adafruit_SH1106::display(void) {
|
||||
SH1106_command(SH1106_SETLOWCOLUMN | 0x0); // low col = 0
|
||||
SH1106_command(SH1106_SETHIGHCOLUMN | 0x0); // hi col = 0
|
||||
SH1106_command(SH1106_SETSTARTLINE | 0x0); // line #0
|
||||
// I2C
|
||||
//height >>= 3;
|
||||
//width >>= 3;
|
||||
byte height=64;
|
||||
byte width=132;
|
||||
byte m_row = 0;
|
||||
byte m_col = 2;
|
||||
|
||||
|
||||
height >>= 3;
|
||||
width >>= 3;
|
||||
//Serial.println(width);
|
||||
|
||||
int p = 0;
|
||||
|
||||
byte i, j, k =0;
|
||||
|
||||
for ( i = 0; i < height; i++) {
|
||||
|
||||
// send a bunch of data in one xmission
|
||||
SH1106_command(0xB0 + i + m_row);//set page address
|
||||
SH1106_command(m_col & 0xf);//set lower column address
|
||||
SH1106_command(0x10 | (m_col >> 4));//set higher column address
|
||||
|
||||
for( j = 0; j < 8; j++){
|
||||
Wire.beginTransmission(_i2caddr);
|
||||
Wire.write(0x40);
|
||||
for ( k = 0; k < width; k++, p++) {
|
||||
Wire.write(framebuffer[p]);
|
||||
}
|
||||
Wire.endTransmission();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// clear everything
|
||||
void Adafruit_SH1106::clearDisplay(void) {
|
||||
memset(framebuffer, 0, (SH1106_LCDWIDTH*SH1106_LCDHEIGHT/8));
|
||||
}
|
|
@ -1,154 +0,0 @@
|
|||
/*********************************************************************
|
||||
This is a library for our Monochrome OLEDs based on SSD1306 drivers
|
||||
|
||||
Pick one up today in the adafruit shop!
|
||||
------> http://www.adafruit.com/category/63_98
|
||||
|
||||
These displays use SPI to communicate, 4 or 5 pins are required to
|
||||
interface
|
||||
|
||||
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.
|
||||
BSD license, check license.txt for more information
|
||||
All text above, and the splash screen must be included in any redistribution
|
||||
*********************************************************************/
|
||||
|
||||
/*********************************************************************
|
||||
I change the adafruit SSD1306 to SH1106
|
||||
|
||||
SH1106 driver similar to SSD1306 so, just change the display() method.
|
||||
|
||||
However, SH1106 driver don't provide several functions such as scroll commands.
|
||||
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#if ARDUINO >= 100
|
||||
#include "Arduino.h"
|
||||
#define WIRE_WRITE Wire.write
|
||||
#else
|
||||
#include "WProgram.h"
|
||||
#define WIRE_WRITE Wire.send
|
||||
#endif
|
||||
|
||||
#include <renderer.h>
|
||||
|
||||
#define BLACK 0
|
||||
#define WHITE 1
|
||||
#define INVERSE 2
|
||||
|
||||
#define SH1106_I2C_ADDRESS 0x3C // 011110+SA0+RW - 0x3C or 0x3D
|
||||
// Address for 128x32 is 0x3C
|
||||
// Address for 128x64 is 0x3D (default) or 0x3C (if SA0 is grounded)
|
||||
|
||||
/*=========================================================================
|
||||
SH1106 Displays
|
||||
-----------------------------------------------------------------------
|
||||
The driver is used in multiple displays (128x64, 128x32, etc.).
|
||||
Select the appropriate display below to create an appropriately
|
||||
sized framebuffer, etc.
|
||||
|
||||
SH1106_128_64 128x64 pixel display
|
||||
|
||||
SH1106_128_32 128x32 pixel display
|
||||
|
||||
SH1106_96_16
|
||||
|
||||
-----------------------------------------------------------------------*/
|
||||
#define SH1106_128_64
|
||||
// #define SH1106_128_32
|
||||
// #define SH1106_96_16
|
||||
/*=========================================================================*/
|
||||
|
||||
#if defined SH1106_128_64 && defined SH1106_128_32
|
||||
#error "Only one SH1106 display can be specified at once in SH1106.h"
|
||||
#endif
|
||||
#if !defined SH1106_128_64 && !defined SH1106_128_32 && !defined SH1106_96_16
|
||||
#error "At least one SH1106 display must be specified in SH1106.h"
|
||||
#endif
|
||||
|
||||
#if defined SH1106_128_64
|
||||
#define SH1106_LCDWIDTH 128
|
||||
#define SH1106_LCDHEIGHT 64
|
||||
#endif
|
||||
#if defined SH1106_128_32
|
||||
#define SH1106_LCDWIDTH 128
|
||||
#define SH1106_LCDHEIGHT 32
|
||||
#endif
|
||||
#if defined SH1106_96_16
|
||||
#define SH1106_LCDWIDTH 96
|
||||
#define SH1106_LCDHEIGHT 16
|
||||
#endif
|
||||
|
||||
#define SH1106_SETCONTRAST 0x81
|
||||
#define SH1106_DISPLAYALLON_RESUME 0xA4
|
||||
#define SH1106_DISPLAYALLON 0xA5
|
||||
#define SH1106_NORMALDISPLAY 0xA6
|
||||
#define SH1106_INVERTDISPLAY 0xA7
|
||||
#define SH1106_DISPLAYOFF 0xAE
|
||||
#define SH1106_DISPLAYON 0xAF
|
||||
|
||||
#define SH1106_SETDISPLAYOFFSET 0xD3
|
||||
#define SH1106_SETCOMPINS 0xDA
|
||||
|
||||
#define SH1106_SETVCOMDETECT 0xDB
|
||||
|
||||
#define SH1106_SETDISPLAYCLOCKDIV 0xD5
|
||||
#define SH1106_SETPRECHARGE 0xD9
|
||||
|
||||
#define SH1106_SETMULTIPLEX 0xA8
|
||||
|
||||
#define SH1106_SETLOWCOLUMN 0x00
|
||||
#define SH1106_SETHIGHCOLUMN 0x10
|
||||
|
||||
#define SH1106_SETSTARTLINE 0x40
|
||||
|
||||
#define SH1106_MEMORYMODE 0x20
|
||||
#define SH1106_COLUMNADDR 0x21
|
||||
#define SH1106_PAGEADDR 0x22
|
||||
|
||||
#define SH1106_COMSCANINC 0xC0
|
||||
#define SH1106_COMSCANDEC 0xC8
|
||||
|
||||
#define SH1106_SEGREMAP 0xA0
|
||||
|
||||
#define SH1106_CHARGEPUMP 0x8D
|
||||
|
||||
#define SH1106_EXTERNALVCC 0x1
|
||||
#define SH1106_SWITCHCAPVCC 0x2
|
||||
|
||||
// Scrolling #defines
|
||||
#define SH1106_ACTIVATE_SCROLL 0x2F
|
||||
#define SH1106_DEACTIVATE_SCROLL 0x2E
|
||||
#define SH1106_SET_VERTICAL_SCROLL_AREA 0xA3
|
||||
#define SH1106_RIGHT_HORIZONTAL_SCROLL 0x26
|
||||
#define SH1106_LEFT_HORIZONTAL_SCROLL 0x27
|
||||
#define SH1106_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
|
||||
#define SH1106_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A
|
||||
|
||||
class Adafruit_SH1106 : public Renderer {
|
||||
public:
|
||||
Adafruit_SH1106(int16_t width, int16_t height);
|
||||
|
||||
boolean begin(uint8_t switchvcc = SH1106_SWITCHCAPVCC, uint8_t i2caddr = SH1106_I2C_ADDRESS, bool reset=true);
|
||||
void SH1106_command(uint8_t c);
|
||||
void SH1106_data(uint8_t c);
|
||||
|
||||
void clearDisplay(void);
|
||||
void invertDisplay(uint8_t i);
|
||||
void display();
|
||||
|
||||
|
||||
void DisplayOnff(int8_t on);
|
||||
void DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font);
|
||||
void Begin(int16_t p1,int16_t p2,int16_t p3);
|
||||
void Updateframe();
|
||||
void dim(uint8_t contrast);
|
||||
|
||||
private:
|
||||
int8_t _i2caddr, _vccstate, rst;
|
||||
|
||||
};
|
|
@ -1,26 +0,0 @@
|
|||
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.
|
|
@ -1,16 +0,0 @@
|
|||
Adafruit_SH1106
|
||||
===============
|
||||
|
||||
Adafruit graphic library for SH1106 driver lcds.
|
||||
|
||||
some small oled lcd use SH1106 driver.
|
||||
|
||||
I change the adafruit SSD1306 to SH1106
|
||||
|
||||
SH1106 driver similar to SSD1306. thus, just change the display() method.
|
||||
|
||||
However, SH1106 driver don't provide several functions such as scroll commands.
|
||||
|
||||
|
||||
Adafruit-GFX-Library
|
||||
https://github.com/adafruit/Adafruit-GFX-Library
|
|
@ -1,363 +0,0 @@
|
|||
/*********************************************************************
|
||||
This is an example for our Monochrome OLEDs based on SSD1306 drivers
|
||||
|
||||
Pick one up today in the adafruit shop!
|
||||
------> http://www.adafruit.com/category/63_98
|
||||
|
||||
This example is for a 128x64 size display using I2C to communicate
|
||||
3 pins are required to interface (2 I2C and one reset)
|
||||
|
||||
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.
|
||||
BSD license, check license.txt for more information
|
||||
All text above, and the splash screen must be included in any redistribution
|
||||
*********************************************************************/
|
||||
|
||||
/*********************************************************************
|
||||
I change the adafruit SSD1306 to SH1106
|
||||
|
||||
SH1106 driver don't provide several functions such as scroll commands.
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_GFX.h>
|
||||
#include <Adafruit_SH1106.h>
|
||||
|
||||
#define OLED_RESET 4
|
||||
Adafruit_SH1106 display(OLED_RESET);
|
||||
|
||||
#define NUMFLAKES 10
|
||||
#define XPOS 0
|
||||
#define YPOS 1
|
||||
#define DELTAY 2
|
||||
|
||||
|
||||
#define LOGO16_GLCD_HEIGHT 16
|
||||
#define LOGO16_GLCD_WIDTH 16
|
||||
static const unsigned char PROGMEM logo16_glcd_bmp[] =
|
||||
{ B00000000, B11000000,
|
||||
B00000001, B11000000,
|
||||
B00000001, B11000000,
|
||||
B00000011, B11100000,
|
||||
B11110011, B11100000,
|
||||
B11111110, B11111000,
|
||||
B01111110, B11111111,
|
||||
B00110011, B10011111,
|
||||
B00011111, B11111100,
|
||||
B00001101, B01110000,
|
||||
B00011011, B10100000,
|
||||
B00111111, B11100000,
|
||||
B00111111, B11110000,
|
||||
B01111100, B11110000,
|
||||
B01110000, B01110000,
|
||||
B00000000, B00110000 };
|
||||
|
||||
#if (SH1106_LCDHEIGHT != 64)
|
||||
#error("Height incorrect, please fix Adafruit_SH1106.h!");
|
||||
#endif
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
|
||||
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
|
||||
display.begin(SH1106_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
|
||||
// init done
|
||||
|
||||
// Show image buffer on the display hardware.
|
||||
// Since the buffer is intialized with an Adafruit splashscreen
|
||||
// internally, this will display the splashscreen.
|
||||
display.display();
|
||||
delay(2000);
|
||||
|
||||
// Clear the buffer.
|
||||
display.clearDisplay();
|
||||
|
||||
// draw a single pixel
|
||||
display.drawPixel(10, 10, WHITE);
|
||||
// Show the display buffer on the hardware.
|
||||
// NOTE: You _must_ call display after making any drawing commands
|
||||
// to make them visible on the display hardware!
|
||||
display.display();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
// draw many lines
|
||||
testdrawline();
|
||||
display.display();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
// draw rectangles
|
||||
testdrawrect();
|
||||
display.display();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
// draw multiple rectangles
|
||||
testfillrect();
|
||||
display.display();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
// draw mulitple circles
|
||||
testdrawcircle();
|
||||
display.display();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
// draw a white circle, 10 pixel radius
|
||||
display.fillCircle(display.width()/2, display.height()/2, 10, WHITE);
|
||||
display.display();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
testdrawroundrect();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
testfillroundrect();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
testdrawtriangle();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
testfilltriangle();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
// draw the first ~12 characters in the font
|
||||
testdrawchar();
|
||||
display.display();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
// draw scrolling text
|
||||
/* testscrolltext();
|
||||
delay(2000);
|
||||
display.clearDisplay();*/
|
||||
|
||||
// text display tests
|
||||
display.setTextSize(1);
|
||||
display.setTextColor(WHITE);
|
||||
display.setCursor(0,0);
|
||||
display.println("Hello, world!");
|
||||
display.setTextColor(BLACK, WHITE); // 'inverted' text
|
||||
display.println(3.141592);
|
||||
display.setTextSize(2);
|
||||
display.setTextColor(WHITE);
|
||||
display.print("0x"); display.println(0xDEADBEEF, HEX);
|
||||
display.display();
|
||||
delay(2000);
|
||||
|
||||
// miniature bitmap display
|
||||
display.clearDisplay();
|
||||
display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1);
|
||||
display.display();
|
||||
|
||||
// invert the display
|
||||
display.invertDisplay(true);
|
||||
delay(1000);
|
||||
display.invertDisplay(false);
|
||||
delay(1000);
|
||||
|
||||
// draw a bitmap icon and 'animate' movement
|
||||
testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH);
|
||||
}
|
||||
|
||||
|
||||
void loop() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
|
||||
uint8_t icons[NUMFLAKES][3];
|
||||
|
||||
// initialize
|
||||
for (uint8_t f=0; f< NUMFLAKES; f++) {
|
||||
icons[f][XPOS] = random(display.width());
|
||||
icons[f][YPOS] = 0;
|
||||
icons[f][DELTAY] = random(5) + 1;
|
||||
|
||||
Serial.print("x: ");
|
||||
Serial.print(icons[f][XPOS], DEC);
|
||||
Serial.print(" y: ");
|
||||
Serial.print(icons[f][YPOS], DEC);
|
||||
Serial.print(" dy: ");
|
||||
Serial.println(icons[f][DELTAY], DEC);
|
||||
}
|
||||
|
||||
while (1) {
|
||||
// draw each icon
|
||||
for (uint8_t f=0; f< NUMFLAKES; f++) {
|
||||
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, WHITE);
|
||||
}
|
||||
display.display();
|
||||
delay(200);
|
||||
|
||||
// then erase it + move it
|
||||
for (uint8_t f=0; f< NUMFLAKES; f++) {
|
||||
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, BLACK);
|
||||
// move it
|
||||
icons[f][YPOS] += icons[f][DELTAY];
|
||||
// if its gone, reinit
|
||||
if (icons[f][YPOS] > display.height()) {
|
||||
icons[f][XPOS] = random(display.width());
|
||||
icons[f][YPOS] = 0;
|
||||
icons[f][DELTAY] = random(5) + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void testdrawchar(void) {
|
||||
display.setTextSize(1);
|
||||
display.setTextColor(WHITE);
|
||||
display.setCursor(0,0);
|
||||
|
||||
for (uint8_t i=0; i < 168; i++) {
|
||||
if (i == '\n') continue;
|
||||
display.write(i);
|
||||
if ((i > 0) && (i % 21 == 0))
|
||||
display.println();
|
||||
}
|
||||
display.display();
|
||||
}
|
||||
|
||||
void testdrawcircle(void) {
|
||||
for (int16_t i=0; i<display.height(); i+=2) {
|
||||
display.drawCircle(display.width()/2, display.height()/2, i, WHITE);
|
||||
display.display();
|
||||
}
|
||||
}
|
||||
|
||||
void testfillrect(void) {
|
||||
uint8_t color = 1;
|
||||
for (int16_t i=0; i<display.height()/2; i+=3) {
|
||||
// alternate colors
|
||||
display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2);
|
||||
display.display();
|
||||
color++;
|
||||
}
|
||||
}
|
||||
|
||||
void testdrawtriangle(void) {
|
||||
for (int16_t i=0; i<min(display.width(),display.height())/2; i+=5) {
|
||||
display.drawTriangle(display.width()/2, display.height()/2-i,
|
||||
display.width()/2-i, display.height()/2+i,
|
||||
display.width()/2+i, display.height()/2+i, WHITE);
|
||||
display.display();
|
||||
}
|
||||
}
|
||||
|
||||
void testfilltriangle(void) {
|
||||
uint8_t color = WHITE;
|
||||
for (int16_t i=min(display.width(),display.height())/2; i>0; i-=5) {
|
||||
display.fillTriangle(display.width()/2, display.height()/2-i,
|
||||
display.width()/2-i, display.height()/2+i,
|
||||
display.width()/2+i, display.height()/2+i, WHITE);
|
||||
if (color == WHITE) color = BLACK;
|
||||
else color = WHITE;
|
||||
display.display();
|
||||
}
|
||||
}
|
||||
|
||||
void testdrawroundrect(void) {
|
||||
for (int16_t i=0; i<display.height()/2-2; i+=2) {
|
||||
display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, WHITE);
|
||||
display.display();
|
||||
}
|
||||
}
|
||||
|
||||
void testfillroundrect(void) {
|
||||
uint8_t color = WHITE;
|
||||
for (int16_t i=0; i<display.height()/2-2; i+=2) {
|
||||
display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, color);
|
||||
if (color == WHITE) color = BLACK;
|
||||
else color = WHITE;
|
||||
display.display();
|
||||
}
|
||||
}
|
||||
|
||||
void testdrawrect(void) {
|
||||
for (int16_t i=0; i<display.height()/2; i+=2) {
|
||||
display.drawRect(i, i, display.width()-2*i, display.height()-2*i, WHITE);
|
||||
display.display();
|
||||
}
|
||||
}
|
||||
|
||||
void testdrawline() {
|
||||
for (int16_t i=0; i<display.width(); i+=4) {
|
||||
display.drawLine(0, 0, i, display.height()-1, WHITE);
|
||||
display.display();
|
||||
}
|
||||
for (int16_t i=0; i<display.height(); i+=4) {
|
||||
display.drawLine(0, 0, display.width()-1, i, WHITE);
|
||||
display.display();
|
||||
}
|
||||
delay(250);
|
||||
|
||||
display.clearDisplay();
|
||||
for (int16_t i=0; i<display.width(); i+=4) {
|
||||
display.drawLine(0, display.height()-1, i, 0, WHITE);
|
||||
display.display();
|
||||
}
|
||||
for (int16_t i=display.height()-1; i>=0; i-=4) {
|
||||
display.drawLine(0, display.height()-1, display.width()-1, i, WHITE);
|
||||
display.display();
|
||||
}
|
||||
delay(250);
|
||||
|
||||
display.clearDisplay();
|
||||
for (int16_t i=display.width()-1; i>=0; i-=4) {
|
||||
display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE);
|
||||
display.display();
|
||||
}
|
||||
for (int16_t i=display.height()-1; i>=0; i-=4) {
|
||||
display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE);
|
||||
display.display();
|
||||
}
|
||||
delay(250);
|
||||
|
||||
display.clearDisplay();
|
||||
for (int16_t i=0; i<display.height(); i+=4) {
|
||||
display.drawLine(display.width()-1, 0, 0, i, WHITE);
|
||||
display.display();
|
||||
}
|
||||
for (int16_t i=0; i<display.width(); i+=4) {
|
||||
display.drawLine(display.width()-1, 0, i, display.height()-1, WHITE);
|
||||
display.display();
|
||||
}
|
||||
delay(250);
|
||||
}
|
||||
|
||||
/*void testscrolltext(void) {
|
||||
display.setTextSize(2);
|
||||
display.setTextColor(WHITE);
|
||||
display.setCursor(10,0);
|
||||
display.clearDisplay();
|
||||
display.println("scroll");
|
||||
display.display();
|
||||
|
||||
display.startscrollright(0x00, 0x0F);
|
||||
delay(2000);
|
||||
display.stopscroll();
|
||||
delay(1000);
|
||||
display.startscrollleft(0x00, 0x0F);
|
||||
delay(2000);
|
||||
display.stopscroll();
|
||||
delay(1000);
|
||||
display.startscrolldiagright(0x00, 0x07);
|
||||
delay(2000);
|
||||
display.startscrolldiagleft(0x00, 0x07);
|
||||
delay(2000);
|
||||
display.stopscroll();
|
||||
}*/
|
|
@ -1,369 +0,0 @@
|
|||
/*********************************************************************
|
||||
This is an example for our Monochrome OLEDs based on SH1106 drivers
|
||||
|
||||
Pick one up today in the adafruit shop!
|
||||
------> http://www.adafruit.com/category/63_98
|
||||
|
||||
This example is for a 128x64 size display using SPI to communicate
|
||||
4 or 5 pins are required to interface
|
||||
|
||||
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.
|
||||
BSD license, check license.txt for more information
|
||||
All text above, and the splash screen must be included in any redistribution
|
||||
*********************************************************************/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_GFX.h>
|
||||
#include <Adafruit_SH1106.h>
|
||||
|
||||
// If using software SPI (the default case):
|
||||
#define OLED_MOSI 9
|
||||
#define OLED_CLK 10
|
||||
#define OLED_DC 11
|
||||
#define OLED_CS 12
|
||||
#define OLED_RESET 13
|
||||
Adafruit_SH1106 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
|
||||
|
||||
/* Uncomment this block to use hardware SPI
|
||||
#define OLED_DC 6
|
||||
#define OLED_CS 7
|
||||
#define OLED_RESET 8
|
||||
Adafruit_SH1106 display(OLED_DC, OLED_RESET, OLED_CS);
|
||||
*/
|
||||
|
||||
#define NUMFLAKES 10
|
||||
#define XPOS 0
|
||||
#define YPOS 1
|
||||
#define DELTAY 2
|
||||
|
||||
#define LOGO16_GLCD_HEIGHT 16
|
||||
#define LOGO16_GLCD_WIDTH 16
|
||||
static const unsigned char PROGMEM logo16_glcd_bmp[] =
|
||||
{ B00000000, B11000000,
|
||||
B00000001, B11000000,
|
||||
B00000001, B11000000,
|
||||
B00000011, B11100000,
|
||||
B11110011, B11100000,
|
||||
B11111110, B11111000,
|
||||
B01111110, B11111111,
|
||||
B00110011, B10011111,
|
||||
B00011111, B11111100,
|
||||
B00001101, B01110000,
|
||||
B00011011, B10100000,
|
||||
B00111111, B11100000,
|
||||
B00111111, B11110000,
|
||||
B01111100, B11110000,
|
||||
B01110000, B01110000,
|
||||
B00000000, B00110000 };
|
||||
|
||||
#if (SH1106_LCDHEIGHT != 64)
|
||||
#error("Height incorrect, please fix Adafruit_SH1106.h!");
|
||||
#endif
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
|
||||
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
|
||||
display.begin(SH1106_SWITCHCAPVCC);
|
||||
// init done
|
||||
|
||||
// Show image buffer on the display hardware.
|
||||
// Since the buffer is intialized with an Adafruit splashscreen
|
||||
// internally, this will display the splashscreen.
|
||||
display.display();
|
||||
delay(2000);
|
||||
|
||||
// Clear the buffer.
|
||||
display.clearDisplay();
|
||||
|
||||
// draw a single pixel
|
||||
display.drawPixel(10, 10, WHITE);
|
||||
// Show the display buffer on the hardware.
|
||||
// NOTE: You _must_ call display after making any drawing commands
|
||||
// to make them visible on the display hardware!
|
||||
display.display();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
// draw many lines
|
||||
testdrawline();
|
||||
display.display();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
// draw rectangles
|
||||
testdrawrect();
|
||||
display.display();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
// draw multiple rectangles
|
||||
testfillrect();
|
||||
display.display();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
// draw mulitple circles
|
||||
testdrawcircle();
|
||||
display.display();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
// draw a white circle, 10 pixel radius
|
||||
display.fillCircle(display.width()/2, display.height()/2, 10, WHITE);
|
||||
display.display();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
testdrawroundrect();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
testfillroundrect();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
testdrawtriangle();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
testfilltriangle();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
// draw the first ~12 characters in the font
|
||||
testdrawchar();
|
||||
display.display();
|
||||
delay(2000);
|
||||
display.clearDisplay();
|
||||
|
||||
// draw scrolling text
|
||||
/*testscrolltext();
|
||||
delay(2000);
|
||||
display.clearDisplay();*/
|
||||
|
||||
// text display tests
|
||||
display.setTextSize(1);
|
||||
display.setTextColor(WHITE);
|
||||
display.setCursor(0,0);
|
||||
display.println("Hello, world!");
|
||||
display.setTextColor(BLACK, WHITE); // 'inverted' text
|
||||
display.println(3.141592);
|
||||
display.setTextSize(2);
|
||||
display.setTextColor(WHITE);
|
||||
display.print("0x"); display.println(0xDEADBEEF, HEX);
|
||||
display.display();
|
||||
delay(2000);
|
||||
|
||||
// miniature bitmap display
|
||||
display.clearDisplay();
|
||||
display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1);
|
||||
display.display();
|
||||
|
||||
// invert the display
|
||||
display.invertDisplay(true);
|
||||
delay(1000);
|
||||
display.invertDisplay(false);
|
||||
delay(1000);
|
||||
|
||||
// draw a bitmap icon and 'animate' movement
|
||||
testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH);
|
||||
}
|
||||
|
||||
|
||||
void loop() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
|
||||
uint8_t icons[NUMFLAKES][3];
|
||||
|
||||
// initialize
|
||||
for (uint8_t f=0; f< NUMFLAKES; f++) {
|
||||
icons[f][XPOS] = random(display.width());
|
||||
icons[f][YPOS] = 0;
|
||||
icons[f][DELTAY] = random(5) + 1;
|
||||
|
||||
Serial.print("x: ");
|
||||
Serial.print(icons[f][XPOS], DEC);
|
||||
Serial.print(" y: ");
|
||||
Serial.print(icons[f][YPOS], DEC);
|
||||
Serial.print(" dy: ");
|
||||
Serial.println(icons[f][DELTAY], DEC);
|
||||
}
|
||||
|
||||
while (1) {
|
||||
// draw each icon
|
||||
for (uint8_t f=0; f< NUMFLAKES; f++) {
|
||||
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, WHITE);
|
||||
}
|
||||
display.display();
|
||||
delay(200);
|
||||
|
||||
// then erase it + move it
|
||||
for (uint8_t f=0; f< NUMFLAKES; f++) {
|
||||
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, BLACK);
|
||||
// move it
|
||||
icons[f][YPOS] += icons[f][DELTAY];
|
||||
// if its gone, reinit
|
||||
if (icons[f][YPOS] > display.height()) {
|
||||
icons[f][XPOS] = random(display.width());
|
||||
icons[f][YPOS] = 0;
|
||||
icons[f][DELTAY] = random(5) + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void testdrawchar(void) {
|
||||
display.setTextSize(1);
|
||||
display.setTextColor(WHITE);
|
||||
display.setCursor(0,0);
|
||||
|
||||
for (uint8_t i=0; i < 168; i++) {
|
||||
if (i == '\n') continue;
|
||||
display.write(i);
|
||||
if ((i > 0) && (i % 21 == 0))
|
||||
display.println();
|
||||
}
|
||||
display.display();
|
||||
}
|
||||
|
||||
void testdrawcircle(void) {
|
||||
for (int16_t i=0; i<display.height(); i+=2) {
|
||||
display.drawCircle(display.width()/2, display.height()/2, i, WHITE);
|
||||
display.display();
|
||||
}
|
||||
}
|
||||
|
||||
void testfillrect(void) {
|
||||
uint8_t color = 1;
|
||||
for (int16_t i=0; i<display.height()/2; i+=3) {
|
||||
// alternate colors
|
||||
display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2);
|
||||
display.display();
|
||||
color++;
|
||||
}
|
||||
}
|
||||
|
||||
void testdrawtriangle(void) {
|
||||
for (int16_t i=0; i<min(display.width(),display.height())/2; i+=5) {
|
||||
display.drawTriangle(display.width()/2, display.height()/2-i,
|
||||
display.width()/2-i, display.height()/2+i,
|
||||
display.width()/2+i, display.height()/2+i, WHITE);
|
||||
display.display();
|
||||
}
|
||||
}
|
||||
|
||||
void testfilltriangle(void) {
|
||||
uint8_t color = WHITE;
|
||||
for (int16_t i=min(display.width(),display.height())/2; i>0; i-=5) {
|
||||
display.fillTriangle(display.width()/2, display.height()/2-i,
|
||||
display.width()/2-i, display.height()/2+i,
|
||||
display.width()/2+i, display.height()/2+i, WHITE);
|
||||
if (color == WHITE) color = BLACK;
|
||||
else color = WHITE;
|
||||
display.display();
|
||||
}
|
||||
}
|
||||
|
||||
void testdrawroundrect(void) {
|
||||
for (int16_t i=0; i<display.height()/2-2; i+=2) {
|
||||
display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, WHITE);
|
||||
display.display();
|
||||
}
|
||||
}
|
||||
|
||||
void testfillroundrect(void) {
|
||||
uint8_t color = WHITE;
|
||||
for (int16_t i=0; i<display.height()/2-2; i+=2) {
|
||||
display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, color);
|
||||
if (color == WHITE) color = BLACK;
|
||||
else color = WHITE;
|
||||
display.display();
|
||||
}
|
||||
}
|
||||
|
||||
void testdrawrect(void) {
|
||||
for (int16_t i=0; i<display.height()/2; i+=2) {
|
||||
display.drawRect(i, i, display.width()-2*i, display.height()-2*i, WHITE);
|
||||
display.display();
|
||||
}
|
||||
}
|
||||
|
||||
void testdrawline() {
|
||||
for (int16_t i=0; i<display.width(); i+=4) {
|
||||
display.drawLine(0, 0, i, display.height()-1, WHITE);
|
||||
display.display();
|
||||
}
|
||||
for (int16_t i=0; i<display.height(); i+=4) {
|
||||
display.drawLine(0, 0, display.width()-1, i, WHITE);
|
||||
display.display();
|
||||
}
|
||||
delay(250);
|
||||
|
||||
display.clearDisplay();
|
||||
for (int16_t i=0; i<display.width(); i+=4) {
|
||||
display.drawLine(0, display.height()-1, i, 0, WHITE);
|
||||
display.display();
|
||||
}
|
||||
for (int16_t i=display.height()-1; i>=0; i-=4) {
|
||||
display.drawLine(0, display.height()-1, display.width()-1, i, WHITE);
|
||||
display.display();
|
||||
}
|
||||
delay(250);
|
||||
|
||||
display.clearDisplay();
|
||||
for (int16_t i=display.width()-1; i>=0; i-=4) {
|
||||
display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE);
|
||||
display.display();
|
||||
}
|
||||
for (int16_t i=display.height()-1; i>=0; i-=4) {
|
||||
display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE);
|
||||
display.display();
|
||||
}
|
||||
delay(250);
|
||||
|
||||
display.clearDisplay();
|
||||
for (int16_t i=0; i<display.height(); i+=4) {
|
||||
display.drawLine(display.width()-1, 0, 0, i, WHITE);
|
||||
display.display();
|
||||
}
|
||||
for (int16_t i=0; i<display.width(); i+=4) {
|
||||
display.drawLine(display.width()-1, 0, i, display.height()-1, WHITE);
|
||||
display.display();
|
||||
}
|
||||
delay(250);
|
||||
}
|
||||
|
||||
/*
|
||||
void testscrolltext(void) {
|
||||
display.setTextSize(2);
|
||||
display.setTextColor(WHITE);
|
||||
display.setCursor(10,0);
|
||||
display.clearDisplay();
|
||||
display.println("scroll");
|
||||
display.display();
|
||||
|
||||
display.startscrollright(0x00, 0x0F);
|
||||
delay(2000);
|
||||
display.stopscroll();
|
||||
delay(1000);
|
||||
display.startscrollleft(0x00, 0x0F);
|
||||
delay(2000);
|
||||
display.stopscroll();
|
||||
delay(1000);
|
||||
display.startscrolldiagright(0x00, 0x07);
|
||||
delay(2000);
|
||||
display.startscrolldiagleft(0x00, 0x07);
|
||||
delay(2000);
|
||||
display.stopscroll();
|
||||
}
|
||||
*/
|
|
@ -1,9 +0,0 @@
|
|||
name=Adafruit SH1106-gemu-1.0
|
||||
version=1.0
|
||||
author=Adafruit
|
||||
maintainer=Adafruit <info@adafruit.com>
|
||||
sentence=SH1106
|
||||
paragraph=SH1106
|
||||
category=Display
|
||||
url=
|
||||
architectures=*
|
|
@ -357,7 +357,7 @@
|
|||
// REMOVED - #define USE_DISPLAY_SSD1306 // [DisplayModel 2] Enable SSD1306 Oled 128x64 display (I2C addresses 0x3C and 0x3D) (+16k code)
|
||||
#define USE_DISPLAY_MATRIX // [DisplayModel 3] Enable 8x8 Matrix display (I2C adresseses see below) (+11k code)
|
||||
#define USE_DISPLAY_SEVENSEG // [DisplayModel 11] [I2cDriver47] Enable sevenseg display (I2C addresses 0x70 - 0x77) (<+11k code)
|
||||
#define USE_DISPLAY_SH1106 // [DisplayModel 7] Enable SH1106 Oled 128x64 display (I2C addresses 0x3C and 0x3D)
|
||||
// REMOVED - #define USE_DISPLAY_SH1106 // [DisplayModel 7] Enable SH1106 Oled 128x64 display (I2C addresses 0x3C and 0x3D)
|
||||
// #define USE_DISPLAY_TM1650 // [DisplayModel 20] [I2cDriver74] Enable TM1650 display (I2C addresses 0x24 - 0x27 and 0x34 - 0x37)
|
||||
|
||||
#define USE_SPI // Hardware SPI using GPIO12(MISO), GPIO13(MOSI) and GPIO14(CLK) in addition to two user selectable GPIOs(CS and DC)
|
||||
|
|
|
@ -159,9 +159,10 @@ constexpr uint32_t feature[] = {
|
|||
#if defined(USE_SPI) && defined(USE_DISPLAY) && defined(USE_DISPLAY_EPAPER_29)
|
||||
0x00000800 | // xdsp_05_epaper.ino
|
||||
#endif
|
||||
#if defined(USE_I2C) && defined(USE_DISPLAY) && defined(USE_DISPLAY_SH1106)
|
||||
0x00001000 | // xdsp_07_sh1106.ino
|
||||
#endif
|
||||
// REMOVED
|
||||
// #if defined(USE_I2C) && defined(USE_DISPLAY) && defined(USE_DISPLAY_SH1106)
|
||||
// 0x00001000 | // xdsp_07_sh1106.ino
|
||||
// #endif
|
||||
#ifdef USE_MP3_PLAYER
|
||||
0x00002000 | // xdrv_14_mp3.ino
|
||||
#endif
|
||||
|
|
|
@ -17,179 +17,182 @@
|
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef USE_I2C
|
||||
#ifdef USE_DISPLAY
|
||||
#ifdef USE_DISPLAY_SH1106
|
||||
// REMOVED
|
||||
// DEPRECATED - USE UNIVERSAL DISPLAY INSTEAD, https://tasmota.github.io/docs/Universal-Display-Driver/#migrating-to-udisplay
|
||||
|
||||
#define OLED_RESET 4
|
||||
// #ifdef USE_I2C
|
||||
// #ifdef USE_DISPLAY
|
||||
// #ifdef USE_DISPLAY_SH1106
|
||||
|
||||
#define SPRINT(A) char str[32];sprintf(str,"val: %d ",A);Serial.println((char*)str);
|
||||
// #define OLED_RESET 4
|
||||
|
||||
// #define SPRINT(A) char str[32];sprintf(str,"val: %d ",A);Serial.println((char*)str);
|
||||
|
||||
|
||||
#define XDSP_07 7
|
||||
#define XI2C_06 6 // See I2CDEVICES.md
|
||||
// #define XDSP_07 7
|
||||
// #define XI2C_06 6 // See I2CDEVICES.md
|
||||
|
||||
#define OLED_ADDRESS1 0x3C // Oled 128x32 I2C address
|
||||
#define OLED_ADDRESS2 0x3D // Oled 128x64 I2C address
|
||||
// #define OLED_ADDRESS1 0x3C // Oled 128x32 I2C address
|
||||
// #define OLED_ADDRESS2 0x3D // Oled 128x64 I2C address
|
||||
|
||||
#define OLED_BUFFER_COLS 40 // Max number of columns in display shadow buffer
|
||||
#define OLED_BUFFER_ROWS 16 // Max number of lines in display shadow buffer
|
||||
// #define OLED_BUFFER_COLS 40 // Max number of columns in display shadow buffer
|
||||
// #define OLED_BUFFER_ROWS 16 // Max number of lines in display shadow buffer
|
||||
|
||||
#define OLED_FONT_WIDTH 6
|
||||
#define OLED_FONT_HEIGTH 8
|
||||
// #define OLED_FONT_WIDTH 6
|
||||
// #define OLED_FONT_HEIGTH 8
|
||||
|
||||
#include <Wire.h>
|
||||
#include <renderer.h>
|
||||
#include <Adafruit_SH1106.h>
|
||||
// #include <Wire.h>
|
||||
// #include <renderer.h>
|
||||
// #include <Adafruit_SH1106.h>
|
||||
|
||||
Adafruit_SH1106 *oled1106;
|
||||
// Adafruit_SH1106 *oled1106;
|
||||
|
||||
/*********************************************************************************************/
|
||||
// /*********************************************************************************************/
|
||||
|
||||
|
||||
void SH1106InitDriver() {
|
||||
if (!TasmotaGlobal.i2c_enabled) { return; }
|
||||
// void SH1106InitDriver() {
|
||||
// if (!TasmotaGlobal.i2c_enabled) { return; }
|
||||
|
||||
if (!Settings->display_model) {
|
||||
if (I2cSetDevice(OLED_ADDRESS1)) {
|
||||
Settings->display_address[0] = OLED_ADDRESS1;
|
||||
Settings->display_model = XDSP_07;
|
||||
}
|
||||
else if (I2cSetDevice(OLED_ADDRESS2)) {
|
||||
Settings->display_address[0] = OLED_ADDRESS2;
|
||||
Settings->display_model = XDSP_07;
|
||||
}
|
||||
}
|
||||
// if (!Settings->display_model) {
|
||||
// if (I2cSetDevice(OLED_ADDRESS1)) {
|
||||
// Settings->display_address[0] = OLED_ADDRESS1;
|
||||
// Settings->display_model = XDSP_07;
|
||||
// }
|
||||
// else if (I2cSetDevice(OLED_ADDRESS2)) {
|
||||
// Settings->display_address[0] = OLED_ADDRESS2;
|
||||
// Settings->display_model = XDSP_07;
|
||||
// }
|
||||
// }
|
||||
|
||||
if (XDSP_07 == Settings->display_model) {
|
||||
I2cSetActiveFound(Settings->display_address[0], "SH1106");
|
||||
// if (XDSP_07 == Settings->display_model) {
|
||||
// I2cSetActiveFound(Settings->display_address[0], "SH1106");
|
||||
|
||||
if (Settings->display_width != SH1106_LCDWIDTH) {
|
||||
Settings->display_width = SH1106_LCDWIDTH;
|
||||
}
|
||||
if (Settings->display_height != SH1106_LCDHEIGHT) {
|
||||
Settings->display_height = SH1106_LCDHEIGHT;
|
||||
}
|
||||
// init renderer
|
||||
oled1106 = new Adafruit_SH1106(SH1106_LCDWIDTH,SH1106_LCDHEIGHT);
|
||||
renderer = oled1106;
|
||||
renderer->Begin(SH1106_SWITCHCAPVCC, Settings->display_address[0],0);
|
||||
renderer->DisplayInit(DISPLAY_INIT_MODE,Settings->display_size,Settings->display_rotate,Settings->display_font);
|
||||
renderer->setTextColor(1,0);
|
||||
// if (Settings->display_width != SH1106_LCDWIDTH) {
|
||||
// Settings->display_width = SH1106_LCDWIDTH;
|
||||
// }
|
||||
// if (Settings->display_height != SH1106_LCDHEIGHT) {
|
||||
// Settings->display_height = SH1106_LCDHEIGHT;
|
||||
// }
|
||||
// // init renderer
|
||||
// oled1106 = new Adafruit_SH1106(SH1106_LCDWIDTH,SH1106_LCDHEIGHT);
|
||||
// renderer = oled1106;
|
||||
// renderer->Begin(SH1106_SWITCHCAPVCC, Settings->display_address[0],0);
|
||||
// renderer->DisplayInit(DISPLAY_INIT_MODE,Settings->display_size,Settings->display_rotate,Settings->display_font);
|
||||
// renderer->setTextColor(1,0);
|
||||
|
||||
#ifdef SHOW_SPLASH
|
||||
if (!Settings->flag5.display_no_splash) {
|
||||
renderer->setTextFont(0);
|
||||
renderer->setTextSize(2);
|
||||
renderer->setCursor(20,20);
|
||||
renderer->println(F("SH1106"));
|
||||
renderer->Updateframe();
|
||||
renderer->DisplayOnff(1);
|
||||
}
|
||||
#endif
|
||||
// #ifdef SHOW_SPLASH
|
||||
// if (!Settings->flag5.display_no_splash) {
|
||||
// renderer->setTextFont(0);
|
||||
// renderer->setTextSize(2);
|
||||
// renderer->setCursor(20,20);
|
||||
// renderer->println(F("SH1106"));
|
||||
// renderer->Updateframe();
|
||||
// renderer->DisplayOnff(1);
|
||||
// }
|
||||
// #endif
|
||||
|
||||
AddLog(LOG_LEVEL_INFO, PSTR("DSP: SH1106"));
|
||||
}
|
||||
}
|
||||
// AddLog(LOG_LEVEL_INFO, PSTR("DSP: SH1106"));
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
/*********************************************************************************************/
|
||||
#ifdef USE_DISPLAY_MODES1TO5
|
||||
// /*********************************************************************************************/
|
||||
// #ifdef USE_DISPLAY_MODES1TO5
|
||||
|
||||
void SH1106PrintLog(void)
|
||||
{
|
||||
disp_refresh--;
|
||||
if (!disp_refresh) {
|
||||
disp_refresh = Settings->display_refresh;
|
||||
if (!disp_screen_buffer_cols) { DisplayAllocScreenBuffer(); }
|
||||
// void SH1106PrintLog(void)
|
||||
// {
|
||||
// disp_refresh--;
|
||||
// if (!disp_refresh) {
|
||||
// disp_refresh = Settings->display_refresh;
|
||||
// if (!disp_screen_buffer_cols) { DisplayAllocScreenBuffer(); }
|
||||
|
||||
char* txt = DisplayLogBuffer('\370');
|
||||
if (txt != NULL) {
|
||||
uint8_t last_row = Settings->display_rows -1;
|
||||
// char* txt = DisplayLogBuffer('\370');
|
||||
// if (txt != NULL) {
|
||||
// uint8_t last_row = Settings->display_rows -1;
|
||||
|
||||
renderer->clearDisplay();
|
||||
renderer->setTextSize(Settings->display_size);
|
||||
renderer->setCursor(0,0);
|
||||
for (byte i = 0; i < last_row; i++) {
|
||||
strlcpy(disp_screen_buffer[i], disp_screen_buffer[i +1], disp_screen_buffer_cols);
|
||||
renderer->println(disp_screen_buffer[i]);
|
||||
}
|
||||
strlcpy(disp_screen_buffer[last_row], txt, disp_screen_buffer_cols);
|
||||
DisplayFillScreen(last_row);
|
||||
// renderer->clearDisplay();
|
||||
// renderer->setTextSize(Settings->display_size);
|
||||
// renderer->setCursor(0,0);
|
||||
// for (byte i = 0; i < last_row; i++) {
|
||||
// strlcpy(disp_screen_buffer[i], disp_screen_buffer[i +1], disp_screen_buffer_cols);
|
||||
// renderer->println(disp_screen_buffer[i]);
|
||||
// }
|
||||
// strlcpy(disp_screen_buffer[last_row], txt, disp_screen_buffer_cols);
|
||||
// DisplayFillScreen(last_row);
|
||||
|
||||
AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "[%s]"), disp_screen_buffer[last_row]);
|
||||
// AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "[%s]"), disp_screen_buffer[last_row]);
|
||||
|
||||
renderer->println(disp_screen_buffer[last_row]);
|
||||
renderer->Updateframe();
|
||||
}
|
||||
}
|
||||
}
|
||||
// renderer->println(disp_screen_buffer[last_row]);
|
||||
// renderer->Updateframe();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
void SH1106Time(void)
|
||||
{
|
||||
char line[12];
|
||||
// void SH1106Time(void)
|
||||
// {
|
||||
// char line[12];
|
||||
|
||||
renderer->clearDisplay();
|
||||
renderer->setTextSize(Settings->display_size);
|
||||
renderer->setTextFont(Settings->display_font);
|
||||
renderer->setCursor(0, 0);
|
||||
snprintf_P(line, sizeof(line), PSTR(" %02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), RtcTime.hour, RtcTime.minute, RtcTime.second); // [ 12:34:56 ]
|
||||
renderer->println(line);
|
||||
renderer->println();
|
||||
snprintf_P(line, sizeof(line), PSTR("%02d" D_MONTH_DAY_SEPARATOR "%02d" D_YEAR_MONTH_SEPARATOR "%04d"), RtcTime.day_of_month, RtcTime.month, RtcTime.year); // [01-02-2018]
|
||||
renderer->println(line);
|
||||
renderer->Updateframe();
|
||||
}
|
||||
// renderer->clearDisplay();
|
||||
// renderer->setTextSize(Settings->display_size);
|
||||
// renderer->setTextFont(Settings->display_font);
|
||||
// renderer->setCursor(0, 0);
|
||||
// snprintf_P(line, sizeof(line), PSTR(" %02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), RtcTime.hour, RtcTime.minute, RtcTime.second); // [ 12:34:56 ]
|
||||
// renderer->println(line);
|
||||
// renderer->println();
|
||||
// snprintf_P(line, sizeof(line), PSTR("%02d" D_MONTH_DAY_SEPARATOR "%02d" D_YEAR_MONTH_SEPARATOR "%04d"), RtcTime.day_of_month, RtcTime.month, RtcTime.year); // [01-02-2018]
|
||||
// renderer->println(line);
|
||||
// renderer->Updateframe();
|
||||
// }
|
||||
|
||||
void SH1106Refresh(void) // Every second
|
||||
{
|
||||
if (!renderer) return;
|
||||
if (Settings->display_mode) { // Mode 0 is User text
|
||||
switch (Settings->display_mode) {
|
||||
case 1: // Time
|
||||
SH1106Time();
|
||||
break;
|
||||
case 2: // Local
|
||||
case 3: // Local
|
||||
case 4: // Mqtt
|
||||
case 5: // Mqtt
|
||||
SH1106PrintLog();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// void SH1106Refresh(void) // Every second
|
||||
// {
|
||||
// if (!renderer) return;
|
||||
// if (Settings->display_mode) { // Mode 0 is User text
|
||||
// switch (Settings->display_mode) {
|
||||
// case 1: // Time
|
||||
// SH1106Time();
|
||||
// break;
|
||||
// case 2: // Local
|
||||
// case 3: // Local
|
||||
// case 4: // Mqtt
|
||||
// case 5: // Mqtt
|
||||
// SH1106PrintLog();
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
#endif // USE_DISPLAY_MODES1TO5
|
||||
// #endif // USE_DISPLAY_MODES1TO5
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Interface
|
||||
\*********************************************************************************************/
|
||||
// /*********************************************************************************************\
|
||||
// * Interface
|
||||
// \*********************************************************************************************/
|
||||
|
||||
bool Xdsp07(uint32_t function)
|
||||
{
|
||||
if (!I2cEnabled(XI2C_06)) { return false; }
|
||||
// bool Xdsp07(uint32_t function)
|
||||
// {
|
||||
// if (!I2cEnabled(XI2C_06)) { return false; }
|
||||
|
||||
bool result = false;
|
||||
// bool result = false;
|
||||
|
||||
if (FUNC_DISPLAY_INIT_DRIVER == function) {
|
||||
SH1106InitDriver();
|
||||
}
|
||||
else if (XDSP_07 == Settings->display_model) {
|
||||
// if (FUNC_DISPLAY_INIT_DRIVER == function) {
|
||||
// SH1106InitDriver();
|
||||
// }
|
||||
// else if (XDSP_07 == Settings->display_model) {
|
||||
|
||||
switch (function) {
|
||||
case FUNC_DISPLAY_MODEL:
|
||||
result = true;
|
||||
break;
|
||||
#ifdef USE_DISPLAY_MODES1TO5
|
||||
case FUNC_DISPLAY_EVERY_SECOND:
|
||||
SH1106Refresh();
|
||||
break;
|
||||
#endif // USE_DISPLAY_MODES1TO5
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
// switch (function) {
|
||||
// case FUNC_DISPLAY_MODEL:
|
||||
// result = true;
|
||||
// break;
|
||||
// #ifdef USE_DISPLAY_MODES1TO5
|
||||
// case FUNC_DISPLAY_EVERY_SECOND:
|
||||
// SH1106Refresh();
|
||||
// break;
|
||||
// #endif // USE_DISPLAY_MODES1TO5
|
||||
// }
|
||||
// }
|
||||
// return result;
|
||||
// }
|
||||
|
||||
#endif // USE_DISPLAY_SH1106
|
||||
#endif // USE_DISPLAY
|
||||
#endif // USE_I2C
|
||||
// #endif // USE_DISPLAY_SH1106
|
||||
// #endif // USE_DISPLAY
|
||||
// #endif // USE_I2C
|
||||
|
|
Loading…
Reference in New Issue