Various applications using the LCD. Cycle through the applications by pressing down on the joystick

Dependencies:   C12832 MMA7660 mbed

Committer:
jad19925
Date:
Fri Feb 21 22:12:31 2014 +0000
Revision:
0:b8fc40cb537b
Child:
1:ff7ee2c32cd1
LCD Games base

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jad19925 0:b8fc40cb537b 1 #include "mbed.h"
jad19925 0:b8fc40cb537b 2 #include "C12832.h"
jad19925 0:b8fc40cb537b 3 #include "MMA7660.h"
jad19925 0:b8fc40cb537b 4
jad19925 0:b8fc40cb537b 5 BusIn joy(p15,p12,p13,p16);
jad19925 0:b8fc40cb537b 6 DigitalIn fire(p14);
jad19925 0:b8fc40cb537b 7 C12832 lcd(p5, p7, p6, p8, p11);
jad19925 0:b8fc40cb537b 8 AnalogIn pot1(p19);
jad19925 0:b8fc40cb537b 9 AnalogIn pot2(p20);
jad19925 0:b8fc40cb537b 10 DigitalIn joyUp(p15);
jad19925 0:b8fc40cb537b 11 DigitalIn joyDown(p12);
jad19925 0:b8fc40cb537b 12 DigitalIn joyLeft(p13);
jad19925 0:b8fc40cb537b 13 DigitalIn joyRight(p16);
jad19925 0:b8fc40cb537b 14 MMA7660 MMA(p28, p27); //I2C Accelerometer
jad19925 0:b8fc40cb537b 15 Serial pc(USBTX, USBRX); // tx, rx
jad19925 0:b8fc40cb537b 16
jad19925 0:b8fc40cb537b 17 BusOut leds(LED1,LED2,LED3,LED4);
jad19925 0:b8fc40cb537b 18 int appIndex = 0;
jad19925 0:b8fc40cb537b 19 const int NUM_APPS = 4;
jad19925 0:b8fc40cb537b 20 bool appSwitch = true;
jad19925 0:b8fc40cb537b 21 enum SnakeDirection{RIGHT,LEFT,UP,DOWN};
jad19925 0:b8fc40cb537b 22 const int SCREEN_WIDTH = 128;
jad19925 0:b8fc40cb537b 23 const int SCREEN_HEIGHT = 32;
jad19925 0:b8fc40cb537b 24 struct Point {int x; int y;};
jad19925 0:b8fc40cb537b 25 /*
jad19925 0:b8fc40cb537b 26 Index App
jad19925 0:b8fc40cb537b 27 0 Etch a sketch
jad19925 0:b8fc40cb537b 28 1 Flat Level
jad19925 0:b8fc40cb537b 29 2 Snake
jad19925 0:b8fc40cb537b 30 3 ?
jad19925 0:b8fc40cb537b 31 */
jad19925 0:b8fc40cb537b 32
jad19925 0:b8fc40cb537b 33 int main()
jad19925 0:b8fc40cb537b 34 {
jad19925 0:b8fc40cb537b 35 //potentiometer variables
jad19925 0:b8fc40cb537b 36 float etchX = 0;
jad19925 0:b8fc40cb537b 37 float etchY = 0;
jad19925 0:b8fc40cb537b 38 //accelerometer variables
jad19925 0:b8fc40cb537b 39 int x=0,y=0;
jad19925 0:b8fc40cb537b 40 //snake variables
jad19925 0:b8fc40cb537b 41 const int SNAKE_MAX = 256;
jad19925 0:b8fc40cb537b 42 Point snake[SNAKE_MAX];
jad19925 0:b8fc40cb537b 43 int snakeHead = 4;//the front filled square in the snake
jad19925 0:b8fc40cb537b 44 int snakeTail = 0;
jad19925 0:b8fc40cb537b 45 SnakeDirection snakeGo = RIGHT;
jad19925 0:b8fc40cb537b 46 bool gameOver = false;
jad19925 0:b8fc40cb537b 47 int points = 0;
jad19925 0:b8fc40cb537b 48 Point goalLoc;
jad19925 0:b8fc40cb537b 49
jad19925 0:b8fc40cb537b 50 lcd.cls();
jad19925 0:b8fc40cb537b 51 lcd.printf("hello world");
jad19925 0:b8fc40cb537b 52
jad19925 0:b8fc40cb537b 53 while(1) {
jad19925 0:b8fc40cb537b 54 if (fire) {
jad19925 0:b8fc40cb537b 55 appIndex = (appIndex+1)%NUM_APPS;
jad19925 0:b8fc40cb537b 56 leds=0xf;
jad19925 0:b8fc40cb537b 57 appSwitch = true;
jad19925 0:b8fc40cb537b 58 }
jad19925 0:b8fc40cb537b 59 else {
jad19925 0:b8fc40cb537b 60 leds=joy;
jad19925 0:b8fc40cb537b 61 }
jad19925 0:b8fc40cb537b 62
jad19925 0:b8fc40cb537b 63 switch(appIndex) {
jad19925 0:b8fc40cb537b 64 case 0: {
jad19925 0:b8fc40cb537b 65 if(appSwitch){
jad19925 0:b8fc40cb537b 66 lcd.cls();
jad19925 0:b8fc40cb537b 67 lcd.locate(0,0);
jad19925 0:b8fc40cb537b 68 lcd.printf("Etch-a-Sketch");
jad19925 0:b8fc40cb537b 69 wait(2);
jad19925 0:b8fc40cb537b 70 lcd.cls();
jad19925 0:b8fc40cb537b 71 lcd.locate(0,0);
jad19925 0:b8fc40cb537b 72 appSwitch=false;
jad19925 0:b8fc40cb537b 73 }
jad19925 0:b8fc40cb537b 74 //read potentiometers in scaled volatge
jad19925 0:b8fc40cb537b 75 etchY = 32-pot1.read()*32;
jad19925 0:b8fc40cb537b 76 etchX = 128-pot2.read()*128;
jad19925 0:b8fc40cb537b 77 lcd.pixel((int)etchX, (int)etchY, 1);
jad19925 0:b8fc40cb537b 78 lcd.copy_to_lcd();
jad19925 0:b8fc40cb537b 79 x = MMA.x();
jad19925 0:b8fc40cb537b 80 y = MMA.y();
jad19925 0:b8fc40cb537b 81 if(x > .9 || x < -.9 || y > .9 || y < -.9){
jad19925 0:b8fc40cb537b 82 lcd.cls();
jad19925 0:b8fc40cb537b 83 }
jad19925 0:b8fc40cb537b 84 break;}
jad19925 0:b8fc40cb537b 85 case 1: {
jad19925 0:b8fc40cb537b 86 if(appSwitch){
jad19925 0:b8fc40cb537b 87 lcd.cls();
jad19925 0:b8fc40cb537b 88 lcd.locate(0,0);
jad19925 0:b8fc40cb537b 89 lcd.printf("Flat Level");
jad19925 0:b8fc40cb537b 90 wait(2);
jad19925 0:b8fc40cb537b 91 lcd.cls();
jad19925 0:b8fc40cb537b 92 lcd.locate(0,0);
jad19925 0:b8fc40cb537b 93 appSwitch=false;
jad19925 0:b8fc40cb537b 94 }
jad19925 0:b8fc40cb537b 95 //read X,Y +/-Gs and scale for #display pixels
jad19925 0:b8fc40cb537b 96 x = (x + MMA.x() * 32.0)/2.0;
jad19925 0:b8fc40cb537b 97 y = (y -(MMA.y() * 16.0))/2.0;
jad19925 0:b8fc40cb537b 98 lcd.fillcircle(x+63, y+15, 3, 1); //draw bubble
jad19925 0:b8fc40cb537b 99 lcd.line(0, 11, 127, 11, 1);
jad19925 0:b8fc40cb537b 100 lcd.line(0, 20, 127, 20, 1);
jad19925 0:b8fc40cb537b 101 lcd.line(59, 0, 59, 31, 1);
jad19925 0:b8fc40cb537b 102 lcd.line(68, 0, 68, 31, 1);
jad19925 0:b8fc40cb537b 103 //lcd.circle(63, 15, 8, 1);
jad19925 0:b8fc40cb537b 104 wait(.2); //time delay
jad19925 0:b8fc40cb537b 105 lcd.fillcircle(x+63, y+15, 3, 0); //erase bubble
jad19925 0:b8fc40cb537b 106 break;}
jad19925 0:b8fc40cb537b 107 case 2: {//snake
jad19925 0:b8fc40cb537b 108 if(appSwitch || gameOver){
jad19925 0:b8fc40cb537b 109 lcd.cls();
jad19925 0:b8fc40cb537b 110 lcd.locate(0,0);
jad19925 0:b8fc40cb537b 111 lcd.printf("Snake");
jad19925 0:b8fc40cb537b 112
jad19925 0:b8fc40cb537b 113 //setup new snake
jad19925 0:b8fc40cb537b 114 snakeTail = 0;
jad19925 0:b8fc40cb537b 115 snakeHead = 4;
jad19925 0:b8fc40cb537b 116 snakeGo = RIGHT;
jad19925 0:b8fc40cb537b 117 snake[0].x = 0;
jad19925 0:b8fc40cb537b 118 snake[0].y = 14;
jad19925 0:b8fc40cb537b 119 snake[1].x = 2;
jad19925 0:b8fc40cb537b 120 snake[1].y = 14;
jad19925 0:b8fc40cb537b 121 snake[2].x = 4;
jad19925 0:b8fc40cb537b 122 snake[2].y = 14;
jad19925 0:b8fc40cb537b 123 snake[3].x = 6;
jad19925 0:b8fc40cb537b 124 snake[3].y = 14;
jad19925 0:b8fc40cb537b 125 snake[4].x = 8;
jad19925 0:b8fc40cb537b 126 snake[4].y = 14;
jad19925 0:b8fc40cb537b 127 gameOver = false;
jad19925 0:b8fc40cb537b 128 points = 0;
jad19925 0:b8fc40cb537b 129 float seed = pot1.read()*pot2.read()*100000;
jad19925 0:b8fc40cb537b 130 srand((int)seed);
jad19925 0:b8fc40cb537b 131 goalLoc.x = (rand()%64)*2;
jad19925 0:b8fc40cb537b 132 goalLoc.y = (rand()%16)*2;
jad19925 0:b8fc40cb537b 133
jad19925 0:b8fc40cb537b 134 wait(2);
jad19925 0:b8fc40cb537b 135 lcd.cls();
jad19925 0:b8fc40cb537b 136 lcd.locate(0,0);
jad19925 0:b8fc40cb537b 137 appSwitch=false;
jad19925 0:b8fc40cb537b 138
jad19925 0:b8fc40cb537b 139 //draw initial snake
jad19925 0:b8fc40cb537b 140 for(int i = 0; i<=snakeHead; i++){
jad19925 0:b8fc40cb537b 141 lcd.fillrect(snake[i].x, snake[i].y, snake[i].x+1, snake[i].y+1, 1);
jad19925 0:b8fc40cb537b 142 }
jad19925 0:b8fc40cb537b 143 //draw initial goal location
jad19925 0:b8fc40cb537b 144 lcd.fillrect(goalLoc.x, goalLoc.y, goalLoc.x+1, goalLoc.y+1, 1);
jad19925 0:b8fc40cb537b 145 lcd.copy_to_lcd();
jad19925 0:b8fc40cb537b 146
jad19925 0:b8fc40cb537b 147 //wait for user to see snake before moving
jad19925 0:b8fc40cb537b 148 wait(1);
jad19925 0:b8fc40cb537b 149 }
jad19925 0:b8fc40cb537b 150
jad19925 0:b8fc40cb537b 151 //read joystick to get new direction
jad19925 0:b8fc40cb537b 152 if(joyUp && DOWN != snakeGo)
jad19925 0:b8fc40cb537b 153 {snakeGo = UP;}
jad19925 0:b8fc40cb537b 154 if(joyDown && UP != snakeGo)
jad19925 0:b8fc40cb537b 155 {snakeGo = DOWN;}
jad19925 0:b8fc40cb537b 156 if(joyLeft && RIGHT != snakeGo)
jad19925 0:b8fc40cb537b 157 {snakeGo = LEFT;}
jad19925 0:b8fc40cb537b 158 if(joyRight && LEFT != snakeGo)
jad19925 0:b8fc40cb537b 159 {snakeGo = RIGHT;}
jad19925 0:b8fc40cb537b 160
jad19925 0:b8fc40cb537b 161 //move snake
jad19925 0:b8fc40cb537b 162 switch(snakeGo){
jad19925 0:b8fc40cb537b 163 case RIGHT:
jad19925 0:b8fc40cb537b 164 //clear tail
jad19925 0:b8fc40cb537b 165 lcd.fillrect(snake[snakeTail].x, snake[snakeTail].y, snake[snakeTail].x+1, snake[snakeTail].y+1, 0);
jad19925 0:b8fc40cb537b 166 snakeTail = (snakeTail+1)%SNAKE_MAX;
jad19925 0:b8fc40cb537b 167 //draw new front
jad19925 0:b8fc40cb537b 168 snake[snakeHead+1].x = snake[snakeHead].x + 2;
jad19925 0:b8fc40cb537b 169 snake[snakeHead+1].y = snake[snakeHead].y;
jad19925 0:b8fc40cb537b 170 snakeHead = (snakeHead+1)%SNAKE_MAX;
jad19925 0:b8fc40cb537b 171 lcd.fillrect(snake[snakeHead].x, snake[snakeHead].y, snake[snakeHead].x+1, snake[snakeHead].y+1, 1);
jad19925 0:b8fc40cb537b 172 //copy to lcd
jad19925 0:b8fc40cb537b 173 lcd.copy_to_lcd();
jad19925 0:b8fc40cb537b 174 //check if we went off the screen
jad19925 0:b8fc40cb537b 175 if(snake[snakeHead].x >= SCREEN_WIDTH){
jad19925 0:b8fc40cb537b 176 gameOver = true;
jad19925 0:b8fc40cb537b 177 pc.printf("Off screen to right\n");
jad19925 0:b8fc40cb537b 178 }
jad19925 0:b8fc40cb537b 179 break;
jad19925 0:b8fc40cb537b 180 case LEFT:
jad19925 0:b8fc40cb537b 181 //clear tail
jad19925 0:b8fc40cb537b 182 lcd.fillrect(snake[snakeTail].x, snake[snakeTail].y, snake[snakeTail].x+1, snake[snakeTail].y+1, 0);
jad19925 0:b8fc40cb537b 183 snakeTail = (snakeTail+1)%SNAKE_MAX;
jad19925 0:b8fc40cb537b 184 //draw new front
jad19925 0:b8fc40cb537b 185 snake[snakeHead+1].x = snake[snakeHead].x - 2;
jad19925 0:b8fc40cb537b 186 snake[snakeHead+1].y = snake[snakeHead].y;
jad19925 0:b8fc40cb537b 187 snakeHead = (snakeHead+1)%SNAKE_MAX;
jad19925 0:b8fc40cb537b 188 lcd.fillrect(snake[snakeHead].x, snake[snakeHead].y, snake[snakeHead].x+1, snake[snakeHead].y+1, 1);
jad19925 0:b8fc40cb537b 189 //copy to lcd
jad19925 0:b8fc40cb537b 190 lcd.copy_to_lcd();
jad19925 0:b8fc40cb537b 191 //check if we went off the screen
jad19925 0:b8fc40cb537b 192 if(snake[snakeHead].x < 0){
jad19925 0:b8fc40cb537b 193 gameOver = true;
jad19925 0:b8fc40cb537b 194 pc.printf("Off screen to left\n");
jad19925 0:b8fc40cb537b 195 }
jad19925 0:b8fc40cb537b 196 break;
jad19925 0:b8fc40cb537b 197 case UP:
jad19925 0:b8fc40cb537b 198 //clear tail
jad19925 0:b8fc40cb537b 199 lcd.fillrect(snake[snakeTail].x, snake[snakeTail].y, snake[snakeTail].x+1, snake[snakeTail].y+1, 0);
jad19925 0:b8fc40cb537b 200 snakeTail = (snakeTail+1)%SNAKE_MAX;
jad19925 0:b8fc40cb537b 201 //draw new front
jad19925 0:b8fc40cb537b 202 snake[snakeHead+1].x = snake[snakeHead].x;
jad19925 0:b8fc40cb537b 203 snake[snakeHead+1].y = snake[snakeHead].y - 2;
jad19925 0:b8fc40cb537b 204 snakeHead = (snakeHead+1)%SNAKE_MAX;
jad19925 0:b8fc40cb537b 205 lcd.fillrect(snake[snakeHead].x, snake[snakeHead].y, snake[snakeHead].x+1, snake[snakeHead].y+1, 1);
jad19925 0:b8fc40cb537b 206 //copy to lcd
jad19925 0:b8fc40cb537b 207 lcd.copy_to_lcd();
jad19925 0:b8fc40cb537b 208 //check if we went off the screen
jad19925 0:b8fc40cb537b 209 if(snake[snakeHead].y < 0){
jad19925 0:b8fc40cb537b 210 gameOver = true;
jad19925 0:b8fc40cb537b 211 pc.printf("Off screen top\n");
jad19925 0:b8fc40cb537b 212 }
jad19925 0:b8fc40cb537b 213 //wait?
jad19925 0:b8fc40cb537b 214 break;
jad19925 0:b8fc40cb537b 215 case DOWN:
jad19925 0:b8fc40cb537b 216 //clear tail
jad19925 0:b8fc40cb537b 217 lcd.fillrect(snake[snakeTail].x, snake[snakeTail].y, snake[snakeTail].x+1, snake[snakeTail].y+1, 0);
jad19925 0:b8fc40cb537b 218 snakeTail = (snakeTail+1)%SNAKE_MAX;
jad19925 0:b8fc40cb537b 219 //draw new front
jad19925 0:b8fc40cb537b 220 snake[snakeHead+1].x = snake[snakeHead].x;
jad19925 0:b8fc40cb537b 221 snake[snakeHead+1].y = snake[snakeHead].y + 2;
jad19925 0:b8fc40cb537b 222 snakeHead = (snakeHead+1)%SNAKE_MAX;
jad19925 0:b8fc40cb537b 223 lcd.fillrect(snake[snakeHead].x, snake[snakeHead].y, snake[snakeHead].x+1, snake[snakeHead].y+1, 1);
jad19925 0:b8fc40cb537b 224 //copy to lcd
jad19925 0:b8fc40cb537b 225 lcd.copy_to_lcd();
jad19925 0:b8fc40cb537b 226 //check if we went off the screen
jad19925 0:b8fc40cb537b 227 if(snake[snakeHead].y >= SCREEN_HEIGHT){
jad19925 0:b8fc40cb537b 228 gameOver = true;
jad19925 0:b8fc40cb537b 229 pc.printf("Off screen bottom\n");
jad19925 0:b8fc40cb537b 230 }
jad19925 0:b8fc40cb537b 231 //wait?
jad19925 0:b8fc40cb537b 232 break;
jad19925 0:b8fc40cb537b 233 }
jad19925 0:b8fc40cb537b 234 //check if we scored a point
jad19925 0:b8fc40cb537b 235 if(snake[snakeHead].x == goalLoc.x && snake[snakeHead].y == goalLoc.y){
jad19925 0:b8fc40cb537b 236 points++;
jad19925 0:b8fc40cb537b 237 //clear old goal and set new goal
jad19925 0:b8fc40cb537b 238 lcd.fillrect(goalLoc.x, goalLoc.y, goalLoc.x+1, goalLoc.y+1, 0);
jad19925 0:b8fc40cb537b 239 goalLoc.x = (rand()%64)*2;
jad19925 0:b8fc40cb537b 240 goalLoc.y = (rand()%16)*2;
jad19925 0:b8fc40cb537b 241 lcd.fillrect(goalLoc.x, goalLoc.y, goalLoc.x+1, goalLoc.y+1, 1);
jad19925 0:b8fc40cb537b 242
jad19925 0:b8fc40cb537b 243 //add on to the tail
jad19925 0:b8fc40cb537b 244 int newTail = (snakeTail-1+SNAKE_MAX)%SNAKE_MAX;
jad19925 0:b8fc40cb537b 245 snake[newTail].x = snake[snakeTail].x;
jad19925 0:b8fc40cb537b 246 snake[newTail].y = snake[snakeTail].y;
jad19925 0:b8fc40cb537b 247 snakeTail = newTail;
jad19925 0:b8fc40cb537b 248
jad19925 0:b8fc40cb537b 249 //copy everything to the lcd
jad19925 0:b8fc40cb537b 250 lcd.copy_to_lcd();
jad19925 0:b8fc40cb537b 251 if(points > SNAKE_MAX-5)
jad19925 0:b8fc40cb537b 252 {
jad19925 0:b8fc40cb537b 253 gameOver = true;
jad19925 0:b8fc40cb537b 254 pc.printf("Game Winner!\n");
jad19925 0:b8fc40cb537b 255 }
jad19925 0:b8fc40cb537b 256 }
jad19925 0:b8fc40cb537b 257 //check if we hit ourself
jad19925 0:b8fc40cb537b 258 int testLimit = snakeHead;
jad19925 0:b8fc40cb537b 259 if(snakeTail > snakeHead){
jad19925 0:b8fc40cb537b 260 testLimit = snakeHead+SNAKE_MAX;
jad19925 0:b8fc40cb537b 261 }
jad19925 0:b8fc40cb537b 262 for(int i = snakeTail; i < testLimit; i++){
jad19925 0:b8fc40cb537b 263 int iMod = i%SNAKE_MAX;
jad19925 0:b8fc40cb537b 264 if(snake[snakeHead].x == snake[iMod].x && snake[snakeHead].y == snake[iMod].y){
jad19925 0:b8fc40cb537b 265 gameOver = true;
jad19925 0:b8fc40cb537b 266 pc.printf("Hit Self\n");
jad19925 0:b8fc40cb537b 267 }
jad19925 0:b8fc40cb537b 268 }
jad19925 0:b8fc40cb537b 269
jad19925 0:b8fc40cb537b 270 if(gameOver){
jad19925 0:b8fc40cb537b 271 //lcd.cls();
jad19925 0:b8fc40cb537b 272 lcd.locate(0,0);
jad19925 0:b8fc40cb537b 273 lcd.printf("Game Over, Press Joystick to start over\nPoints Scored: %d",points);
jad19925 0:b8fc40cb537b 274 pc.printf("Game Over\n");
jad19925 0:b8fc40cb537b 275 while(!fire){
jad19925 0:b8fc40cb537b 276 //infinite loop to wait for user to press joystick to restart
jad19925 0:b8fc40cb537b 277 }
jad19925 0:b8fc40cb537b 278 wait(.5);
jad19925 0:b8fc40cb537b 279 }
jad19925 0:b8fc40cb537b 280
jad19925 0:b8fc40cb537b 281 break;}
jad19925 0:b8fc40cb537b 282 case 3: {
jad19925 0:b8fc40cb537b 283 if(appSwitch){
jad19925 0:b8fc40cb537b 284 lcd.cls();
jad19925 0:b8fc40cb537b 285 lcd.locate(0,0);
jad19925 0:b8fc40cb537b 286 lcd.printf("Horizontal Level");
jad19925 0:b8fc40cb537b 287 wait(2);
jad19925 0:b8fc40cb537b 288 lcd.cls();
jad19925 0:b8fc40cb537b 289 lcd.locate(0,0);
jad19925 0:b8fc40cb537b 290 appSwitch=false;
jad19925 0:b8fc40cb537b 291 }
jad19925 0:b8fc40cb537b 292 break;}
jad19925 0:b8fc40cb537b 293 default: {
jad19925 0:b8fc40cb537b 294 lcd.cls();
jad19925 0:b8fc40cb537b 295 lcd.locate(0,0);
jad19925 0:b8fc40cb537b 296 lcd.printf("Error: appIndex out of range - appIndes=%d",appIndex);
jad19925 0:b8fc40cb537b 297 break;}
jad19925 0:b8fc40cb537b 298 }
jad19925 0:b8fc40cb537b 299
jad19925 0:b8fc40cb537b 300
jad19925 0:b8fc40cb537b 301 wait(0.1);
jad19925 0:b8fc40cb537b 302 }
jad19925 0:b8fc40cb537b 303 }