MAX7219の使い方 8×8LCD 無ライブラリー (4)

思った位置のドットを点灯する関数を作ってみました。



Void set_dot(int x,int y,int u_num){
  switch (u_num){
    case 1:
        maxTransfer(0,0);
        maxTransfer(0,0);
        maxTransfer(0,0);
        maxTransfer(x,1<<(y-1));
        digitalWrite(CS_PIN, HIGH);
        break;
    case 2:
        maxTransfer(0,0);
        maxTransfer(0,0);
        maxTransfer(x,1<<(y-1));
        maxTransfer(0,0);
        digitalWrite(CS_PIN, HIGH);
        break;
    case 3:
        maxTransfer(0,0);
        maxTransfer(x,1<<(y-1));
        maxTransfer(0,0);
        maxTransfer(0,0);
        digitalWrite(CS_PIN, HIGH);
        break;  
    case 4:
        maxTransfer(x,1<<(y-1));
        maxTransfer(0,0);
        maxTransfer(0,0);
        maxTransfer(0,0);
        digitalWrite(CS_PIN, HIGH);
  }
}

この関数を使って,縦に順次点灯し,終わったら次の行を同じように点灯するスケッチを動かしてみました。

void loop() {
   Clear_Matrix();
  for(int u=1;u<5;u++){
    for(int y=1;y<9;y++){
      for(int x=1;x<9;x++){
        set_dot(x,y,u);
        delay(500);
      }
    }
  }
}}

このスケッチは次の動画のような動作をします。消すためのスケッチはいれてないのですが,縦の列のドット
は保持できるのですが,隣の行に書き込むと前の行のドットは消えてしまいます。これは意識して消している
のではなく,結果として消えてます。
横一列の表示は,8ビットのデータを書き込むこと0で行います。00000001 のデータを書き込むと一番右を
点灯させることができます。2番目を点灯させるために,1 を左に一個だけシフトさせて,00000010 の
データを作り,書き込んでいます。結果,一番右のドットは消灯することになります。

これは意図した動作ではないので,どうした物か考えましたが,結果,操作したドットの状態を記憶し
ないとだめだろうというこで,配列を準備して,操作したドットの情報を保持すれば,することにしま
した。次のスケッチが,メモリーの保持をいれて,ドットの点灯・消灯の選択をできるようにしたもの
です。

uint8_t dot_hoji[5][9];//保持用配列
void set_dot(int y,int x,int u_num,boolean on_off){
  switch (u_num){
    case 1:
        if(on_off){
          bitSet(dot_hoji[1][y],x-1);
        }
        else{
          bitClear(dot_hoji[1][y],x-1);
        }        
        maxTransfer(0,0);
        maxTransfer(0,0);
        maxTransfer(0,0);
        maxTransfer(y,dot_hoji[1][y]);
        digitalWrite(CS_PIN, HIGH);        
        break;
    case 2:
        if(on_off){
          bitSet(dot_hoji[2][y],x-1);
        }
        else{
          bitClear(dot_hoji[2][y],x-1);
        }
        maxTransfer(0,0);
        maxTransfer(0,0);
        maxTransfer(y,dot_hoji[2][y]);
        maxTransfer(0,0);
        digitalWrite(CS_PIN, HIGH);
        break;
    case 3:
        if(on_off){
          bitSet(dot_hoji[3][y],x-1);
        }
        else{
          bitClear(dot_hoji[3][y],x-1);
        }
        maxTransfer(0,0);
        maxTransfer(y,dot_hoji[3][y]);
        maxTransfer(0,0);
        maxTransfer(0,0);
        digitalWrite(CS_PIN, HIGH);
        break;  
    case 4:
        if(on_off){
          bitSet(dot_hoji[4][y],x-1);
        }
        else{
          bitClear(dot_hoji[4][y],x-1);
        }
        maxTransfer(y,dot_hoji[4][y]);
        maxTransfer(0,0);
        maxTransfer(0,0);
        maxTransfer(0,0);
        digitalWrite(CS_PIN, HIGH);
  }


}

このスケッチで,順番に点灯して,最後まで点灯したら,順番に消灯する,スケッチを動かしました。

画像を動かしているスケッチです。

void loop() {
  Clear_Matrix();
  for(int u=1;u<5;u++){
    for(int y=1;y<9;y++){
      for(int x=1;x<9;x++){
        set_dot(x,y,u,1);
        delay(100);
      }
    }
  }
   for(int u=4;u>0;u--){
    for(int y=8;y>0;y--){
      for(int x=8;x>0;x--){
        set_dot(x,y,u,0);
        delay(100);
      }
    }
  }
}

この変更をしているなかで,ちょっとはまりました。正しい記述を忘れていたようで,
二次元配列を次のように記述すると思いこんでました。

    ***[a,b]

正しくは,下記のように

    ***[a][b]

記述するようで,はまりました。頭の衰えが始まってるのかな(笑)と思います。
また,arduino は至れり尽くせりで,ビットのセットもクリアーも

  bitSet(*,*)
  bitClear(*,*)

という命令が準備されています。通常ですと,ビット演算をして,やるところです。