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