使用 8 個 74HC238 解碼 IC 跟 1 個 74HC595 移位寄存 IC 完成 1 個 8x8 的面
再用 1 個 74HC238 解碼 IC 切換 8 層 led 的共同接地
如果要再偷懶,切換共同接地的 74HC238 前面再放 1 個 74HC595
這是 4x4 cube 的一層範例
其中,CD4051 跟 74HC238 的功能是一樣的
const int latchPin = 8;
const int clockPin = 12;
const int dataPin = 11;
int seq[7][4] = {{0,6,6,0},{0,14,14,6},{12,12,15,7},{14,15,3,3},{7,7,7,0},{7,7,7,7},{6,7,7,3}};
int dt = 4;
void setup() {
pinMode(latchPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(dataPin,OUTPUT);
pinMode(14,OUTPUT);
pinMode(15,OUTPUT);
pinMode(16,OUTPUT);
pinMode(17,OUTPUT);
}
void loop() {
for(int a=0;a<7;a++){
for(int b=0;b<20;b++){
for(int c=0;c<4;c++){
digitalWrite(latchPin, LOW); //Pull latch LOW to start sending data
shiftOut(dataPin, clockPin, MSBFIRST, seq[a][c]); //Send the data
/*MSBFIRST的意思是most significant bit first,也就是最先輸出的會是number(是個uint8_t,有8個bits,第7個bit是MSB,第0個bit是LSB)的第7個bit。如果改用LSBFIRST(least significant bit first),那麼最先輸出的會是第0個*/
bitdigitalWrite(latchPin, HIGH); //Pull latch LOW to end sending data
digitalWrite(14,LOW);
digitalWrite(15,LOW);
digitalWrite(16,LOW);
digitalWrite(17,LOW);
delay(dt);
}
}
}
}
材料不夠裝,只上了 4*4 的平面,而且只控到 4*3 的範圍
做好再補完整照片
補上 74HC595 * 2 + CD4051 * 4 的控制碼
int switchPort[3] = {8,9,10};
int data[3] = {11,12,13};
int seq[12][4] = {{0,6,6,0},{0,14,14,0},{0,12,12,12},{0,0,14,14},{0,0,7,7},{0,3,3,3},{3,3,3,0},{7,7,0,0},{14,14,0,0},{12,12,12,0},{0,14,14,0},{0,6,6,0}};
int dt = 4;
void setup() {
for(int a=0;a<3;a++){
pinMode(data[a],OUTPUT);
pinMode(switchPort[a],OUTPUT);
}
pinMode(2,OUTPUT);
}
void loop() {
for(int c=0;c<12;c++){
//調整迴圈數製造影像效果
for(int b=0;b<20;b++){
for(int a=0;a<4;a++){
//利用選擇器跳排
//Pull latch LOW to start sending data
digitalWrite(switchPort[1], LOW);
//Send the data
shiftOut(switchPort[0], switchPort[2], MSBFIRST, a);
//Pull latch HIGH to stop sending data
digitalWrite(switchPort[1], HIGH);
//利用寄存器顯示 Led
//Pull latch LOW to start sending data
digitalWrite(data[1], LOW);
//Send the data
shiftOut(data[0], data[2], MSBFIRST, seq[c][a]);
//Pull latch HIGH to stop sending data
digitalWrite(data[1], HIGH);
//調整延遲時間減弱閃爍的問題
delay(dt);
//重發清除的資料解決殘餘弱電顯示微光的問題
//Pull latch LOW to start sending data
digitalWrite(data[1], LOW);
//Send the data
shiftOut(data[0], data[2], MSBFIRST, 0);
//Pull latch HIGH to stop sending data
digitalWrite(data[1], HIGH);
}
}
}
}