SSブログ

手っ取り早くマトリックスLEDを使う その2 [Arduino]

前回のスケッチだと、マトリックスLEDに何か表示することが目的となっており他の処理がしづらい状態でした。
表示自体は割り込みを使って、CPUを解放してみました。

// Arduino Pro Miniで手っ取り早くマトリックスLEDを使うスケッチ (Arduino Pro Mini専用)
//   (SZ420788K: 8x8, 0.8inch, カソードコモン)
//   timer2使用
const uint8_t MATRIX_ROW[] = {  2,  7, 17,  5, 10, 16, 11, 14 };  // 行 → デジタルピン番号
const uint8_t MATRIX_COL[] = {  9,  8,  4, 15,  3, 13, 12,  6 };  // 列 → デジタルピン番号 (左からMSB -> LSB)
uint8_t *MATRIX_IMAGE;        // イメージのポインタ

uint8_t face_smile[] = {      // にこにこ
  B00111100,
  B01000010,
  B10100101,
  B10000001,
  B10100101,
  B10011001,
  B01000010,
  B00111100 };

uint8_t face_angry[] = {      // ぷんぷん
  B00111100,
  B01000010,
  B10100101,
  B10000001,
  B10011001,
  B10100101,
  B01000010,
  B00111100 };
  
void setup() {
  for( int i = 2; i <= 17; i++ ) pinMode( i, OUTPUT );
  TCCR2A = B00000000;         // Timer2 (8bit) のオーバーフローで割り込む。ちらつきがない分周比は
  TCCR2B = B00000010;         // dot毎なら010(8分周まで),line毎なら101(128分周まで)くらい。
  TIMSK2 = B00000001;         // TOIE2 (オーバーフロー割り込み許可)
}

void loop() {
  MATRIX_IMAGE = face_smile;
  delay(1000);
  MATRIX_IMAGE = face_angry;
  delay(1000);
}

ISR( TIMER2_OVF_vect ) {
  static uint8_t row, col;
  digitalWrite( MATRIX_COL[ col ], LOW  );
  if( ++col == 8 ) {
    col = 0;
    digitalWrite( MATRIX_ROW[ row ], HIGH );
    row = ( row + 1 ) % 8;
    digitalWrite( MATRIX_ROW[ row ], LOW  );
  }
  digitalWrite( MATRIX_COL[ col ], ( MATRIX_IMAGE[ row ] >> col ) & 1 );
}

交互に顔が変わります。
matrix_angry.jpg
loop() 関数内は、Lチカみたいな感じかな?


Arduino Pro Mini 328 5V 16MHz

Arduino Pro Mini 328 5V 16MHz

  • 出版社/メーカー: スイッチサイエンス
  • メディア: エレクトロニクス


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。