RP2040マイコンでドットマトリックスを制御しようボードのサンプルプログラム③

- ## 商品概要

RP2040マイコンを使って、8x8LED ドットマトリックスを制御して楽しもうというコンセプトです。
RTCも簡単につながるので、時間表示なども楽しんで知的好奇心を満たせれば嬉しいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782127/f2e0aef4-f554-a150-7c22-2be970321d50.png)


- ## サンプルサンプルプログラム内容
作成したデータをスクロールして楽しむプログラムです。

- ## プログラム環境
ArduinoIDE バージョン：2.3.2
RTCライブラリ　version to 2.1.4

- ## ハードウェアの主な仕様
　①マイコン:PR2040-ZERO（RaspberryPiPico系）
　②I2C接続ピン　
　 SDA：GPIO8（GPIO4）
　 SDL：GPI09（GPIO5）
　③RTC　DS1307RTCモジュール
　④Lチカ用LED　：GPIO10
　⑤マトリクスLEDドライバ　HT16K33-28Wまたは互換
　⑥プッシュスイッチ１：GPI011
　 プッシュスイッチ２：GPI012

- ## サンプルプログラム

ちょっと無駄が多そうなプログラムなので、もう少しうまく整理して処理すれば
簡素化できると思います。
動き始めたら、そこから改造で効率よくプログラミングを楽しんでください。
動かないと絶望で進まなくなりますものね。

```c++
//  8x8 dot matrix board program

//  8x8 dot matrix board program

//########## I2C Serial communication settings ############
#include <Wire.h>

//データ格納ファイル設定
#include "led_data.h"

//########## LED 8x8 Matrix Control IC ############
#define Addrs1 (0x70)  //LED制御IC HT16K33　アドレス
#define Addrs2 (0x71)  //LED制御IC HT16K33　アドレス
#define Addrs3 (0x73)  //LED制御IC HT16K33　アドレス

//########## RTC (Real Time Clock) module ##########
#define MEM (0x50)  //EEPROM AT24C02　アドレス　データを保管するIC
#define RTC (0x68)  //DS3231　アドレス 時間を制御するIC

// #######　左回りに90°回転したデータを入れる　######
byte led_d1_rotate[8];
byte led_d2_rotate[8];
byte led_d3_rotate[8];
byte led_d4_rotate[8];
byte led_d5_rotate[8];
byte led_d6_rotate[8];
byte led_d7_rotate[8];
byte led_d8_rotate[8];
byte led_d9_rotate[8];
byte led_d0_rotate[8];
byte led_da_rotate[8];
byte led_dq_rotate[8];

// #######　シフトしたデータを合算したデータ　######
byte DA1P[8];
byte DA2P[8];
byte DA3P[8];
byte DA4P[8];
byte DA5P[8];
byte DA6P[8];
byte DA7P[8];
byte DA8P[8];
byte DA9P[8];
byte DA10P[8];
byte DA11P[8];
byte DA12P[8];

// #######　シフトしたデータを合算したデータ　######
byte dat1p[8];
byte dat2p[8];
byte dat3p[8];
byte dat4p[8];
byte dat5p[8];
byte dat6p[8];
byte dat7p[8];
byte dat8p[8];

// #######　シフト合算して回転させたデータ　######
byte DA1SR[8];
byte DA2SR[8];
byte DA3SR[8];
byte DA4SR[8];
byte DA5SR[8];
byte DA6SR[8];
byte DA7SR[8];
byte DA8SR[8];

// #######　シフトして回転したデータ　######
byte dat1pSR[8];
byte dat2pSR[8];
byte dat3pSR[8];
byte dat4pSR[8];
byte dat5pSR[8];
byte dat6pSR[8];
byte dat7pSR[8];
byte dat8pSR[8];

//**********************HT16K33 Initial setting*******************
void LED_Driver_Setup(byte LD_addrs, byte on_off)
{
  Wire.beginTransmission(LD_addrs);  //
  Wire.write(0x20 | on_off);  //システムオシレータをONにする
  Wire.endTransmission();
}
//**********************ＬＥＤドライバ　HT16K33　点滅周期設定*******************
void LED_Driver_Blink(byte LD_addrs, byte on_off, byte blink_Hz)
{
  //blink_Hz=0 点滅off, 1は2Hz, 2は1Hz, 3は0.5Hz, on_off=0は消灯、1は点灯　
  Wire.beginTransmission(LD_addrs);
  Wire.write(0x80 | (blink_Hz<<1) | on_off); 
  Wire.endTransmission();
}
//**********************ＬＥＤドライバ　HT16K33　明るさ設定*********************
void LED_Driver_Brightness(byte LD_addrs, byte brightness)
{
  Wire.beginTransmission(LD_addrs);
  Wire.write(0xE0 | brightness); // brightness= 0～15
  Wire.endTransmission();
}
//********************** HT16K33　画面初期化*********************
void LED_Driver_DisplayInt(byte LD_addrs)
{
  Wire.beginTransmission(LD_addrs);
  Wire.write(0x00);
  for(int i=0;i<8;i++){  
        Wire.write(0x00);                   //1つ目の8x8LED初期化
        Wire.write(0x00);                   //2つ目の8x8LED初期化
  }
  Wire.endTransmission();
}

//**********************Data send*******************

void  data_send(byte addrs, byte* led_hi, byte* led_lo)
{

int i;
       Wire.beginTransmission(addrs);
        Wire.write(0x00); // 
  for ( i=0; i<8; i++){
        Wire.write(led_hi[i]); // 1
        Wire.write(led_lo[i]); // 2
  }
        Wire.endTransmission();
  
}

//**********************Rotate the Data ******************************
// data_raw は、作成した生のデータを代入する
// data_procは、左回転したデータを格納する
// 例 rotate_cnv(AA, BB) とプログラムを書くと、AAのデータを読み取って、
// 左回転したデータをBBに書き込む処理です。
// ちなみにrawは、英語で「生の」から命名
// procは、processから取った英語で「処理」から命名
void rotate_cnv(byte* data_raw, byte* data_proc)
{
  for(byte i=0; i<8; i++){
    for(byte j=0; j<8; j++){
     bitWrite(data_proc[7-j],i,bitRead(data_raw[i],j));
    }
  }
}


//**********************Shift Data ******************************
//disp_shift 8x8で分割されている表示データを左にずらして8x8のデータに合算している
//データを合算しているのでplusという意味で末尾にpを命名

void disp_shift(byte* dat1, byte* dat2, byte* dat3, byte* dat4, byte* dat5, byte* dat6, byte* dat7, byte* dat8){

int i,j;

for(byte j=0; j<8; j++){
    for(byte i=0; i<8; i++){
      dat1p[i] = (dat1[i] >> j) + (dat3[i] << 8-j);
      dat2p[i] = (dat2[i] >> j) + (dat4[i] << 8-j);
      dat3p[i] = (dat3[i] >> j) + (dat5[i] << 8-j);
      dat4p[i] = (dat4[i] >> j) + (dat6[i] << 8-j);
      dat5p[i] = (dat5[i] >> j) + (dat7[i] << 8-j);
      dat6p[i] = (dat6[i] >> j) + (dat8[i] << 8-j);
    }

  rotate_cnv(dat1p, dat1pSR);  //Shift + Rotate
  rotate_cnv(dat2p, dat2pSR);  //Shift + Rotate
  rotate_cnv(dat3p, dat3pSR);  //Shift + Rotate
  rotate_cnv(dat4p, dat4pSR);  //Shift + Rotate
  rotate_cnv(dat5p, dat5pSR);  //Shift + Rotate
  rotate_cnv(dat6p, dat6pSR);  //Shift + Rotate
  rotate_cnv(dat7p, dat7pSR);  //Shift + Rotate
  rotate_cnv(dat8p, dat8pSR);  //Shift + Rotate

//########## data send command ##########
//########## chip_addres, ch1 data, ch2 data ##########

data_send(Addrs1, dat1pSR, dat2pSR);
data_send(Addrs2, dat3pSR, dat4pSR);
data_send(Addrs3, dat5pSR, dat6pSR);

    delay (90);

}
}

//###############  セットアップ  ####################
void setup() 
{
  Wire.begin(); // initialise the connection
  Wire.setClock(400000L); //I2Cクロック を400kHzにする
  LED_Driver_Setup( Addrs1, 1); //HT16K33システムオシレータ　ＯＮ
  LED_Driver_Blink( Addrs1, 1, 0); //blink_Hz=0 点滅off, 1は2Hz, 2は1Hz, 3は0.5Hz, on_off=0は消灯、1は点灯
  LED_Driver_Brightness( Addrs1, 2 ); // brightness= 0～15
  LED_Driver_DisplayInt( Addrs1 ); //Display Black OUT

  LED_Driver_Setup( Addrs2, 1); //HT16K33システムオシレータ　ＯＮ
  LED_Driver_Blink( Addrs2, 1, 0); //blink_Hz=0 点滅off, 1は2Hz, 2は1Hz, 3は0.5Hz, on_off=0は消灯、1は点灯
  LED_Driver_Brightness( Addrs2, 2 ); // brightness= 0～15
  LED_Driver_DisplayInt( Addrs2 ); //Display Black OUT

  LED_Driver_Setup( Addrs3, 1); //HT16K33システムオシレータ　ＯＮ
  LED_Driver_Blink( Addrs3, 1, 0); //blink_Hz=0 点滅off, 1は2Hz, 2は1Hz, 3は0.5Hz, on_off=0は消灯、1は点灯
  LED_Driver_Brightness( Addrs3, 2 ); // brightness= 0～15
  LED_Driver_DisplayInt( Addrs3 ); //Display Black OUT

// RP2040-ZERO の動作チェック用LED制御用
  pinMode(10, OUTPUT);
  digitalWrite(10,HIGH);
  delay (200);

}

//######################################################
//####################  メインループ  ####################
//######################################################

void loop() {

//----------  変数の宣言　Intはinteger 整数  ----------
int i,j;


//----------  データを左にシフトして表示させる  ----------
//----------  DA0はからデータでスタート時は全消灯から始まる  ----------
disp_shift(PAC0, PAC0, PAC0, PAC0, PAC0, PAC0, PAC1, PAC2  );
  digitalWrite(16,HIGH);
disp_shift(PAC0, PAC0, PAC0, PAC0, PAC1, PAC2, PAC3, PAC4  );
  digitalWrite(16,LOW);
disp_shift(PAC0, PAC0, PAC1, PAC2, PAC3, PAC4, PAC5, PAC6  );
  digitalWrite(16,HIGH);
disp_shift(PAC1, PAC2, PAC3, PAC4, PAC5, PAC6, PAC7, PAC8 );
  digitalWrite(16,LOW);
disp_shift(PAC3, PAC4, PAC5, PAC6, PAC7, PAC8, PAC9, PAC10 );
  digitalWrite(16,HIGH);
disp_shift(PAC5, PAC6, PAC7, PAC8, PAC9, PAC10, PAC11, PAC12 );
  digitalWrite(16,LOW);

disp_shift(PAC7, PAC8, PAC9, PAC10, PAC11, PAC12, MON1, MON2 );
  digitalWrite(16,HIGH);
disp_shift(PAC9, PAC10, PAC11, PAC12, MON1, MON2, MON3, MON4 );
  digitalWrite(16,LOW);
disp_shift(PAC11, PAC12, MON1, MON2, MON3, MON4, MON5, MON6 );
  digitalWrite(16,HIGH);
disp_shift(MON1, MON2, MON3, MON4, MON5, MON6, MON7, MON8 );
  digitalWrite(16,LOW);
disp_shift(MON3, MON4, MON5, MON6, MON7, MON8, MON1, MON2 );
  digitalWrite(16,HIGH);
disp_shift(MON5, MON6, MON7, MON8, MON1, MON2, MON3, MON4 );
  digitalWrite(16,LOW);
disp_shift(MON7, MON8, MON1, MON2, MON3, MON4, MON5, MON6 );
  digitalWrite(16,HIGH);

    delay (100);

}
```

- ## 動作イメージ

メインループで「disp_shift」関数を使って8個のデータを処理します。
8個のデータのイメージは下記になります。
赤枠がドットマトリクスの8x8LEDになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782127/20e3c82c-2926-6a12-5ba7-073043b733f2.png)


1ドット左にシフトするので、不足分を７、８から補うようにするため8個のデータを処理させています。
8ドットシフトしたら続きを設定します。

「disp_shift」関数は、作成したデータを
①回転させる（向きを合わせています。）
②8回シフトする
処理をしています。

「rotate_cnv」関数は、データを回転させて向きを調整しています。

```c++
void rotate_cnv(byte* data_raw, byte* data_proc)
{
  for(byte i=0; i<8; i++){
    for(byte j=0; j<8; j++){
     bitWrite(data_proc[7-j],i,bitRead(data_raw[i],j));
    }
  }
}
```

データシフトは、これで処理しています。
```c++
int i,j;

for(byte j=0; j<8; j++){
    for(byte i=0; i<8; i++){
      dat1p[i] = (dat1[i] >> j) + (dat3[i] << 8-j);
      dat2p[i] = (dat2[i] >> j) + (dat4[i] << 8-j);
      dat3p[i] = (dat3[i] >> j) + (dat5[i] << 8-j);
      dat4p[i] = (dat4[i] >> j) + (dat6[i] << 8-j);
      dat5p[i] = (dat5[i] >> j) + (dat7[i] << 8-j);
      dat6p[i] = (dat6[i] >> j) + (dat8[i] << 8-j);
    }
```

処理したデータをLEDドライバに送信する関数はこちらです。
データを回転させて、シフトしたデータがdat1pSR、dat2pSRですね。


```c++
//########## data send command ##########
//########## chip_addres, ch1 data, ch2 data ##########

data_send(Addrs1, dat1pSR, dat2pSR);
data_send(Addrs2, dat3pSR, dat4pSR);
data_send(Addrs3, dat5pSR, dat6pSR);

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782127/32feb8c1-a06b-fc73-7102-de2553eeeed2.png)

- ## データ led_data.h
データはプログラムから分けています。
データを分けておけば流用も可能ですし、メインプログラムがすっきりすると思うのでお勧めです。

```c++

// led_data.h
#ifndef LED_DATA_H
#define LED_DATA_H

// 自作数字のデータ
// 数字1を表すデータ
byte led_d1[8] = { 0x60, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 };
// 数字2を表すデータ
byte led_d2[8] = { 0x7E, 0x40, 0x40, 0x7E, 0x02, 0x02, 0x02, 0x7E };
// 数字3を表すデータ
byte led_d3[8] = { 0x7E, 0x40, 0x40, 0x7E, 0x40, 0x40, 0x40, 0x7E };
// 数字4を表すデータ
byte led_d4[8] = { 0x42, 0x42, 0x42, 0x42, 0x7E, 0x40, 0x40, 0x40 };
// 数字5を表すデータ
byte led_d5[8] = { 0x7E, 0x02, 0x02, 0x7E, 0x40, 0x40, 0x40, 0x7E };
// 数字6を表すデータ
byte led_d6[8] = { 0x7E, 0x02, 0x02, 0x7E, 0x42, 0x42, 0x42, 0x7E };
// 数字7を表すデータ
byte led_d7[8] = { 0x7E, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 };
// 数字8を表すデータ
byte led_d8[8] = { 0x7E, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x7E };
// 数字9を表すデータ
byte led_d9[8] = { 0x7E, 0x42, 0x42, 0x7E, 0x40, 0x40, 0x40, 0x7E };
// 数字0を表すデータ
byte led_d0[8] = { 0x7E, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7E };
// 特殊文字Aを表すデータ
byte led_da[8] = { 0x20, 0xF0, 0x27, 0xFD, 0x47, 0xFD, 0x57, 0x60 };
// 特殊文字Qを表すデータ
byte led_dq[8] = { 0x18, 0x24, 0x42, 0xBD, 0x48, 0x48, 0x44, 0x24 };

// #######　電脳好奇心のデータ　######

byte DA0[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
//電
byte DA1[8] = { 0xFE, 0x80, 0xFE, 0x82, 0xBA, 0x82, 0xBA, 0x00 };
byte DA2[8] = { 0xFC, 0x84, 0xFC, 0x84, 0xFC, 0x80, 0x80, 0x80 };
byte DA3[8] = { 0x3F, 0x00, 0x3F, 0x20, 0x2E, 0x20, 0x2E, 0x00 };
byte DA4[8] = { 0x1F, 0x10, 0x1F, 0x10, 0x1F, 0x00, 0x20, 0x1F };
//脳
byte DA5[8] = { 0x00, 0x9E, 0x92, 0x12, 0x12, 0x1E, 0x52, 0x52 };
byte DA6[8] = { 0x52, 0x5E, 0x52, 0x52, 0x52, 0x51, 0xD1, 0x4D };
byte DA7[8] = { 0x02, 0x44, 0x44, 0x25, 0x21, 0x10, 0x80, 0x91 };
byte DA8[8] = { 0x92, 0x8C, 0x8C, 0x92, 0xA1, 0x80, 0xFF, 0x80 };
//好
byte DA9[8] = { 0x04, 0x04, 0x44, 0xFF, 0x44, 0x44, 0x42, 0xA2 };
byte DA10[8] = { 0x22, 0x14, 0x08, 0x14, 0x22, 0x21, 0x00, 0x00 };
byte DA11[8] = { 0x00, 0x7F, 0x40, 0x20, 0x20, 0x10, 0x10, 0x7F };
byte DA12[8] = { 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x12, 0x0C };
//奇
byte DA13[8] = { 0x80, 0x80, 0xFC, 0x40, 0x20, 0x18, 0xFE, 0x00 };
byte DA14[8] = { 0xF8, 0x88, 0x88, 0xF8, 0x08, 0x00, 0x00, 0x00 };
byte DA15[8] = { 0x00, 0x00, 0x3F, 0x01, 0x02, 0x0C, 0x7F, 0x10 };
byte DA16[8] = { 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0F };
//心
byte DA17[8] = { 0x00, 0x80, 0x00, 0x00, 0x10, 0x10, 0x12, 0x12 };
byte DA18[8] = { 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x10, 0xE0 };
byte DA19[8] = { 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00 };
byte DA20[8] = { 0x20, 0x20, 0x40, 0x40, 0x00, 0x10, 0x10, 0x0F };
//電
byte DA21[8] = { 0xFE, 0x80, 0xFE, 0x82, 0xBA, 0x82, 0xBA, 0x00 };
byte DA22[8] = { 0xFC, 0x84, 0xFC, 0x84, 0xFC, 0x80, 0x80, 0x80 };
byte DA23[8] = { 0x3F, 0x00, 0x3F, 0x20, 0x2E, 0x20, 0x2E, 0x00 };
byte DA24[8] = { 0x1F, 0x10, 0x1F, 0x10, 0x1F, 0x00, 0x20, 0x1F };
//子
byte DA25[8] = { 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00 };
byte DA26[8] = { 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80 };
byte DA27[8] = { 0x00, 0x00, 0x1F, 0x08, 0x04, 0x03, 0x01, 0x01 };
byte DA28[8] = { 0x7F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
//工
byte DA29[8] = { 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00 };
byte DA30[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE };
byte DA31[8] = { 0x00, 0x00, 0x00, 0x3F, 0x01, 0x01, 0x01, 0x01 };
byte DA32[8] = { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF };
//作
byte DA33[8] = { 0x10, 0x90, 0x48, 0xE4, 0x2C, 0x2A, 0x1A, 0x09 };
byte DA34[8] = { 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 };
byte DA35[8] = { 0x01, 0x00, 0x00, 0x7F, 0x02, 0x02, 0x02, 0x3E };
byte DA36[8] = { 0x02, 0x02, 0x02, 0x3E, 0x02, 0x02, 0x02, 0x02 };
//工
byte DA37[8] = { 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00 };
byte DA38[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE };
byte DA39[8] = { 0x00, 0x00, 0x00, 0x3F, 0x01, 0x01, 0x01, 0x01 };
byte DA40[8] = { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF };
//房      
byte DA41[8] = { 0xF8, 0x00, 0xF8, 0x08, 0xF8, 0x28, 0x48, 0xF8 };
byte DA42[8] = { 0x04, 0x84, 0x84, 0x42, 0x42, 0x22, 0x32, 0x00 };
byte DA43[8] = { 0x3F, 0x00, 0x3F, 0x20, 0x3F, 0x00, 0x00, 0x7F };
byte DA44[8] = { 0x01, 0x1E, 0x20, 0x20, 0x20, 0x20, 0x28, 0x10 };
//インベーダー１
byte DA45[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
byte DA46[8] = { 0x10, 0x24, 0xF4, 0xDC, 0xFC, 0xF8, 0x10, 0x08 };
byte DA47[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
byte DA48[8] = { 0x08, 0x24, 0x2F, 0x3B, 0x3F, 0x0F, 0x08, 0x10 };
//インベーダー2
byte DA49[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
byte DA50[8] = { 0xC0, 0xF8, 0xFC, 0x9C, 0xFC, 0x60, 0xB0, 0x0C };
byte DA51[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
byte DA52[8] = { 0x03, 0x1F, 0x3F, 0x39, 0x3F, 0x06, 0x0D, 0x30 };

// #######　PACMAN　character data　######
byte PAC1[8] = { 0x00, 0x00, 0xC0, 0xF0, 0xF8, 0xF8, 0xFC, 0xFC };
byte PAC2[8] = { 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xC0, 0x00 };
byte PAC3[8] = { 0x00, 0x00, 0x03, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F };
byte PAC4[8] = { 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, 0x0F, 0x03, 0x00 };
byte PAC5[8] = { 0x00, 0x00, 0xC0, 0xF0, 0xF8, 0xF8, 0xE0, 0x00 };
byte PAC6[8] = { 0x00, 0x00, 0xE0, 0xF8, 0xF8, 0xF0, 0xC0, 0x00 };
byte PAC7[8] = { 0x00, 0x00, 0x03, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F };
byte PAC8[8] = { 0x3C, 0x3F, 0x3F, 0x1F, 0x1F, 0x0F, 0x03, 0x00 };
byte PAC9[8] = { 0x00, 0x00, 0xC0, 0xE0, 0xC0, 0x80, 0x00, 0x00 };
byte PAC10[8] = { 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xC0, 0x00 };
byte PAC11[8] = { 0x00, 0x00, 0x03, 0x0F, 0x1F, 0x1F, 0x3F, 0x3E };
byte PAC12[8] = { 0x3C, 0x3E, 0x3F, 0x1F, 0x1F, 0x0F, 0x03, 0x00 };

//##### Monster character data #####
byte MON1[8] = { 0x00, 0xC0, 0xF0, 0xF8, 0xE4, 0xC0, 0xCC, 0xCE };
byte MON2[8] = { 0xE6, 0xFE, 0xFE, 0xFE, 0xFE, 0x76, 0x62, 0x00 };
byte MON3[8] = { 0x00, 0x03, 0x0F, 0x1F, 0x39, 0x30, 0x33, 0x73 };
byte MON4[8] = { 0x79, 0x7F, 0x7F, 0x7F, 0x7F, 0x6E, 0x46, 0x00 };
byte MON5[8] = { 0x00, 0xC0, 0xF0, 0xF8, 0xE4, 0xC0, 0xCC, 0xCE };
byte MON6[8] = { 0xE6, 0xFE, 0xFE, 0xFE, 0xFE, 0xDE, 0x8C, 0x00 };
byte MON7[8] = { 0x00, 0x03, 0x0F, 0x1F, 0x39, 0x30, 0x33, 0x73 };
byte MON8[8] = { 0x79, 0x7F, 0x7F, 0x7F, 0x7F, 0x7B, 0x31, 0x00 };

#endif // LED_DATA_H

```

ヘッダファイルは、スケッチと同じ個所に置くと読み込んでくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782127/05eee381-ecdf-c762-95f5-a4efcc130539.png)