Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of SD600A by
Diff: LPD8806.cpp
- Revision:
- 2:af5af64e114d
- Parent:
- 1:6ebd3ac910b6
- Child:
- 3:a415f73507c9
diff -r 6ebd3ac910b6 -r af5af64e114d LPD8806.cpp
--- a/LPD8806.cpp Fri Dec 16 10:26:35 2011 +0000
+++ b/LPD8806.cpp Sun Sep 16 13:09:54 2012 +0000
@@ -5,33 +5,40 @@
// and their strips: http://www.adafruit.com/products/306
// Released under the MIT License: http://mbed.org/license/mit
//
-// standard connected to 1st hardware SPI
-// LPD8806 <> MBED
-// DATA -> P5
-// CLOCK -> p7
+// Parameterized and modified to use soft SPI.
+// Jas Strong <jasmine@electronpusher.org>
/*****************************************************************************/
#include "LPD8806.h"
-//Define SPI pins
-//Connected to first SPI module
-SPI spi(p5, p6, p7); // mosi, miso, sclk
-//SPI spi(p11, p12, p13); // mosi, miso, sclk
-
-LPD8806::LPD8806(uint16_t n) {
+LPD8806::LPD8806(PinName dataPin, PinName clockPin, int n) :
+ dat(dataPin),
+ clk(clockPin) {
// Allocate 3 bytes per pixel:
+ numLEDs = n;
if (NULL != (pixels = (uint8_t *)malloc(numLEDs * 3))) {
memset(pixels, 0x80, numLEDs * 3); // Init to RGB 'off' state
- numLEDs = n;
}
}
-void LPD8806::begin(void) {
+/*
+ * Soft SPI clock-out implementation (CPOL = 0, CPHA = 0).
+ * Certainly not the fastest in the world but it'll do.
+ * Gets about 3.6 MHz; could get several times as much
+ * using the bitbands directly - jas.
+ */
+
+void LPD8806::write(uint8_t byte) {
+ for (int i=0; i<8; i++) {
+ clk = 0;
+ dat = (byte & 0x80);
+ clk = 1;
+ byte <<= 1;
+ }
+ clk = 0;
+}
- // Setup the spi for 8 bit data, low steady state clock,
- // first edge capture, with a 2MHz clock rate
- spi.format(8,0);
- spi.frequency(2000000);
+void LPD8806::begin(void) {
// Issue initial latch to 'wake up' strip (latch length varies w/numLEDs)
writezeros(3 * ((numLEDs + 63) / 64));
@@ -42,7 +49,11 @@
}
void LPD8806::writezeros(uint16_t n) {
- while (n--) spi.write(0x00);
+ while (n--) write(0x00);
+}
+
+void LPD8806::blank(void) {
+ memset(pixels, 0x80, numLEDs * 3);
}
// This is how data is pushed to the strip. Unfortunately, the company
@@ -53,15 +64,11 @@
uint16_t i, nl3 = numLEDs * 3; // 3 bytes per LED
for (i=0; i<nl3; i++ ) {
- spi.write(pixels[i]);
+ write(pixels[i]);
}
// Write latch at end of data; latch length varies with number of LEDs
writezeros(3 * ((numLEDs + 63) / 64));
-
- // We need to have a delay here, a few ms seems to do the job
- // shorter may be OK as well - need to experiment :(
-// wait_ms(3);
}
// Convert R,G,B to combined 32-bit color
@@ -81,6 +88,31 @@
pixels[n*3+2] = b | 0x80;
}
+void LPD8806::setPixelGB(uint16_t n, uint8_t g, uint8_t b) {
+ if (n >= numLEDs) return; // '>=' because arrays are 0-indexed
+
+ pixels[n*3 ] = g | 0x80;
+ pixels[n*3+2] = b | 0x80;
+}
+
+void LPD8806::setPixelR(uint16_t n, uint8_t r) {
+ if (n >= numLEDs) return; // '>=' because arrays are 0-indexed
+
+ pixels[n*3+1] = r | 0x80;
+}
+
+void LPD8806::setPixelG(uint16_t n, uint8_t g) {
+ if (n >= numLEDs) return; // '>=' because arrays are 0-indexed
+
+ pixels[n*3] = g | 0x80;
+}
+
+void LPD8806::setPixelB(uint16_t n, uint8_t b) {
+ if (n >= numLEDs) return; // '>=' because arrays are 0-indexed
+
+ pixels[n*3+2] = b | 0x80;
+}
+
void LPD8806::setPixelColor(uint16_t n, uint32_t c) {
if (n >= numLEDs) return; // '>=' because arrays are 0-indexed
