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 Adafruit_WS2801 by
Diff: Adafruit_WS2801.cpp
- Revision:
- 1:6ff477690983
- Parent:
- 0:582e1b9c1cc1
- Child:
- 2:2fdaa13896a4
diff -r 582e1b9c1cc1 -r 6ff477690983 Adafruit_WS2801.cpp --- a/Adafruit_WS2801.cpp Fri Mar 08 08:49:04 2013 +0000 +++ b/Adafruit_WS2801.cpp Fri Mar 08 13:25:50 2013 +0000 @@ -1,5 +1,4 @@ #include "mbed.h" - #include "Adafruit_WS2801.h" // Example to control WS2801-based RGB LED Modules in a strand or strip @@ -7,12 +6,12 @@ /*****************************************************************************/ // Constructor for use with hardware SPI (specific clock/data pins): -Adafruit_WS2801::Adafruit_WS2801(uint16_t n, uint8_t order): clkpin(PTD4), datapin(PTA12) -{ - rgb_order = order; - alloc(n); - updatePins(); -} +//Adafruit_WS2801::Adafruit_WS2801(uint16_t n, uint8_t order): clkpin(PTD4), datapin(PTA12) +//{ +// rgb_order = order; +// alloc(n); +// updatePins(); +//} // Constructor for use with arbitrary clock/data pins: Adafruit_WS2801::Adafruit_WS2801(uint16_t n, PinName dpin, PinName cpin, uint8_t order) : clkpin(cpin), datapin(dpin) @@ -56,14 +55,14 @@ // command. If using this constructor, MUST follow up with updateLength() // and updatePins() to establish the strand length and output pins! // Also, updateOrder() to change RGB vs GRB order (RGB is default). -Adafruit_WS2801::Adafruit_WS2801(void) : clkpin(PTD4), datapin(PTA12) -{ - begun = false; - numLEDs = 0; - pixels = NULL; - rgb_order = WS2801_RGB; - updatePins(); // Must assume hardware SPI until pins are set -} +//Adafruit_WS2801::Adafruit_WS2801(void) : clkpin(PTD4), datapin(PTA12) +//{ +// begun = false; +// numLEDs = 0; +// pixels = NULL; +// rgb_order = WS2801_RGB; +// updatePins(); // Must assume hardware SPI until pins are set +//} // Release memory (as needed): Adafruit_WS2801::~Adafruit_WS2801(void) @@ -77,62 +76,30 @@ void Adafruit_WS2801::begin(void) { - if(hardwareSPI == true) { - startSPI(); - } else { -// pinMode(datapin, OUTPUT); -// pinMode(clkpin , OUTPUT); - } + datapin = 0; + clkpin = 0; begun = true; } // Change pin assignments post-constructor, switching to hardware SPI: +/* void Adafruit_WS2801::updatePins(void) { hardwareSPI = true; datapin = 0; clkpin = 0; - - // If begin() was previously invoked, init the SPI hardware now: - if(begun == true) startSPI(); - // Otherwise, SPI is NOT initted until begin() is explicitly called. - - // Note: any prior clock/data pin directions are left as-is and are - // NOT restored as inputs! } +*/ // Change pin assignments post-constructor, using arbitrary pins: -void Adafruit_WS2801::updatePins(PinName dpin, PinName cpin) -{ - - if(begun == true) { // If begin() was previously invoked... - // If previously using hardware SPI, turn that off: -// if(hardwareSPI == true) SPI.end(); - // Regardless, now enable output on 'soft' SPI pins: -// pinMode(dpin, OUTPUT); -// pinMode(cpin, OUTPUT); - } // Otherwise, pins are not set to outputs until begin() is called. - +//void Adafruit_WS2801::updatePins(PinName dpin, PinName cpin) +//{ // Note: any prior clock/data pin directions are left as-is and are // NOT restored as inputs! - hardwareSPI = false; - datapin = dpin; - clkpin = cpin; -// clkport = portOutputRegister(digitalPinToPort(cpin)); -// clkpinmask = digitalPinToBitMask(cpin); -// dataport = portOutputRegister(digitalPinToPort(dpin)); -// datapinmask = digitalPinToBitMask(dpin); -} - -// Enable SPI hardware and set up protocol details: -void Adafruit_WS2801::startSPI(void) -{ -// SPI.begin(); -// SPI.setBitOrder(MSBFIRST); -// SPI.setDataMode(SPI_MODE0); -// SPI.setClockDivider(SPI_CLOCK_DIV16); // 1 MHz max, else flicker -} +// datapin = DigitalOut(dpin); +// clkpin = DigitalOut(cpin); +//} uint16_t Adafruit_WS2801::numPixels(void) { @@ -162,33 +129,6 @@ uint8_t bit; // Write 24 bits per pixel: -// if(hardwareSPI) { -// for(i=0; i<nl3; i++) { -// SPDR = pixels[i]; -// while(!(SPSR & (1<<SPIF))); -// } -// } else { - -/* - for(int LED_number = 0 ; LED_number < _STRIP_LENGTH ; LED_number++) { - if(_level != 100) { - int R = ((strip_colors[LED_number] & 0x00ff0000) >> 16)*_level/100; - int G = ((strip_colors[LED_number] & 0x0000ff00) >> 8)*_level/100; - int B = (strip_colors[LED_number] & 0x000000ff)*_level/100; - strip_colors_leveled[LED_number] = (R << 16)|(G << 8)|B; - } else strip_colors_leveled[LED_number] = strip_colors[LED_number]; - int this_led_color = strip_colors_leveled[LED_number]; //24 bits of color data - for(char color_bit = 23 ; color_bit != 255 ; color_bit--) { - _CKI = 0; - mask = 1 << color_bit; - if(this_led_color & mask)_SDI = 1; - else _SDI = 0; - _CKI = 1; //Data is latched when clock goes high - } - } - _CKI = 0; - wait_us(_reset_delay); //Wait for 1ms to go into reset -*/ for(i=0; i<nl3; i++ ) { for(bit=0x80; bit; bit >>= 1) { clkpin = 0; @@ -197,9 +137,10 @@ clkpin = 1; } } -// } + clkpin = 0; wait_ms(1); // Data is latched by holding clock pin low for 1 millisecond + clkpin = 1; } // Set pixel color from separate 8-bit R, G, B components: