This library allows control of the TLC5940 PWM driver IC. It supports both normal operation and controlling multiplexed displays.
TLC5940Mux.cpp@3:e5ed5650eb15, 2013-05-26 (annotated)
- Committer:
- Spencer
- Date:
- Sun May 26 05:04:29 2013 +0000
- Revision:
- 3:e5ed5650eb15
- Parent:
- 0:be9399a34b15
A few more bug fixes
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Spencer | 0:be9399a34b15 | 1 | #include "mbed.h" |
Spencer | 0:be9399a34b15 | 2 | #include "TLC5940.h" |
Spencer | 0:be9399a34b15 | 3 | |
Spencer | 0:be9399a34b15 | 4 | |
Spencer | 0:be9399a34b15 | 5 | TLC5940Mux::TLC5940Mux(PinName SCLK, PinName MOSI, PinName GSCLK, PinName BLANK, |
Spencer | 0:be9399a34b15 | 6 | PinName XLAT, PinName DCPRG, PinName VPRG, const int number, |
Spencer | 0:be9399a34b15 | 7 | const int rows, void (*SetRows)(int)) : TLC5940(SCLK, MOSI, GSCLK, BLANK, XLAT, DCPRG, VPRG, number), |
Spencer | 0:be9399a34b15 | 8 | rows(rows), |
Spencer | 0:be9399a34b15 | 9 | SetRows(SetRows), |
Spencer | 3:e5ed5650eb15 | 10 | currentIndex(0) |
Spencer | 0:be9399a34b15 | 11 | |
Spencer | 0:be9399a34b15 | 12 | { |
Spencer | 0:be9399a34b15 | 13 | // Create a data buffer to store the current LED states |
Spencer | 0:be9399a34b15 | 14 | dataBuffer = new unsigned short[rows * 16 * number]; |
Spencer | 0:be9399a34b15 | 15 | |
Spencer | 0:be9399a34b15 | 16 | // Zero the buffer |
Spencer | 0:be9399a34b15 | 17 | memset(dataBuffer, 0x00, rows * 16 * number * 2); |
Spencer | 0:be9399a34b15 | 18 | } |
Spencer | 0:be9399a34b15 | 19 | |
Spencer | 0:be9399a34b15 | 20 | TLC5940Mux::~TLC5940Mux() |
Spencer | 0:be9399a34b15 | 21 | { |
Spencer | 0:be9399a34b15 | 22 | // Delete the buffer |
Spencer | 0:be9399a34b15 | 23 | delete[] dataBuffer; |
Spencer | 0:be9399a34b15 | 24 | } |
Spencer | 0:be9399a34b15 | 25 | |
Spencer | 0:be9399a34b15 | 26 | unsigned short* TLC5940Mux::operator=(unsigned short* data) |
Spencer | 0:be9399a34b15 | 27 | { |
Spencer | 0:be9399a34b15 | 28 | // Copy the memory from data to the data buffer |
Spencer | 0:be9399a34b15 | 29 | memcpy(dataBuffer, data, rows * 16 * number * 2); |
Spencer | 0:be9399a34b15 | 30 | |
Spencer | 0:be9399a34b15 | 31 | return data; |
Spencer | 0:be9399a34b15 | 32 | } |
Spencer | 0:be9399a34b15 | 33 | |
Spencer | 0:be9399a34b15 | 34 | unsigned short* TLC5940Mux::operator[](int index) |
Spencer | 0:be9399a34b15 | 35 | { |
Spencer | 0:be9399a34b15 | 36 | // Return the start of the correct data chunk |
Spencer | 0:be9399a34b15 | 37 | return dataBuffer + (index * 16 * number); |
Spencer | 0:be9399a34b15 | 38 | } |
Spencer | 0:be9399a34b15 | 39 | |
Spencer | 0:be9399a34b15 | 40 | void TLC5940Mux::setNextData() |
Spencer | 0:be9399a34b15 | 41 | { |
Spencer | 0:be9399a34b15 | 42 | // Move into the dataBuffer and return a pointer corresponding to the start of the correct data block |
Spencer | 3:e5ed5650eb15 | 43 | setNewGSData(dataBuffer + (currentIndex * 16 * number)); |
Spencer | 0:be9399a34b15 | 44 | |
Spencer | 0:be9399a34b15 | 45 | // Since the data we sent on the previous reset was just latched in, |
Spencer | 0:be9399a34b15 | 46 | // we must enable the row for the previous index so it is displayed in the right position |
Spencer | 0:be9399a34b15 | 47 | // The ternary is used in case index is zero (we can't have an index of -1) |
Spencer | 3:e5ed5650eb15 | 48 | SetRows((currentIndex ? (currentIndex - 1) : (rows - 1))); |
Spencer | 0:be9399a34b15 | 49 | |
Spencer | 0:be9399a34b15 | 50 | // Go to next index |
Spencer | 3:e5ed5650eb15 | 51 | if (currentIndex == (rows - 1)) |
Spencer | 3:e5ed5650eb15 | 52 | currentIndex = 0; |
Spencer | 0:be9399a34b15 | 53 | else |
Spencer | 3:e5ed5650eb15 | 54 | currentIndex++; |
Spencer | 0:be9399a34b15 | 55 | } |