#define CLK sr1:Q1
#define OE sr1:Q2
#define LAT sr1:Q3
#define A sr1:Q4
#define B sr1:Q5
#define C sr1:Q6
#define D sr1:Q7
#define R1 sr2:Q1
#define G1 sr2:Q2
#define B1 sr2:Q3
#define R2 sr2:Q4
#define G2 sr2:Q5
#define B2 sr2:Q6
const int datapin = 2;//DS SER Serial Data Input [data]
const int latchpin = 3;//SHCP SRCLK Shift Register Clock Input [latch]
const int clockpin = 4;//STCP RCK Storage Register Clock Input [clock]
#define LED_WIDTH 64
#define LED_HEIGHT 32
/*
74hc595:1 send data bytes is b1
74hc595:2 send data bytes is b2
b1=B00000010 mean only hub75:clock is on
b1=B00000100 mean only hub75:OE is on
b1=B00001000 mean only hub75:LAT is on
b1=B00010000 mean only hub75:A is on
b1=B00100000 mean only hub75:B is on
b1=B01000000 mean only hub75:C is on
b1=B10000000 mean only hub75:D is on
b2=B00000010 mean only hub75:R1 is on
b2=B00000100 mean only hub75:G1 is on
b2=B00001000 mean only hub75:B1 is on
b2=B00010000 mean only hub75:R2 is on
b2=B00100000 mean only hub75:G2 is on
b2=B01000000 mean only hub75:B2 is on
*/
void setup() {
pinMode(datapin, OUTPUT);
pinMode(latchpin, OUTPUT);
pinMode(clockpin, OUTPUT);
digitalWrite(datapin, LOW);
digitalWrite(latchpin, LOW);
digitalWrite(clockpin, LOW);
Serial.begin(115200);
}
uint8_t address = 0;
void write595(byte b1,byte b2){
//digitalWrite(latchpin, HIGH);
//digitalWrite(latchpin, LOW);
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, LSBFIRST, b2);
shiftOut(datapin, clockpin, LSBFIRST, b1);
digitalWrite(latchpin, HIGH);
//Serial.println(b1);
}
byte hub75_setting_data(bool clk,bool oe,bool lat,bool a,bool b,bool c,bool d)
{
byte data=B11111110;
byte cmp;
cmp=(d<<7)|(c<<6)|(b<<5)|(a<<4)|(lat<<3)|(oe<<2)|(clk<<1);
//data=data&cmp;
//Serial.println(cmp);
return cmp;
}
byte hub75_dot_data(bool r1,bool r2,bool g1,bool g2,bool b1,bool b2)
{
byte data=B11111110;
byte cmp=B00000000;
cmp=(b2<<6)|(b1<<5)|(g2<<4)|(g1<<3)|(r2<<2)|(r1<<1);
//data=data&cmp;
return cmp;
}
void loop() {
byte data1;
byte data2;
bool r1=0;
bool g1=0;
bool b1=0;
bool r2=0;
bool g2=0;
bool b2=0;
bool clk=0;
bool oe=0;
bool lat=0;
bool a=0;
bool b=0;
bool c=0;
bool d=0;
//oe=1;
//write595(B0000100, 0);//OE OFF by HIGH
for (int j = 0; j < LED_HEIGHT; j++ ){
lat=1;//latch on
clk=0;
r1=1;
g1=1;
b1=0;
//data1=hub75_setting_data(clk,oe,lat,a,b,c,d);
data2=hub75_dot_data(r1,r2,g1,g2,b1,b2);
//write595(data1,data2);
for(int i=0; i<LED_WIDTH; i++) {
//send clock pulse
clk=1;
data1=hub75_setting_data(clk,oe,lat,a,b,c,d);
write595(data1,data2);//clock on
clk=0;
data1=hub75_setting_data(clk,oe,lat,a,b,c,d);
write595(data1,data2);//clock off
//write595(data1&B11110111,data2);//latch on
}
// LED を消灯する (データ転送時のちらつきを防ぐ)
oe=1;//OE OFF by HIGH
data1=hub75_setting_data(clk,oe,lat,a,b,c,d);
write595(data1,data2);
if(address == 0b1111) {
address = 0;
} else {
address++;
}
a=address & 0b0001;
b=address & 0b0010;
c=address & 0b0100;
d=address & 0b1000;
// 4bit で指定した列に RGB データを転送する
lat=1;//latch off
data1=hub75_setting_data(clk,oe,lat,a,b,c,d);
data2=hub75_dot_data(r1,r2,g1,g2,b1,b2);
write595(data1,data2);
lat=0;//latch off
oe=0;//OE ON by LOW
data1=hub75_setting_data(clk,oe,lat,a,b,c,d);
write595(data1,data2);
}
//Serial.println(data1);
delay(100);
}