目的
カラー液晶で遊ぶ
なぜか連続100KB失敗したので
50KBと50KBにわけた
COLORのHとL
TFT_CS 14
TFT_RST 15
TFT_DC 32
CLK-18
MOSI-23
OLED_SSD1306_BITMAP_DV67_color_SPI_89_UNO
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
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
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_