Exemple #1
0
static void rgb(uint8_t r, uint8_t g, uint8_t b)
{
	// Reset.
	SET_BIT_LO(PORTB, PIN);
	_delay_us(RESET);

	// Green
	for (uint8_t bit = 0; bit < 8; bit++) {
		if (g & 0x80) {
			SET_BIT_HI(PORT, PIN);
			_delay_ns(ON_HI);
			SET_BIT_LO(PORT, PIN);
			_delay_ns(ON_LO);
		} else {
			SET_BIT_HI(PORT, PIN);
			_delay_ns(OFF_HI);
			SET_BIT_LO(PORT, PIN);
			_delay_ns(OFF_LO);
		}
		g <<= 1;
	}

	// Red
	for (uint8_t bit = 0; bit < 8; bit++) {
		if (r & 0x80) {
			SET_BIT_HI(PORT, PIN);
			_delay_ns(ON_HI);
			SET_BIT_LO(PORT, PIN);
			_delay_ns(ON_LO);
		} else {
			SET_BIT_HI(PORT, PIN);
			_delay_ns(OFF_HI);
			SET_BIT_LO(PORT, PIN);
			_delay_ns(OFF_LO);
		}
		r <<= 1;
	}

	// Blue
	for (uint8_t bit = 0; bit < 8; bit++) {
		if (b & 0x80) {
			SET_BIT_HI(PORT, PIN);
			_delay_ns(ON_HI);
			SET_BIT_LO(PORT, PIN);
			_delay_ns(ON_LO);
		} else {
			SET_BIT_HI(PORT, PIN);
			_delay_ns(OFF_HI);
			SET_BIT_LO(PORT, PIN);
			_delay_ns(OFF_LO);
		}
		b <<= 1;
	}

}
// Drive the three pixels in an infinite loop.
void threepixeldemo(void)
{
    // Configure pin for output.
    SET_BIT_HI(DDR, PIN);
    SET_BIT_LO(PORT, PIN);

    // off->red, off->green, off->blue
    RGB_t rgb[3] = {{0,0,0},{0,0,0},{0,0,0}};
    WS2811RGB(rgb, ARRAYLEN(rgb));
    _delay_ms(PAUSE);
    for (int i = 0; i < 255; i++) {
        rgb[0].r += 1; 
        rgb[1].g += 1; 
        rgb[2].b += 1; 
        WS2811RGB(rgb, ARRAYLEN(rgb));
        _delay_ms(DELAY);
    }

    // loop forever.
    for (;;) {
        // red->yellow, green->cyan, blue->magenta    
        for (int i = 0; i < 255; i++) {
            rgb[0].g += 1; 
            rgb[1].b += 1; 
            rgb[2].r += 1; 
            WS2811RGB(rgb, ARRAYLEN(rgb));
            _delay_ms(DELAY);
        }
        // yellow->green, cyan->blue, magenta->white
        for (int i = 0; i < 255; i++) {
            rgb[0].r -= 1; 
            rgb[1].g -= 1; 
            rgb[2].g += 1; 
            WS2811RGB(rgb, ARRAYLEN(rgb));
            _delay_ms(DELAY);
        }
        // green->cyan, blue->magenta, white->red
        for (int i = 0; i < 255; i++) {
            rgb[0].b += 1; 
            rgb[1].r += 1; 
            rgb[2].g -= 1; 
            rgb[2].b -= 1; 
            WS2811RGB(rgb, ARRAYLEN(rgb));
            _delay_ms(DELAY);
        }
        // cyan->blue, magenta->white, red->yellow
        for (int i = 0; i < 255; i++) {
            rgb[0].g -= 1;
            rgb[1].g += 1;
            rgb[2].g += 1;
            WS2811RGB(rgb, ARRAYLEN(rgb));
            _delay_ms(DELAY);
        }
        // blue->magenta, white->red, yellow->green
        for (int i = 0; i < 255; i++) {
            rgb[0].r += 1;
            rgb[1].g -= 1;
            rgb[1].b -= 1;
            rgb[2].r -= 1;
            WS2811RGB(rgb, ARRAYLEN(rgb));
            _delay_ms(DELAY);
        }
        // magenta->white, red->yellow, green->cyan
        for (int i = 0; i < 255; i++) {
            rgb[0].g += 1;
            rgb[1].g += 1;
            rgb[2].b += 1;
            WS2811RGB(rgb, ARRAYLEN(rgb));
            _delay_ms(DELAY);
        }
        // white->red, yellow->green, cyan->blue
        for (int i = 0; i < 255; i++) {
            rgb[0].b -= 1;
            rgb[0].g -= 1;
            rgb[1].r -= 1;
            rgb[2].g -= 1;
            WS2811RGB(rgb, ARRAYLEN(rgb));
            _delay_ms(DELAY);
        }
    }
}