Arduino Nanoでミニ電光掲示板(8×8マトリクスLED + MAX7219)を作る #7 ミニ電光掲示板編(2)

[1 ソフトウェア インストール編](https://qiita.com/kan-no/items/34b4e54b58a7caae0441)
[2 電子パーツ購入編](https://qiita.com/kan-no/items/b39644aee91322203f3a)
[3 (共通)準備編](https://qiita.com/kan-no/items/63450faddbec89e279a3)
[4 基本編](https://qiita.com/kan-no/items/14d02316267c99084e21)
[5 フルカラーLED編](https://qiita.com/kan-no/items/3e3434dc4b536b5b5c00)
[6 ミニ電光掲示板編(1)](https://qiita.com/kan-no/items/ca3879022235729771e6)
7 ミニ電光掲示板編(2)

---
配線はそのままで、プログラムを下記のものと入れ替えてください。

```c
int dataIn = 2;
int load = 3;
int clock = 4;
int count = 0;
void putByte( byte data ) {
  byte i = 8;
  byte mask;
  while( i > 0 ) {
    mask = 0x01 << ( i - 1 );
    digitalWrite( clock, LOW );
    if( data & mask ){
      digitalWrite( dataIn, HIGH );
    }else{
      digitalWrite( dataIn, LOW );
    }
    digitalWrite( clock, HIGH );
    --i;
  }
}
void maxAll( byte reg, byte col ) {
  int c = 0;
  digitalWrite( load, LOW );
  for( c = 1; c <= 4; c++ ) {
    putByte( reg );
    putByte( col );
  }
  digitalWrite( load, LOW );
  digitalWrite( load,HIGH );
}
void setup() {
  pinMode( dataIn, OUTPUT );
  pinMode( clock,  OUTPUT );
  pinMode( load,   OUTPUT );
  digitalWrite( 13, HIGH );
  maxAll( 0x0b, 0x07 );
  maxAll( 0x09, 0x00 );
  maxAll( 0x0c, 0x01 );
  maxAll( 0x0f, 0x00 );
  for( count = 1; count <= 8; count++ ) {
    maxAll( count,0 );
  }
  maxAll( 0x0a, 0x0f & 0x0f );
}
void loop( ) {
  int wait_time = 300;
  a();
  delay( wait_time );
  b();
  delay( wait_time );
  c();
  delay( wait_time );
  d();
  delay( wait_time );
  e();
  delay( wait_time );
  f();
  delay( wait_time );
  g();
  delay( wait_time );
  h();
  delay( wait_time );
  i();
  delay( wait_time );
  j();
  delay( wait_time );
  k();
  delay( wait_time );
  l();
  delay( wait_time );
  m();
  delay( wait_time );
  n();
  delay( wait_time );
  o();
  delay( wait_time );
  p();
  delay( wait_time );
  q();
  delay( wait_time );
  r();
  delay( wait_time );
  s();
  delay( wait_time );
  t();
  delay( wait_time );
  u();
  delay( wait_time );
  v();
  delay( wait_time );
  w();
  delay( wait_time );
  x();
  delay( wait_time );
  y();
  delay( wait_time );
  z();
  delay( wait_time );
  space();
  delay( wait_time );
  heart();
  delay( wait_time );
  space();
  delay( wait_time );
}

// アルファベット表示
void a(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b00111100 );
  maxAll( 3,0b01000010 );
  maxAll( 4,0b01000010 );
  maxAll( 5,0b01111110 );
  maxAll( 6,0b01000010 );
  maxAll( 7,0b01000010 );
  maxAll( 8,0b00000000 );
}
void b(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01111100 );
  maxAll( 3,0b01000010 );
  maxAll( 4,0b01111100 );
  maxAll( 5,0b01000010 );
  maxAll( 6,0b01000010 );
  maxAll( 7,0b01111100 );
  maxAll( 8,0b00000000 );
}
void c(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b00111100 );
  maxAll( 3,0b01000010 );
  maxAll( 4,0b01000000 );
  maxAll( 5,0b01000000 );
  maxAll( 6,0b01000010 );
  maxAll( 7,0b00111100 );
  maxAll( 8,0b00000000 );
}
void d(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01111100 );
  maxAll( 3,0b01000010 );
  maxAll( 4,0b01000010 );
  maxAll( 5,0b01000010 );
  maxAll( 6,0b01000010 );
  maxAll( 7,0b01111100 );
  maxAll( 8,0b00000000 );
}
void e(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01111110 );
  maxAll( 3,0b01000000 );
  maxAll( 4,0b01111110 );
  maxAll( 5,0b01000000 );
  maxAll( 6,0b01000000 );
  maxAll( 7,0b01111110 );
  maxAll( 8,0b00000000 );
}
void f(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01111110 );
  maxAll( 3,0b01000000 );
  maxAll( 4,0b01111110 );
  maxAll( 5,0b01000000 );
  maxAll( 6,0b01000000 );
  maxAll( 7,0b01000000 );
  maxAll( 8,0b00000000 );
}
void g(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b00111100 );
  maxAll( 3,0b01000010 );
  maxAll( 4,0b01000000 );
  maxAll( 5,0b01001110 );
  maxAll( 6,0b01000010 );
  maxAll( 7,0b00111110 );
  maxAll( 8,0b00000000 );
}
void h(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01000010 );
  maxAll( 3,0b01000010 );
  maxAll( 4,0b01111110 );
  maxAll( 5,0b01000010 );
  maxAll( 6,0b01000010 );
  maxAll( 7,0b01000010 );
  maxAll( 8,0b00000000 );
}
void i(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b00011000 );
  maxAll( 3,0b00011000 );
  maxAll( 4,0b00011000 );
  maxAll( 5,0b00011000 );
  maxAll( 6,0b00011000 );
  maxAll( 7,0b00011000 );
  maxAll( 8,0b00000000 );
}
void j(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b00000010 );
  maxAll( 3,0b00000010 );
  maxAll( 4,0b00000010 );
  maxAll( 5,0b01000010 );
  maxAll( 6,0b01000010 );
  maxAll( 7,0b00111100 );
  maxAll( 8,0b00000000 );
}
void k(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01000010 );
  maxAll( 3,0b01000100 );
  maxAll( 4,0b01111000 );
  maxAll( 5,0b01001000 );
  maxAll( 6,0b01000100 );
  maxAll( 7,0b01000010 );
  maxAll( 8,0b00000000 );
}
void l(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01000000 );
  maxAll( 3,0b01000000 );
  maxAll( 4,0b01000000 );
  maxAll( 5,0b01000000 );
  maxAll( 6,0b01000000 );
  maxAll( 7,0b01111110 );
  maxAll( 8,0b00000000 );
}
void m(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01000010 );
  maxAll( 3,0b01100110 );
  maxAll( 4,0b01011010 );
  maxAll( 5,0b01000010 );
  maxAll( 6,0b01000010 );
  maxAll( 7,0b01000010 );
  maxAll( 8,0b00000000 );
}
void n(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01000010 );
  maxAll( 3,0b01100010 );
  maxAll( 4,0b01010010 );
  maxAll( 5,0b01001010 );
  maxAll( 6,0b01000110 );
  maxAll( 7,0b01000010 );
  maxAll( 8,0b00000000 );
}
void o(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b00111100 );
  maxAll( 3,0b01000010 );
  maxAll( 4,0b01000010 );
  maxAll( 5,0b01000010 );
  maxAll( 6,0b01000010 );
  maxAll( 7,0b00111100 );
  maxAll( 8,0b00000000 );
}
void p(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01111100 );
  maxAll( 3,0b01000010 );
  maxAll( 4,0b01000010 );
  maxAll( 5,0b01111100 );
  maxAll( 6,0b01000000 );
  maxAll( 7,0b01000000 );
  maxAll( 8,0b00000000 );
}
void q(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b00111100 );
  maxAll( 3,0b01000010 );
  maxAll( 4,0b01000010 );
  maxAll( 5,0b01000010 );
  maxAll( 6,0b01000110 );
  maxAll( 7,0b00111110 );
  maxAll( 8,0b00000000 );
}
void r(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01111100 );
  maxAll( 3,0b01000010 );
  maxAll( 4,0b01000010 );
  maxAll( 5,0b01111100 );
  maxAll( 6,0b01001000 );
  maxAll( 7,0b01000110 );
  maxAll( 8,0b00000000 );
}
void s(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b00111100 );
  maxAll( 3,0b01000010 );
  maxAll( 4,0b01110000 );
  maxAll( 5,0b00001110 );
  maxAll( 6,0b01000010 );
  maxAll( 7,0b00111100 );
  maxAll( 8,0b00000000 );
}
void t(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01111110 );
  maxAll( 3,0b00011000 );
  maxAll( 4,0b00011000 );
  maxAll( 5,0b00011000 );
  maxAll( 6,0b00011000 );
  maxAll( 7,0b00011000 );
  maxAll( 8,0b00000000 );
}
void u(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01000010 );
  maxAll( 3,0b01000010 );
  maxAll( 4,0b01000010 );
  maxAll( 5,0b01000010 );
  maxAll( 6,0b01000010 );
  maxAll( 7,0b00111100 );
  maxAll( 8,0b00000000 );
}
void v(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01000010 );
  maxAll( 3,0b01000010 );
  maxAll( 4,0b01000010 );
  maxAll( 5,0b00100100 );
  maxAll( 6,0b00100100 );
  maxAll( 7,0b00011000 );
  maxAll( 8,0b00000000 );
}
void w(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01000010 );
  maxAll( 3,0b01000010 );
  maxAll( 4,0b01000010 );
  maxAll( 5,0b01011010 );
  maxAll( 6,0b01100110 );
  maxAll( 7,0b01000010 );
  maxAll( 8,0b00000000 );
}
void x(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01000010 );
  maxAll( 3,0b00100100 );
  maxAll( 4,0b00011000 );
  maxAll( 5,0b00011000 );
  maxAll( 6,0b00100100 );
  maxAll( 7,0b01000010 );
  maxAll( 8,0b00000000 );
}
void y(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01000010 );
  maxAll( 3,0b00100100 );
  maxAll( 4,0b00011000 );
  maxAll( 5,0b00011000 );
  maxAll( 6,0b00011000 );
  maxAll( 7,0b00011000 );
  maxAll( 8,0b00000000 );
}
void z(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b01111110 );
  maxAll( 3,0b00000100 );
  maxAll( 4,0b00001000 );
  maxAll( 5,0b00010000 );
  maxAll( 6,0b00100000 );
  maxAll( 7,0b01111110 );
  maxAll( 8,0b00000000 );
}

// 空白
void space(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b00000000 );
  maxAll( 3,0b00000000 );
  maxAll( 4,0b00000000 );
  maxAll( 5,0b00000000 );
  maxAll( 6,0b00000000 );
  maxAll( 7,0b00000000 );
  maxAll( 8,0b00000000 );
}

// ハート
void heart(){
  maxAll( 1, 0b00000000 );
  maxAll( 2, 0b01100110 );
  maxAll( 3, 0b10011001 );
  maxAll( 4, 0b10000001 );
  maxAll( 5, 0b01000010 );
  maxAll( 6, 0b00100100 );
  maxAll( 7, 0b00011000 );
  maxAll( 8, 0b00000000 );
}

// マイマーク(自分で好きなマークを作ってみよう)
void mymark(){
  maxAll( 1,0b00000000 );
  maxAll( 2,0b00000000 );
  maxAll( 3,0b00000000 );
  maxAll( 4,0b00000000 );
  maxAll( 5,0b00000000 );
  maxAll( 6,0b00000000 );
  maxAll( 7,0b00000000 );
  maxAll( 8,0b00000000 );
}

// スモール to ラージ
void s_to_l(){
  int wait=20;
  maxAll( 1, 0b00000000 );
  maxAll( 2, 0b00000000 );
  maxAll( 3, 0b00000000 );
  maxAll( 4, 0b00000000 );
  maxAll( 5, 0b00000000 );
  maxAll( 6, 0b00000000 );
  maxAll( 7, 0b00000000 );
  maxAll( 8, 0b00000000 );
  maxAll( 1, 0b00000000 );
  delay( wait*2 );
  maxAll( 1, 0b00000000 );
  maxAll( 2, 0b00000000 );
  maxAll( 3, 0b00000000 );
  maxAll( 4, 0b00010000 );
  maxAll( 5, 0b00001000 );
  maxAll( 6, 0b00000000 );
  maxAll( 7, 0b00000000 );
  maxAll( 8, 0b00000000 );
  maxAll( 1, 0b00000000 );
  delay( wait );
  maxAll( 2, 0b00000000 );
  maxAll( 3, 0b00000000 );
  maxAll( 4, 0b00001000 );
  maxAll( 5, 0b00010000 );
  maxAll( 6, 0b00000000 );
  maxAll( 7, 0b00000000 );
  maxAll( 8, 0b00000000 );
  delay( wait );
  maxAll( 2, 0b00000000 );
  maxAll( 3, 0b00110000 );
  maxAll( 4, 0b00010000 );
  maxAll( 5, 0b00001000 );
  maxAll( 6, 0b00001100 );
  maxAll( 7, 0b00000000 );
  maxAll( 8, 0b00000000 );
  delay( wait );
  maxAll( 2, 0b00000000 );
  maxAll( 3, 0b00000100 );
  maxAll( 4, 0b00000100 );
  maxAll( 5, 0b00000000 );
  maxAll( 6, 0b00100000 );
  maxAll( 7, 0b00100000 );
  maxAll( 8, 0b00000000 );
  delay( wait );
}

// スクロール
void sub_scroll( int wait_time, int clum_nm ) {
int scr_i = 0;
int line_i = 0;
int cnt_i = 0;
int data_int[8];
int keta = 128;
int a;

char sc1[8][100+1]=
{
// 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
  "0000000001111101010000000000001100000000000000000100000000100100000010000000000000000000000000000000",
  "0000000000000001010011000000000010000001111100111111110011111110000011111000000000000000000000000000",
  "0000000011111111000000100010011000010000000100100000010000100100000100001000000000000000000000000000",
  "0000000000001000000000000010000100010000000100100000010000100100001000001000000000000000000000000000",
  "0000000000001000000000000100000000100000000100000000100000100100000000010000000000000000000000000000",
  "0000000000001000000000001000000000100000000100000000100000000100000000010000000000000000000000000000",
  "0000000000001000000000110000000011000000000100000001000000001000000001100000000000000000000000000000",
  "0000000000010000000011000000001100000001111100000110000000110000000010000000000000000000000000000000",
};
  for( scr_i = 0; scr_i < clum_nm; scr_i++ ) {
    for( line_i = 0; line_i < 8; line_i++ ) {
      data_int[line_i] = 0;
      keta=128;
      for( cnt_i = 0; cnt_i < 8; cnt_i++ ) {
        if( sc1[line_i][cnt_i+scr_i] == '0' ) {
          a = 0;
        } else {
          a = 1;
        }
        data_int[line_i] = data_int[line_i] + a * keta;
        keta = keta / 2;
      }
    }
    maxAll( 1,data_int[0] ); 
    maxAll( 2,data_int[1] ); 
    maxAll( 3,data_int[2] ); 
    maxAll( 4,data_int[3] ); 
    maxAll( 5,data_int[4] ); 
    maxAll( 6,data_int[5] ); 
    maxAll( 7,data_int[6] ); 
    maxAll( 8,data_int[7] ); 
    delay( wait_time );
  }
}
```

putByte()、maxAll() に関しましては、下記のページを参考にさせていただきました。
https://playground.arduino.cc/Main/BadPage

A～Zとオマケの文字が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/e81a2144-9a01-3cce-c602-012b7cbf2c48.png)

loop関数の中で、a、b、c … と順に呼ばれて、間に0.3秒の待ち時間を入れています。
loop関数から呼ぶ関数を変えることで、自分の名前を表示することができます。

ここで、例えば私の名前は KANNO (カンノ)なのですが、N が続いているので、そこがイマイチな感じになります。
そこで、s_to_l関数を使ってみましょう。

```c
s_to_l();  k();  delay(wait_time);
s_to_l();  a();  delay(wait_time);
s_to_l();  n();  delay(wait_time);
s_to_l();  n();  delay(wait_time);
s_to_l();  o();  delay(wait_time);
```

見やすいように、s_to_l関数とdelay関数(待ち時間)の関数も1行で書いてみました。
s_to_l はスモール→ラージの略で、文字が大きくなる感じが出ると思います。

続いて、loop関数の中に

```c
sub_scroll( 100, 80 );
```

を追加してみましょう。
「デンシコウサク」の文字が流れると思います。
引数の意味は、sub_scroll( 速度, 列数 ); です。
第一引数を変えるとスピードが変わります。
データは100列作っていますが、80列で切っているので、第二引数は80にしています。
sc1という配列で文字を書いているので、0と1を書き換えると、好きなパターンを流すことができます。
ドットで文字を書くのは難しいと思いますが、「美咲フォント」という少ないドットのフォントを参考にすると良い感じにできると思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198393/5783a834-1007-6dc7-fdf9-3a7d96bf2eb1.png)

ミニ掲示板編は以上で終了です。

---
[先頭へ](https://qiita.com/kan-no/items/34b4e54b58a7caae0441)