Skip to content

Instantly share code, notes, and snippets.

@thata
Created August 7, 2018 20:48
Show Gist options
  • Save thata/a6c5dcc73a49416a0a7f59ba40087ae7 to your computer and use it in GitHub Desktop.
Save thata/a6c5dcc73a49416a0a7f59ba40087ae7 to your computer and use it in GitHub Desktop.
TFT液晶でライフゲーム。
#include <Adafruit_GFX.h>
#include <gfxfont.h>
#include <Adafruit_TFTLCD.h>
#include <pin_magic.h>
#include <registers.h>
// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
// double up the pins with the touch screen (see the TFT paint example).
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin
// When using the BREAKOUT BOARD only, use these 8 data lines to the LCD:
// For the Arduino Uno, Duemilanove, Diecimila, etc.:
// D0 connects to digital pin 8 (Notice these are
// D1 connects to digital pin 9 NOT in order!)
// D2 connects to digital pin 2
// D3 connects to digital pin 3
// D4 connects to digital pin 4
// D5 connects to digital pin 5
// D6 connects to digital pin 6
// D7 connects to digital pin 7
// For the Arduino Mega, use digital pins 22 through 29
// (on the 2-row header at the end of the board).
// Assign human-readable names to some common 16-bit color values:
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
boolean cells[8][8] = {
{ false, true, false, false, false, false, false, false },
{ false, true, false, true, false, false, false, false },
{ false, true, true, false, false, false, false, false },
{ false, false, false, false, false, false, false, false },
{ false, false, false, false, false, false, false, false },
{ false, false, false, false, false, false, false, false },
{ false, false, false, false, false, false, false, false },
{ false, false, false, false, false, false, false, false },
};
void next_generation() {
boolean new_cells[8][8] = {
{ false, false, false, false, false, false, false, false },
{ false, false, false, false, false, false, false, false },
{ false, false, false, false, false, false, false, false },
{ false, false, false, false, false, false, false, false },
{ false, false, false, false, false, false, false, false },
{ false, false, false, false, false, false, false, false },
{ false, false, false, false, false, false, false, false },
{ false, false, false, false, false, false, false, false },
};
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 8; y++) {
new_cells[y][x] = next_generation_cell(x, y);
}
}
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 8; y++) {
cells[y][x] = new_cells[y][x];
}
}
}
int neighbors(int x, int y) {
int n = 0;
int _x = 0;
int _y = 0;
// left
_x = (x == 0) ? 7: (x - 1);
_y = y;
if (is_alive(_x, _y)) {
n += 1;
}
// right
_x = (x == 7) ? 0: (x + 1);
_y = y;
if (is_alive(_x, _y)) {
n += 1;
}
// up
_x = x;
_y = (y == 0) ? 7: y - 1;
if (is_alive(_x, _y)) {
n += 1;
}
// down
_x = x;
_y = (y == 7) ? 0: y + 1;
if (is_alive(_x, _y)) {
n += 1;
}
// upleft
_x = (x == 0) ? 7: (x - 1);
_y = (y == 0) ? 7: y - 1;
if (is_alive(_x, _y)) {
n += 1;
}
// upright
_x = (x == 7) ? 0: (x + 1);
_y = (y == 0) ? 7: y - 1;
if (is_alive(_x, _y)) {
n += 1;
}
// downleft
_x = (x == 0) ? 7: (x - 1);
_y = (y == 7) ? 0: y + 1;
if (is_alive(_x, _y)) {
n += 1;
}
// downright
_x = (x == 7) ? 0: (x + 1);
_y = (y == 7) ? 0: y + 1;
if (is_alive(_x, _y)) {
n += 1;
}
return n;
}
boolean is_alive(int x, int y) {
return cells[y][x];
}
boolean next_generation_cell(int x, int y) {
if (is_alive(x, y)) {
if (neighbors(x, y) < 2 || neighbors(x, y) >= 4) {
// 2未満、4以上は死
return false;
} else {
// それ以外はそのまま
return true;
}
} else {
if (neighbors(x, y) == 3) {
// 3の場合は誕生
return true;
} else {
// それ以外はそのまま
return false;
}
}
}
void randomCell() {
// ランダムで初期化
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 8; y++) {
cells[y][x] = random(2) == 0;
}
}
}
void setup(void) {
Serial.begin(9600);
Serial.println(F("TFT LCD test"));
#ifdef USE_ADAFRUIT_SHIELD_PINOUT
Serial.println(F("Using Adafruit 2.8\" TFT Arduino Shield Pinout"));
#else
Serial.println(F("Using Adafruit 2.8\" TFT Breakout Board Pinout"));
#endif
Serial.print("TFT size is "); Serial.print(tft.width()); Serial.print("x"); Serial.println(tft.height());
tft.reset();
uint16_t identifier = tft.readID();
if(identifier == 0x9325) {
Serial.println(F("Found ILI9325 LCD driver"));
} else if(identifier == 0x9328) {
Serial.println(F("Found ILI9328 LCD driver"));
} else if(identifier == 0x7575) {
Serial.println(F("Found HX8347G LCD driver"));
} else if(identifier == 0x9341) {
Serial.println(F("Found ILI9341 LCD driver"));
} else if(identifier == 0x8357) {
Serial.println(F("Found HX8357D LCD driver"));
} else {
Serial.print(F("Unknown LCD driver chip: "));
Serial.println(identifier, HEX);
Serial.println(F("If using the Adafruit 2.8\" TFT Arduino shield, the line:"));
Serial.println(F(" #define USE_ADAFRUIT_SHIELD_PINOUT"));
Serial.println(F("should appear in the library header (Adafruit_TFT.h)."));
Serial.println(F("If using the breakout board, it should NOT be #defined!"));
Serial.println(F("Also if using the breakout, double-check that all wiring"));
Serial.println(F("matches the tutorial."));
return;
}
tft.begin(identifier);
Serial.println(F("Benchmark Time (microseconds)"));
tft.fillScreen(WHITE);
randomSeed(analogRead(0));
//randomCell();
}
void loop() {
int n = 25;
// put your main code here, to run repeatedly:
// 枠だけ描画
for (int w=0; w<8; w++) {
for (int h=0; h<8; h++) {
int left_start = 10;
int top_start = 10;
tft.drawRect(w * (n + 1) + left_start, h * (n + 1) + top_start, n, n, BLACK);
}
}
// 生きてるセルを描画
for (int w=0; w<8; w++) {
for (int h=0; h<8; h++) {
int left_start = 10;
int top_start = 10;
if (cells[h][w] == true) {
tft.fillRect(w * (n + 1) + left_start + 1, h * (n + 1) + top_start + 1, n-2, n-2, BLACK);
} else {
tft.fillRect(w * (n + 1) + left_start + 1, h * (n + 1) + top_start + 1, n-2, n-2, WHITE);
}
}
}
next_generation();
delay(250);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment