// 定数の定義
#define DATAPIN 2
#define CSPIN 3
#define CLKPIN 4
// 文字パターン設定
byte pattern[8][8]={
{0B00111000,0B01000100,0B10000010,0B10000010,0B11111110,0B10000010,0B10000010,0B00000000}, // A
{0B00000000,0B00000000,0B10011100,0B10100000,0B11000000,0B10000000,0B10000000,0B00000000}, // r
{0B00000100,0B00000100,0B00000100,0B00111100,0B01000100,0B01000100,0B00111100,0B00000000}, // d
{0B00000000,0B00000000,0B10000100,0B10000100,0B10000100,0B10001100,0B01110100,0B00000000}, // u
{0B00001000,0B00000000,0B00011000,0B00001000,0B00001000,0B00001000,0B00011100,0B00000000}, // i
{0B00000000,0B00000000,0B10111000,0B11000100,0B10000100,0B10000100,0B10000100,0B00000000}, // n
{0B00000000,0B00000000,0B01111000,0B10000100,0B10000100,0B10000100,0B01111000,0B00000000}, // o
{0B00000000,0B00000000,0B00000000,0B00000000,0B00000000,0B00000000,0B00000000,0B00000000} // 空白
};
// 16ビットのデータをSPI送信
void sendSPIData(uint16_t data){
byte highByte=data>>8, lowByte=data&0xFF;
digitalWrite(CSPIN, LOW); // CSはLOWの時セレクト
shiftOut(DATAPIN, CLKPIN, MSBFIRST, highByte); // データをシリアル送信
shiftOut(DATAPIN, CLKPIN, MSBFIRST, lowByte); // (MAX7219は上位ビットを先に受信するのでMSBFIRSTを指定)
digitalWrite(CSPIN, HIGH); // CSをHIGHに戻しておく
}
// 行digに値:dataをセットする
void setDigitData(byte dig, byte data){
uint16_t sendData = (dig+1)*256|data;
sendSPIData(sendData);
}
void setup() {
// 関係する端子を出力にセット
pinMode(DATAPIN, OUTPUT);
pinMode(CLKPIN, OUTPUT);
pinMode(CSPIN, OUTPUT);
// とりあえずCSは非選択にセット
digitalWrite(CSPIN, HIGH);
// 各レジスタに初期値をセット
sendSPIData(0x0F00); // ディスプレイテスト;normal operation
sendSPIData(0x0900); // デコードモード:no decode
sendSPIData(0x0A0F); // 輝度最大
sendSPIData(0x0B07); // 全桁使用
// 点灯データクリア
for(int i=0; i<8; i++){
setDigitData(i, 0);
}
// 初期設定が終わったらシャットダウン解除
sendSPIData(0x0C01);
}
void loop() {
for(int i=0; i<8; i++){
for(int row=0; row<8; row++){
setDigitData((byte)row, pattern[i][row]);
}
delay(500);
}
}