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); } } }
int main(int argc, const char *argv[]) { // Init system clock, disable WDT... clock_prescale_set(clock_div_1); MCUSR &= ~(1 << WDRF); wdt_disable(); // Configure pin SET_BIT_HI(DDR, PIN); // Off rgb(0, 0, 0); for (;;) { // Red rgb(255, 0, 0); _delay_ms(PAUSE); // Yellow rgb(255, 255, 0); _delay_ms(PAUSE); // Green rgb(0, 255, 0); _delay_ms(PAUSE); // Cyan rgb(0, 255, 255); _delay_ms(PAUSE); // Blue rgb(0, 0, 255); _delay_ms(PAUSE); // Magenta rgb(255, 0, 255); _delay_ms(PAUSE); // White rgb(255, 255, 255); _delay_ms(PAUSE); // Off rgb(0, 0, 0); _delay_ms(PAUSE); // Red up for (int i = 0; i <= 255; i++) { rgb(i, 0, 0); _delay_ms(DELAY); } // Red -> yellow for (int i = 0; i <= 255; i++) { rgb(255, i, 0); _delay_ms(DELAY); } // Yellow -> green for (int i = 0; i <= 255; i++) { rgb(255 - i, 255, 0); _delay_ms(DELAY); } // Green -> cyan for (int i = 0; i <= 255; i++) { rgb(0, 255, i); _delay_ms(DELAY); } // Cyan -> blue for (int i = 0; i <= 255; i++) { rgb(0, 255 - i, 255); _delay_ms(DELAY); } // Blue -> magenta for (int i = 0; i <= 255; i++) { rgb(i, 0, 255); _delay_ms(DELAY); } // Magenta -> white for (int i = 0; i <= 255; i++) { rgb(255, i, 255); _delay_ms(DELAY); } // White -> Off for (int i = 0; i <= 255; i++) { rgb(255 - i, 255 - i, 255 - i); _delay_ms(DELAY); } _delay_ms(PAUSE); } }