This library allows control of the TLC5940 PWM driver IC. It supports both normal operation and controlling multiplexed displays.

Dependencies:   FastPWM

Dependents:   TLC5940LEDtreiber

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?

UserRevisionLine numberNew 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 }