二進数点灯パターンによるプログラム例

プログラム例 8-1

#include <Arduino.h> // Arduino.h の読み込み

// ドットマトリクスLEDアノード側ピンの配列
int ledAnodePins[8] = {0, 2, 4, 5, 16, 17, 18, 19};
// ドットマトリクスLEDカソード側ピンの配列
int ledCathodePins[8] = {21, 22, 23, 25, 26, 27, 32, 33};
// 文字Aの点灯パターン
byte ledPatternA[8] = {
  0b00000000,
  0b00001000,
  0b00010100,
  0b00100010,
  0b00100010,
  0b00111110,
  0b00100010,
  0b00100010,
};

/*
 * setup 関数
 */
void setup() {
  /* ここにプログラムの最初に1回だけ実行したい処理を上から順に記述していきます */

  // シリアル通信を115200bpsで開始
  Serial.begin(115200);

  Serial.println("初期設定の開始");

  // 各アノード・カソード端子の設定
  for(int i=0; i<8; i++) {

    // 入出力設定
    pinMode(ledAnodePins[i], OUTPUT);
    pinMode(ledCathodePins[i], OUTPUT);

    // 出力レベル設定(全消灯)
    digitalWrite(ledAnodePins[i], LOW);
    digitalWrite(ledCathodePins[i], HIGH);
  }

  Serial.println("初期設定の完了");
}

/*
 * loop 関数
 */
void loop() {
  /* ここにプログラム中で繰り返し実行したい処理を上から順に記述していきます */

  for(int i=0; i<8; i++) {
    // i行目の列の点灯設定
    for(int j=0; j<8; j++) {
      // j列目にjビット目の値を設定
      digitalWrite(ledAnodePins[j], (ledPatternA[i]>>j)&1);
    }
    // i行目を点灯
    digitalWrite(ledCathodePins[i], LOW);
    // 時間待ち
    delay(1);
    // i行目を消灯
    digitalWrite(ledCathodePins[i], HIGH);
  }
}
Code language: Arduino (arduino)

ドットマトリクスLEDに、点灯パターンで指定した「A」が表示されましたか?


bitRead マクロ

Arduino フレームワークには、ある値の特定のビットが 0 か 1 かを返す「bitRead」というマクロが備わっています。例えば、

(ledPatternA[i]>>j)&1Code language: Arduino (arduino)

のように「ledPatternA[i]」という値の j 番ビット(LSB を 0 番目とする)が 0 か 1 かを得たい場合、

bitRead(ledPatternA[i], j)Code language: Arduino (arduino)

のように最初の引数に対象の値、2 番目の引数にビットを指定します。

この bitRead を使うと、「main.cpp 08」のプログラムは

  // i行目の各列の点灯設定
  for(int j=0; j<8; j++) {
    // j列目にjビット目の値を設定
    digitalWrite(ledAnodePins[j], bitRead(ledPatternA[i], j));
  }
Code language: Arduino (arduino)

のように書けます。

なお,このように引数を取るマクロは「関数形式マクロ」と呼ばれています。

bitReadマクロは、ヘッダファイル Arduino.h の中で

#define bitRead(value,bit) (((value) >> (bit)) & 0x01)Code language: Arduino (arduino)

のように定義されており、値valueのbit番目のビットの値が0か1かを、「右シフト」と「論理積」というビット演算で取得しています。上記の例の場合、マクロの展開後は

(((ledPatternA[i]) >> (j)) & 0x01)Code language: Arduino (arduino)

のようになります。カッコがたくさんあって少しわかりにくいので整理すると

(ledPatternA[i]>>j)&1Code language: Arduino (arduino)

のようになります。

前の記事

ビット演算

次の記事

その他のビット演算