Lookup table driven version.
Shorter code using data lookup table which could be placed in PROGMEM.
/* =====================================================================================================================
* File - KnightRider.pde
* ---------------------------------------------------------------------------------------------------------------------
* <http://arduino.cc/forum/index.php/topic,107403.0.html>
*/
const uint8_t pinDATA0 = 2;
const uint8_t pinCLOCK0 = 3;
const uint8_t pinDATA1 = 4;
const uint8_t pinCLOCK1 = 5;
const uint8_t pinFLASH = 7;
const uint8_t FLASH_OFF = LOW;
const uint8_t FLASH_ON = HIGH;
const unsigned long dmsLIT = 5UL; // delta, in milliseconds, LIGHT ON
const uint8_t lookup[] =
{
0b10000000 // 0
, 0b01000000 // 1
, 0b00100000 // 2
, 0b00010000 // 3
, 0b00001000 // 4
, 0b00000100 // 5
, 0b00000010 // 6
, 0b00000001 // 7
, 0b00000000 // 8 flash and change register set
, 0b10000000 // 9
, 0b01000000 // 10
, 0b00100000 // 11
, 0b00010000 // 12
, 0b00001000 // 13
, 0b00000100 // 14
, 0b00000010 // 15
, 0b00000001 // 16
, 0b00000010 // 17
, 0b00000100 // 18
, 0b00001000 // 19
, 0b00010000 // 20
, 0b00100000 // 21
, 0b01000000 // 22
, 0b10000000 // 23
, 0b00000000 // 24 flash and change register set
, 0b00000001 // 25
, 0b00000010 // 26
, 0b00000100 // 27
, 0b00001000 // 28
, 0b00010000 // 29
, 0b00100000 // 30
, 0b01000000 // 31
};
void flash(int dms)
{
digitalWrite(pinFLASH, FLASH_ON);
delay(dms);
digitalWrite(pinFLASH, FLASH_OFF);
}
void shift(uint8_t const data, uint8_t const rindex)
{
// shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, byte value)
const uint8_t pinDATA[] = { pinDATA0 , pinDATA1 };
const uint8_t pinCLOCK[] = { pinCLOCK0, pinCLOCK1 };
shiftOut(pinDATA[rindex], pinCLOCK[rindex], LSBFIRST, data);
delay(dmsLIT);
if ( 0 == data )
{
flash(dmsLIT);
}
}
void loop()
{
uint8_t rindex = 0;
for ( size_t i = 0; i < sizeof(lookup); i++ )
{
uint8_t data = lookup[i];
shift(data, rindex);
if ( 0 == data )
{
rindex = ((++rindex) & 1);
}
}
}
void setup()
{
pinMode(pinCLOCK0, OUTPUT);
pinMode(pinDATA0 , OUTPUT);
pinMode(pinCLOCK1, OUTPUT);
pinMode(pinDATA1, OUTPUT);
pinMode(pinFLASH, OUTPUT);
}