32# include <avr/pgmspace.h>
33#elif defined(ESP8266) || defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
36# define pgm_read_byte(addr) \
37 (*(const unsigned char*)(addr))
40#if !defined(__ARM_ARCH) && !defined(ENERGIA) && !defined(ESP8266) && !defined(ESP32) && \
42# include <util/delay.h>
50#if defined(I2C_BUFFER_LENGTH)
51# define WIRE_MAX min(256, I2C_BUFFER_LENGTH)
52#elif defined(BUFFER_LENGTH)
53# define WIRE_MAX min(256, BUFFER_LENGTH)
54#elif defined(SERIAL_BUFFER_SIZE)
55# define WIRE_MAX min(255, SERIAL_BUFFER_SIZE - 1)
60#define ssd1306_swap(a, b) \
61 (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b)))
64# define WIRE_WRITE wire->write
66# define WIRE_WRITE wire->send
70# define SSD1306_SELECT *csPort &= ~csPinMask;
71# define SSD1306_DESELECT *csPort |= csPinMask;
72# define SSD1306_MODE_COMMAND *dcPort &= ~dcPinMask;
73# define SSD1306_MODE_DATA *dcPort |= dcPinMask;
75# define SSD1306_SELECT digitalWrite(csPin, LOW);
76# define SSD1306_DESELECT digitalWrite(csPin, HIGH);
77# define SSD1306_MODE_COMMAND digitalWrite(dcPin, LOW);
78# define SSD1306_MODE_DATA digitalWrite(dcPin, HIGH);
81#if (ARDUINO >= 157) && !defined(ARDUINO_STM32_FEATHER)
82# define SETWIRECLOCK wire->setClock(wireClk)
83# define RESWIRECLOCK wire->setClock(restoreClk)
89#if defined(SPI_HAS_TRANSACTION)
90# define SPI_TRANSACTION_START spi->beginTransaction(spiSettings)
91# define SPI_TRANSACTION_END spi->endTransaction()
93# define SPI_TRANSACTION_START
94# define SPI_TRANSACTION_END
107#define TRANSACTION_START \
112 SPI_TRANSACTION_START; \
116#define TRANSACTION_END \
122 SPI_TRANSACTION_END; \
162 uint8_t w, uint8_t h, TwoWire* twi, int8_t rst_pin, uint32_t clkDuring, uint32_t clkAfter)
165 , wire(twi ? twi : &Wire)
174 , restoreClk(clkAfter)
206 uint8_t w, uint8_t h, int8_t mosi_pin, int8_t sclk_pin, int8_t dc_pin, int8_t rst_pin,
246 uint8_t w, uint8_t h, SPIClass* spi_ptr, int8_t dc_pin, int8_t rst_pin, int8_t cs_pin,
249 , spi(spi_ptr ? spi_ptr : &SPI)
258#ifdef SPI_HAS_TRANSACTION
259 spiSettings = SPISettings(bitrate, MSBFIRST, SPI_MODE0);
290 int8_t mosi_pin, int8_t sclk_pin, int8_t dc_pin, int8_t rst_pin, int8_t cs_pin)
334#ifdef SPI_HAS_TRANSACTION
335 spiSettings = SPISettings(8000000, MSBFIRST, SPI_MODE0);
393 (void)
spi->transfer(d);
395 for (uint8_t bit = 0x80; bit; bit >>= 1) {
398 *mosiPort |= mosiPinMask;
400 *mosiPort &= ~mosiPinMask;
401 *clkPort |= clkPinMask;
402 *clkPort &= ~clkPinMask;
404 digitalWrite(
mosiPin, d & bit);
405 digitalWrite(
clkPin, HIGH);
406 digitalWrite(
clkPin, LOW);
430 wire->endTransmission();
454 uint16_t bytesOut = 1;
457 wire->endTransmission();
465 wire->endTransmission();
544 if (periphBegin)
wire->begin();
546 pinMode(
dcPin, OUTPUT);
547 pinMode(
csPin, OUTPUT);
549 dcPort = (PortReg*)portOutputRegister(digitalPinToPort(
dcPin));
550 dcPinMask = digitalPinToBitMask(
dcPin);
551 csPort = (PortReg*)portOutputRegister(digitalPinToPort(
csPin));
552 csPinMask = digitalPinToBitMask(
csPin);
557 if (periphBegin)
spi->begin();
562 mosiPort = (PortReg*)portOutputRegister(digitalPinToPort(
mosiPin));
563 mosiPinMask = digitalPinToBitMask(
mosiPin);
564 clkPort = (PortReg*)portOutputRegister(digitalPinToPort(
clkPin));
565 clkPinMask = digitalPinToBitMask(
clkPin);
566 *clkPort &= ~clkPinMask;
568 digitalWrite(
clkPin, LOW);
574 if (reset && (
rstPin >= 0)) {
576 digitalWrite(
rstPin, HIGH);
578 digitalWrite(
rstPin, LOW);
580 digitalWrite(
rstPin, HIGH);
586 static const uint8_t
PROGMEM init1[] = {
594 static const uint8_t
PROGMEM init2[] = {
603 static const uint8_t
PROGMEM init3[] = {
610 uint8_t comPins = 0x02;
633 static const uint8_t
PROGMEM init5[] = {
780 uint8_t *pBuf = &
buffer[(
y / 8) *
WIDTH +
x], mask = 1 << (
y & 7);
875 if ((__y + __h) >
HEIGHT) {
881 uint8_t
y = __y, h = __h;
885 uint8_t mod = (
y & 7);
892 static const uint8_t
PROGMEM premask[8] = {
893 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE};
896 if (h < mod) mask &= (0XFF >> (mod - h));
936 static const uint8_t
PROGMEM postmask[8] = {
937 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F};
1006 static const uint8_t
PROGMEM dlist1[] = {
1029 uint16_t bytesOut = 1;
1032 wire->endTransmission();
1040 wire->endTransmission();
1112 static const uint8_t
PROGMEM scrollList3b[] = {
1138 static const uint8_t
PROGMEM scrollList4b[] = {
#define pgm_read_byte(addr)
Adafruit SSD1306 dependency code.
#define TRANSACTION_START
Wire, SPI or bitbang transfer setup.
#define SSD1306_MODE_COMMAND
Command mode.
#define SSD1306_MODE_DATA
Data mode.
#define WIRE_MAX
Use common Arduino core default.
#define WIRE_WRITE
Wire write function in older Arduino lib.
#define ssd1306_swap(a, b)
No-temp-var swap operation.
#define SSD1306_DESELECT
Device deselect.
#define TRANSACTION_END
Wire, SPI or bitbang transfer end.
Handling MiniR4.OLED functions. (Full Wrapping from Adafruit_SSD1306)
#define SSD1306_SETVCOMDETECT
See datasheet.
#define SSD1306_SETDISPLAYCLOCKDIV
See datasheet.
#define SSD1306_MEMORYMODE
See datasheet.
#define SSD1306_DISPLAYALLON_RESUME
See datasheet.
#define SSD1306_DEACTIVATE_SCROLL
Stop scroll.
#define SSD1306_SET_VERTICAL_SCROLL_AREA
Set scroll range.
#define SSD1306_LEFT_HORIZONTAL_SCROLL
Init left scroll.
#define SSD1306_INVERTDISPLAY
See datasheet.
#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL
Init diag scroll.
#define SSD1306_SETDISPLAYOFFSET
See datasheet.
#define SSD1306_RIGHT_HORIZONTAL_SCROLL
Init rt scroll.
#define SSD1306_SEGREMAP
See datasheet.
#define SSD1306_ACTIVATE_SCROLL
Start scroll.
#define SSD1306_PAGEADDR
See datasheet.
#define SSD1306_SETPRECHARGE
See datasheet.
#define SSD1306_INVERSE
Invert pixels.
#define SSD1306_SETCOMPINS
See datasheet.
#define SSD1306_DISPLAYON
See datasheet.
#define SSD1306_BLACK
fit into the SSD1306_ naming scheme
#define SSD1306_WHITE
Draw 'on' pixels.
#define SSD1306_SETSTARTLINE
See datasheet.
#define SSD1306_SETCONTRAST
See datasheet.
#define SSD1306_LCDHEIGHT
DEPRECATED: height w/SSD1306_128_32 defined.
#define SSD1306_EXTERNALVCC
External display voltage source.
#define SSD1306_CHARGEPUMP
See datasheet.
#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL
Init diag scroll.
#define SSD1306_COMSCANDEC
See datasheet.
#define SSD1306_SETMULTIPLEX
See datasheet.
#define SSD1306_LCDWIDTH
DEPRECATED: width w/SSD1306_128_32 defined.
#define SSD1306_NORMALDISPLAY
See datasheet.
#define SSD1306_DISPLAYOFF
See datasheet.
#define SSD1306_COLUMNADDR
See datasheet.
A generic graphics superclass that can handle all sorts of drawing. At a.
int16_t HEIGHT
This is the 'raw' display height - never changes.
int16_t width(void) const
Get width of the display, accounting for current rotation.
uint8_t rotation
Display rotation (0 thru 3)
int16_t height(void) const
Get height of the display, accounting for current rotation.
uint8_t getRotation(void) const
Get rotation setting for display.
int16_t WIDTH
This is the 'raw' display width - never changes.
int8_t i2caddr
I2C address initialized when begin method is called.
void ssd1306_command1(uint8_t c)
Issue single command to SSD1306, using I2C or hard/soft SPI as needed. Because command calls are ofte...
void display(void)
Push data currently in RAM to SSD1306 display.
virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color)
Draw a vertical line. This is also invoked by the Adafruit_GFX library in generating many higher-leve...
uint8_t * getBuffer(void)
Get base address of display buffer for direct reading or writing.
void dim(bool dim)
Dim the display.
int8_t dcPin
(Data Pin) set when using SPI set during construction.
void invertDisplay(bool i)
Enable or disable display invert mode (white-on-black vs black-on-white).
void startscrollleft(uint8_t start, uint8_t stop)
Activate a left-handed scroll for all or part of the display.
~Adafruit_SSD1306(void)
Destructor for Adafruit_SSD1306 object.
Adafruit_SSD1306(uint8_t w, uint8_t h, TwoWire *twi=&Wire, int8_t rst_pin=-1, uint32_t clkDuring=400000UL, uint32_t clkAfter=100000UL)
Constructor for I2C-interfaced SSD1306 displays.
void startscrollright(uint8_t start, uint8_t stop)
Activate a right-handed scroll for all or part of the display.
int8_t rstPin
Display reset pin assignment. Set during construction.
int8_t csPin
(Chip Select Pin) set when using SPI set during construction.
void ssd1306_commandList(const uint8_t *c, uint8_t n)
Issue list of commands to SSD1306, same rules as above re: transactions. This is a protected function...
virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color)
Draw a horizontal line. This is also invoked by the Adafruit_GFX library in generating many higher-le...
bool getPixel(int16_t x, int16_t y)
Return color of a single pixel in display buffer.
void startscrolldiagleft(uint8_t start, uint8_t stop)
Activate alternate diagonal scroll for all or part of the display.
void drawFastVLineInternal(int16_t x, int16_t y, int16_t h, uint16_t color)
Draw a vertical line with a width and color. Used by public method drawFastHLine,drawFastVLine.
void ssd1306_command(uint8_t c)
Issue a single low-level command directly to the SSD1306 display, bypassing the library.
bool begin(uint8_t switchvcc=SSD1306_SWITCHCAPVCC, uint8_t i2caddr=0, bool reset=true, bool periphBegin=true)
Allocate RAM for image buffer, initialize peripherals and pins.
void stopscroll(void)
Cease a previously-begun scrolling action.
void drawFastHLineInternal(int16_t x, int16_t y, int16_t w, uint16_t color)
Draw a horizontal line with a width and color. Used by public methods drawFastHLine,...
int8_t clkPin
(Clock Pin) set when using SPI set during construction.
void startscrolldiagright(uint8_t start, uint8_t stop)
Activate a diagonal scroll for all or part of the display.
int8_t vccstate
VCC selection, set by begin method.
void drawPixel(int16_t x, int16_t y, uint16_t color)
Set/clear/invert a single pixel. This is also invoked by the Adafruit_GFX library in generating many ...
uint8_t contrast
normal contrast setting for this device
void SPIwrite(uint8_t d) __attribute__((always_inline))
Write a single byte to the SPI port.
void clearDisplay(void)
Clear contents of display buffer (set all pixels to off).