#include #include #include #define interrupt(x) void __attribute__((interrupt (x))) #define LEDS 6 #define DECAY 14 #define MAX 255 // ",".join([str(int(x**3/256/256)) for x in range(0, 256)]) const uint8_t bright_map[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3, 4,4,4,4,4,5,5,5,5,5,6,6,6,6,7,7,7,8,8,8,9,9,9,10,10,10,11,11,11, 12,12,13,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,22, 22,23,23,24,25,25,26,27,27,28,29,29,30,31,32,32,33,34,35,35,36, 37,38,39,40,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56, 57,59,60,61,62,63,64,66,67,68,69,71,72,73,74,76,77,79,80,81,83, 84,86,87,88,90,91,93,95,96,98,99,101,103,104,106,108,109,111, 113,114,116,118,120,122,123,125,127,129,131,133,135,137,139,141, 143,145,147,149,151,153,155,158,160,162,164,166,169,171,173,176, 178,180,183,185,188,190,193,195,198,200,203,205,208,210,213,216, 218,221,224,227,229,232,235,238,241,244,247,250,253 }; void delay_ms(uint16_t ms) { while (ms--) __delay_cycles(16000); } uint16_t debug[8]; int main() { // Disable watchdog WDTCTL = WDTPW | WDTHOLD; // 16MHz clock BCSCTL1 = CALBC1_16MHZ; DCOCTL = CALDCO_16MHZ; P2SEL = 0; P2SEL2 = 0; P2DIR = 0x3F; int16_t cur = 0, dir = 1, i; uint16_t val; uint8_t pwm = 0, frame = 1; uint8_t bright[LEDS]; uint8_t decay = 0; for (i = 0; i < LEDS; i++) bright[i] = 0; while (1) { val = 0; for (i = 0; i < LEDS; i++) { if (pwm < bright_map[bright[i]]) val |= 1 << i; } P2OUT = val; pwm++; if (pwm == 0) { frame--; for (i = 0; i < LEDS; i++) { if (decay || i != cur) { if (bright[i] <= DECAY) bright[i] = 0; else bright[i] -= DECAY; } } if (frame == 0) { frame = 5; cur += dir; if (cur == LEDS - 1) { dir = -1; frame = 15; decay = 0; } else if (cur == 0) { dir = 1; frame = 15; decay = 0; } else { decay = 1; } bright[cur] = MAX; } } __delay_cycles(1200); } }