В вашем конкретном случае вы можете включить первый и последний ряд, например, на 1 мсек, затем включить первый и последний столбец на 1 мсек и повторить это. Кроме того, я предлагаю отключить все светодиоды перед включением нового шаблона.
void loop() {
static int show_rows = 0;
switch_all_off();
if(show_rows) {
first_last_row();
} else {
first_last_column();
}
show_rows = !show_rows;
delay(10);
}
void switch_all_off()
{
int off = 0;
for( j = 0 ; j < Loop_Count ; j++ )
{
digitalWrite(Led_Row_Pins[i],off);
digitalWrite(Led_Column_Pins[j],!off);
}
}
На этом первом шаге светодиоды, содержащиеся как в строках, так и в столбцах, будут ярче. Чтобы исправить это, вы можете исключить угловые светодиоды либо из строк, либо из столбцов, например,
void first_last_column()
{
for( j = 0 ; j < Loop_Count ; j++ )// Led First And Last Column
{
for( i = 0 ; i < Loop_Count ; i++)
{
if((i != 0) && (i != 4) && ( j == 0 || j == 4 ))
{
digitalWrite(Led_Row_Pins[i],state);// Led_On_State
digitalWrite(Led_Column_Pins[j],!state);
}
}
}
}
. Для более общего решения вам нужно циклически перебирать строки, активировать одну строку за другой и переключатьВыводы столбцов, необходимые для текущей строки.
#define MAXLEDS 5
int states[MAXLEDS][MAXLEDS] = {
{ 1, 0, 0, 0, 1 },
{ 0, 1, 0, 1, 0 },
{ 0, 0, 1, 0, 0 },
{ 0, 1, 0, 1, 0 },
{ 1, 0, 0, 0, 1 }
};
void switch_leds(int row) {
int i;
/* switch off all rows */
for(i = 0; i < MAXLEDS, i++) {
digitalWrite(Led_Row_Pins[i], 0);
}
/* switch columns according to current row */
for(i = 0; i < MAXLEDS; i++) {
digitalWrite(Led_Column_Pins[i], !states[row][i]);
}
/* switch on current row */
digitalWrite(Led_Row_Pins[row], 1);
}
void loop() {
static int row = 0;
/* switch on LEDs in a single row */
switch_leds(row);
/* next row */
row++; row %= MAXLEDS;
/* The processing delay between calls to loop() is added to this delay. */
delay(5);
}
Все примеры кода не проверены и могут содержать ошибки.