0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

秋月のst7789(spi)の白黒(STM32F767)(約SRAM8KB)(小マイコン向き)

Last updated at Posted at 2023-11-01

x カラー液晶は、 ST7789 ST7789V2 ATM0130B3 の事
秋月のst7789(spi)の白黒(STM32F767)(約SRAM8KB)(小マイコン向き)

目的
カラーだとメモリーの消費量が大きいので
白黒にしてみた。

いろいろ
今の使い方だと
ぶっちゃけ、それほどカラーの必要性がない
なぜなら、単純に数字だけを表示できれば
いいから。
767は、小マイコンじゃないけど、
繋ぎ変えるのが面倒だったから!!

o_cop732.jpg

OLED_SSD1306_BITMAP_DV67_monotone_SPI_89_UNO

main.cpp



//OLED_SSD1306_BITMAP_DV67_monotone_SPI_89_UNO


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

//定義
#define SCREEN_WIDTH 240 // OLED display width, in pixels
#define SCREEN_HEIGHT 240 // OLED display height, in pixels
NA_ST7735_P display(SCREEN_WIDTH, SCREEN_HEIGHT);


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

{

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

0b01111110,
0b01111110,
0b00111100,
0b00011000

};


//初期化
void setup() {

  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin();

}//setup


//メインループ
void loop() {

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

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



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


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

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

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

  delay(1000); //1秒待つ

}//loop





hh.cpp

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




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_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 = (uint8_t *)malloc(WIDTH * ((HEIGHT + 7) / 8))))
    return false;

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

  //ポートのモード設定
  //アウトプットモード
  //pinMode(13, OUTPUT);
  //pinMode(12, OUTPUT); //未使用
  //pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);


//spi start

  //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);

//spi

  //ポートの初期化
  //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;
    }
    switch (color) {
    case NA_ST7735_P_WHITE:
      buffer[(x/8) +    (y * 30)  ] |=  (1 << (7-(x & 7)));
      break;
    case NA_ST7735_P_BLACK:
      buffer[(x/8) +    (y * 30)  ] &= ~(1 << (7-(x & 7)));
      break;
    case NA_ST7735_P_INVERSE:
      buffer[(x/8) +    (y * 30)  ] ^=  (1 << (7-(x & 7)));
      break;
    }
  }
}


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


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[x + (y / 8) * WIDTH] & (1 << (y & 7)));
  }
  return false; // Pixel out of bounds
}


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


void NA_ST7735_P::display(void) {

  uint8_t *ptr = buffer;

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

    GPIO_D8(1); //A0=1; 9

  int jjk=0,vg=0;
  int hp[8]={0x80,0x40,0x20,0x10,  0x08,0x04,0x02,0x01};
  for (int i = 0; i < HEIGHT; i++) {
    for (int j = 0; j < (WIDTH/8); j++) {

      vg=ptr[jjk];
      for(int k=0;k < 8;k++){
        if ( ( vg & hp[k]) == 0 ) {
          GPIO_D10(0);//CS=0; 12
            GPIO_8BIT(0x00);//P1=a; data SPI SPI
          GPIO_D10(1);//CS=1; 12
          GPIO_D10(0);//CS=0; 12
            GPIO_8BIT(0x00);//P1=a; data SPI SPI
          GPIO_D10(1);//CS=1; 12

        } else {
          GPIO_D10(0);//CS=0; 12
            GPIO_8BIT(0xff);//P1=a; data SPI SPI
          GPIO_D10(1);//CS=1; 12
          GPIO_D10(0);//CS=0; 12
            GPIO_8BIT(0xff);//P1=a; data SPI SPI
          GPIO_D10(1);//CS=1; 12
        }//end if
          
      }//k
      jjk++;

    } //j
  }//i

}//display



hh.h

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 INVERSE NA_ST7735_P_INVERSE ///< Invert pixels
#endif
/// fit into the SSD1306_ naming scheme
#define NA_ST7735_P_BLACK 0   ///< Draw 'off' pixels
#define NA_ST7735_P_WHITE 1   ///< 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 *buffer; ///< Buffer data used for display buffer. Allocated when
                   ///< begin method is called.

};

#endif // _NA_ST7735_P_H_





0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?