mirror of
https://github.com/LilyGO/TTGO-TM-ESP32
synced 2024-11-23 07:30:54 +00:00
add commit
This commit is contained in:
parent
8bf8fea9f2
commit
1df2cd333c
507
Arduino-ST7789-Library/Arduino_ST7789.cpp
Normal file
507
Arduino-ST7789-Library/Arduino_ST7789.cpp
Normal file
@ -0,0 +1,507 @@
|
||||
/***************************************************
|
||||
This is a library for the ST7789 IPS SPI display.
|
||||
|
||||
Originally written by Limor Fried/Ladyada for
|
||||
Adafruit Industries.
|
||||
|
||||
Modified by Ananev Ilia
|
||||
****************************************************/
|
||||
|
||||
#include "Arduino_ST7789.h"
|
||||
#include <limits.h>
|
||||
#include "pins_arduino.h"
|
||||
#include "wiring_private.h"
|
||||
#include <SPI.h>
|
||||
|
||||
static const uint8_t PROGMEM
|
||||
cmd_240x240[] = { // Initialization commands for 7789 screens
|
||||
10, // 9 commands in list:
|
||||
ST7789_SWRESET, ST_CMD_DELAY, // 1: Software reset, no args, w/delay
|
||||
150, // 150 ms delay
|
||||
ST7789_SLPOUT , ST_CMD_DELAY, // 2: Out of sleep mode, no args, w/delay
|
||||
255, // 255 = 500 ms delay
|
||||
ST7789_COLMOD , 1+ST_CMD_DELAY, // 3: Set color mode, 1 arg + delay:
|
||||
0x55, // 16-bit color
|
||||
10, // 10 ms delay
|
||||
ST7789_MADCTL , 1, // 4: Memory access ctrl (directions), 1 arg:
|
||||
0x00, // Row addr/col addr, bottom to top refresh
|
||||
ST7789_CASET , 4, // 5: Column addr set, 4 args, no delay:
|
||||
0x00, ST7789_240x240_XSTART, // XSTART = 0
|
||||
(ST7789_TFTWIDTH+ST7789_240x240_XSTART) >> 8,
|
||||
(ST7789_TFTWIDTH+ST7789_240x240_XSTART) & 0xFF, // XEND = 240
|
||||
ST7789_RASET , 4, // 6: Row addr set, 4 args, no delay:
|
||||
0x00, ST7789_240x240_YSTART, // YSTART = 0
|
||||
(ST7789_TFTHEIGHT+ST7789_240x240_YSTART) >> 8,
|
||||
(ST7789_TFTHEIGHT+ST7789_240x240_YSTART) & 0xFF, // YEND = 240
|
||||
ST7789_INVON , ST_CMD_DELAY, // 7: Inversion ON
|
||||
10,
|
||||
ST7789_NORON , ST_CMD_DELAY, // 8: Normal display on, no args, w/delay
|
||||
10, // 10 ms delay
|
||||
ST7789_DISPON , ST_CMD_DELAY, // 9: Main screen turn on, no args, w/delay
|
||||
255 }; // 255 = 500 ms delay
|
||||
|
||||
inline uint16_t swapcolor(uint16_t x) {
|
||||
return (x << 11) | (x & 0x07E0) | (x >> 11);
|
||||
}
|
||||
|
||||
#if defined (SPI_HAS_TRANSACTION)
|
||||
static SPISettings mySPISettings;
|
||||
#elif defined (__AVR__) || defined(CORE_TEENSY)
|
||||
static uint8_t SPCRbackup;
|
||||
static uint8_t mySPCR;
|
||||
#endif
|
||||
|
||||
|
||||
#if defined (SPI_HAS_TRANSACTION)
|
||||
#define SPI_BEGIN_TRANSACTION() if (_hwSPI) SPI.beginTransaction(mySPISettings)
|
||||
#define SPI_END_TRANSACTION() if (_hwSPI) SPI.endTransaction()
|
||||
#else
|
||||
#define SPI_BEGIN_TRANSACTION() (void)
|
||||
#define SPI_END_TRANSACTION() (void)
|
||||
#endif
|
||||
|
||||
// Constructor when using software SPI. All output pins are configurable.
|
||||
Arduino_ST7789::Arduino_ST7789(int8_t dc, int8_t rst, int8_t sid, int8_t sclk, int8_t cs)
|
||||
: Adafruit_GFX(ST7789_TFTWIDTH, ST7789_TFTHEIGHT)
|
||||
{
|
||||
_cs = cs;
|
||||
_dc = dc;
|
||||
_sid = sid;
|
||||
_sclk = sclk;
|
||||
_rst = rst;
|
||||
_hwSPI = false;
|
||||
if(dc == -1) _SPI9bit = true;
|
||||
else _SPI9bit = false;
|
||||
}
|
||||
|
||||
// Constructor when using hardware SPI. Faster, but must use SPI pins
|
||||
// specific to each board type (e.g. 11,13 for Uno, 51,52 for Mega, etc.)
|
||||
Arduino_ST7789::Arduino_ST7789(int8_t dc, int8_t rst, int8_t cs)
|
||||
: Adafruit_GFX(ST7789_TFTWIDTH, ST7789_TFTHEIGHT) {
|
||||
_cs = cs;
|
||||
_dc = dc;
|
||||
_rst = rst;
|
||||
_hwSPI = true;
|
||||
_SPI9bit = false;
|
||||
_sid = _sclk = -1;
|
||||
}
|
||||
|
||||
inline void Arduino_ST7789::spiwrite(uint8_t c)
|
||||
{
|
||||
|
||||
//Serial.println(c, HEX);
|
||||
|
||||
if (_hwSPI)
|
||||
{
|
||||
#if defined (SPI_HAS_TRANSACTION)
|
||||
SPI.transfer(c);
|
||||
#elif defined (__AVR__) || defined(CORE_TEENSY)
|
||||
SPCRbackup = SPCR;
|
||||
SPCR = mySPCR;
|
||||
SPI.transfer(c);
|
||||
SPCR = SPCRbackup;
|
||||
#elif defined (__arm__)
|
||||
SPI.setClockDivider(21); //4MHz
|
||||
SPI.setDataMode(SPI_MODE2);
|
||||
SPI.transfer(c);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
if(_SPI9bit)
|
||||
{
|
||||
//9s bit send first
|
||||
#if defined(USE_FAST_IO)
|
||||
*clkport &= ~clkpinmask;
|
||||
if(_DCbit) *dataport |= datapinmask;
|
||||
else *dataport &= ~datapinmask;
|
||||
*clkport |= clkpinmask;
|
||||
#else
|
||||
digitalWrite(_sclk, LOW);
|
||||
if(_DCbit) digitalWrite(_sid, HIGH);
|
||||
else digitalWrite(_sid, LOW);
|
||||
digitalWrite(_sclk, HIGH);
|
||||
#endif
|
||||
|
||||
|
||||
// Fast SPI bitbang swiped from LPD8806 library
|
||||
for(uint8_t bit = 0x80; bit; bit >>= 1) {
|
||||
#if defined(USE_FAST_IO)
|
||||
*clkport &= ~clkpinmask;
|
||||
if(c & bit) *dataport |= datapinmask;
|
||||
else *dataport &= ~datapinmask;
|
||||
*clkport |= clkpinmask;
|
||||
#else
|
||||
digitalWrite(_sclk, LOW);
|
||||
if(c & bit) digitalWrite(_sid, HIGH);
|
||||
else digitalWrite(_sid, LOW);
|
||||
digitalWrite(_sclk, HIGH);
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Fast SPI bitbang swiped from LPD8806 library
|
||||
for(uint8_t bit = 0x80; bit; bit >>= 1) {
|
||||
#if defined(USE_FAST_IO)
|
||||
*clkport &= ~clkpinmask;
|
||||
if(c & bit) *dataport |= datapinmask;
|
||||
else *dataport &= ~datapinmask;
|
||||
*clkport |= clkpinmask;
|
||||
#else
|
||||
digitalWrite(_sclk, LOW);
|
||||
if(c & bit) digitalWrite(_sid, HIGH);
|
||||
else digitalWrite(_sid, LOW);
|
||||
digitalWrite(_sclk, HIGH);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Arduino_ST7789::writecommand(uint8_t c) {
|
||||
|
||||
DC_LOW();
|
||||
CS_LOW();
|
||||
SPI_BEGIN_TRANSACTION();
|
||||
|
||||
spiwrite(c);
|
||||
|
||||
CS_HIGH();
|
||||
SPI_END_TRANSACTION();
|
||||
}
|
||||
|
||||
void Arduino_ST7789::writedata(uint8_t c) {
|
||||
SPI_BEGIN_TRANSACTION();
|
||||
DC_HIGH();
|
||||
CS_LOW();
|
||||
|
||||
spiwrite(c);
|
||||
|
||||
CS_HIGH();
|
||||
SPI_END_TRANSACTION();
|
||||
}
|
||||
|
||||
// Companion code to the above tables. Reads and issues
|
||||
// a series of LCD commands stored in PROGMEM byte array.
|
||||
void Arduino_ST7789::displayInit(const uint8_t *addr) {
|
||||
|
||||
uint8_t numCommands, numArgs;
|
||||
uint16_t ms;
|
||||
//<-----------------------------------------------------------------------------------------
|
||||
DC_HIGH();
|
||||
#if defined(USE_FAST_IO)
|
||||
*clkport |= clkpinmask;
|
||||
#else
|
||||
digitalWrite(_sclk, HIGH);
|
||||
#endif
|
||||
//<-----------------------------------------------------------------------------------------
|
||||
|
||||
numCommands = pgm_read_byte(addr++); // Number of commands to follow
|
||||
while(numCommands--) { // For each command...
|
||||
writecommand(pgm_read_byte(addr++)); // Read, issue command
|
||||
numArgs = pgm_read_byte(addr++); // Number of args to follow
|
||||
ms = numArgs & ST_CMD_DELAY; // If hibit set, delay follows args
|
||||
numArgs &= ~ST_CMD_DELAY; // Mask out delay bit
|
||||
while(numArgs--) { // For each argument...
|
||||
writedata(pgm_read_byte(addr++)); // Read, issue argument
|
||||
}
|
||||
|
||||
if(ms) {
|
||||
ms = pgm_read_byte(addr++); // Read post-command delay time (ms)
|
||||
if(ms == 255) ms = 500; // If 255, delay for 500 ms
|
||||
delay(ms);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Initialization code common to all ST7789 displays
|
||||
void Arduino_ST7789::commonInit(const uint8_t *cmdList) {
|
||||
_ystart = _xstart = 0;
|
||||
_colstart = _rowstart = 0; // May be overridden in init func
|
||||
|
||||
pinMode(_dc, OUTPUT);
|
||||
if(_cs) {
|
||||
pinMode(_cs, OUTPUT);
|
||||
}
|
||||
|
||||
#if defined(USE_FAST_IO)
|
||||
dcport = portOutputRegister(digitalPinToPort(_dc));
|
||||
dcpinmask = digitalPinToBitMask(_dc);
|
||||
if(_cs) {
|
||||
csport = portOutputRegister(digitalPinToPort(_cs));
|
||||
cspinmask = digitalPinToBitMask(_cs);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
if(_hwSPI) { // Using hardware SPI
|
||||
#if defined (SPI_HAS_TRANSACTION)
|
||||
SPI.begin();
|
||||
mySPISettings = SPISettings(24000000, MSBFIRST, SPI_MODE2);
|
||||
#elif defined (__AVR__) || defined(CORE_TEENSY)
|
||||
SPCRbackup = SPCR;
|
||||
SPI.begin();
|
||||
SPI.setClockDivider(SPI_CLOCK_DIV4);
|
||||
SPI.setDataMode(SPI_MODE2);
|
||||
mySPCR = SPCR; // save our preferred state
|
||||
SPCR = SPCRbackup; // then restore
|
||||
#elif defined (__SAM3X8E__)
|
||||
SPI.begin();
|
||||
SPI.setClockDivider(21); //4MHz
|
||||
SPI.setDataMode(SPI_MODE2);
|
||||
#endif
|
||||
} else {
|
||||
pinMode(_sclk, OUTPUT);
|
||||
pinMode(_sid , OUTPUT);
|
||||
digitalWrite(_sclk, LOW);
|
||||
digitalWrite(_sid, LOW);
|
||||
|
||||
#if defined(USE_FAST_IO)
|
||||
clkport = portOutputRegister(digitalPinToPort(_sclk));
|
||||
dataport = portOutputRegister(digitalPinToPort(_sid));
|
||||
clkpinmask = digitalPinToBitMask(_sclk);
|
||||
datapinmask = digitalPinToBitMask(_sid);
|
||||
#endif
|
||||
}
|
||||
|
||||
// toggle RST low to reset; CS low so it'll listen to us
|
||||
CS_LOW();
|
||||
if (_rst != -1) {
|
||||
pinMode(_rst, OUTPUT);
|
||||
digitalWrite(_rst, HIGH);
|
||||
delay(50);
|
||||
digitalWrite(_rst, LOW);
|
||||
delay(50);
|
||||
digitalWrite(_rst, HIGH);
|
||||
delay(50);
|
||||
}
|
||||
|
||||
if(cmdList)
|
||||
displayInit(cmdList);
|
||||
}
|
||||
|
||||
void Arduino_ST7789::setRotation(uint8_t m) {
|
||||
|
||||
writecommand(ST7789_MADCTL);
|
||||
rotation = m % 4; // can't be higher than 3
|
||||
switch (rotation) {
|
||||
case 0:
|
||||
writedata(ST7789_MADCTL_MX | ST7789_MADCTL_MY | ST7789_MADCTL_RGB);
|
||||
|
||||
_xstart = _colstart;
|
||||
_ystart = _rowstart;
|
||||
break;
|
||||
case 1:
|
||||
writedata(ST7789_MADCTL_MY | ST7789_MADCTL_MV | ST7789_MADCTL_RGB);
|
||||
|
||||
_ystart = _colstart;
|
||||
_xstart = _rowstart;
|
||||
break;
|
||||
case 2:
|
||||
writedata(ST7789_MADCTL_RGB);
|
||||
|
||||
_xstart = _colstart;
|
||||
_ystart = _rowstart;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
writedata(ST7789_MADCTL_MX | ST7789_MADCTL_MV | ST7789_MADCTL_RGB);
|
||||
|
||||
_ystart = _colstart;
|
||||
_xstart = _rowstart;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Arduino_ST7789::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1,
|
||||
uint16_t y1) {
|
||||
|
||||
uint16_t x_start = x0 + _xstart, x_end = x1 + _xstart;
|
||||
uint16_t y_start = y0 + _ystart, y_end = y1 + _ystart;
|
||||
|
||||
|
||||
writecommand(ST7789_CASET); // Column addr set
|
||||
writedata(x_start >> 8);
|
||||
writedata(x_start & 0xFF); // XSTART
|
||||
writedata(x_end >> 8);
|
||||
writedata(x_end & 0xFF); // XEND
|
||||
|
||||
writecommand(ST7789_RASET); // Row addr set
|
||||
writedata(y_start >> 8);
|
||||
writedata(y_start & 0xFF); // YSTART
|
||||
writedata(y_end >> 8);
|
||||
writedata(y_end & 0xFF); // YEND
|
||||
|
||||
writecommand(ST7789_RAMWR); // write to RAM
|
||||
}
|
||||
|
||||
void Arduino_ST7789::pushColor(uint16_t color) {
|
||||
SPI_BEGIN_TRANSACTION();
|
||||
DC_HIGH();
|
||||
CS_LOW();
|
||||
|
||||
spiwrite(color >> 8);
|
||||
spiwrite(color);
|
||||
|
||||
CS_HIGH();
|
||||
SPI_END_TRANSACTION();
|
||||
}
|
||||
|
||||
void Arduino_ST7789::drawPixel(int16_t x, int16_t y, uint16_t color) {
|
||||
|
||||
if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
|
||||
|
||||
setAddrWindow(x,y,x+1,y+1);
|
||||
|
||||
SPI_BEGIN_TRANSACTION();
|
||||
DC_HIGH();
|
||||
CS_LOW();
|
||||
|
||||
spiwrite(color >> 8);
|
||||
spiwrite(color);
|
||||
|
||||
CS_HIGH();
|
||||
SPI_END_TRANSACTION();
|
||||
}
|
||||
|
||||
void Arduino_ST7789::drawFastVLine(int16_t x, int16_t y, int16_t h,
|
||||
uint16_t color) {
|
||||
|
||||
// Rudimentary clipping
|
||||
if((x >= _width) || (y >= _height)) return;
|
||||
if((y+h-1) >= _height) h = _height-y;
|
||||
setAddrWindow(x, y, x, y+h-1);
|
||||
|
||||
uint8_t hi = color >> 8, lo = color;
|
||||
|
||||
SPI_BEGIN_TRANSACTION();
|
||||
DC_HIGH();
|
||||
CS_LOW();
|
||||
|
||||
while (h--) {
|
||||
spiwrite(hi);
|
||||
spiwrite(lo);
|
||||
}
|
||||
|
||||
CS_HIGH();
|
||||
SPI_END_TRANSACTION();
|
||||
}
|
||||
|
||||
void Arduino_ST7789::drawFastHLine(int16_t x, int16_t y, int16_t w,
|
||||
uint16_t color) {
|
||||
|
||||
// Rudimentary clipping
|
||||
if((x >= _width) || (y >= _height)) return;
|
||||
if((x+w-1) >= _width) w = _width-x;
|
||||
setAddrWindow(x, y, x+w-1, y);
|
||||
|
||||
uint8_t hi = color >> 8, lo = color;
|
||||
|
||||
SPI_BEGIN_TRANSACTION();
|
||||
DC_HIGH();
|
||||
CS_LOW();
|
||||
|
||||
while (w--) {
|
||||
spiwrite(hi);
|
||||
spiwrite(lo);
|
||||
}
|
||||
|
||||
CS_HIGH();
|
||||
SPI_END_TRANSACTION();
|
||||
}
|
||||
|
||||
void Arduino_ST7789::fillScreen(uint16_t color) {
|
||||
fillRect(0, 0, _width, _height, color);
|
||||
}
|
||||
|
||||
// fill a rectangle
|
||||
void Arduino_ST7789::fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
|
||||
uint16_t color) {
|
||||
|
||||
// rudimentary clipping (drawChar w/big text requires this)
|
||||
if((x >= _width) || (y >= _height)) return;
|
||||
if((x + w - 1) >= _width) w = _width - x;
|
||||
if((y + h - 1) >= _height) h = _height - y;
|
||||
|
||||
setAddrWindow(x, y, x+w-1, y+h-1);
|
||||
|
||||
uint8_t hi = color >> 8, lo = color;
|
||||
|
||||
SPI_BEGIN_TRANSACTION();
|
||||
|
||||
DC_HIGH();
|
||||
CS_LOW();
|
||||
for(y=h; y>0; y--) {
|
||||
for(x=w; x>0; x--) {
|
||||
spiwrite(hi);
|
||||
spiwrite(lo);
|
||||
}
|
||||
}
|
||||
CS_HIGH();
|
||||
SPI_END_TRANSACTION();
|
||||
}
|
||||
|
||||
// Pass 8-bit (each) R,G,B, get back 16-bit packed color
|
||||
uint16_t Arduino_ST7789::Color565(uint8_t r, uint8_t g, uint8_t b) {
|
||||
return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
|
||||
}
|
||||
|
||||
void Arduino_ST7789::invertDisplay(boolean i) {
|
||||
writecommand(i ? ST7789_INVON : ST7789_INVOFF);
|
||||
}
|
||||
|
||||
/******** low level bit twiddling **********/
|
||||
|
||||
inline void Arduino_ST7789::CS_HIGH(void) {
|
||||
if(_cs) {
|
||||
#if defined(USE_FAST_IO)
|
||||
*csport |= cspinmask;
|
||||
#else
|
||||
digitalWrite(_cs, HIGH);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
inline void Arduino_ST7789::CS_LOW(void) {
|
||||
if(_cs) {
|
||||
#if defined(USE_FAST_IO)
|
||||
*csport &= ~cspinmask;
|
||||
#else
|
||||
digitalWrite(_cs, LOW);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
inline void Arduino_ST7789::DC_HIGH(void) {
|
||||
_DCbit = true;
|
||||
#if defined(USE_FAST_IO)
|
||||
*dcport |= dcpinmask;
|
||||
#else
|
||||
digitalWrite(_dc, HIGH);
|
||||
#endif
|
||||
}
|
||||
|
||||
inline void Arduino_ST7789::DC_LOW(void) {
|
||||
_DCbit = false;
|
||||
#if defined(USE_FAST_IO)
|
||||
*dcport &= ~dcpinmask;
|
||||
#else
|
||||
digitalWrite(_dc, LOW);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Arduino_ST7789::init(uint16_t width, uint16_t height) {
|
||||
commonInit(NULL);
|
||||
|
||||
_colstart = ST7789_240x240_XSTART;
|
||||
_rowstart = ST7789_240x240_YSTART;
|
||||
_height = height;
|
||||
_width = width;
|
||||
|
||||
displayInit(cmd_240x240);
|
||||
|
||||
setRotation(2);
|
||||
}
|
145
Arduino-ST7789-Library/Arduino_ST7789.h
Normal file
145
Arduino-ST7789-Library/Arduino_ST7789.h
Normal file
@ -0,0 +1,145 @@
|
||||
/***************************************************
|
||||
This is a library for the ST7789 IPS SPI display.
|
||||
|
||||
Originally written by Limor Fried/Ladyada for
|
||||
Adafruit Industries.
|
||||
|
||||
Modified by Ananev Ilia
|
||||
****************************************************/
|
||||
|
||||
#ifndef _ADAFRUIT_ST7789H_
|
||||
#define _ADAFRUIT_ST7789H_
|
||||
|
||||
#include "Arduino.h"
|
||||
#include "Print.h"
|
||||
#include <Adafruit_GFX.h>
|
||||
|
||||
#if defined(__AVR__) || defined(CORE_TEENSY)
|
||||
#include <avr/pgmspace.h>
|
||||
#define USE_FAST_IO
|
||||
typedef volatile uint8_t RwReg;
|
||||
#elif defined(ARDUINO_STM32_FEATHER)
|
||||
typedef volatile uint32 RwReg;
|
||||
#define USE_FAST_IO
|
||||
#elif defined(ARDUINO_FEATHER52)
|
||||
typedef volatile uint32_t RwReg;
|
||||
#define USE_FAST_IO
|
||||
#elif defined(ESP8266)
|
||||
#include <pgmspace.h>
|
||||
#elif defined(__SAM3X8E__)
|
||||
#undef __FlashStringHelper::F(string_literal)
|
||||
#define F(string_literal) string_literal
|
||||
#include <include/pio.h>
|
||||
#define PROGMEM
|
||||
#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
|
||||
#define pgm_read_word(addr) (*(const unsigned short *)(addr))
|
||||
typedef unsigned char prog_uchar;
|
||||
#endif
|
||||
|
||||
#define ST7789_TFTWIDTH 240
|
||||
#define ST7789_TFTHEIGHT 240
|
||||
|
||||
#define ST7789_240x240_XSTART 0
|
||||
#define ST7789_240x240_YSTART 0
|
||||
|
||||
#define ST_CMD_DELAY 0x80 // special signifier for command lists
|
||||
|
||||
#define ST7789_NOP 0x00
|
||||
#define ST7789_SWRESET 0x01
|
||||
#define ST7789_RDDID 0x04
|
||||
#define ST7789_RDDST 0x09
|
||||
|
||||
#define ST7789_SLPIN 0x10
|
||||
#define ST7789_SLPOUT 0x11
|
||||
#define ST7789_PTLON 0x12
|
||||
#define ST7789_NORON 0x13
|
||||
|
||||
#define ST7789_INVOFF 0x20
|
||||
#define ST7789_INVON 0x21
|
||||
#define ST7789_DISPOFF 0x28
|
||||
#define ST7789_DISPON 0x29
|
||||
#define ST7789_CASET 0x2A
|
||||
#define ST7789_RASET 0x2B
|
||||
#define ST7789_RAMWR 0x2C
|
||||
#define ST7789_RAMRD 0x2E
|
||||
|
||||
#define ST7789_PTLAR 0x30
|
||||
#define ST7789_COLMOD 0x3A
|
||||
#define ST7789_MADCTL 0x36
|
||||
|
||||
#define ST7789_MADCTL_MY 0x80
|
||||
#define ST7789_MADCTL_MX 0x40
|
||||
#define ST7789_MADCTL_MV 0x20
|
||||
#define ST7789_MADCTL_ML 0x10
|
||||
#define ST7789_MADCTL_RGB 0x00
|
||||
|
||||
#define ST7789_RDID1 0xDA
|
||||
#define ST7789_RDID2 0xDB
|
||||
#define ST7789_RDID3 0xDC
|
||||
#define ST7789_RDID4 0xDD
|
||||
|
||||
// Color definitions
|
||||
#define BLACK 0x0000
|
||||
#define BLUE 0x001F
|
||||
#define RED 0xF800
|
||||
#define GREEN 0x07E0
|
||||
#define CYAN 0x07FF
|
||||
#define MAGENTA 0xF81F
|
||||
#define YELLOW 0xFFE0
|
||||
#define WHITE 0xFFFF
|
||||
|
||||
class Arduino_ST7789 : public Adafruit_GFX {
|
||||
|
||||
public:
|
||||
|
||||
Arduino_ST7789(int8_t DC, int8_t RST, int8_t SID, int8_t SCLK, int8_t CS = -1);
|
||||
Arduino_ST7789(int8_t DC, int8_t RST, int8_t CS = -1);
|
||||
|
||||
void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1),
|
||||
pushColor(uint16_t color),
|
||||
fillScreen(uint16_t color),
|
||||
drawPixel(int16_t x, int16_t y, uint16_t color),
|
||||
drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color),
|
||||
drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color),
|
||||
fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color),
|
||||
setRotation(uint8_t r),
|
||||
invertDisplay(boolean i),
|
||||
init(uint16_t width, uint16_t height);
|
||||
uint16_t Color565(uint8_t r, uint8_t g, uint8_t b);
|
||||
uint16_t color565(uint8_t r, uint8_t g, uint8_t b) { return Color565(r, g, b); }
|
||||
|
||||
protected:
|
||||
uint8_t _colstart, _rowstart, _xstart, _ystart; // some displays need this changed
|
||||
|
||||
void displayInit(const uint8_t *addr);
|
||||
void spiwrite(uint8_t),
|
||||
writecommand(uint8_t c),
|
||||
writedata(uint8_t d),
|
||||
commonInit(const uint8_t *cmdList);
|
||||
|
||||
private:
|
||||
|
||||
inline void CS_HIGH(void);
|
||||
inline void CS_LOW(void);
|
||||
inline void DC_HIGH(void);
|
||||
inline void DC_LOW(void);
|
||||
|
||||
boolean _hwSPI;
|
||||
boolean _SPI9bit;
|
||||
boolean _DCbit;
|
||||
|
||||
int8_t _cs, _dc, _rst, _sid, _sclk;
|
||||
|
||||
#if defined(USE_FAST_IO)
|
||||
volatile RwReg *dataport, *clkport, *csport, *dcport;
|
||||
|
||||
#if defined(__AVR__) || defined(CORE_TEENSY) // 8 bit!
|
||||
uint8_t datapinmask, clkpinmask, cspinmask, dcpinmask;
|
||||
#else // 32 bit!
|
||||
uint32_t datapinmask, clkpinmask, cspinmask, dcpinmask;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
#endif
|
3
Arduino-ST7789-Library/README.txt
Normal file
3
Arduino-ST7789-Library/README.txt
Normal file
@ -0,0 +1,3 @@
|
||||
This is a library for the ST7789 IPS SPI display.
|
||||
|
||||
Also requires the Adafruit_GFX library for Arduino.
|
298
Arduino-ST7789-Library/examples/graphicstest/graphicstest.ino
Normal file
298
Arduino-ST7789-Library/examples/graphicstest/graphicstest.ino
Normal file
@ -0,0 +1,298 @@
|
||||
/***************************************************
|
||||
This is a library for the ST7789 IPS SPI display.
|
||||
|
||||
Originally written by Limor Fried/Ladyada for
|
||||
Adafruit Industries.
|
||||
|
||||
Modified by Ananev Ilia
|
||||
****************************************************/
|
||||
|
||||
#include <Adafruit_GFX.h> // Core graphics library by Adafruit
|
||||
#include <Arduino_ST7789.h> // Hardware-specific library for ST7789 (with or without CS pin)
|
||||
#include <SPI.h>
|
||||
|
||||
// #define TFT_DC 8
|
||||
// #define TFT_RST 9
|
||||
// #define TFT_CS 10 // only for displays with CS pin
|
||||
// #define TFT_MOSI 11 // for hardware SPI data pin (all of available pins)
|
||||
// #define TFT_SCLK 13 // for hardware SPI sclk pin (all of available pins)
|
||||
|
||||
#define TFT_MISO -1
|
||||
#define TFT_MOSI 23
|
||||
#define TFT_SCLK 18
|
||||
#define TFT_CS 5 // Chip select control pin
|
||||
#define TFT_DC 16 // Data Command control pin
|
||||
#define TFT_RST 17 // Reset pin (could connect to RST pin)
|
||||
|
||||
//You can use different type of hardware initialization
|
||||
//using hardware SPI (11, 13 on UNO; 51, 52 on MEGA; ICSP-4, ICSP-3 on DUE and etc)
|
||||
//Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST); //for display without CS pin
|
||||
//Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST, TFT_CS); //for display with CS pin
|
||||
//or you can use software SPI on all available pins (slow)
|
||||
//Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST, TFT_MOSI, TFT_SCLK); //for display without CS pin
|
||||
Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST, TFT_MOSI, TFT_SCLK, TFT_CS); //for display with CS pin
|
||||
// Arduino_ST7789 tft = Arduino_ST7789(-1, TFT_RST, TFT_MOSI, TFT_SCLK, TFT_CS); //for display with CS pin and DC via 9bit SPI
|
||||
|
||||
|
||||
float p = 3.1415926;
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(9600);
|
||||
Serial.print("Hello! ST7789 TFT Test");
|
||||
|
||||
tft.init(240, 320); // initialize a ST7789 chip, 240x240 pixels
|
||||
tft.setRotation(0);
|
||||
Serial.println("Initialized");
|
||||
|
||||
uint16_t time = millis();
|
||||
tft.fillScreen(BLACK);
|
||||
time = millis() - time;
|
||||
|
||||
Serial.println(time, DEC);
|
||||
delay(500);
|
||||
|
||||
// large block of text
|
||||
tft.fillScreen(BLACK);
|
||||
testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", WHITE);
|
||||
delay(1000);
|
||||
|
||||
// tft print function
|
||||
tftPrintTest();
|
||||
delay(4000);
|
||||
|
||||
// a single pixel
|
||||
tft.drawPixel(tft.width() / 2, tft.height() / 2, GREEN);
|
||||
delay(500);
|
||||
|
||||
// line draw test
|
||||
testlines(YELLOW);
|
||||
delay(500);
|
||||
|
||||
// optimized lines
|
||||
testfastlines(RED, BLUE);
|
||||
delay(500);
|
||||
|
||||
testdrawrects(GREEN);
|
||||
delay(500);
|
||||
|
||||
testfillrects(YELLOW, MAGENTA);
|
||||
delay(500);
|
||||
|
||||
tft.fillScreen(BLACK);
|
||||
testfillcircles(10, BLUE);
|
||||
testdrawcircles(10, WHITE);
|
||||
delay(500);
|
||||
|
||||
testroundrects();
|
||||
delay(500);
|
||||
|
||||
testtriangles();
|
||||
delay(500);
|
||||
|
||||
mediabuttons();
|
||||
delay(500);
|
||||
|
||||
Serial.println("done");
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
tft.invertDisplay(true);
|
||||
delay(500);
|
||||
tft.invertDisplay(false);
|
||||
delay(500);
|
||||
}
|
||||
|
||||
void testlines(uint16_t color)
|
||||
{
|
||||
tft.fillScreen(BLACK);
|
||||
for (int16_t x = 0; x < tft.width(); x += 6) {
|
||||
tft.drawLine(0, 0, x, tft.height() - 1, color);
|
||||
}
|
||||
for (int16_t y = 0; y < tft.height(); y += 6) {
|
||||
tft.drawLine(0, 0, tft.width() - 1, y, color);
|
||||
}
|
||||
|
||||
tft.fillScreen(BLACK);
|
||||
for (int16_t x = 0; x < tft.width(); x += 6) {
|
||||
tft.drawLine(tft.width() - 1, 0, x, tft.height() - 1, color);
|
||||
}
|
||||
for (int16_t y = 0; y < tft.height(); y += 6) {
|
||||
tft.drawLine(tft.width() - 1, 0, 0, y, color);
|
||||
}
|
||||
|
||||
tft.fillScreen(BLACK);
|
||||
for (int16_t x = 0; x < tft.width(); x += 6) {
|
||||
tft.drawLine(0, tft.height() - 1, x, 0, color);
|
||||
}
|
||||
for (int16_t y = 0; y < tft.height(); y += 6) {
|
||||
tft.drawLine(0, tft.height() - 1, tft.width() - 1, y, color);
|
||||
}
|
||||
|
||||
tft.fillScreen(BLACK);
|
||||
for (int16_t x = 0; x < tft.width(); x += 6) {
|
||||
tft.drawLine(tft.width() - 1, tft.height() - 1, x, 0, color);
|
||||
}
|
||||
for (int16_t y = 0; y < tft.height(); y += 6) {
|
||||
tft.drawLine(tft.width() - 1, tft.height() - 1, 0, y, color);
|
||||
}
|
||||
}
|
||||
|
||||
void testdrawtext(char *text, uint16_t color)
|
||||
{
|
||||
tft.setCursor(0, 0);
|
||||
tft.setTextColor(color);
|
||||
tft.setTextWrap(true);
|
||||
tft.print(text);
|
||||
}
|
||||
|
||||
void testfastlines(uint16_t color1, uint16_t color2)
|
||||
{
|
||||
tft.fillScreen(BLACK);
|
||||
for (int16_t y = 0; y < tft.height(); y += 5) {
|
||||
tft.drawFastHLine(0, y, tft.width(), color1);
|
||||
}
|
||||
for (int16_t x = 0; x < tft.width(); x += 5) {
|
||||
tft.drawFastVLine(x, 0, tft.height(), color2);
|
||||
}
|
||||
}
|
||||
|
||||
void testdrawrects(uint16_t color)
|
||||
{
|
||||
tft.fillScreen(BLACK);
|
||||
for (int16_t x = 0; x < tft.width(); x += 6) {
|
||||
tft.drawRect(tft.width() / 2 - x / 2, tft.height() / 2 - x / 2, x, x, color);
|
||||
}
|
||||
}
|
||||
|
||||
void testfillrects(uint16_t color1, uint16_t color2)
|
||||
{
|
||||
tft.fillScreen(BLACK);
|
||||
for (int16_t x = tft.width() - 1; x > 6; x -= 6) {
|
||||
tft.fillRect(tft.width() / 2 - x / 2, tft.height() / 2 - x / 2, x, x, color1);
|
||||
tft.drawRect(tft.width() / 2 - x / 2, tft.height() / 2 - x / 2, x, x, color2);
|
||||
}
|
||||
}
|
||||
|
||||
void testfillcircles(uint8_t radius, uint16_t color)
|
||||
{
|
||||
for (int16_t x = radius; x < tft.width(); x += radius * 2) {
|
||||
for (int16_t y = radius; y < tft.height(); y += radius * 2) {
|
||||
tft.fillCircle(x, y, radius, color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void testdrawcircles(uint8_t radius, uint16_t color)
|
||||
{
|
||||
for (int16_t x = 0; x < tft.width() + radius; x += radius * 2) {
|
||||
for (int16_t y = 0; y < tft.height() + radius; y += radius * 2) {
|
||||
tft.drawCircle(x, y, radius, color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void testtriangles()
|
||||
{
|
||||
tft.fillScreen(BLACK);
|
||||
int color = 0xF800;
|
||||
int t;
|
||||
int w = tft.width() / 2;
|
||||
int x = tft.height() - 1;
|
||||
int y = 0;
|
||||
int z = tft.width();
|
||||
for (t = 0 ; t <= 15; t++) {
|
||||
tft.drawTriangle(w, y, y, x, z, x, color);
|
||||
x -= 4;
|
||||
y += 4;
|
||||
z -= 4;
|
||||
color += 100;
|
||||
}
|
||||
}
|
||||
|
||||
void testroundrects()
|
||||
{
|
||||
tft.fillScreen(BLACK);
|
||||
int color = 100;
|
||||
int i;
|
||||
int t;
|
||||
for (t = 0 ; t <= 4; t += 1) {
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
int w = tft.width() - 2;
|
||||
int h = tft.height() - 2;
|
||||
for (i = 0 ; i <= 16; i += 1) {
|
||||
tft.drawRoundRect(x, y, w, h, 5, color);
|
||||
x += 2;
|
||||
y += 3;
|
||||
w -= 4;
|
||||
h -= 6;
|
||||
color += 1100;
|
||||
}
|
||||
color += 100;
|
||||
}
|
||||
}
|
||||
|
||||
void tftPrintTest()
|
||||
{
|
||||
tft.setTextWrap(false);
|
||||
tft.fillScreen(BLACK);
|
||||
tft.setCursor(0, 30);
|
||||
tft.setTextColor(RED);
|
||||
tft.setTextSize(1);
|
||||
tft.println("Hello World!");
|
||||
tft.setTextColor(YELLOW);
|
||||
tft.setTextSize(2);
|
||||
tft.println("Hello World!");
|
||||
tft.setTextColor(GREEN);
|
||||
tft.setTextSize(3);
|
||||
tft.println("Hello World!");
|
||||
tft.setTextColor(BLUE);
|
||||
tft.setTextSize(4);
|
||||
tft.print(1234.567);
|
||||
delay(1500);
|
||||
tft.setCursor(0, 0);
|
||||
tft.fillScreen(BLACK);
|
||||
tft.setTextColor(WHITE);
|
||||
tft.setTextSize(0);
|
||||
tft.println("Hello World!");
|
||||
tft.setTextSize(1);
|
||||
tft.setTextColor(GREEN);
|
||||
tft.print(p, 6);
|
||||
tft.println(" Want pi?");
|
||||
tft.println(" ");
|
||||
tft.print(8675309, HEX); // print 8,675,309 out in HEX!
|
||||
tft.println(" Print HEX!");
|
||||
tft.println(" ");
|
||||
tft.setTextColor(WHITE);
|
||||
tft.println("Sketch has been");
|
||||
tft.println("running for: ");
|
||||
tft.setTextColor(MAGENTA);
|
||||
tft.print(millis() / 1000);
|
||||
tft.setTextColor(WHITE);
|
||||
tft.print(" seconds.");
|
||||
}
|
||||
|
||||
void mediabuttons()
|
||||
{
|
||||
// play
|
||||
tft.fillScreen(BLACK);
|
||||
tft.fillRoundRect(25, 10, 78, 60, 8, WHITE);
|
||||
tft.fillTriangle(42, 20, 42, 60, 90, 40, RED);
|
||||
delay(500);
|
||||
// pause
|
||||
tft.fillRoundRect(25, 90, 78, 60, 8, WHITE);
|
||||
tft.fillRoundRect(39, 98, 20, 45, 5, GREEN);
|
||||
tft.fillRoundRect(69, 98, 20, 45, 5, GREEN);
|
||||
delay(500);
|
||||
// play color
|
||||
tft.fillTriangle(42, 20, 42, 60, 90, 40, BLUE);
|
||||
delay(50);
|
||||
// pause color
|
||||
tft.fillRoundRect(39, 98, 20, 45, 5, RED);
|
||||
tft.fillRoundRect(69, 98, 20, 45, 5, RED);
|
||||
// play color
|
||||
tft.fillTriangle(42, 20, 42, 60, 90, 40, GREEN);
|
||||
}
|
9
Arduino-ST7789-Library/library.properties
Normal file
9
Arduino-ST7789-Library/library.properties
Normal file
@ -0,0 +1,9 @@
|
||||
name=Arduino ST7789 Library
|
||||
version=0.9.5
|
||||
author=Ananev Ilya
|
||||
maintainer=Ananev Ilya <ananevilya@gmail.com>
|
||||
sentence=This is a library for the ST7789 IPS SPI display.
|
||||
paragraph=This is a library for the ST7789 IPS SPI display.
|
||||
category=Display
|
||||
url=https://github.com/ananevilya/Arduino-ST7789-Library
|
||||
architectures=*
|
Loading…
Reference in New Issue
Block a user