ThumbIt Repository - use thumb joystick to navigate ball through maze.

Dependencies:   4DGL-uLCD-SE mbed

Committer:
pwilson39
Date:
Wed Mar 11 16:10:21 2015 +0000
Revision:
0:62fc2a3fb443
Completion of Lab4 with shiftbrite

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pwilson39 0:62fc2a3fb443 1 #include "mbed.h"
pwilson39 0:62fc2a3fb443 2 #include "uLCD_4DGL.h"
pwilson39 0:62fc2a3fb443 3
pwilson39 0:62fc2a3fb443 4 uLCD_4DGL uLCD(p28, p27, p29);
pwilson39 0:62fc2a3fb443 5 AnalogIn AnalogX(p18);
pwilson39 0:62fc2a3fb443 6 AnalogIn AnalogY(p19);
pwilson39 0:62fc2a3fb443 7
pwilson39 0:62fc2a3fb443 8 int grid_field[7][7];
pwilson39 0:62fc2a3fb443 9 int xLocs[13];
pwilson39 0:62fc2a3fb443 10 int yLocs[13];
pwilson39 0:62fc2a3fb443 11 int round = 1;
pwilson39 0:62fc2a3fb443 12
pwilson39 0:62fc2a3fb443 13 //Cycles through different colors on RGB LED
pwilson39 0:62fc2a3fb443 14 SPI spi(p11, p12, p13);
pwilson39 0:62fc2a3fb443 15 DigitalOut latch(p15);
pwilson39 0:62fc2a3fb443 16 DigitalOut enable(p16);
pwilson39 0:62fc2a3fb443 17
pwilson39 0:62fc2a3fb443 18 //Methods
pwilson39 0:62fc2a3fb443 19 void lcdSetup();
pwilson39 0:62fc2a3fb443 20 void createGrid();
pwilson39 0:62fc2a3fb443 21 void drawGrid();
pwilson39 0:62fc2a3fb443 22 void fillGrid();
pwilson39 0:62fc2a3fb443 23 void initGrid();
pwilson39 0:62fc2a3fb443 24 void createGrid1();
pwilson39 0:62fc2a3fb443 25 void createGrid2();
pwilson39 0:62fc2a3fb443 26 void createGrid3();
pwilson39 0:62fc2a3fb443 27 void drawBorder();
pwilson39 0:62fc2a3fb443 28 void drawRoundInfo();
pwilson39 0:62fc2a3fb443 29 void moveBall();
pwilson39 0:62fc2a3fb443 30 void RGB_LED(int red, int green, int blue);
pwilson39 0:62fc2a3fb443 31
pwilson39 0:62fc2a3fb443 32 int main()
pwilson39 0:62fc2a3fb443 33 {
pwilson39 0:62fc2a3fb443 34 lcdSetup();
pwilson39 0:62fc2a3fb443 35 createGrid();
pwilson39 0:62fc2a3fb443 36
pwilson39 0:62fc2a3fb443 37 // Round 1
pwilson39 0:62fc2a3fb443 38 createGrid1();
pwilson39 0:62fc2a3fb443 39 drawBorder();
pwilson39 0:62fc2a3fb443 40 moveBall();
pwilson39 0:62fc2a3fb443 41 round++;
pwilson39 0:62fc2a3fb443 42 uLCD.cls();
pwilson39 0:62fc2a3fb443 43 drawRoundInfo();
pwilson39 0:62fc2a3fb443 44 wait(2);
pwilson39 0:62fc2a3fb443 45 uLCD.cls();
pwilson39 0:62fc2a3fb443 46
pwilson39 0:62fc2a3fb443 47 // Round 2
pwilson39 0:62fc2a3fb443 48 createGrid();
pwilson39 0:62fc2a3fb443 49 createGrid2();
pwilson39 0:62fc2a3fb443 50 drawBorder();
pwilson39 0:62fc2a3fb443 51 moveBall();
pwilson39 0:62fc2a3fb443 52 round++;
pwilson39 0:62fc2a3fb443 53 uLCD.cls();
pwilson39 0:62fc2a3fb443 54 drawRoundInfo();
pwilson39 0:62fc2a3fb443 55 wait(2);
pwilson39 0:62fc2a3fb443 56 uLCD.cls();
pwilson39 0:62fc2a3fb443 57
pwilson39 0:62fc2a3fb443 58 // Round 3
pwilson39 0:62fc2a3fb443 59 createGrid();
pwilson39 0:62fc2a3fb443 60 createGrid3();
pwilson39 0:62fc2a3fb443 61 drawBorder();
pwilson39 0:62fc2a3fb443 62 moveBall();
pwilson39 0:62fc2a3fb443 63 round++;
pwilson39 0:62fc2a3fb443 64 uLCD.cls();
pwilson39 0:62fc2a3fb443 65 drawRoundInfo();
pwilson39 0:62fc2a3fb443 66 wait(2);
pwilson39 0:62fc2a3fb443 67
pwilson39 0:62fc2a3fb443 68 }
pwilson39 0:62fc2a3fb443 69
pwilson39 0:62fc2a3fb443 70 void lcdSetup()
pwilson39 0:62fc2a3fb443 71 {
pwilson39 0:62fc2a3fb443 72 uLCD.baudrate(3000000); //jack up baud rate to max for fast display
pwilson39 0:62fc2a3fb443 73 uLCD.background_color(WHITE);
pwilson39 0:62fc2a3fb443 74 uLCD.textbackground_color(WHITE);
pwilson39 0:62fc2a3fb443 75 uLCD.color(BLUE);
pwilson39 0:62fc2a3fb443 76 uLCD.text_width(2);
pwilson39 0:62fc2a3fb443 77 uLCD.text_height(2);
pwilson39 0:62fc2a3fb443 78
pwilson39 0:62fc2a3fb443 79 // Setup shiftbrite
pwilson39 0:62fc2a3fb443 80 spi.format(16,0);
pwilson39 0:62fc2a3fb443 81 spi.frequency(500000);
pwilson39 0:62fc2a3fb443 82 enable=0;
pwilson39 0:62fc2a3fb443 83 latch=0;
pwilson39 0:62fc2a3fb443 84
pwilson39 0:62fc2a3fb443 85
pwilson39 0:62fc2a3fb443 86 uLCD.cls();
pwilson39 0:62fc2a3fb443 87
pwilson39 0:62fc2a3fb443 88 uLCD.printf("Maze Game\n");
pwilson39 0:62fc2a3fb443 89 uLCD.printf("Try to get from the top, left to the bottom, right.\n");
pwilson39 0:62fc2a3fb443 90 wait(3);
pwilson39 0:62fc2a3fb443 91 uLCD.printf("\nLet's Begin..");
pwilson39 0:62fc2a3fb443 92 wait(2);
pwilson39 0:62fc2a3fb443 93 uLCD.cls();
pwilson39 0:62fc2a3fb443 94 }
pwilson39 0:62fc2a3fb443 95
pwilson39 0:62fc2a3fb443 96 void createGrid()
pwilson39 0:62fc2a3fb443 97 {
pwilson39 0:62fc2a3fb443 98 uLCD.background_color(WHITE);
pwilson39 0:62fc2a3fb443 99 uLCD.cls();
pwilson39 0:62fc2a3fb443 100
pwilson39 0:62fc2a3fb443 101 // Max a 7x7 Grid
pwilson39 0:62fc2a3fb443 102 // 18 pix width
pwilson39 0:62fc2a3fb443 103 int count = 0;
pwilson39 0:62fc2a3fb443 104 for(int i = 0; i < 127; i=i+18) {
pwilson39 0:62fc2a3fb443 105 xLocs[count] = i;
pwilson39 0:62fc2a3fb443 106 yLocs[count] = i;
pwilson39 0:62fc2a3fb443 107 uLCD.line(i,0,i, 127, BLACK);
pwilson39 0:62fc2a3fb443 108 uLCD.line(0, i,127, i, BLACK);
pwilson39 0:62fc2a3fb443 109 count++;
pwilson39 0:62fc2a3fb443 110 }
pwilson39 0:62fc2a3fb443 111
pwilson39 0:62fc2a3fb443 112
pwilson39 0:62fc2a3fb443 113 }
pwilson39 0:62fc2a3fb443 114
pwilson39 0:62fc2a3fb443 115 void initGrid()
pwilson39 0:62fc2a3fb443 116 {
pwilson39 0:62fc2a3fb443 117 // Initialize all the grid locations with 0
pwilson39 0:62fc2a3fb443 118 for(int a = 0; a < 8; a++) {
pwilson39 0:62fc2a3fb443 119 for(int b = 0; b < 8; b++) {
pwilson39 0:62fc2a3fb443 120 grid_field[a][b] = 0;
pwilson39 0:62fc2a3fb443 121 }
pwilson39 0:62fc2a3fb443 122 }
pwilson39 0:62fc2a3fb443 123 }
pwilson39 0:62fc2a3fb443 124
pwilson39 0:62fc2a3fb443 125 void createGrid1()
pwilson39 0:62fc2a3fb443 126 {
pwilson39 0:62fc2a3fb443 127 initGrid();
pwilson39 0:62fc2a3fb443 128 // For second, third row, fill in all but the end
pwilson39 0:62fc2a3fb443 129 for(int c = 0; c < 6; c++) {
pwilson39 0:62fc2a3fb443 130 grid_field[c][1] = 1;
pwilson39 0:62fc2a3fb443 131 grid_field[c][2] = 1;
pwilson39 0:62fc2a3fb443 132 }
pwilson39 0:62fc2a3fb443 133
pwilson39 0:62fc2a3fb443 134 // For fifth, sixth row, fill 2nd to end
pwilson39 0:62fc2a3fb443 135 for(int d = 1; d < 7; d++) {
pwilson39 0:62fc2a3fb443 136 grid_field[d][4] = 1;
pwilson39 0:62fc2a3fb443 137 grid_field[d][5] = 1;
pwilson39 0:62fc2a3fb443 138 }
pwilson39 0:62fc2a3fb443 139 }
pwilson39 0:62fc2a3fb443 140
pwilson39 0:62fc2a3fb443 141 void createGrid2()
pwilson39 0:62fc2a3fb443 142 {
pwilson39 0:62fc2a3fb443 143 initGrid();
pwilson39 0:62fc2a3fb443 144 // For second, fill in all but the middle
pwilson39 0:62fc2a3fb443 145 for(int c = 0; c < 7; c++) {
pwilson39 0:62fc2a3fb443 146 if(c == 3) {
pwilson39 0:62fc2a3fb443 147 continue;
pwilson39 0:62fc2a3fb443 148 }
pwilson39 0:62fc2a3fb443 149 grid_field[c][1] = 1;
pwilson39 0:62fc2a3fb443 150 }
pwilson39 0:62fc2a3fb443 151
pwilson39 0:62fc2a3fb443 152 //leave the 3rd row open
pwilson39 0:62fc2a3fb443 153 //Fourth row
pwilson39 0:62fc2a3fb443 154 for(int c = 1; c < 7; c++) {
pwilson39 0:62fc2a3fb443 155 grid_field[c][3] = 1;
pwilson39 0:62fc2a3fb443 156 }
pwilson39 0:62fc2a3fb443 157 // Leave the fifth row open
pwilson39 0:62fc2a3fb443 158
pwilson39 0:62fc2a3fb443 159 // For sixth row, fill 2nd to end
pwilson39 0:62fc2a3fb443 160 for(int d = 0; d < 7; d++) {
pwilson39 0:62fc2a3fb443 161 if(d == 2) {
pwilson39 0:62fc2a3fb443 162 continue;
pwilson39 0:62fc2a3fb443 163 }
pwilson39 0:62fc2a3fb443 164
pwilson39 0:62fc2a3fb443 165 grid_field[d][5] = 1;
pwilson39 0:62fc2a3fb443 166 }
pwilson39 0:62fc2a3fb443 167 }
pwilson39 0:62fc2a3fb443 168
pwilson39 0:62fc2a3fb443 169 void createGrid3()
pwilson39 0:62fc2a3fb443 170 {
pwilson39 0:62fc2a3fb443 171 initGrid();
pwilson39 0:62fc2a3fb443 172
pwilson39 0:62fc2a3fb443 173 // For second, fill in all but the middle
pwilson39 0:62fc2a3fb443 174 for(int c = 0; c < 7; c++) {
pwilson39 0:62fc2a3fb443 175 if(c == 3) {
pwilson39 0:62fc2a3fb443 176 continue;
pwilson39 0:62fc2a3fb443 177 }
pwilson39 0:62fc2a3fb443 178 grid_field[c][1] = 1;
pwilson39 0:62fc2a3fb443 179 }
pwilson39 0:62fc2a3fb443 180
pwilson39 0:62fc2a3fb443 181 //leave the 3rd row open
pwilson39 0:62fc2a3fb443 182 //Fourth row
pwilson39 0:62fc2a3fb443 183 for(int c = 0; c < 7; c++) {
pwilson39 0:62fc2a3fb443 184 if(c == 1 || c == 3 || c == 5) {
pwilson39 0:62fc2a3fb443 185 continue;
pwilson39 0:62fc2a3fb443 186 }
pwilson39 0:62fc2a3fb443 187 grid_field[c][3] = 1;
pwilson39 0:62fc2a3fb443 188 }
pwilson39 0:62fc2a3fb443 189 // Leave the fifth row open
pwilson39 0:62fc2a3fb443 190
pwilson39 0:62fc2a3fb443 191 // For sixth row, fill 2nd to end
pwilson39 0:62fc2a3fb443 192 for(int d = 0; d < 7; d++) {
pwilson39 0:62fc2a3fb443 193 if(d == 2 || d == 3 || d == 4) {
pwilson39 0:62fc2a3fb443 194 continue;
pwilson39 0:62fc2a3fb443 195 }
pwilson39 0:62fc2a3fb443 196
pwilson39 0:62fc2a3fb443 197 grid_field[d][5] = 1;
pwilson39 0:62fc2a3fb443 198 }
pwilson39 0:62fc2a3fb443 199 grid_field[3][4] = 1;
pwilson39 0:62fc2a3fb443 200 grid_field[3][6] = 1;
pwilson39 0:62fc2a3fb443 201 }
pwilson39 0:62fc2a3fb443 202
pwilson39 0:62fc2a3fb443 203 void drawBorder()
pwilson39 0:62fc2a3fb443 204 {
pwilson39 0:62fc2a3fb443 205 for(int e = 0; e < 8; e++) {
pwilson39 0:62fc2a3fb443 206 for(int f = 0; f < 8; f++) {
pwilson39 0:62fc2a3fb443 207 if(grid_field[e][f] == 1) {
pwilson39 0:62fc2a3fb443 208 //Draw a filled square in the block using the values in the locations
pwilson39 0:62fc2a3fb443 209 uLCD.filled_rectangle(yLocs[e],yLocs[f], yLocs[e+1], yLocs[f+1], BLACK);
pwilson39 0:62fc2a3fb443 210 }
pwilson39 0:62fc2a3fb443 211 }
pwilson39 0:62fc2a3fb443 212 }
pwilson39 0:62fc2a3fb443 213 }
pwilson39 0:62fc2a3fb443 214
pwilson39 0:62fc2a3fb443 215 void drawRoundInfo()
pwilson39 0:62fc2a3fb443 216 {
pwilson39 0:62fc2a3fb443 217 uLCD.locate(0,0);
pwilson39 0:62fc2a3fb443 218 uLCD.text_width(2);
pwilson39 0:62fc2a3fb443 219 uLCD.text_height(2);
pwilson39 0:62fc2a3fb443 220 if(round <= 3) {
pwilson39 0:62fc2a3fb443 221 uLCD.printf("Finished!\n");
pwilson39 0:62fc2a3fb443 222 uLCD.printf("Next up, Round %d\n", round);
pwilson39 0:62fc2a3fb443 223 } else {
pwilson39 0:62fc2a3fb443 224 uLCD.printf("Game Over!");
pwilson39 0:62fc2a3fb443 225 }
pwilson39 0:62fc2a3fb443 226 }
pwilson39 0:62fc2a3fb443 227
pwilson39 0:62fc2a3fb443 228 void moveBall()
pwilson39 0:62fc2a3fb443 229 {
pwilson39 0:62fc2a3fb443 230 int posX = 0;
pwilson39 0:62fc2a3fb443 231 int posY = 0;
pwilson39 0:62fc2a3fb443 232 bool win = false;
pwilson39 0:62fc2a3fb443 233 bool movement = true;
pwilson39 0:62fc2a3fb443 234 int prevPosX = 0;
pwilson39 0:62fc2a3fb443 235 int prevPosY = 0;
pwilson39 0:62fc2a3fb443 236 int radius = 4;
pwilson39 0:62fc2a3fb443 237 int x, y, AnalogXReading, AnalogYReading;
pwilson39 0:62fc2a3fb443 238
pwilson39 0:62fc2a3fb443 239 while(!win) {
pwilson39 0:62fc2a3fb443 240 AnalogXReading = AnalogX.read()*128;
pwilson39 0:62fc2a3fb443 241 AnalogYReading = AnalogY.read()*128;
pwilson39 0:62fc2a3fb443 242
pwilson39 0:62fc2a3fb443 243 // Get reading
pwilson39 0:62fc2a3fb443 244 if(AnalogXReading > 118) {
pwilson39 0:62fc2a3fb443 245 if(posX > 0 && grid_field[posX-1][posY] == 0) {
pwilson39 0:62fc2a3fb443 246 posX--;
pwilson39 0:62fc2a3fb443 247 movement = true;
pwilson39 0:62fc2a3fb443 248 RGB_LED(0, 50, 0);
pwilson39 0:62fc2a3fb443 249 } else {
pwilson39 0:62fc2a3fb443 250 RGB_LED(50, 0, 0);
pwilson39 0:62fc2a3fb443 251 }
pwilson39 0:62fc2a3fb443 252 }
pwilson39 0:62fc2a3fb443 253
pwilson39 0:62fc2a3fb443 254 if(AnalogXReading < 10 && grid_field[posX+1][posY] == 0) {
pwilson39 0:62fc2a3fb443 255 if(posX < 7) {
pwilson39 0:62fc2a3fb443 256 posX++;
pwilson39 0:62fc2a3fb443 257 movement = true;
pwilson39 0:62fc2a3fb443 258 RGB_LED(0, 50, 0);
pwilson39 0:62fc2a3fb443 259 } else {
pwilson39 0:62fc2a3fb443 260 RGB_LED(50, 0, 0);
pwilson39 0:62fc2a3fb443 261 }
pwilson39 0:62fc2a3fb443 262 }
pwilson39 0:62fc2a3fb443 263
pwilson39 0:62fc2a3fb443 264 if(AnalogYReading > 118 && grid_field[posX][posY - 1] == 0) {
pwilson39 0:62fc2a3fb443 265 if(posY > 0) {
pwilson39 0:62fc2a3fb443 266 posY--;
pwilson39 0:62fc2a3fb443 267 movement = true;
pwilson39 0:62fc2a3fb443 268 RGB_LED(0, 50, 0);
pwilson39 0:62fc2a3fb443 269 } else {
pwilson39 0:62fc2a3fb443 270 RGB_LED(50, 0, 0);
pwilson39 0:62fc2a3fb443 271 }
pwilson39 0:62fc2a3fb443 272 }
pwilson39 0:62fc2a3fb443 273 if(AnalogYReading < 10 && grid_field[posX][posY + 1] == 0) {
pwilson39 0:62fc2a3fb443 274 if(posY < 7) {
pwilson39 0:62fc2a3fb443 275 posY++;
pwilson39 0:62fc2a3fb443 276 movement = true;
pwilson39 0:62fc2a3fb443 277 RGB_LED(0, 50, 0);
pwilson39 0:62fc2a3fb443 278 } else {
pwilson39 0:62fc2a3fb443 279 RGB_LED(50, 0, 0);
pwilson39 0:62fc2a3fb443 280 }
pwilson39 0:62fc2a3fb443 281 }
pwilson39 0:62fc2a3fb443 282
pwilson39 0:62fc2a3fb443 283 // Redraw the ball
pwilson39 0:62fc2a3fb443 284 if(movement) {
pwilson39 0:62fc2a3fb443 285 x = (yLocs[prevPosX] + yLocs[prevPosX + 1]) / 2;
pwilson39 0:62fc2a3fb443 286 y = (yLocs[prevPosY] + yLocs[prevPosY + 1]) / 2;
pwilson39 0:62fc2a3fb443 287 uLCD.circle(x, y, radius, WHITE);
pwilson39 0:62fc2a3fb443 288 x = (yLocs[posX] + yLocs[posX + 1]) / 2;
pwilson39 0:62fc2a3fb443 289 y = (yLocs[posY] + yLocs[posY + 1]) / 2;
pwilson39 0:62fc2a3fb443 290 uLCD.circle(x, y, radius, BLUE);
pwilson39 0:62fc2a3fb443 291 prevPosX = posX;
pwilson39 0:62fc2a3fb443 292 prevPosY = posY;
pwilson39 0:62fc2a3fb443 293 movement = false;
pwilson39 0:62fc2a3fb443 294 }
pwilson39 0:62fc2a3fb443 295 wait(.2);
pwilson39 0:62fc2a3fb443 296
pwilson39 0:62fc2a3fb443 297 if(posX == 6 && posY == 6) {
pwilson39 0:62fc2a3fb443 298 win = true;
pwilson39 0:62fc2a3fb443 299 }
pwilson39 0:62fc2a3fb443 300 }
pwilson39 0:62fc2a3fb443 301 }
pwilson39 0:62fc2a3fb443 302
pwilson39 0:62fc2a3fb443 303 //Use SPI hardware to write color values to LED driver chip
pwilson39 0:62fc2a3fb443 304 void RGB_LED(int red, int green, int blue)
pwilson39 0:62fc2a3fb443 305 {
pwilson39 0:62fc2a3fb443 306 unsigned int low_color=0;
pwilson39 0:62fc2a3fb443 307 unsigned int high_color=0;
pwilson39 0:62fc2a3fb443 308 high_color=(blue<<4)|((red&0x3C0)>>6);
pwilson39 0:62fc2a3fb443 309 low_color=(((red&0x3F)<<10)|(green));
pwilson39 0:62fc2a3fb443 310 spi.write(high_color);
pwilson39 0:62fc2a3fb443 311 spi.write(low_color);
pwilson39 0:62fc2a3fb443 312 latch=1;
pwilson39 0:62fc2a3fb443 313 latch=0;
pwilson39 0:62fc2a3fb443 314 }