A sample of SFE's ColorLCDShield library demonstrating Conway's Game of Life

Dependencies:   ColorLCDShield mbed

Committer:
kayekss
Date:
Sun Jun 09 05:04:32 2013 +0000
Revision:
0:bc852e1d0b48
Child:
1:eed4416d3359
A program example using Sparkfun's Color LCD Shield for FRDM-KL25Z boards.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kayekss 0:bc852e1d0b48 1 // ColorLCDShield_Conway
kayekss 0:bc852e1d0b48 2 // ---------------------
kayekss 0:bc852e1d0b48 3 // A program example using Sparkfun's Color LCD Shield for FRDM-KL25Z boards.
kayekss 0:bc852e1d0b48 4 // - https://www.sparkfun.com/products/9363
kayekss 0:bc852e1d0b48 5 // - The library has modified from Sparkfun's Arduino library code
kayekss 0:bc852e1d0b48 6 // - Conway's Life Game simulator in a 128x128 world
kayekss 0:bc852e1d0b48 7
kayekss 0:bc852e1d0b48 8 #include <stdint.h>
kayekss 0:bc852e1d0b48 9 #include "mbed.h"
kayekss 0:bc852e1d0b48 10 #include "ColorLCDShield.h"
kayekss 0:bc852e1d0b48 11 #include "Conway.h"
kayekss 0:bc852e1d0b48 12
kayekss 0:bc852e1d0b48 13 LCDShield lcd;
kayekss 0:bc852e1d0b48 14 DigitalIn sw1(D3);
kayekss 0:bc852e1d0b48 15 DigitalIn sw2(D4);
kayekss 0:bc852e1d0b48 16 DigitalIn sw3(D5);
kayekss 0:bc852e1d0b48 17 AnalogIn seed(A0);
kayekss 0:bc852e1d0b48 18
kayekss 0:bc852e1d0b48 19 Conway life;
kayekss 0:bc852e1d0b48 20 Timer timer;
kayekss 0:bc852e1d0b48 21
kayekss 0:bc852e1d0b48 22 void drawWorld() {
kayekss 0:bc852e1d0b48 23 static bool firstTime = true;
kayekss 0:bc852e1d0b48 24 uint8_t b;
kayekss 0:bc852e1d0b48 25 uint16_t ix8;
kayekss 0:bc852e1d0b48 26
kayekss 0:bc852e1d0b48 27 for (uint8_t j = 0; j < 128; j++) {
kayekss 0:bc852e1d0b48 28 for (uint8_t i = 0; i < 16; i++) {
kayekss 0:bc852e1d0b48 29 b = life.world[j][i];
kayekss 0:bc852e1d0b48 30 if (firstTime || b != life.worldTemp[j][i]) {
kayekss 0:bc852e1d0b48 31 ix8 = i << 3;
kayekss 0:bc852e1d0b48 32 lcd.setPixel(b & 0x80 ? 0xfff : 0x000, j, ix8);
kayekss 0:bc852e1d0b48 33 lcd.setPixel(b & 0x40 ? 0xfff : 0x000, j, ix8 + 1);
kayekss 0:bc852e1d0b48 34 lcd.setPixel(b & 0x20 ? 0xfff : 0x000, j, ix8 + 2);
kayekss 0:bc852e1d0b48 35 lcd.setPixel(b & 0x10 ? 0xfff : 0x000, j, ix8 + 3);
kayekss 0:bc852e1d0b48 36 lcd.setPixel(b & 0x08 ? 0xfff : 0x000, j, ix8 + 4);
kayekss 0:bc852e1d0b48 37 lcd.setPixel(b & 0x04 ? 0xfff : 0x000, j, ix8 + 5);
kayekss 0:bc852e1d0b48 38 lcd.setPixel(b & 0x02 ? 0xfff : 0x000, j, ix8 + 6);
kayekss 0:bc852e1d0b48 39 lcd.setPixel(b & 0x01 ? 0xfff : 0x000, j, ix8 + 7);
kayekss 0:bc852e1d0b48 40 }
kayekss 0:bc852e1d0b48 41 }
kayekss 0:bc852e1d0b48 42 }
kayekss 0:bc852e1d0b48 43 firstTime = false;
kayekss 0:bc852e1d0b48 44 }
kayekss 0:bc852e1d0b48 45
kayekss 0:bc852e1d0b48 46 void setup() {
kayekss 0:bc852e1d0b48 47 lcd.init(PHILIPS);
kayekss 0:bc852e1d0b48 48 lcd.contrast(-63);
kayekss 0:bc852e1d0b48 49 lcd.clear(0x444);
kayekss 0:bc852e1d0b48 50
kayekss 0:bc852e1d0b48 51 // Blinker ship 1
kayekss 0:bc852e1d0b48 52 // http://conwaylife.com/wiki/Blinker_ship_1
kayekss 0:bc852e1d0b48 53 uint8_t offsetX = 64 >> 3;
kayekss 0:bc852e1d0b48 54 uint8_t offsetY = 64;
kayekss 0:bc852e1d0b48 55
kayekss 0:bc852e1d0b48 56 life.world[offsetY - 4][offsetX - 1] = 0x60;
kayekss 0:bc852e1d0b48 57 life.world[offsetY - 3][offsetX - 1] = 0xd8;
kayekss 0:bc852e1d0b48 58 life.world[offsetY - 2][offsetX - 1] = 0x78;
kayekss 0:bc852e1d0b48 59 life.world[offsetY - 1][offsetX - 1] = 0x31;
kayekss 0:bc852e1d0b48 60 life.world[offsetY ][offsetX - 1] = 0x02;
kayekss 0:bc852e1d0b48 61 life.world[offsetY + 1][offsetX - 1] = 0x31;
kayekss 0:bc852e1d0b48 62 life.world[offsetY + 2][offsetX - 1] = 0x78;
kayekss 0:bc852e1d0b48 63 life.world[offsetY + 3][offsetX - 1] = 0xd8;
kayekss 0:bc852e1d0b48 64 life.world[offsetY + 4][offsetX - 1] = 0x60;
kayekss 0:bc852e1d0b48 65
kayekss 0:bc852e1d0b48 66 life.world[offsetY - 7][offsetX ] = 0x3c;
kayekss 0:bc852e1d0b48 67 life.world[offsetY - 6][offsetX ] = 0x22;
kayekss 0:bc852e1d0b48 68 life.world[offsetY - 5][offsetX ] = 0x20;
kayekss 0:bc852e1d0b48 69 life.world[offsetY - 4][offsetX ] = 0x12;
kayekss 0:bc852e1d0b48 70 life.world[offsetY - 2][offsetX ] = 0x80;
kayekss 0:bc852e1d0b48 71 life.world[offsetY - 1][offsetX ] = 0x60;
kayekss 0:bc852e1d0b48 72 life.world[offsetY ][offsetX ] = 0x20;
kayekss 0:bc852e1d0b48 73 life.world[offsetY + 1][offsetX ] = 0x60;
kayekss 0:bc852e1d0b48 74 life.world[offsetY + 2][offsetX ] = 0x80;
kayekss 0:bc852e1d0b48 75 life.world[offsetY + 4][offsetX ] = 0x12;
kayekss 0:bc852e1d0b48 76 life.world[offsetY + 5][offsetX ] = 0x20;
kayekss 0:bc852e1d0b48 77 life.world[offsetY + 6][offsetX ] = 0x22;
kayekss 0:bc852e1d0b48 78 life.world[offsetY + 7][offsetX ] = 0x3c;
kayekss 0:bc852e1d0b48 79
kayekss 0:bc852e1d0b48 80 life.world[offsetY - 1][offsetX + 1] = 0x10;
kayekss 0:bc852e1d0b48 81 life.world[offsetY ][offsetX + 1] = 0x10;
kayekss 0:bc852e1d0b48 82 life.world[offsetY + 1][offsetX + 1] = 0x10;
kayekss 0:bc852e1d0b48 83
kayekss 0:bc852e1d0b48 84 life.world[offsetY - 1][offsetX + 2] = 0xe0;
kayekss 0:bc852e1d0b48 85 life.world[offsetY ][offsetX + 2] = 0xa0;
kayekss 0:bc852e1d0b48 86 life.world[offsetY + 1][offsetX + 2] = 0xe0;
kayekss 0:bc852e1d0b48 87
kayekss 0:bc852e1d0b48 88 drawWorld();
kayekss 0:bc852e1d0b48 89
kayekss 0:bc852e1d0b48 90 // Start timer
kayekss 0:bc852e1d0b48 91 timer.start();
kayekss 0:bc852e1d0b48 92 }
kayekss 0:bc852e1d0b48 93
kayekss 0:bc852e1d0b48 94 void switches() {
kayekss 0:bc852e1d0b48 95 static bool sw1Prev, sw2Prev, sw3Prev;
kayekss 0:bc852e1d0b48 96
kayekss 0:bc852e1d0b48 97 if (!sw1 && sw1Prev) {
kayekss 0:bc852e1d0b48 98 life.randomizeWorld25(seed.read_u16());
kayekss 0:bc852e1d0b48 99 }
kayekss 0:bc852e1d0b48 100 if (!sw2 && sw2Prev) {
kayekss 0:bc852e1d0b48 101 life.randomizeWorld(seed.read_u16());
kayekss 0:bc852e1d0b48 102 }
kayekss 0:bc852e1d0b48 103 if (!sw3 && sw3Prev) {
kayekss 0:bc852e1d0b48 104 life.randomizeWorld75(seed.read_u16());
kayekss 0:bc852e1d0b48 105 }
kayekss 0:bc852e1d0b48 106
kayekss 0:bc852e1d0b48 107 sw1Prev = sw1;
kayekss 0:bc852e1d0b48 108 sw2Prev = sw2;
kayekss 0:bc852e1d0b48 109 sw3Prev = sw3;
kayekss 0:bc852e1d0b48 110 }
kayekss 0:bc852e1d0b48 111
kayekss 0:bc852e1d0b48 112 void loop() {
kayekss 0:bc852e1d0b48 113 int32_t t = timer.read_ms();
kayekss 0:bc852e1d0b48 114 static int32_t prevSwitch = t;
kayekss 0:bc852e1d0b48 115
kayekss 0:bc852e1d0b48 116 if (t >= prevSwitch + 20 || t < prevSwitch) {
kayekss 0:bc852e1d0b48 117 prevSwitch = t;
kayekss 0:bc852e1d0b48 118 switches();
kayekss 0:bc852e1d0b48 119 }
kayekss 0:bc852e1d0b48 120
kayekss 0:bc852e1d0b48 121 life.nextGeneration();
kayekss 0:bc852e1d0b48 122 life.swap();
kayekss 0:bc852e1d0b48 123 drawWorld();
kayekss 0:bc852e1d0b48 124 }
kayekss 0:bc852e1d0b48 125
kayekss 0:bc852e1d0b48 126 int main() {
kayekss 0:bc852e1d0b48 127 setup();
kayekss 0:bc852e1d0b48 128
kayekss 0:bc852e1d0b48 129 while (1) {
kayekss 0:bc852e1d0b48 130 loop();
kayekss 0:bc852e1d0b48 131 }
kayekss 0:bc852e1d0b48 132 }