
4x4x4 LED CUBE CODE
Diff: main.cpp
- Revision:
- 0:6ee2b9c3c22c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Mar 07 21:09:04 2013 +0000 @@ -0,0 +1,323 @@ +#include "mbed.h" +#include "stdlib.h" + +DigitalOut myled(LED1); + +// 8 bit bus to control two FF's +DigitalOut d0(p10); +DigitalOut d1(p11); +DigitalOut d2(p12); +DigitalOut d3(p13); +DigitalOut d4(p14); +DigitalOut d5(p15); +DigitalOut d6(p16); +DigitalOut d7(p17); + +// Two pins for the CP pins on the FF's +DigitalOut cp0(p22); +DigitalOut cp1(p21); + +// Two pins for the input to to the 3 to 8 decoder +DigitalOut a0(p24); +DigitalOut a1(p23); + +// 4 x 4 x 4 Cube +const int SIDE = 4; + +void drawLayer(int*, int); +void selPin(int, int); +void selLED(int*, int); +void clear(int); +void RotZ(int*); +void DrawCube(int* cube); +void effect_rain(int, double); + +const double alph = 0.3827; // sin(22.5*) +const double bet = 0.9239; // cos(22.5*) + enum + { + XDIM, YDIM, ZDIM + } DIM; + +int EMPTYARRAY[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + +int main() { + void effect_rand(int); + void effect_box(int); + void clearAll(); + // int layer[16] = {1,0,0,1,1,0,0,0,1,1,0,1,1,1,0,1}; + int layer[16] = {1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1}; + int cube[64] = {1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1}; +// layer[0] = 1; +// layer[3] = 1; +// layer[3] = 1; +// layer[3] = 1; +// layer[4] = 1; +// layer[8] = 1; +// layer[9] = 1; +// layer[11] = 1; +// layer[12] = 1; +// layer[13] = 1; +// layer[15] = 1; + int x = 0; + int y = 0; + srand(546); + int t = 0; +while(1){ + // DrawCube(cube); + // if(t>1000){ + // for(int j = 0; j<64; ++j){ + // cube[j] = rand() % 2;} + // t=0; + clearAll();wait(1); + effect_rand(8000); + clearAll();wait(1); + effect_box(8000); + clearAll();wait(1); + effect_rain(15, 0.16); + + } +// ++t; + +} +// Draw a layer using a 16 int array (SIDE*SIDE) +void drawLayer(int* layer, int selLayer){ + switch(selLayer){ + case 0: + a0 = 0; + a1 = 0; + break; + case 1: + a0 = 1; + a1 = 0; + break; + case 2: + a0 = 0; + a1 = 1; + break; + case 3: + a0 = 1; + a1 = 1; + break; + } + + for(int i = 0; i < (SIDE*SIDE); i+=8){ + int ffSel = i >> 3; // divide by 8 to determine which FF (will give 0 or 1) + selLED(layer+ffSel*8, ffSel); + } +} +// selLED will turn on the selected LEDS on a layer (8 at a time) +// cp = 0 for first FF +// cp = 1 for second FF +void selLED(int* ffOut, int cp){ + // change data, bring latch low then high to latch input to output + for(int i = 0; i < 8; i++){ + selPin(i, ffOut[i]); + } + if(cp == 0){ + cp0 = 0; // pull latch low + // wait() ?? + cp0 = 1; + cp1 = 0; + } + if(cp == 1){ + cp1 = 0; // pull latch low + // wait() ?? + cp0 = 0; + cp1 = 1; + } +} + +// Turn the selected pin on the FF to the input value +void selPin(int i, int val){ + switch(i){ + case 0: + d0 = val; + break; + case 1: + d1 = val; + break; + case 2: + d2 = val; + break; + case 3: + d3 = val; + break; + case 4: + d4 = val; + break; + case 5: + d5 = val; + break; + case 6: + d6 = val; + break; + case 7: + d7 = val; + break; + } +} + +// Random voxels light up at the top layer and falls to the bottom layer. +void effect_rain (int iterations, double speed){ +int numi = 70; + int count = 0; + + int layer[16]; + int layer2[16]; + count = 0; + + /* count = 0; + while ( !(count > 0 && count <=3)){ + count = 0; + for(int i = 0; i < 16; i++){ + layer2[i] = rand() % 2; + if(layer2[i]) count++; + } + } + */ + clear(3); clear(2); clear(1); clear(0); + + int i = 0; + while(i < iterations){ + count = 0; + // Get new L1 + while ( !(count > 0 && count <=3)){ + count = 0; + for(int i = 0; i < 16; i++){ + layer[i] = rand() % 2; + if(layer[i]) count++; + } + } + + clear(0);clear(2); + for(int test = 0 ; test < numi ; test++){ + clear(1); + drawLayer(layer, 3); + wait(0.001); + clear(3); + drawLayer(layer2,1); + wait(0.001); + } + + clear(3);clear(1); + for(int test = 0 ; test < numi ; test++){ + drawLayer(layer, 2); + wait(0.001); + clear(2); + drawLayer(layer2,0); + wait(0.001); + clear(0); + } + // Swap layer + for(int i = 0 ; i<16 ;i++){ + layer2[i]=layer[i]; + } + // Get new L1 + count = 0; + while ( !(count > 0 && count <=3)){ + count = 0; + for(int i = 0; i < 16; i++){ + layer[i] = rand() % 2; + if(layer[i]) count++; + } + } + + clear(2);clear(0); + for(int test = 0 ; test < numi; test++){ + drawLayer(layer2, 1); + wait(0.001); + clear(1); + drawLayer(layer,3); + wait(0.001); + clear(3); + } + //wait(speed); + + clear(1);clear(3); + for(int test = 0 ; test < numi ; test++){ + drawLayer(layer2, 0); + wait(0.001); + clear(0); + drawLayer(layer,2); + wait(0.001); + clear(2); + } + // Swap layer + for(int i = 0 ; i<16 ;i++){ + layer2[i]=layer[i]; + } + i++; + } + +} + +void RotZ(int* cube){ + int x,y,z = 0; // init coordinates + int temp[SIDE*SIDE*SIDE]; + int* ptemp = &temp[0]; + int newx,newy,newz; + + for(int i = 0; i < SIDE*SIDE*SIDE ; i++){ + z = i/(SIDE*SIDE); + int newi = i - z*SIDE*SIDE; + y = newi / SIDE; + x = newi - y*SIDE; + + newx = bet*x - alph*y; + newy = alph*x + bet*y; + newz = z; + ptemp[SIDE*SIDE*newz + SIDE*newy + newx] = 1; + } + + for(int i = 0; i < SIDE*SIDE*SIDE ; i++){ + cube[i] = ptemp[i]; + } + +} + + void DrawCube(int* cube){ + double t = 0.45; + for(int i = 0; i<SIDE*SIDE*SIDE ; i+= SIDE*SIDE){ + drawLayer(EMPTYARRAY, i/(SIDE*SIDE)); + drawLayer((cube+i),i/(SIDE*SIDE)); + wait(0.0001); + } + + } + + void clear(int layer){ + drawLayer(EMPTYARRAY, layer); + } + + void effect_rand(int it){ + int i = 0; + int cube[64]; + int x = 0; + while (i<it){ + + if(x > 500){ + for(int k = 0; k < 64 ; k++){ + cube[k] = rand() % 2; + } + x = 0; + } + DrawCube(cube); + x++; + + + i++; + } + + } + void effect_box(int it){ + + int cube[64] = {1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1, 1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1, 1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1, 1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1}; + int i = 0; + while(i < it){i++; + DrawCube(cube); + } + + } + + void clearAll(){clear(0);clear(1);clear(2);clear(3);} \ No newline at end of file