#define GREYSCALES 128
#define LATCH_PORT B00000001
#define CLOCK_PORT B00010000
#define DATA_PORT B00001000
//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;
//holder for infromation you're going to pass to shifting function
byte data = 0;
inline void latchOn() {
// Port 8
PORTB |= B00000001;
}
inline void latchOff() {
// Port 8
PORTB &= ~B00000001;
}
inline void dataOn() {
// Port 11
PORTB |= B00001000;
}
inline void dataOff() {
// Port 11
PORTB &= ~B00001000;
}
inline void clockOn() {
// Port 12
PORTB |= B00010000;
}
inline void clockOff() {
// Port 12
PORTB &= ~B00010000;
}
void setup() {
//set pins to output because they are addressed in the main loop
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
lightPwm(100,
random(GREYSCALES) / 10,
random(GREYSCALES) / 10,
random(GREYSCALES) / 10,
random(GREYSCALES) / 10,
random(GREYSCALES),
random(GREYSCALES),
random(GREYSCALES)
);
}
void lightPwm(long duration,
int white,
int r1, int g1, int b1,
int r2, int g2, int b2) {
byte data = 0;
// TODO: Gamma
int r1tar = r1;
int g1tar = g1;
int b1tar = b1;
int r2tar = r2;
int g2tar = g2;
int b2tar = b2;
int whtar = white;
int r1inv = GREYSCALES - r1tar;
int g1inv = GREYSCALES - g1tar;
int b1inv = GREYSCALES - b1tar;
int r2inv = GREYSCALES - r2tar;
int g2inv = GREYSCALES - g2tar;
int b2inv = GREYSCALES - b2tar;
int whinv = GREYSCALES - whtar;
int r1err = 0;
int g1err = 0;
int b1err = 0;
int r2err = 0;
int g2err = 0;
int b2err = 0;
int wherr = 0;
for (int t=duration; t >= 0; t--) {
data = 0;
for (int i=GREYSCALES-1; i >= 0; i--) {
if (r1err > 0) {data |= B00000001; r1err -= r1inv;} else {data &= ~B00000001; r1err += r1tar;}
if (g1err > 0) {data |= B00000010; g1err -= g1inv;} else {data &= ~B00000010; g1err += g1tar;}
if (b1err > 0) {data |= B00000100; b1err -= b1inv;} else {data &= ~B00000100; b1err += b1tar;}
if (r2err > 0) {data |= B00001000; r2err -= r2inv;} else {data &= ~B00001000; r2err += r2tar;}
if (g2err > 0) {data |= B00010000; g2err -= g2inv;} else {data &= ~B00010000; g2err += g2tar;}
if (b2err > 0) {data |= B00100000; b2err -= b2inv;} else {data &= ~B00100000; b2err += b2tar;}
if (wherr > 0) {data |= B01000000; wherr -= whinv;} else {data &= ~B01000000; wherr += whtar;}
/*
if (r1 == i) data |= B00000001;
if (g1 == i) data |= B00000010;
if (b1 == i) data |= B00000100;
if (r2 == i) data |= B00001000;
if (g2 == i) data |= B00010000;
if (b2 == i) data |= B00100000;
if (white == i) data |= B01000000;
*/
shiftOut(data);
shiftOut(data);
shiftOut(data);
shiftOut(data);
shiftOut(data);
}
}
}
inline void shiftOut(byte data) {
PORTB &= ~LATCH_PORT; // Latch off
PORTB &= ~CLOCK_PORT; // Clock off
if (data & B00000001) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
PORTB |= CLOCK_PORT; // Clock on
PORTB &= ~CLOCK_PORT; // Clock off
if (data & B00000010) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
PORTB |= CLOCK_PORT; // Clock on
PORTB &= ~CLOCK_PORT; // Clock off
if (data & B00000100) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
PORTB |= CLOCK_PORT; // Clock on
PORTB &= ~CLOCK_PORT; // Clock off
if (data & B00001000) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
PORTB |= CLOCK_PORT; // Clock on
PORTB &= ~CLOCK_PORT; // Clock off
if (data & B00010000) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
PORTB |= CLOCK_PORT; // Clock on
PORTB &= ~CLOCK_PORT; // Clock off
if (data & B00100000) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
PORTB |= CLOCK_PORT; // Clock on
PORTB &= ~CLOCK_PORT; // Clock off
if (data & B01000000) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
PORTB |= CLOCK_PORT; // Clock on
PORTB &= ~CLOCK_PORT; // Clock off
if (data & B10000000) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
PORTB |= CLOCK_PORT; // Clock on
PORTB |= LATCH_PORT; // Latch on
}