8×8ドットマトリックス4連(6)・・走れ小緑人
はじめに
前二回ほどは、LedControlライブラリの
void LedControl::setLed(int addr, int row, int column, boolean state)
という、「1点1点」書き込む関数を使う中でどうやって高速化するかと悩んでいたのです。ライブラリをよく見たら、
void LedControl::setRow(int addr, int row, byte value)
という一行(8ドット)を一回で、丸ごと書き込める関数があるじゃないですか。これ使えばずっと(8倍近く?)速くなるんじゃない?
・・・ということで、やってみましょう。
あ、速い
変えたところ
前々回
のコードの中で displayImage という関数を次のように書き換えています。
void displayImage(int device,const byte *image) {
for (int i = 0; i < 8; i++) {
/*
for (int j = 0; j < 8; j++) {
display.setLed(device , i, j, bitRead(image[i], 7 - j));
}
*/
display.setRow(device,i,image[i]);
}
}
一点一点の書き込み関数setLedのかわりに一行書き込みの setRowを使っています。これだけです。
ライブラリはきちんと調べてから使うべきですね。まわり道をしてしまいました。
実装
変えたところはわずかですが一応、コード全体を載せておきます。
#include <LedControl.h>
const int DIN_PIN = 7;
const int CS_PIN = 6;
const int CLK_PIN = 5;
const int DEVICES = 4;
const byte walkingimages[7][4][8]={
{{//0
B00000000,
B00000110,
B00001111,
B00000110,
B00000011,
B00000011,
B00000011,
B00000101
},{
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B11100000,
B10010000,
B10001000
},{
B00001001,
B00000000,
B00000000,
B00000001,
B00000010,
B00001110,
B00001000,
B00000000
},{
B11000000,
B11000000,
B10100000,
B00010000,
B00000000,
B00000100,
B00000100,
B00000000
}},
{{//1
B00000000,
B00000110,
B00001111,
B00000110,
B00000011,
B00000011,
B00000011,
B00000101
},{
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B11100000,
B10010000,
B10001000
},{
B00001001,
B00000000,
B00000000,
B00000000,
B00000001,
B00000010,
B00001100,
B00000000
},{
B11000000,
B11000000,
B10100000,
B10011100,
B00000100,
B00000100,
B00000100,
B00001000
}},
{{//2
B00000000,
B00000011,
B00000111,
B00000011,
B00000001,
B00000001,
B00000001,
B00000010
},{
B00000000,
B00000000,
B10000000,
B00000000,
B00000000,
B11000000,
B00100000,
B10010000
},{
B00000100,
B00000000,
B00000001,
B00000010,
B00000010,
B00000001,
B00000111,
B00000000
},{
B11010000,
B01000000,
B00100000,
B00111100,
B00000100,
B00001000,
B00000000,
B00000000
}},
{{//3
B00000000,
B00000011,
B00000111,
B00000011,
B00000001,
B00000001,
B00000001,
B00000000
},{
B00000000,
B00000000,
B10000000,
B00000000,
B10000000,
B11000000,
B10100000,
B11010000
},{
B00000000,
B00000001,
B00000000,
B00000001,
B00000010,
B00000001,
B00000000,
B00000011
},{
B11010000,
B01100000,
B11100000,
B00100000,
B00010000,
B10000100,
B10000100,
B10000000
}},
{{//4
B00000000,
B00000011,
B00000111,
B00000011,
B00000001,
B00000001,
B00000001,
B00000000
},{
B00000000,
B00000000,
B10000000,
B00000000,
B10000000,
B11000000,
B10100000,
B11010000
},{
B00000000,
B00000001,
B00000000,
B00000001,
B00000001,
B00000000,
B00000000,
B00000001
},{
B11010000,
B01100000,
B11100000,
B00100000,
B00010000,
B11001000,
B01011000,
B11010000
}},
{{//5
B00000000,
B00000011,
B00000111,
B00000011,
B00000001,
B00000001,
B00000001,
B00000000
},{
B00000000,
B00000000,
B10000000,
B00000000,
B10000000,
B11000000,
B11000000,
B11100000
},{
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000
},{
B11100000,
B01100000,
B01100000,
B10110000,
B01010000,
B01110000,
B00010000,
B01010000
}},
{{//6
B00000000,
B00000110,
B00001111,
B00000110,
B00000011,
B00000011,
B00000011,
B00000001
},{
B00000000,
B00000000,
B00000000,
B00000000,
B10000000,
B11000000,
B10100000,
B11010000
},{
B00000001,
B00000000,
B00000000,
B00000000,
B00000001,
B00000000,
B00000001,
B00000000
},{
B11010000,
B11100000,
B01100000,
B11000000,
B00100000,
B10011000,
B10000100,
B00011100
}}
};
LedControl display = LedControl(DIN_PIN, CLK_PIN, CS_PIN, DEVICES);
void setup() {
int devices = display.getDeviceCount();
for(int address=0;address<devices;address++) {
display.shutdown(address,false);
display.setIntensity(address,0);
display.clearDisplay(address);
};
}
void displayImage(int device,const byte *image) {
for (int i = 0; i < 8; i++) {
/*
for (int j = 0; j < 8; j++) {
display.setLed(device , i, j, bitRead(image[i], 7 - j));
}
*/
display.setRow(device,i,image[i]);
}
}
void displayImageL(const byte image[4][8]){
displayImage(3, image[0]);
displayImage(2, image[1]);
displayImage(1, image[2]);
displayImage(0, image[3]);
}
void loop() {
for (byte num = 0; num<7; num++){
displayImageL(walkingimages[num]);
//delay(50);
}
}