For the 8x8x8 RGB LEDCube
LEDCUBE_RGB_888.cpp
- Committer:
- zgtk_r
- Date:
- 2017-01-29
- Revision:
- 0:1cb54c970448
File content as of revision 0:1cb54c970448:
#include"LEDCUBE_RGB_888.h" #include <math.h> SPIShiftReg SReg2(D11,D13,D10); //data, dclk, rck SPIShiftReg SReg(PC_12,PC_10,D7); //data, dclk, rck AnalogIn seed(A5); extern char VRam[64][3] = {0,0,0,}; char checkColor(char dat, int C, int i){ if(C == i)return dat; else return 0; } void IniVRam(char dat){ for(int i = 0; i < 64; i++){ for(int c = 0; c < 3; c++){ VRam[i][c] = dat; } } } //VRamFunctions--------------------------------------- int multiple(int i){ if(i == 0)return 0; int hoge = 1; while(i % hoge){ hoge++; } return hoge; } uint32_t GetV(uint8_t R, int8_t G, uint8_t B){ return (R << 16) | (G << 8) | B; } COL GetColor(bool R, bool G, bool B){ return (R << 2) | (G << 1) | B; } void PutPixel(int x, int y, int z, uint8_t Color){ if(x <= -1 || x >= 8)return; if(y <= -1 || y >= 8)return; if(z <= -1 || z >= 8)return; for(int i = 0; i <3; i++){ if(Color & (1<<i))VRam[(x * 8) + y][i] |= 1 << z; else VRam[(x * 8) + y][i] &= ~(1 << z); } } void DrawLine(int x1, int y1, int z1, int x2, int y2, int z2, COL Color){ } void DrawBox(int x1, int y1, int z1, int x2, int y2, int z2, COL Color, bool f){ if(f) for(int x = x1; x < x1+x2; x++){ for(int y = y1; y < y1+y2; y++){ for(int z = z1; z < z1+z2; z++){ PutPixel(x, y, z, Color); } } } else volatile int xx = 0, yy = 0, zz = 0; for(int x = x1, xx = 0; x < x1+x2; x++, xx++){ for(int y = y1, yy = 0; y < y1+y2; y++, yy++){ for(int z = z1, zz = 0; z < z1+z2; z++, zz++){ if(xx == yy && yy == zz && zz == xx)PutPixel(x, y, z, Color); } } } } void DrawBall(float x, float y, float z, float r, COL Color, bool f){ for(float xx = x-r; xx < x+r; xx++){ for(float yy = y-r; yy < y+r; yy++){ for(float zz = z-r; zz < z+r; zz++){ float a = ((xx-x)*(xx-x) + (yy-y)*(yy-y) + (zz-z)*(zz-z)); if(f){ if(a < r*r )PutPixel(xx, yy, zz, Color); } else{ if(a >= r*r-30 && a < r*r)PutPixel(xx, yy, zz, Color); } } } } } void ShiftVRam(ShiftType Type){ switch(Type){ case X_Plus : for(int i = 55 ; i >= 0; i--){ for(int j = 0;j < 3; j++){ VRam[i+8][j] = VRam[i][j]; } } for(int i = 0 ; i < 8; i++){ for(int j = 0;j < 3; j++){ VRam[i][j] = 0; } } break; case X_Minus : for(int i = 0 ; i < 56; i++){ for(int j = 0;j < 3; j++){ VRam[i][j] = VRam[i+7][j]; } } for(int i = 0 ; i < 8; i++){ for(int j = 0;j < 3; j++){ VRam[i][j] = 0; } } break; case Z_Plus : for(int i = 0 ; i < 64; i++){ for(int j = 0;j < 3; j++){ VRam[i][j] = VRam[i][j] << 1; } } break; case Z_Minus : for(int i = 0 ; i < 64; i++){ for(int j = 0;j < 3; j++){ VRam[i][j] = VRam[i][j] >> 1; } } break; } } //VerticalProcessings--------------------------------- int VertCount = 0; //uint64_t VertData = 1; char VertDataArray[8] = { 0,0,0,0,0,0,0,0 }; void IniVertArray(){ for(int i = 0;i < 8; i++){ VertDataArray[i] = 0; } } void VertNext(){ if(VertCount >= 64){ VertCount = 0; } VertCount++; } void WriteVertData(){ SReg2.write(VertDataArray, 8); } void vertUpData(){ IniVertArray(); VertDataArray[VertCount/8] = 1 << VertCount%8; } //HorizonProcessings--------------------------------- //BRG char HorizData[3] = {0x00, 0x00, 0x00}; void WriteHrizData(){ SReg.write(HorizData, 3); } void horizUpData(bool F){ if(F){ for(int i = 0;i < 3; i++){ HorizData[i] = VRam[VertCount][i]; } }else{ for(int i = 0;i < 3; i++){ HorizData[i] = 0; } } } //FramePagingProcessings---------------------------------- long Frame = 0; bool UpdateFlag = false; void FrameUpDate(bool F){ if(VertCount != 64){ WriteVertData(); WriteHrizData(); vertUpData(); horizUpData(F); if(F)VertNext(); } } void InitialScreen(int n, char data){ int temp = VertCount; VertCount = 0; IniVRam(data); for(int i = 0; i < n; i++){ FrameUpDate(true); } VertCount = temp; } void Cls(){ int temp = VertCount; VertCount-=1; FrameUpDate(false); VertCount = temp; } void CubeUpdata(){ VertCount = 0; for(int i = 0; i <= 64; i++){ FrameUpDate(true); Cls(); } }