8x8x8 Led Cube driven by 4x PCF8575 for the columns and 1x PCF8574 for the layers
led_cube.cpp
- Committer:
- Bas
- Date:
- 2012-09-08
- Revision:
- 0:920c5ed65a45
- Child:
- 1:e08a4d27f534
File content as of revision 0:920c5ed65a45:
#include "led_cube.h" LED_CUBE::LED_CUBE(I2C* _interface) : row(_interface, 0x07,PCF8574_TYPE), colums_0_1(_interface, 0x00), colums_2_3(_interface, 0x01), colums_4_5(_interface, 0x02), colums_6_7(_interface, 0x03) { _interface->frequency(400000); //400KHz duty.attach_us(this, &LED_CUBE::UpdateRow,1250);// each row = 1/8 duty } LED_CUBE::~LED_CUBE() {} void LED_CUBE::UpdateRow() { static int rownr = 0; if (rownr < 0 || rownr > 7) { rownr = 0; } row.WriteByte(0xFF); // switch off all rows before updating next colums to avoid ghost data from previous colums colums_0_1.WriteBytes(~cubeData[8 * rownr + 0],~cubeData[8 * rownr + 2]); //update the columns colums_2_3.WriteBytes(~cubeData[8 * rownr + 1],~cubeData[8 * rownr + 3]); colums_4_5.WriteBytes(~cubeData[8 * rownr + 6],~cubeData[8 * rownr + 4]); colums_6_7.WriteBytes(~cubeData[8 * rownr + 7],~cubeData[8 * rownr + 5]); row.WriteByte(~(1<<rownr)); // now display the row rownr++; } //clear everything void LED_CUBE::clear_cube(void){ row.WriteByte(0xFF); colums_0_1.WriteBytes(0xFF,0xFF); colums_2_3.WriteBytes(0xFF,0xFF); colums_4_5.WriteBytes(0xFF,0xFF); colums_6_7.WriteBytes(0xFF,0xFF); clearVoxels(); } //set a voxel in my space saver cube array void LED_CUBE::setVoxel(unsigned char x, unsigned char y, unsigned char z){ cubeData[z*8 + y] |= 0x01<<x; } //clear a single voxel in my space saver cube array void LED_CUBE::clearVoxel(unsigned char x, unsigned char y, unsigned char z){ cubeData[z*8 + y] &= ~(0x01<<x); } //return the value of the voxel in my cube array unsigned char LED_CUBE::getVoxel(unsigned char x, unsigned char y, unsigned char z){ if(cubeData[z*8 + y] & 0x01<<x){ return 1; }else{ return 0; } } void LED_CUBE::copyColumn(unsigned char x, unsigned char y, unsigned char col){ for(unsigned char z = 0; z < Zd; z++){ if(col&(0x01<<z)){ setVoxel(x, y, z); }else{ clearVoxel(x, y, z); } } } //clear all the voxels in the array void LED_CUBE::clearVoxels(void){ memset(cubeData, 0, 64*sizeof(unsigned char)); }