This library allows control of the TLC5940 PWM driver IC. It supports both normal operation and controlling multiplexed displays.
Diff: TLC5940Mux.cpp
- Revision:
- 0:be9399a34b15
- Child:
- 3:e5ed5650eb15
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TLC5940Mux.cpp Mon May 20 19:07:01 2013 +0000 @@ -0,0 +1,55 @@ +#include "mbed.h" +#include "TLC5940.h" + + +TLC5940Mux::TLC5940Mux(PinName SCLK, PinName MOSI, PinName GSCLK, PinName BLANK, + PinName XLAT, PinName DCPRG, PinName VPRG, const int number, + const int rows, void (*SetRows)(int)) : TLC5940(SCLK, MOSI, GSCLK, BLANK, XLAT, DCPRG, VPRG, number), + rows(rows), + SetRows(SetRows), + index(0) + +{ + // Create a data buffer to store the current LED states + dataBuffer = new unsigned short[rows * 16 * number]; + + // Zero the buffer + memset(dataBuffer, 0x00, rows * 16 * number * 2); +} + +TLC5940Mux::~TLC5940Mux() +{ + // Delete the buffer + delete[] dataBuffer; +} + +unsigned short* TLC5940Mux::operator=(unsigned short* data) +{ + // Copy the memory from data to the data buffer + memcpy(dataBuffer, data, rows * 16 * number * 2); + + return data; +} + +unsigned short* TLC5940Mux::operator[](int index) +{ + // Return the start of the correct data chunk + return dataBuffer + (index * 16 * number); +} + +void TLC5940Mux::setNextData() +{ + // Move into the dataBuffer and return a pointer corresponding to the start of the correct data block + setNewGSData(dataBuffer + (index * 16 * number)); + + // Since the data we sent on the previous reset was just latched in, + // we must enable the row for the previous index so it is displayed in the right position + // The ternary is used in case index is zero (we can't have an index of -1) + SetRows((index ? (index - 1) : (rows - 1))); + + // Go to next index + if (index == (rows - 1)) + index = 0; + else + index++; +} \ No newline at end of file