16x16の(カラー)スプライトであそぶ(液晶)(Arduino UNO)(ATM0177B5)(ST7735)


https://qiita.com/caa45040/items/60fcfd9744eab56e2cbb

https://qiita.com/caa45040/items/065923e47a4d2894c4de

https://qiita.com/caa45040/items/ee7cba0ae1a06d2cc6b9

x 過去ログをみよ

メイン処理

```c++

  for (int y = 0; y < 160; y++) {
    for (int x = 0; x < 128; x++) {

いろいろ

    }//for x
  }//for y


```


```c++

      //スプライト1の表示
      a = 0;
      if ( (x + 1) > ux1 && x < (ux1 + 16) && (y + 1) > uy1 && y < (uy1 + 16) ) {
        //相対座標からキャラクターパターンを求める
        a = pgm_read_word_near( Sprite1 + ((y - uy1) * 16) + (x - ux1) );
      }//ux1,uy1
      if (a) { // a != 0
        b = a;
      }//end if


```

![o_coq195.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a3ad3a04-c889-fba9-a31e-c0c091692a1e.jpeg)


![o_coq194.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5237efee-2add-35e6-c683-c53bea08c2ed.jpeg)



```c++



//ssd1306_Sound_Sprite_c16x16_UNO_1


//インクルド
#include <Arduino.h>


//定義
//GPIO
#define GPIO_RESET_P  2 //RESET=1
#define GPIO_RS_P    17 //RS=0 (A3)
#define GPIO_WR_P     3 //WR=1
#define GPIO_RD_P    16 //RD=1 (A2)

//8bitのGPIOの設定
int DBx[8] = {4, 15, 5, 14, 6, 9, 7, 8};

// GPIO A4 I2Cで使用済み
// GPIO A5 I2Cで使用済み

#define GPIO1(s) digitalWrite(GPIO_RESET_P , s)  //RESET
#define GPIO2(s) digitalWrite(GPIO_RS_P    , s)  //A0
#define GPIO3(s) digitalWrite(GPIO_WR_P    , s)  //WR
#define GPIO4(s) digitalWrite(GPIO_RD_P    , s)  //RD

//全体のカラー
int s_color = 0xFFFF; //ハイホワイト


//パラレルポートにデータをセットする。
void GPIO_8BIT(int s)
{

  //8bitのGPIOのセット
  for (int ee = 0; ee < 8; ee++) {
    digitalWrite(DBx[ee], (s >> ee) & 0x01); //DB7
  }//for ee

} //GPIO_8BIT

//コマンドの書き込み
void LCD_Write_CMD(int a)
{
  GPIO2(0); //A0=0;
  GPIO_8BIT(a);//P1=a; data
  GPIO3(0);//WRB=0;
  GPIO3(1);//WRB=1;
} //LCD_Write_CMD


//データ書き込み
void LCD_Write_Data(int a)
{
  GPIO2(1);//A0=1;
  GPIO_8BIT(a);//P1=a; data
  GPIO3(0);//WRB=0;
  GPIO3(1);//WRB=1;
} //LCD_Write_Data


//液晶の初期化処理
void ATM0177B5_ST7735S_Init(void)
{

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

  GPIO1(1);//LCD_RESET=1;

  delay(1); //Delay 1ms

  GPIO1(0);//LCD_RESET=0;

  delay(1); //Delay 1ms

  GPIO1(1);//LCD_RESET=1;

  delay(120); //Delay 120ms

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


  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(0x3a);//Interface pixel format
  LCD_Write_Data(0x05);//16bit mode
  delay(100);

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

  //画面の書き込み開始
  //LCD_Write_CMD(0x2C); //memory write
  //GPIO2(1);//A0=1;
  //delay(2);

} //ATM0177B5_ST7735S_Init


//全体のカラーの変更
void set_color(int color) {

  s_color = color;

}//set_color


void Dot(int x, int y, int co) {

  GPIO_8BIT( (co >> 8) & 0xff );

  GPIO3(0);//WRB=0;
  GPIO3(1);//WRB=1;

  GPIO_8BIT( co & 0xff );

  GPIO3(0);//WRB=0;
  GPIO3(1);//WRB=1;

}


//スプライトの定義
const int Sprite1[] PROGMEM = {

  //  1      2      3      4     5      6      7       8      1      2      3     4      5      6      7      8

  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x7BEF, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0xFFFF, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000,
  0x7BEF, 0x7BEF, 0x7BEF, 0x0000, 0x7BEF, 0x0000, 0x7BEF, 0x0000, 0x7BEF, 0x0000, 0x7BEF, 0x0000, 0x0000, 0x7BEF, 0x7BEF, 0x7BEF,
  0x0000, 0x0000, 0xE71C, 0xD69A, 0x0000, 0xD69A, 0xD69A, 0xD69A, 0xC618, 0xC618, 0xC618, 0x0000, 0xC618, 0xC618, 0xC618, 0x0000,
  0x0000, 0x0000, 0x0000, 0x738E, 0x738E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x738E, 0x738E, 0xC618, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0xE71C, 0xE71C, 0xD69A, 0xD69A, 0x738E, 0x738E, 0x738E, 0x738E, 0x738E, 0xC618, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000, 0x738E, 0x738E, 0x738E, 0x738E, 0x738E, 0x738E, 0xC618, 0xC618, 0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

  //  1      2      3      4     5      6      7       8      1      2      3     4      5      6      7      8

  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001C, 0x001C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x0000, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x0000, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x001C, 0x001C, 0x001C, 0x4208, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001C, 0x001C, 0x001C, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x001C, 0x001C, 0x4208, 0x4208, 0x4208, 0xFFFF, 0xFFFF, 0x4208, 0x4208, 0x001C, 0x001C, 0x0000, 0x0000,
  0x0000, 0x0000, 0x001C, 0x001C, 0x001C, 0x4208, 0x4208, 0x4208, 0xFFFF, 0x4208, 0x4208, 0x4208, 0x001C, 0x001C, 0x0000, 0x0000,
  0x0000, 0x0000, 0x001C, 0x001C, 0x001C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFE0, 0xFFFF, 0xFFFF, 0xFFFF, 0x001C, 0x001C, 0x0000, 0x0000,
  0x0000, 0xFFFF, 0x001C, 0x001C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFE0, 0xFFE0, 0xFFE0, 0xFFFF, 0xFFFF, 0x001C, 0x001C, 0xFFFF, 0x0000,
  0xFFFF, 0xFFFF, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0xFFE0, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0xFFFF, 0xFFFF,
  0xFFFF, 0xFFFF, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x0000, 0xFFFF,
  0x0000, 0x0000, 0x001C, 0x001C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001C, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x001C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001C, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x001F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001C, 0x001C, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x001F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x001C, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x001C, 0xFFE0, 0xFFE0, 0xFFE0, 0x001F, 0x001F, 0xFFE0, 0xFFE0, 0xFFE0, 0x001C, 0x0000, 0x0000, 0x0000,
  0x0000, 0x0000, 0x0000, 0x001C, 0xFFE0, 0xFFE0, 0xFFE0, 0x001F, 0x001F, 0xFFE0, 0xFFE0, 0xFFE0, 0x001C, 0x0000, 0x0000, 0x0000,

};

int ux1 = 16; int uy1 = 16;
int ux2 = 0; int uy2 = 0;

//パターンRAMの内容を液晶に転送
void Sound_Oscilloscope(int L1) {


  //画面の書き込み開始
  LCD_Write_CMD(0x2C); //memory write
  GPIO2(1);//A0=1;
  delay(2);

  int a;
  int b;
  for (int y = 0; y < 160; y++) {
    for (int x = 0; x < 128; x++) {
      b = 0;


      //スプライト2の表示
      a = 0;
      if ( (x + 1) > ux2 && x < (ux2 + 16) && (y + 1) > uy2 && y < (uy2 + 16) ) {
        //相対座標からキャラクターパターンを求める
        a = pgm_read_word_near( Sprite1 + ((y - uy2) * 16) + (x - ux2) + (16 * 16) );
      }//ux1,uy1
      if (a) { // a != 0
        b = a;
      }//end if



      //スプライト1の表示
      a = 0;
      if ( (x + 1) > ux1 && x < (ux1 + 16) && (y + 1) > uy1 && y < (uy1 + 16) ) {
        //相対座標からキャラクターパターンを求める
        a = pgm_read_word_near( Sprite1 + ((y - uy1) * 16) + (x - ux1) );
      }//ux1,uy1
      if (a) { // a != 0
        b = a;
      }//end if



      //ドットのポイントをうつ
      Dot(x, y, b);

    }//for x
  }//for y


}//Sound_Oscilloscope


//初期化
void setup() {

  //ポートのモード設定
  //アウトプットモード
  pinMode(GPIO_RESET_P, OUTPUT); //REST
  pinMode(GPIO_RS_P,    OUTPUT); //RS
  pinMode(GPIO_WR_P,    OUTPUT); //WR
  pinMode(GPIO_RD_P,    OUTPUT); //RD

  //8bit分OUTPUTにする
  for (int ee = 0; ee < 8; ee++) {
    pinMode(DBx[ee], OUTPUT);
  }//for ee

  //ポートの初期化
  GPIO4(1);//RD=1
  GPIO3(0);//WR=0
  GPIO2(0);//RS=0
  GPIO1(1);//RESET=1

  delay(500); //0.5秒待つ

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

} //setup


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

  static int L1 = 0;

  L1 = L1 + ( random(16) - 8 );

  //L1 = 64;

  if ( L1 < 0 ) {
    L1 = 0;
  } else if ( L1 > 127 ) {
    L1 = 127;
  }

  Sound_Oscilloscope(L1); //画面の再表示

  //delay(1000); //1秒待つ debug

} //loop


```