This is heavily adapted from the code on the Oomlout web site. I'm defining "sprites" called invader1, invader2 and blank, then in the loop() function I have an array of pointers to these sprites. There is an array led_state which stores the current state of the LED array, and at each cycle I am shifting every row rightwards and overwriting with the relevant portion of the next sprite. There is a lot of bit-masking and shifting going on. The next project is to replace the unwieldy wiring by using the shift register chips which are visible on the bottom right of the video - as described on the Arduino website.
//
// Adapted from Oomlout code for 8x8 matrix,
// http://www.tinyurl.com/yhwxv6h
#define SPEED 10
#define DELAY 1
#define ROW_OFF LOW
#define ROW_ON HIGH
#define COL_OFF HIGH
#define COL_ON LOW
//Pin Definitions
const byte row_pin[] = {9,8,7,6,5,4,3,2};
const byte column_pin[] = {17,16,15,14,13,12,11,10};
const byte invader1[] = {0x18, 0x3c, 0x7e, 0xdb, 0xff, 0x24, 0x5a, 0xa5};
const byte invader2[] = {0x3c, 0x7e, 0xff, 0x99, 0xff, 0x66, 0xdb, 0x81};
const byte blank[] = {0, 0, 0, 0, 0, 0, 0, 0};
const byte mask[] = {1,2,4,8,16,32,64,128};
byte led_state[8];
void setup()
{
for (int i = 0; i < 8; i++)
{
pinMode(row_pin[i], OUTPUT);
digitalWrite(row_pin[i], ROW_OFF);
pinMode(column_pin[i], OUTPUT);
digitalWrite(column_pin[i], COL_OFF);
led_state[i] = blank[i];
}
}
void loop()
{
const byte *frames[] = {invader1, blank, invader2, blank};
for (int frame = 0; frame < 4; frame++)
{
for (int i = 0; i < 8; i++)
{
// Update each row of the current dispay
// by shifting right, and inserting the
// appropriate bits of the next frame
for (int j = 0; j < 8; j++)
{
led_state[j] = (led_state[j] >> 1) |
((frames[frame][j] << (7 - i)));
}
showArray();
}
}
}
void showArray()
{
// Show the array multiple times to slow down
// the "refresh rate"
for (int s = 0; s < SPEED; s++)
{
for(int column = 0; column < 8; column++)
{
// Initially turn off all rows
for(int i = 0; i < 8; i++)
{
digitalWrite(row_pin[i], ROW_OFF);
}
// Turn on this column
digitalWrite(column_pin[column], COL_ON);
// Check the appropriate element of the state
// matrix to see whether to light each row
// in this column.
for (int row = 0; row < 8; row++)
{
if (led_state[column] & mask[row])
{
digitalWrite(row_pin[row], ROW_ON);
}
}
// Delay slightly (too much leads to flickering)
delay(DELAY);
// Turn the column off again
digitalWrite(column_pin[column], COL_OFF);
}
}
}
No comments:
Post a Comment