mirror of
https://github.com/Bodmer/TFT_eSPI.git
synced 2025-07-30 18:57:30 +02:00
Add support for SSD1351! (128*128 OLED)
TODO: Implement read functions as well..
This commit is contained in:
@ -454,7 +454,13 @@
|
|||||||
#define tft_Write_32(C) TFT_WRITE_BITS(C, 32)
|
#define tft_Write_32(C) TFT_WRITE_BITS(C, 32)
|
||||||
|
|
||||||
// Write two address coordinates
|
// Write two address coordinates
|
||||||
#define tft_Write_32C(C,D) TFT_WRITE_BITS((uint16_t)((D)<<8 | (D)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32)
|
#define tft_Write_16C(C,D) TFT_WRITE_BITS((uint16_t)(D)<<8 | (C), 16)
|
||||||
|
|
||||||
|
// Write same value twice
|
||||||
|
#define tft_Write_16D(C) TFT_WRITE_BITS((uint16_t)(C)<<8 | (C), 16)
|
||||||
|
|
||||||
|
// Write two address coordinates
|
||||||
|
#define tft_Write_32C(C,D) TFT_WRITE_BITS((uint16_t)((D)<<8 | (D)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32)
|
||||||
|
|
||||||
// Write same value twice
|
// Write same value twice
|
||||||
#define tft_Write_32D(C) TFT_WRITE_BITS((uint16_t)((C)<<8 | (C)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32)
|
#define tft_Write_32D(C) TFT_WRITE_BITS((uint16_t)((C)<<8 | (C)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32)
|
||||||
|
@ -44,6 +44,7 @@ Displays using the following controllers are supported:
|
|||||||
* ILI9488
|
* ILI9488
|
||||||
* HX8357D
|
* HX8357D
|
||||||
* S6D02A1
|
* S6D02A1
|
||||||
|
* SSD1351
|
||||||
* SSD1963
|
* SSD1963
|
||||||
* ST7735
|
* ST7735
|
||||||
* ST7789
|
* ST7789
|
||||||
|
28
TFT_Drivers/SSD1351_Defines.h
Normal file
28
TFT_Drivers/SSD1351_Defines.h
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#ifndef TFT_WIDTH
|
||||||
|
#define TFT_WIDTH 128
|
||||||
|
#endif
|
||||||
|
#ifndef TFT_HEIGHT
|
||||||
|
#define TFT_HEIGHT 128
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef tft_Write_16D
|
||||||
|
#define tft_Write_16C(C) tft_Write_8(C); tft_Write_8(C);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef tft_Write_16C
|
||||||
|
#define tft_Write_16C(C,D) tft_Write_8(C); tft_Write_8(D);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Delay between some initialisation commands
|
||||||
|
#define TFT_INIT_DELAY 0x80
|
||||||
|
|
||||||
|
// Generic commands used by TFT_eSPI.cpp
|
||||||
|
#define TFT_NOP 0x00
|
||||||
|
#define TFT_SWRST TFT_NOP
|
||||||
|
#define TFT_CASET 0x15 // SETCOLUMN
|
||||||
|
#define TFT_PASET 0x75 // SETROW
|
||||||
|
#define TFT_RAMWR 0x5C // WRITERAM
|
||||||
|
#define TFT_RAMRD 0x5D // READRAM
|
||||||
|
#define TFT_IDXRD TFT_NOP
|
||||||
|
#define TFT_INVOFF 0xA6 // NORMALDISPLAY
|
||||||
|
#define TFT_INVON 0xA7 // INVERTDISPLAY
|
35
TFT_Drivers/SSD1351_Init.h
Normal file
35
TFT_Drivers/SSD1351_Init.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
writecommand(0xFD); // COMMANDLOCK
|
||||||
|
writedata(0x12);
|
||||||
|
writecommand(0xFD); // COMMANDLOCK
|
||||||
|
writedata(0xB1);
|
||||||
|
writecommand(0xAE); // DISPLAYOFF
|
||||||
|
writecommand(0xB3); // CLOCKDIV
|
||||||
|
writedata(0xF1);
|
||||||
|
writecommand(0xCA); // MUXRATIO
|
||||||
|
writedata(127);
|
||||||
|
writecommand(0xA2); // DISPLAYOFFSET
|
||||||
|
writedata(0x00);
|
||||||
|
writecommand(0xB5); // SETGPIO
|
||||||
|
writedata(0x00);
|
||||||
|
writecommand(0xAB); // FUNCTIONSELECT
|
||||||
|
writedata(0x01);
|
||||||
|
writecommand(0xB1); // PRECHARGE
|
||||||
|
writedata(0x32);
|
||||||
|
writecommand(0xBE); // VCOMH
|
||||||
|
writedata(0x05);
|
||||||
|
writecommand(0xA6); // NORMALDISPLAY
|
||||||
|
writecommand(0xC1); // CONTRASTABC
|
||||||
|
writedata(0xC8);
|
||||||
|
writedata(0x80);
|
||||||
|
writedata(0xC8);
|
||||||
|
writecommand(0xC7); // CONTRASTMASTER
|
||||||
|
writedata(0x0F);
|
||||||
|
writecommand(0xB4); // SETVSL
|
||||||
|
writedata(0xA0);
|
||||||
|
writedata(0xB5);
|
||||||
|
writedata(0x55);
|
||||||
|
writecommand(0xB6); // PRECHARGE2
|
||||||
|
writedata(0x01);
|
||||||
|
writecommand(0xAF); // DISPLAYON
|
||||||
|
}
|
34
TFT_Drivers/SSD1351_Rotation.h
Normal file
34
TFT_Drivers/SSD1351_Rotation.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
|
||||||
|
// This is the command sequence that rotates the SSD1351 driver coordinate frame
|
||||||
|
|
||||||
|
rotation = m % 4; // Limit the range of values to 0-3
|
||||||
|
|
||||||
|
uint8_t madctl = 0x64;
|
||||||
|
|
||||||
|
switch (rotation) {
|
||||||
|
case 0:
|
||||||
|
madctl |= 0x10;
|
||||||
|
_width = _init_width;
|
||||||
|
_height = _init_height;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
madctl |= 0x13;
|
||||||
|
_width = _init_height;
|
||||||
|
_height = _init_width;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
madctl |= 0x02;
|
||||||
|
_width = _init_width;
|
||||||
|
_height = _init_height;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
madctl |= 0x01;
|
||||||
|
_width = _init_height;
|
||||||
|
_height = _init_width;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
writecommand(0xA0); // SETREMAP
|
||||||
|
writedata(madctl);
|
||||||
|
writecommand(0xA1); // STARTLINE
|
||||||
|
writedata(rotation < 2 ? TFT_HEIGHT : 0);
|
43
TFT_eSPI.cpp
43
TFT_eSPI.cpp
@ -644,6 +644,9 @@ void TFT_eSPI::init(uint8_t tc)
|
|||||||
#elif defined (ST7789_2_DRIVER)
|
#elif defined (ST7789_2_DRIVER)
|
||||||
#include "TFT_Drivers/ST7789_2_Init.h"
|
#include "TFT_Drivers/ST7789_2_Init.h"
|
||||||
|
|
||||||
|
#elif defined (SSD1351_DRIVER)
|
||||||
|
#include "TFT_Drivers/SSD1351_Init.h"
|
||||||
|
|
||||||
#elif defined (SSD1963_DRIVER)
|
#elif defined (SSD1963_DRIVER)
|
||||||
#include "TFT_Drivers/SSD1963_Init.h"
|
#include "TFT_Drivers/SSD1963_Init.h"
|
||||||
|
|
||||||
@ -729,6 +732,9 @@ void TFT_eSPI::setRotation(uint8_t m)
|
|||||||
#elif defined (ST7789_2_DRIVER)
|
#elif defined (ST7789_2_DRIVER)
|
||||||
#include "TFT_Drivers/ST7789_2_Rotation.h"
|
#include "TFT_Drivers/ST7789_2_Rotation.h"
|
||||||
|
|
||||||
|
#elif defined (SSD1351_DRIVER)
|
||||||
|
#include "TFT_Drivers/SSD1351_Rotation.h"
|
||||||
|
|
||||||
#elif defined (SSD1963_DRIVER)
|
#elif defined (SSD1963_DRIVER)
|
||||||
#include "TFT_Drivers/SSD1963_Rotation.h"
|
#include "TFT_Drivers/SSD1963_Rotation.h"
|
||||||
|
|
||||||
@ -3030,11 +3036,10 @@ void TFT_eSPI::setAddrWindow(int32_t x0, int32_t y0, int32_t w, int32_t h)
|
|||||||
void TFT_eSPI::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1)
|
void TFT_eSPI::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1)
|
||||||
{
|
{
|
||||||
//begin_tft_write(); // Must be called before setWindow
|
//begin_tft_write(); // Must be called before setWindow
|
||||||
#if defined (ILI9225_DRIVER)
|
|
||||||
if (rotation & 0x01) { swap_coord(x0, y0); swap_coord(x1, y1); }
|
|
||||||
|
|
||||||
addr_row = 0xFFFF;
|
addr_row = 0xFFFF;
|
||||||
addr_col = 0xFFFF;
|
addr_col = 0xFFFF;
|
||||||
|
#if defined (ILI9225_DRIVER)
|
||||||
|
if (rotation & 0x01) { swap_coord(x0, y0); swap_coord(x1, y1); }
|
||||||
|
|
||||||
DC_C; tft_Write_8(TFT_CASET1);
|
DC_C; tft_Write_8(TFT_CASET1);
|
||||||
DC_D; tft_Write_16(x0);
|
DC_D; tft_Write_16(x0);
|
||||||
@ -3054,16 +3059,24 @@ void TFT_eSPI::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1)
|
|||||||
// write to RAM
|
// write to RAM
|
||||||
DC_C; tft_Write_8(TFT_RAMWR);
|
DC_C; tft_Write_8(TFT_RAMWR);
|
||||||
DC_D;
|
DC_D;
|
||||||
|
#elif defined (SSD1351_DRIVER)
|
||||||
|
if (rotation & 1) {
|
||||||
|
swap_coord(x0, y0);
|
||||||
|
swap_coord(x1, y1);
|
||||||
|
}
|
||||||
|
|
||||||
#else // Not ILI9225
|
DC_C; tft_Write_8(TFT_CASET);
|
||||||
|
DC_D; tft_Write_16C(x0, x1);
|
||||||
|
DC_C; tft_Write_8(TFT_PASET);
|
||||||
|
DC_D; tft_Write_16C(y0, y1);
|
||||||
|
DC_C; tft_Write_8(TFT_RAMWR);
|
||||||
|
DC_D;
|
||||||
|
#else
|
||||||
|
|
||||||
#if defined (SSD1963_DRIVER)
|
#if defined (SSD1963_DRIVER)
|
||||||
if ((rotation & 0x1) == 0) { swap_coord(x0, y0); swap_coord(x1, y1); }
|
if ((rotation & 0x1) == 0) { swap_coord(x0, y0); swap_coord(x1, y1); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
addr_row = 0xFFFF;
|
|
||||||
addr_col = 0xFFFF;
|
|
||||||
|
|
||||||
#ifdef CGRAM_OFFSET
|
#ifdef CGRAM_OFFSET
|
||||||
x0+=colstart;
|
x0+=colstart;
|
||||||
x1+=colstart;
|
x1+=colstart;
|
||||||
@ -3308,7 +3321,7 @@ void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color)
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#if defined (SSD1963_DRIVER)
|
#if defined (SSD1351_DRIVER) || defined (SSD1963_DRIVER)
|
||||||
if ((rotation & 0x1) == 0) { swap_coord(x, y); }
|
if ((rotation & 0x1) == 0) { swap_coord(x, y); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -3318,6 +3331,20 @@ void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color)
|
|||||||
DC_D; tft_Write_32D(x);
|
DC_D; tft_Write_32D(x);
|
||||||
DC_C; tft_Write_8(TFT_PASET);
|
DC_C; tft_Write_8(TFT_PASET);
|
||||||
DC_D; tft_Write_32D(y);
|
DC_D; tft_Write_32D(y);
|
||||||
|
#elif defined (SSD1351_DRIVER)
|
||||||
|
// No need to send x if it has not changed (speeds things up)
|
||||||
|
if (addr_col != x) {
|
||||||
|
DC_C; tft_Write_8(TFT_CASET);
|
||||||
|
DC_D; tft_Write_16D(x);
|
||||||
|
addr_col = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No need to send y if it has not changed (speeds things up)
|
||||||
|
if (addr_row != y) {
|
||||||
|
DC_C; tft_Write_8(TFT_PASET);
|
||||||
|
DC_D; tft_Write_16D(y);
|
||||||
|
addr_row = y;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
// No need to send x if it has not changed (speeds things up)
|
// No need to send x if it has not changed (speeds things up)
|
||||||
if (addr_col != x) {
|
if (addr_col != x) {
|
||||||
|
@ -50,6 +50,7 @@
|
|||||||
//#define R61581_DRIVER
|
//#define R61581_DRIVER
|
||||||
//#define RM68140_DRIVER
|
//#define RM68140_DRIVER
|
||||||
//#define ST7796_DRIVER
|
//#define ST7796_DRIVER
|
||||||
|
//#define SSD1351_DRIVER
|
||||||
//#define SSD1963_480_DRIVER
|
//#define SSD1963_480_DRIVER
|
||||||
//#define SSD1963_800_DRIVER
|
//#define SSD1963_800_DRIVER
|
||||||
//#define SSD1963_800ALT_DRIVER
|
//#define SSD1963_800ALT_DRIVER
|
||||||
|
@ -175,6 +175,9 @@
|
|||||||
#elif defined (RM68140_DRIVER)
|
#elif defined (RM68140_DRIVER)
|
||||||
#include "TFT_Drivers/RM68140_Defines.h"
|
#include "TFT_Drivers/RM68140_Defines.h"
|
||||||
#define TFT_DRIVER 0x6814
|
#define TFT_DRIVER 0x6814
|
||||||
|
#elif defined (SSD1351_DRIVER)
|
||||||
|
#include "TFT_Drivers/SSD1351_Defines.h"
|
||||||
|
#define TFT_DRIVER 0x1351
|
||||||
#elif defined (SSD1963_480_DRIVER)
|
#elif defined (SSD1963_480_DRIVER)
|
||||||
#include "TFT_Drivers/SSD1963_Defines.h"
|
#include "TFT_Drivers/SSD1963_Defines.h"
|
||||||
#define TFT_DRIVER 0x1963
|
#define TFT_DRIVER 0x1963
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "TFT_eSPI",
|
"name": "TFT_eSPI",
|
||||||
"version": "2.3.66",
|
"version": "2.3.67",
|
||||||
"keywords": "Arduino, tft, ePaper, display, Pico, RP2040, STM32, ESP8266, NodeMCU, ESP32, M5Stack, ILI9341, ST7735, ILI9163, S6D02A1, ILI9481, ILI9486, ILI9488, ST7789, RM68140, SSD1963, ILI9225, HX8357D",
|
"keywords": "Arduino, tft, ePaper, display, Pico, RP2040, STM32, ESP8266, NodeMCU, ESP32, M5Stack, ILI9341, ST7735, ILI9163, S6D02A1, ILI9481, ILI9486, ILI9488, ST7789, RM68140, SSD1351, SSD1963, ILI9225, HX8357D",
|
||||||
"description": "A TFT and ePaper SPI graphics library with optimisation for Raspberry Pi Pico, ESP8266, ESP32 and STM32",
|
"description": "A TFT and ePaper SPI graphics library with optimisation for Raspberry Pi Pico, ESP8266, ESP32 and STM32",
|
||||||
"repository":
|
"repository":
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
name=TFT_eSPI
|
name=TFT_eSPI
|
||||||
version=2.3.66
|
version=2.3.67
|
||||||
author=Bodmer
|
author=Bodmer
|
||||||
maintainer=Bodmer
|
maintainer=Bodmer
|
||||||
sentence=TFT graphics library for Arduino processors with performance optimisation for RP2040, STM32, ESP8266 and ESP32
|
sentence=TFT graphics library for Arduino processors with performance optimisation for RP2040, STM32, ESP8266 and ESP32
|
||||||
|
Reference in New Issue
Block a user