LEDDE matrisen - livets spel (3 / 3 steg)
Steg 3: kod
8 x 8 LED matrix raden och kolumnen stift
CONST int rader [8] = {52, 42, 53, 46, 39, 51, 41, 47};
CONST int kolumner [8] = {44, 43, 45, 50, 49, 48, 40, 38};
knappen PINs
CONST int RANDOMIZE_BUTTON = 8;
CONST int START_BUTTON = 9;
gloabal variabler
bool började = false;
bool fältet [8] [8] = {};
bool nextField [8] [8] = {};
osignerade långa lastMillis = 0;
void setup() {
Konfigurera alla stift
för (int jag = 0; jag < 8; i ++)
{
pinMode (rader [i], produktionen);
pinMode (kolumner [i], produktionen);
}
pinMode (RANDOMIZE_BUTTON, indata);
pinMode (START_BUTTON, indata);
}
void loop() {
Läs knapplägen
int randomizeButton = digitalRead(RANDOMIZE_BUTTON);
int StartOch = digitalRead(START_BUTTON);
om (randomizeButton) {/ / stannar och sätter ett slumpmässigt fält
började = false;
för (int jag = 0; jag < 8; i ++) {
för (int j = 0; j < 8; j ++) {
fältet [i] [j] = random(2);
}
}
Delay(200);
} else om (startknapp) {/ / startar eller stoppar iterationerna
började =! började;
Delay(200);
} else om (började) {
beräkna nästa fält
om (millis() - 1000 > lastMillis) {//delay varje iteration av 1000 millisekunder
fillNextField();
för (int y = 0; y < 8; y ++) {
för (int x = 0, x < 8, x ++) {
fältet [y] [x] = nextField [y] [x];
}
}
lastMillis = millis();
}
}
uppdatera matrisen 8 x 8 LED
refreshScreen();
}
beräknar statligt av nästa iteration
void fillNextField() {
för (int y = 0; y < 8; y ++) {
för (int x = 0, x < 8, x ++) {
nextField [y] [x] = getCellsNextState (x, y);
}
}
}
Returnerar cellens nästa läge, sant om levande, false annars
bool getCellsNextState (int x, int y) {
bool shouldBeAlive = false;
shouldBeAlive | = (! fältet [y] [x] & & countAliveNeighbours (x, y) == 3);
shouldBeAlive | = (fältet [y] [x] & & countAliveNeighbours (x, y) == 3);
shouldBeAlive | = (fältet [y] [x] & & countAliveNeighbours (x, y) == 2);
återvända shouldBeAlive;
}
räknas de levande grannarna detta steg
int countAliveNeighbours (int x, int y) {
int retVal = 0;
för (int rad = y - 1; rad < = y + 1; rad ++) {
för (int col = x - 1; col < = x + 1; col ++) {
om ((rad == y & & col == x) || (raden < 0) || (raden > 7) || (col < 0) || (col > 7)) fortsätta;
om (field[row][col]) retVal ++;
}
}
returnera retVal;
}
uppdaterar 8 x 8 ledde matrisen
void refreshScreen() {
iterera över raderna (anoder):
för (int rad = 0; rad < 8; rad ++) {
ta den rad pin (anod) hög:
digitalWrite (rader [rad], hög);
iterera över cols (katod):
för (int col = 0; col < 8; col ++) {
får tillståndet för den aktuella pixeln.
int thisPixel = fält [rad] [col];
När raden är hög och col är låg,
den där de möter tänds:
digitalWrite (kolumner [col], thisPixel? LÅG: HÖG);
Inaktivera pixeln:
om (thisPixel) {
digitalWrite (kolumner [col], hög).
}
}
ta raden pin låg för att stänga av hela raden:
digitalWrite (rader [rad], låg);
}
}