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

あれこれやってますが,どのHPを見ても,二個目,三個目,四個目のMAX7219に指令を出す方々が書いてあ
りませんでした。これまでかと思い,取説を確認してみるとありました。ありました。きちんと表記があるじゃないですか。

  ===二つ目以降のチップを操作する===

 4つのMAX7219をカスケード接続する場合,4番目のチップに書き込みを行うには,希望する
 16ビットワードの後に,3つのno-noコード(16進の0xXX0X表2)送信します。
 LOAD/CSがハイになった時点で,すべてのデバイスにデータがラッチられます。最初の3つのチップ
 は,no-noコマンドを受け取り,4番目のチップが目的のデータを受け取ります。

とありました。これで,もうちょっと先に進めそうです。

また,諸兄のHPを参考にarduino風に書き換えていた,SPIのデータ書き込みのスケッチも動きました。

#define CLK 13
#define DIN 11
#define CS  10

void setup(){
  Serial.begin( 9600 );     // シリアル通信を初期化する。通信速度は9600bps
    pinMode(CLK, OUTPUT );
    pinMode(DIN, OUTPUT );
    pinMode(CS, OUTPUT );
}

void wait(int i){
  volatile int j,k;
  for(j=0;j<i;j++){
    for(k=0;k<55;k++);
  }
}

//****************************************************************
//arduino自作関数
//データ書き込み
//****************************************************************
void LED_MAT_SEND(unsigned char SELECT, unsigned char DATA){
  digitalWrite( CS, HIGH );// Load ON
  wait(2);void 
  digitalWrite( CS, LOW );// Load OF

  for(int i=0;i<8;i++){               // Send Register data
        digitalWrite( CLK, LOW );//CLK OFF
        if(((SELECT << i) & 0b10000000)==0){
          digitalWrite( DIN, LOW );
          Serial.print( '-' );
        }
        else{
          digitalWrite( DIN, HIGH );
          Serial.print( '+' );
        }
      wait(1);
      digitalWrite( CLK, HIGH );//CLK ON
      wait(1);
  }

  for(int i=0;i<8;i++){               // Send LED DATA
      digitalWrite( CLK, LOW );//CLK OFF


      if(((DATA << i) & 0b10000000)==0){
        digitalWrite( DIN, LOW );
        Serial.print( '-' );
      }
      else{
        digitalWrite( DIN, HIGH );
        Serial.print( '+' );
      }
      wait(1);
      digitalWrite( CLK, HIGH );//CLK ON
      wait(1);
    }
    digitalWrite( CS, HIGH );// Load ON
    wait(2);
    digitalWrite( CS, LOW );// Load OFF
    Serial.print( "******" );
}

デバッグ用のSerial.printは残してあります。また,この, digitalWrite( CLK, HIGH );は結構クロックをつかうようなので,一括処理のものに後で変更しようと思います。このスケッチもSPIライブラリーを使うと,別な諸兄の書かれた下記のように6行程度ですんでしまいます。

void maxTransferCMD(uint8_t address, uint8_t value) {
  digitalWrite(CS_PIN, LOW);
  SPI.transfer(address); // Send address.
  SPI.transfer(value); // Send the value.
  digitalWrite(CS_PIN, HIGH); // Finish transfer.
}

今日,取説で見つけた記述をもとに,2個目3個目のMAX7219に書き込めるスケッチも考えてみたいと思います。

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

何年か前に、8×8の小さ目のLCDマトリックスで、PICを使って流れるサインボードのおもちゃを作成しまし
た。ネットサーフィンをしていると、ちょっと大きめの8×8LCDマトリックスがめにとまりましたので、
思わず、いくつかポチってしまいました。

この一つのものと、4連のもの合計3つをアリでぽちりました。

4連のものは、赤と青を購入しました。

この、LCDは、MAX7219というコントロールIC(ドライバー)が使われていて、比較的たやすく、コント
ロールができるようで、arduinoだと、専用のライプラリーもいくつかあるようです。また、このLCDの
面白いのは、横に連結して使えることです。どのくらい連結できるのかわかりませんが、arduinoの設定
の項目には11個の記載がありましたので、もしかして、電源のこと考えないなら、11個ぐらい連結で
きるのかもしれません。

ライブラリーを使えばいいのでしょうが、MAX7219を直接コントロールしたくて、あれこれしらべました。
幸い詳しく書かれている諸兄のHPが見つかりましたので、ここを参考にいろいろやってみます。

いままで、いろんなもののコントロールに、SPI(シリアル通信)を使う記事も見かけましたが、実際は
どんなふうにするのかいまいち理解がおよびませんでしたが、なんとなく理解することができました。
諸兄のHPによれば、下記のようになるそうです。SPIは3本の線でやり取りします。CLK,Cs,DOUTの3本の
線で下記のようにやり取りをします。

 ・Load端子をLowにセット

  -・CLK端子をLowにセット
  +・15ビット目の値をDINにセット
  +・CLK端子をHighにセット ここでシフトレジスタの0ビット目に①の値がセットされます
  +    つまり 00000000 0000000 がMAX7219のシフトレジスタに入ってま
  +・CLK端子をLowにセット
  +・14ビット目の値をDINにセット
  +・CLK端子をHighにセット ここでシフトレジスタがシフトし②が0ビット目に入ります
  -  つまり 00000000 000000①② が入ってます
      これを繰り返して 16ビットすべて送信したら

  LoadをHighにセットします

  この瞬間シフトレジスタの値が 指定されてたレジスタに反映されます。

この流れを、プログラムに組んでやれば、基本的なデータの送信ができます。この送信の手順は、

のデータシートに記載のあるタイミング図をみればいいみたいですが、いままで、この意味がよく分かり
ませんでした。今となって、やっとその意味が分かりました。

このデータ送信も、arduinoだとSPI(シリアル通信)のライブラリーがあるので、簡単にできてしまうよう
なので、ちょっと、びっくりですね。