秋月のst7789(spi)のカラー化成功(STM32G071)(60ライン)(仮想VRAM方式)

x カラー液晶は、 ST7789 ST7789V2 ATM0130B3 の事

秋月のst7789(spi)のカラー化成功(STM32G071)(60ライン)


目的
カラー化する
仮想VRAMの問題でなかなか進まなかったが
16ビットカラー化成功


●結果


![o_cop716.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5850af02-645a-36d7-67a6-879cd2002c63.jpeg)


●プログラム

OLED_SSD1306_BITMAP_DV67_color_SPI_UNO


```c++:main.cpp



//OLED_SSD1306_BITMAP_DV67_color_SPI_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 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() {

  //ディスプレイの初期化
  display.begin();


  //表示方向
  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("H-SPI");

/*

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

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

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

}//setup


//メインループ
void loop() {
}//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_RESET(y)  GPIO_D9(y) //RESET=1




//1バイト送る
//#define GPIO_8BIT(s) SPI.transfer(s)




//1バイト送る
//#define GPIO_8BIT(s) SPI.transfer(s)


void NA_ST7735_P::GPIO_8BIT(uint8_t s)
{
  SPI.transfer(s);

/*
      digitalWrite(13,0);
  digitalWrite(11, (s >> 7) & 0x01);
      digitalWrite(13,0);
      digitalWrite(13,1);
      digitalWrite(13,0);
  digitalWrite(11, (s >> 6) & 0x01);
      digitalWrite(13,0);
      digitalWrite(13,1);
      digitalWrite(13,0);
  digitalWrite(11, (s >> 5) & 0x01);
      digitalWrite(13,0);
      digitalWrite(13,1);
      digitalWrite(13,0);
  digitalWrite(11, (s >> 4) & 0x01);
      digitalWrite(13,0);
      digitalWrite(13,1);
      digitalWrite(13,0);
  digitalWrite(11, (s >> 3) & 0x01);
      digitalWrite(13,0);
      digitalWrite(13,1);
      digitalWrite(13,0);
  digitalWrite(11, (s >> 2) & 0x01);
      digitalWrite(13,0);
      digitalWrite(13,1);
      digitalWrite(13,0);
  digitalWrite(11, (s >> 1) & 0x01);
      digitalWrite(13,0);
      digitalWrite(13,1);
      digitalWrite(13,0);
  digitalWrite(11, s & 0x01);
      digitalWrite(13,0);
      digitalWrite(13,1);
      digitalWrite(13,0);
*/

} //GPIO_8BIT

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

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

} //LCD_Write_CMD


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

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

} //LCD_Write_Data


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

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

//  GPIO_RESET(1);//LCD_RESET=1;
GPIO_D9(1);

  delay(1); //Delay 1ms

//  GPIO_RESET(0);//LCD_RESET=0;
GPIO_D9(0);

  delay(1); //Delay 1ms

//  GPIO_RESET(1);//LCD_RESET=1;
GPIO_D9(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);


//while(1){} //debug


} //TXDT144TF_ST7735S_Init



NA_ST7735_P::NA_ST7735_P(uint8_t w, uint8_t h)
    : Adafruit_GFX(w, h), buffer(NULL)

{
}


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



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

  if ((!buffer) && !(buffer = (uint16_t *)malloc(WIDTH * HEIGHT * 2)   ))
    return false;

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

  //ポートのモード設定
  //アウトプットモード
  //pinMode(13, OUTPUT);
  //pinMode(12, OUTPUT); //未使用
  //pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, 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_D13(1);//SPI_DATA=1
  //GPIO_D11(0);//SPI_CLK=1

  GPIO_D10(1);//CS=1
  GPIO_D9(1);//RESET=1
  GPIO_D8(0);//RS=0

  delay(500); //0.5秒待つ

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

  //画面の書き込み開始
  //display();

  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

    //ドットのカラーの設定
    buffer[ y_shift[y] + x ] = color;

  }//if
}//drawPixel

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




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 (buffer[ y_shift[y] + x ] );
  }
  return false; // Pixel out of bounds
}



uint16_t *NA_ST7735_P::getBuffer(void) { return buffer; }



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

//buffer = (uint16_t*)yu; //とりま 仮想VRAMに実態を設定


//  uint16_t count = WIDTH * ((HEIGHT + 7) / 8);
//  uint16_t *ptr = buffer;

//    while (count--) {
//
//      //WIRE_WRITE(*ptr++);
//    }

//どつかから拾ってきたint を　文字列　にするアルゴリズム
//int a=0x01234567;
//char s[4];
//int *p;
//p=(int*)s;
//*p=a;


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


  char vg[2];
  uint16_t *ptr;  //ポインター型
  ptr = (uint16_t*)vg; //ポインターに実態の文字列を強制型変換して入れる

  for (int i = 0; i < (HEIGHT * WIDTH); i++) {
 
      *ptr=buffer[i]; //ptr と　vg は、ポインタでリンクしている
//---------------- 1バイト目


          LCD_Write_Data(vg[1]);



//---------------- 2バイト目


          LCD_Write_Data(vg[0]);


  }//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);
  uint16_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:


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


int y_shift[240]={
0,240,480,720,960,1200,1440,1680,1920,2160,
2400,2640,2880,3120,3360,3600,3840,4080,4320,4560,
4800,5040,5280,5520,5760,6000,6240,6480,6720,6960,
7200,7440,7680,7920,8160,8400,8640,8880,9120,9360,
9600,9840,10080,10320,10560,10800,11040,11280,11520,11760,
12000,12240,12480,12720,12960,13200,13440,13680,13920,14160,
14400,14640,14880,15120,15360,15600,15840,16080,16320,16560,
16800,17040,17280,17520,17760,18000,18240,18480,18720,18960,
19200,19440,19680,19920,20160,20400,20640,20880,21120,21360,
21600,21840,22080,22320,22560,22800,23040,23280,23520,23760,
24000,24240,24480,24720,24960,25200,25440,25680,25920,26160,
26400,26640,26880,27120,27360,27600,27840,28080,28320,28560,
28800,29040,29280,29520,29760,30000,30240,30480,30720,30960,
31200,31440,31680,31920,32160,32400,32640,32880,33120,33360,
33600,33840,34080,34320,34560,34800,35040,35280,35520,35760,
36000,36240,36480,36720,36960,37200,37440,37680,37920,38160,
38400,38640,38880,39120,39360,39600,39840,40080,40320,40560,
40800,41040,41280,41520,41760,42000,42240,42480,42720,42960,
43200,43440,43680,43920,44160,44400,44640,44880,45120,45360,
45600,45840,46080,46320,46560,46800,47040,47280,47520,47760,
48000,48240,48480,48720,48960,49200,49440,49680,49920,50160,
50400,50640,50880,51120,51360,51600,51840,52080,52320,52560,
52800,53040,53280,53520,53760,54000,54240,54480,54720,54960,
55200,55440,55680,55920,56160,56400,56640,56880,57120,57360
};





};

#endif // _NA_ST7735_P_H_


```