P_20150523_174746

シフトレジスタ(74HC595)2個を使って5×7ドットマトリクスLEDの表示を行ないました。マイコンからの配線が3本で済むのが利点です。74595のQ7Sという端子を次の素子の入力につなぐことで(図の短い黄色線)データを次々に押し出していくことができますので、8bit以上のパラ出力も可能です。

5x7_LED_ブレッドボード

使用したLEDはMOA20UB019GJという型番のものです。列側が電源、行側がグランドになりますのでそのように出力します。列側の5本に抵抗をいれていますので、明るさがムラにならないように行ごとに出力します。8行めのデータはダミーです。シフトレジスタが8桁なのでそれに合わせています。最初のkのforループで生成したデータは次のforループのときに押し出されて後段の74HC595に入っていきます。

const int latchPin = 3;
const int clockPin = 4;
const int dataPin = 2;

void setup() {
  // put your setup code here, to run once:
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  byte rowData[8] = {16,8,4,6,5,4,4,0};
  shift_Out(rowData);
}

void shift_Out(byte rowData[]) {
  int i,j,k=0;
  
  //行ごとに出力する
  for(i=0; i<7; i++){  //row 0-6
    byte row = (1<<i);
    digitalWrite(clockPin, LOW);
    digitalWrite(dataPin, LOW);
    digitalWrite(latchPin, LOW);
  
    // i行(横)のデータ(5dots)
    for(k=7; k>=0; k--) {
      digitalWrite(clockPin, LOW);
      if(rowData[i] & (1<<k)) digitalWrite(dataPin, HIGH);
      else digitalWrite(dataPin, LOW);
      digitalWrite(clockPin, HIGH);
      digitalWrite(dataPin, LOW);
    }
    //列のデータ(7dots)
    //どの行を出力するかを選ぶ
    for(k=7; k>=0; k--) {
      digitalWrite(clockPin, LOW);
      if(row & (1<<k)) digitalWrite(dataPin, LOW);
      else digitalWrite(dataPin, HIGH);
      digitalWrite(clockPin, HIGH);
      digitalWrite(dataPin, LOW);
    }
    
    digitalWrite(clockPin, LOW);
    digitalWrite(latchPin, HIGH);
  }
}