/* * Copyright Paul Campbell 2011 - licensed GPL 3.0 */ void setup() { pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(17, INPUT); digitalWrite(17, 1); pinMode(18, INPUT); digitalWrite(18, 1); // enable pullups } unsigned char t=4; unsigned char mask; unsigned char left; unsigned char state; void loop() { unsigned char v = 0; int wait; if (digitalRead(17)) // decode the input pins v |= 1; if (digitalRead(18)) v |= 2; if (v != t) { // if they've changed set up initial conditions switch (v) { case 0: state = 0; break; case 1: left = 1; state = 1; break; case 2: state = 0; break; case 3: state = 1; left = 1; mask = 0x1f; break; } t = v; } switch (v) { // perform one step case 0: // count state++; wait = 500; break; case 1: // cylon if (left) { if (state == 0x10) { left = 0; state = 0x8; } else { state = state<<1; } } else { if (state == 1) { left = 1; state = 2; } else { state = state>>1; } } wait = 200; break; case 2: // flash state = ~state; wait = 250; break; case 3: // worm if (left) { if (state&0x10) { if (state == 0x10) { state = 0x18; left = 0; mask = 0x1f; } else { mask = mask << 1; state &= mask; } } else { state = (state<<1)|1; } } else { if (state&0x1) { if (state == 0x1) { state = 0x3; left = 1; mask = 0x1f; } else { mask = mask >> 1; state &= mask; } } else { state = (state>>1)|0x10; } } wait = 400; break; } v = state; digitalWrite(6, v&1?1:0); // light the LEDs digitalWrite(7, v&2?1:0); digitalWrite(8, v&4?1:0); digitalWrite(9, v&8?1:0); digitalWrite(10, v&16?1:0); delay(wait); }