// // LEDマトリクスにパターンを表示するプログラム // // タイマー割込みを使用する #include // LEDマトリクスのピン割当て:ROW側がカソード、COLOMN側がアノードの8x8マトリックスLED int ANODEPIN[] = { 10, 11, 12, 14, 15, 16, 17, 18 }; int CATHODEPIN[] ={ 2, 3, 4, 5, 6, 7, 8, 9 }; int testPatternF[8][8] = { 0,1,1,1, 1,1,1,0, 0,1,1,1, 1,1,1,0, 0,1,1,0, 0,0,0,0, 0,1,1,0, 0,0,0,0, 0,1,1,1, 1,1,0,0, 0,1,1,1, 1,1,0,0, 0,1,1,0, 0,0,0,0, 0,1,1,0, 0,0,0,0}; int testPatternM[8][8] = { 1,1,0,0, 0,0,1,1, 1,1,1,0, 0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,0,1, 1,0,1,1, 1,1,0,0, 0,0,1,1, 1,1,0,0, 0,0,1,1, 1,1,0,0, 0,0,1,1,}; int testPatternS[8][8] = { 0,1,1,1, 1,1,1,0, 1,1,1,1, 1,1,1,1, 0,1,1,0, 0,0,1,1, 0,0,1,1, 1,0,0,0, 0,0,0,1, 1,1,0,0, 1,1,0,0, 0,1,1,0, 1,1,1,1, 1,1,1,1, 0,1,1,1, 1,1,1,0}; int matrix[8][8]; // LEDマトリクスの各点の状態を保持する配列(1:ON、0:OFF) int displayRow; // 現在表示中のrow int pat = 0; // メインプログラムで指定するパターン番号 void setup() { initMatrix(); } void loop() { if(pat == 0) { setPattern(testPatternF); } else if(pat == 1) { setPattern(testPatternM); } else { setPattern(testPatternS); } pat++; pat = pat%3; delay(1000); } //--------------------------------------------------------- // LEDマトリクスを制御する関数 //--------------------------------------------------------- // // LEDマトリクスを初期化する // (1) Arduino の出力ピンの初期化 // (2) 各LEDの状態を保持する配列の初期化 // (3) LEDを表示するタイマ割込みの設定 // void initMatrix() { // 出力を初期化、アノードHIGH、カソードLOWで点灯、その逆に設定する // アノードを、LOWで初期化(coulmn方向) for( int ano = 0; ano < 8; ano++ ) { pinMode( ANODEPIN[ano], OUTPUT ); digitalWrite( ANODEPIN[ano], LOW ); } // カソードを、HIGHで初期化(rowに対応) for( int cat = 0; cat < 8; cat++ ) { pinMode( CATHODEPIN[cat], OUTPUT ); digitalWrite( CATHODEPIN[cat], HIGH ); } clearMatrix(); // 状態を保持する配列をOFFで初期化 startMatrix(); // LEDマトリクスの表示を開始(表示行を0に設定して、タイマ割込みを開始) } // // LEDマトリクスの表示を更新(表示行 ) // displayRow で示される1行分を表示 // startMatrix()が呼ばれた後、タイマ割込みにより1ms毎に呼ばれる // つまり、8msで全ての行を表示する // void updateMatrix() { if(displayRow >= 0) { digitalWrite( CATHODEPIN[displayRow], HIGH ); // 1つ前のROWをHIGHに変更(消す) } displayRow++; displayRow = displayRow%8; // コラム方向(アノード方向)の出力を順にセット for(int column = 0; column<8; column++) { if(matrix[displayRow][column] == 1) { digitalWrite( ANODEPIN[column], HIGH ); // HIGHに変更 } else { digitalWrite( ANODEPIN[column], LOW ); // LOWに戻す } } // LOWに戻す(点灯;次のタイマー割込みまで、その状態で表示) digitalWrite( CATHODEPIN[displayRow], LOW ); } // // LEDマトリクスの表示を開始(表示行displayRowを0に設定して、タイマ割込みを開始) // void startMatrix(){ displayRow = -1; MsTimer2::set(1, updateMatrix);// 1ms毎に割込みを発生させ updateMatrix を呼び出す MsTimer2::start(); } // // LEDマトリクスの状態を保持する配列を変更する // void clearMatrix(): 全て0に設定 // void setPoint(int x, int y): (x,y)を1(ON)に設定 // void resetPoint(int x, int y): (x,y)を0(OFF)に設定 // void setPattern(int _pattern[8][8]): _patternに設定されたパターンを設定 void clearMatrix() { for(int row = 0; row<8; row++) { for(int column = 0; column<8; column++) { matrix[row][column] = 0; } } } void setPoint(int _row, int _column) { matrix[_row][_column] = 1; } void resetPoint(int _row, int _column) { matrix[_row][_column] = 0; } void setPattern(int _pattern[8][8]) { for(int row = 0; row<8; row++) { for(int column = 0; column<8; column++) { matrix[row][column] = _pattern[row][column]; } } }