秋月のst7789(spi)のカラー化成功(ESP32)(SRAM100KB以上)(仮想VRAM方式)


目的
カラー液晶で遊ぶ
なぜか連続100KB失敗したので
50KBと50KBにわけた
COLORのHとL

![o_cop784.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d220c6e8-1530-5b5c-8a2e-b34c5b0536ca.jpeg)



TFT_CS 14
TFT_RST 15
TFT_DC 32

CLK-18
MOSI-23




OLED_SSD1306_BITMAP_DV67_color_SPI_89_UNO


```c++:main.cpp



//OLED_SSD1306_BITMAP_DV67_color_SPI_89_UNO


//ヘッダーファイル
#include <Adafruit_GFX.h>
#include "hh.h"

//定義
#define SCREEN_WIDTH 240 // OLED display width, in pixels
//#define SCREEN_HEIGHT 160 // OLED display height, in pixels
//#define SCREEN_HEIGHT 80 // OLED display height, in pixels stm32G071
#define SCREEN_HEIGHT 240 // OLED display height, in pixels stm32f767
//#define SCREEN_HEIGHT 60 // OLED display height, in pixels stm32G071
NA_ST7735_P display(SCREEN_WIDTH, SCREEN_HEIGHT);


// ビットマップデータ
uint8_t databytes[8] =

{

  0b01100110,
  0b10101111,
  0b10111111,
  0b11011111,

  0b01111110,
  0b01111110,
  0b00111100,
  0b00011000

};


//初期化
void setup() {

  //ディスプレイの初期化
  if(display.begin() == false){
    pinMode(14,OUTPUT);
    while(1){
          digitalWrite(14,1);  delay(200);
          digitalWrite(14,0);  delay(200);            
    }
  }

  //表示方向
  display.setRotation(0);

  // 画面表示をクリア
  display.clearDisplay();

  //ビットマップの表示
  //display.drawBitmap(0, 0, databytes, 8, 8,  WHITE);
  display.drawBitmap(3, 3, databytes, 8, 8,  RED);


  // テキストサイズを設定
  display.setTextSize(3);
  // テキスト色を設定
  display.setTextColor(WHITE);
  //display.setTextColor(RED);
  // テキストの開始位置を設定
  display.setCursor(20, 10);


  // 1行目に46を表示
  display.println("ST7789SPI");



  // 画面の左側に長方形(塗りつぶしなし)を描画
  // display.drawRect(左上x, 左上y, 幅, 高さ, 線の色)
  //display.drawRect(0, 0, 127, 80, WHITE);
  //display.drawRect(0, 0, 127, 159, WHITE);
  display.drawRect(0, 0, 239, 239, WHITE);

  // 描画バッファの内容を画面に表示
  display.display();

  //delay(3000); //1秒待つ

}//setup


//メインループ
void loop() {
  delay(1);
}//loop



```

hh.cpp


```c++:hh.cpp


//インクルド
#include "hh.h"
#include <Adafruit_GFX.h>
#include <SPI.h>


//定義
#define NA_ST7735_P_swap(a, b)  (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))) ///< No-temp-var swap operation

/*
  //GPIOの設定1　開始
  //GPIO
  #define GPIO_D13(s) digitalWrite(13,s)
  #define GPIO_D12(s) digitalWrite(12,s) //未使用
  #define GPIO_D11(s) digitalWrite(11,s)
  #define GPIO_D10(s) digitalWrite(10,s)
  #define GPIO_D9(s)  digitalWrite(9,s)
  #define GPIO_D8(s)  digitalWrite(8,s)
  //#define GPIO_CS(y)     GPIO_D10(y)
  //#define GPIO_RS(y)     GPIO_D8(y)
  //#define GPIO_RESET(y)  GPIO_D9(y) //RESET=1
  //#define TFT_CS    10
  //#define TFT_RST   9
  //#define TFT_RS    8
*/

//GPIOの設定2　開始
//GPIO
#define GPIO_D14(s)  digitalWrite(14,s)
#define GPIO_D15(s)  digitalWrite(15,s)
#define GPIO_D32(s)  digitalWrite(32,s)
#define GPIO_CS(y)     GPIO_D14(y)
#define GPIO_RESET(y)  GPIO_D15(y)
#define GPIO_RS(y)     GPIO_D32(y)
#define TFT_CS    14
#define TFT_RST   15
#define TFT_RS    32


void NA_ST7735_P::GPIO_8BIT(uint8_t s)
{

  SPI.transfer(s);

} //GPIO_8BIT

//コマンドの書き込み
void NA_ST7735_P::LCD_Write_CMD(uint8_t a)
{

  GPIO_CS(0);//CS=0; 12
  GPIO_RS(0); //A0=0; 9
  GPIO_8BIT(a);//P1=a; data SPI SPI
  GPIO_CS(1);//CS=1; 12

} //LCD_Write_CMD


//データ書き込み
void NA_ST7735_P::LCD_Write_Data(uint8_t a)
{

  GPIO_CS(0);//CS=0; 12
  GPIO_RS(1); //A0=1; 9
  GPIO_8BIT(a);//P1=a; data SPI SPI
  GPIO_CS(1);//CS=1; 12

} //LCD_Write_Data


//液晶の初期化処理
void NA_ST7735_P::TXDT144TF_ST7735S_Init(void)
{

  //----------  ST7735S Reset Sequence  --------//

  GPIO_RESET(1);//LCD_RESET=1;
  delay(1); //Delay 1ms

  GPIO_RESET(0);//LCD_RESET=0;
  delay(1); //Delay 1ms

  GPIO_RESET(1);//LCD_RESET=1;
  delay(120); //Delay 120ms

  LCD_Write_CMD(0x01);//SOFTWARE RESET
  delay(50);

  LCD_Write_CMD(0x01);//SOFTWARE RESET
  delay(50);

  LCD_Write_CMD(0x11);//SLEEP OUT
  delay(200);

  LCD_Write_CMD(0x29);//display on
  delay(100);

  LCD_Write_CMD(0x36);//RGB-RGR format
  LCD_Write_Data(0x00);//RGB mode
  delay(100);

  LCD_Write_CMD(0x3a);//Interface pixel format
  LCD_Write_Data(0x55);//16bit mode
  delay(100);

  LCD_Write_CMD(0x21); //Reverse
  delay(100);

} //TXDT144TF_ST7735S_Init


NA_ST7735_P::NA_ST7735_P(uint8_t w, uint8_t h)
  : Adafruit_GFX(w, h) , buffer1(NULL), buffer2(NULL)

{
}


//バッファのクリア
NA_ST7735_P::~NA_ST7735_P(void) {
  if (buffer1) {
    free(buffer1);
    buffer1 = NULL;
  }
  if (buffer2) {
    free(buffer2);
    buffer2 = NULL;
  }
}//~NA_ST7735_P


//初期処理
bool NA_ST7735_P::begin(void) {


  if ((!buffer1) && !(buffer1 = (uint8_t *)malloc(WIDTH * HEIGHT)   ))
    return false;

  if ((!buffer2) && !(buffer2 = (uint8_t *)malloc(WIDTH * HEIGHT)   ))
    return false;


  //バッファーのクリア
  clearDisplay();

  //ポートのモード設定
  //アウトプットモード
  pinMode(TFT_CS, OUTPUT);
  pinMode(TFT_RST, OUTPUT);
  pinMode(TFT_RS, OUTPUT);


  //SPIの開始
  SPI.begin();
  //ビットの並び
  //SPI.setBitOrder(LSBFIRST);
  SPI.setBitOrder(MSBFIRST);   //桁大きい順
  //SPIの速度
  SPI.setClockDivider(SPI_CLOCK_DIV8);  // 2Mhz
  //SPI.setClockDivider(SPI_CLOCK_DIV4);
  //SPI.setClockDivider(SPI_CLOCK_DIV2);    //約8MHz
  //SPIクロックのモード
  SPI.setDataMode(SPI_MODE0);


  //ポートの初期化
  GPIO_CS(1);//CS=1
  GPIO_RESET(1);//RESET=1
  GPIO_RS(0);//RS=0

  delay(500); //0.5秒待つ

  //液晶の初期化処理
  TXDT144TF_ST7735S_Init();

  return true; // Success
}//begin


//点の表示
void NA_ST7735_P::drawPixel(int16_t x, int16_t y, uint16_t color) {
  if ((x >= 0) && (x < width()) && (y >= 0) && (y < height())) {
    // Pixel is in-bounds. Rotate coordinates if needed.
    switch (getRotation()) {
      case 1:
        NA_ST7735_P_swap(x, y);
        x = WIDTH - x - 1;
        break;
      case 2:
        x = WIDTH - x - 1;
        y = HEIGHT - y - 1;
        break;
      case 3:
        NA_ST7735_P_swap(x, y);
        y = HEIGHT - y - 1;
        break;
    }//end switch

    //ドットのカラーの設定
    buffer1[ y * WIDTH + x ] = (color>>8) & 0xff;
    buffer2[ y * WIDTH + x ] =  color     & 0xff;
    

  }//if
}//drawPixel

//バッファのクリア
void NA_ST7735_P::clearDisplay(void) {
  memset(buffer1, 0, WIDTH * HEIGHT  );
  memset(buffer2, 0, WIDTH * HEIGHT  );
}


bool NA_ST7735_P::getPixel(int16_t x, int16_t y) {
  if ((x >= 0) && (x < width()) && (y >= 0) && (y < height())) {
    // Pixel is in-bounds. Rotate coordinates if needed.
    switch (getRotation()) {
      case 1:
        NA_ST7735_P_swap(x, y);
        x = WIDTH - x - 1;
        break;
      case 2:
        x = WIDTH - x - 1;
        y = HEIGHT - y - 1;
        break;
      case 3:
        NA_ST7735_P_swap(x, y);
        y = HEIGHT - y - 1;
        break;
    }
    return ( (buffer1[ y * WIDTH + x ]<<8)+(buffer2[ y * WIDTH + x ]) );
  }
  return false; // Pixel out of bounds
}


uint8_t *NA_ST7735_P::getBuffer(void) {
  return buffer1;
}


//画面のリフレッシュ
void NA_ST7735_P::display(void) {

  //画面の書き込み開始
  LCD_Write_CMD(0x2C); //memory write

  for (int i = 0; i < (HEIGHT * WIDTH); i++) {
    //---------------- 1バイト目
    LCD_Write_Data(buffer1[i]);
    //---------------- 2バイト目
    LCD_Write_Data(buffer2[i]);
  }//i

}//display



```

hh.h


```c++:hh.h


#ifndef _NA_ST7735_P_H_
#define _NA_ST7735_P_H_

#include <Adafruit_GFX.h>

#ifndef NO_ADAFRUIT_NA_ST7735_P_COLOR_COMPATIBILITY
#define BLACK NA_ST7735_P_BLACK     ///< Draw 'off' pixels
#define WHITE NA_ST7735_P_WHITE     ///< Draw 'on' pixels
#define RED NA_ST7735_P_RED         ///< Draw 'on' pixels
//#define INVERSE NA_ST7735_P_INVERSE ///< Invert pixels
#endif
/// fit into the SSD1306_ naming scheme
#define NA_ST7735_P_BLACK 0x0000   ///< Draw 'off' pixels
#define NA_ST7735_P_WHITE 0xffff   ///< Draw 'on' pixels
#define NA_ST7735_P_RED 0b1111100000000000 //red

///< Draw 'on' pixels
//#define NA_ST7735_P_INVERSE 2 ///< Invert pixels


class NA_ST7735_P : public Adafruit_GFX {
  public:

    NA_ST7735_P(uint8_t w, uint8_t h);

    ~NA_ST7735_P(void);

    bool begin(void);
    void display(void);
    void clearDisplay(void);
    void drawPixel(int16_t x, int16_t y, uint16_t color);
    bool getPixel(int16_t x, int16_t y);
    uint8_t *getBuffer(void);

    void GPIO_8BIT(uint8_t s);
    void LCD_Write_CMD(uint8_t ww);
    void LCD_Write_Data(uint8_t ii);
    void TXDT144TF_ST7735S_Init(void);

  protected:

    uint8_t *buffer1; ///< Buffer data used for display buffer. Allocated when
    ///< begin method is called.

    uint8_t *buffer2; ///< Buffer data used for display buffer. Allocated when
    ///< begin method is called.


};

#endif // _NA_ST7735_P_H_


```