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); } } }