Display text on screen.

Dependencies:   TextLCD mbed MaxSonar RTC-DS1307

Fork of TextLCD_HelloWorld by Simon Ford

Committer:
aueangpanit
Date:
Thu May 25 10:55:51 2017 +0000
Revision:
9:39190ed25585
Parent:
8:8ce2ab8191cf
Child:
10:21c24327e65f
Working game menu selection and game exit menu

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 1:7418a52375a0 1 // Hello World! for the TextLCD
simon 1:7418a52375a0 2
simon 0:334327d1a416 3 #include "mbed.h"
aueangpanit 4:c669026b6f6e 4 #include <string>
simon 0:334327d1a416 5 #include "TextLCD.h"
aueangpanit 5:2f13ec8efe0b 6 #include "MaxSonar.h"
aueangpanit 5:2f13ec8efe0b 7 using std::string;
simon 0:334327d1a416 8
aueangpanit 3:5e0ba6e35849 9 TextLCD lcd(PTE30, PTE29, PTE23, PTE22, PTE21, PTE20); // rs, e, d4-d7
aueangpanit 3:5e0ba6e35849 10
aueangpanit 7:f00ddf85cacc 11 DigitalOut questionScreen(PTE3);
aueangpanit 4:c669026b6f6e 12 DigitalOut screen1(PTE5);
aueangpanit 4:c669026b6f6e 13 DigitalOut screen2(PTE4);
aueangpanit 4:c669026b6f6e 14
aueangpanit 9:39190ed25585 15 //All functions for controlling screens
aueangpanit 4:c669026b6f6e 16 void UpdateScreen(DigitalOut screen, string text);
aueangpanit 5:2f13ec8efe0b 17 void UpdateScreen(DigitalOut screen, char text[1024]);
aueangpanit 9:39190ed25585 18 void ClearAllScreen();
aueangpanit 9:39190ed25585 19
aueangpanit 9:39190ed25585 20 //All funcitons for range sensors
aueangpanit 9:39190ed25585 21 void UpdateRange();
aueangpanit 9:39190ed25585 22
aueangpanit 9:39190ed25585 23 //All functions for menu page
aueangpanit 9:39190ed25585 24 void GameOption();
aueangpanit 9:39190ed25585 25 void StartGame(int gameOptionLocation);
aueangpanit 9:39190ed25585 26
aueangpanit 9:39190ed25585 27 //All functions for exit screen menu
aueangpanit 9:39190ed25585 28 bool ExitScreen();
aueangpanit 9:39190ed25585 29 bool CheckExit(float r1, float r2);
aueangpanit 9:39190ed25585 30
aueangpanit 9:39190ed25585 31 //all functions for Multi-Maths game
aueangpanit 9:39190ed25585 32 void MultiChoice();
aueangpanit 8:8ce2ab8191cf 33 void DisplayNewQuestion();
aueangpanit 8:8ce2ab8191cf 34 bool CheckCorrect(int screenNumber);
aueangpanit 8:8ce2ab8191cf 35
aueangpanit 8:8ce2ab8191cf 36 string questions[4] = {"What is 2*2?",
aueangpanit 8:8ce2ab8191cf 37 "What is 5*2?",
aueangpanit 8:8ce2ab8191cf 38 "what is 2+2?",
aueangpanit 8:8ce2ab8191cf 39 "What is 5*4?"};
aueangpanit 8:8ce2ab8191cf 40
aueangpanit 8:8ce2ab8191cf 41 string screen1Answers[4] = {"4 ", "10 ", "5 ", "18 "};
aueangpanit 8:8ce2ab8191cf 42 string screen2Answers[4] = {"5 ", "8 ", "4 ", "20 "};
aueangpanit 8:8ce2ab8191cf 43 int correctScreen[4] = {1, 1, 2, 2}; //1 = screen1; 2 = screen2;
aueangpanit 8:8ce2ab8191cf 44
aueangpanit 8:8ce2ab8191cf 45 int questionCount = 0;
simon 0:334327d1a416 46
aueangpanit 9:39190ed25585 47 //all functions for jumping game
aueangpanit 9:39190ed25585 48 void Jumping();
aueangpanit 9:39190ed25585 49
aueangpanit 9:39190ed25585 50 MaxSonar *range1;
aueangpanit 5:2f13ec8efe0b 51 float r1;
aueangpanit 6:fa30f8383b99 52
aueangpanit 6:fa30f8383b99 53 MaxSonar *range2;
aueangpanit 6:fa30f8383b99 54 float r2;
aueangpanit 9:39190ed25585 55 int main() {
aueangpanit 5:2f13ec8efe0b 56 // Create and configure object for 3.3V powered LV-series device,
aueangpanit 5:2f13ec8efe0b 57 // accessed with analog reads (in cm) on p16, triggered by p7.
aueangpanit 5:2f13ec8efe0b 58 range1 = new MaxSonar(MS_LV, MS_ANALOG, PTB8, PTC2);
aueangpanit 5:2f13ec8efe0b 59 range1->setVoltage(3.3);
aueangpanit 5:2f13ec8efe0b 60 range1->setUnits(MS_CM);
aueangpanit 5:2f13ec8efe0b 61
aueangpanit 6:fa30f8383b99 62 range2 = new MaxSonar(MS_LV, MS_ANALOG, PTB9, PTB3);
aueangpanit 6:fa30f8383b99 63 range2->setVoltage(3.3);
aueangpanit 6:fa30f8383b99 64 range2->setUnits(MS_CM);
aueangpanit 9:39190ed25585 65
aueangpanit 9:39190ed25585 66 ClearAllScreen();
aueangpanit 9:39190ed25585 67
aueangpanit 9:39190ed25585 68 GameOption();
aueangpanit 9:39190ed25585 69 }
aueangpanit 9:39190ed25585 70
aueangpanit 9:39190ed25585 71 int gameOptionLocation = 0;
aueangpanit 9:39190ed25585 72 string gameName[2] = {"Muti-Maths", "Jumping!"};
aueangpanit 9:39190ed25585 73 void GameOption()
aueangpanit 9:39190ed25585 74 {
aueangpanit 9:39190ed25585 75 ClearAllScreen();
aueangpanit 9:39190ed25585 76
aueangpanit 9:39190ed25585 77 UpdateScreen(questionScreen, "Select a game: >" + gameName[gameOptionLocation]);
aueangpanit 9:39190ed25585 78
aueangpanit 9:39190ed25585 79 bool gameOption = true;
aueangpanit 9:39190ed25585 80 while(gameOption)
aueangpanit 9:39190ed25585 81 {
aueangpanit 9:39190ed25585 82 UpdateRange();
aueangpanit 9:39190ed25585 83
aueangpanit 9:39190ed25585 84 if(r1 < 25 && r2 < 25)
aueangpanit 9:39190ed25585 85 {
aueangpanit 9:39190ed25585 86 UpdateScreen(questionScreen, "Entering " + gameName[gameOptionLocation] + ".....");
aueangpanit 9:39190ed25585 87 wait(1);
aueangpanit 9:39190ed25585 88
aueangpanit 9:39190ed25585 89 gameOption = false;
aueangpanit 9:39190ed25585 90 }
aueangpanit 6:fa30f8383b99 91
aueangpanit 9:39190ed25585 92 else if(r1 < 20)
aueangpanit 9:39190ed25585 93 {
aueangpanit 9:39190ed25585 94 if(gameOptionLocation > 0) { gameOptionLocation--; UpdateScreen(questionScreen, "Select a game: >" + gameName[gameOptionLocation]); }
aueangpanit 9:39190ed25585 95 }
aueangpanit 9:39190ed25585 96 else if(r2 < 20)
aueangpanit 9:39190ed25585 97 {
aueangpanit 9:39190ed25585 98 if(gameOptionLocation < 1) { gameOptionLocation++; UpdateScreen(questionScreen, "Select a game: >" + gameName[gameOptionLocation]); }
aueangpanit 9:39190ed25585 99 }
aueangpanit 9:39190ed25585 100 }
aueangpanit 9:39190ed25585 101
aueangpanit 9:39190ed25585 102 StartGame(gameOptionLocation);
aueangpanit 9:39190ed25585 103 }
aueangpanit 9:39190ed25585 104
aueangpanit 9:39190ed25585 105 void StartGame(int gameOptionLocation)
aueangpanit 9:39190ed25585 106 {
aueangpanit 9:39190ed25585 107 switch(gameOptionLocation)
aueangpanit 9:39190ed25585 108 {
aueangpanit 9:39190ed25585 109 case 0:
aueangpanit 9:39190ed25585 110 MultiChoice();
aueangpanit 9:39190ed25585 111 case 1:
aueangpanit 9:39190ed25585 112 Jumping();
aueangpanit 9:39190ed25585 113 }
aueangpanit 9:39190ed25585 114 }
aueangpanit 9:39190ed25585 115
aueangpanit 9:39190ed25585 116 void MultiChoice()
aueangpanit 9:39190ed25585 117 {
aueangpanit 9:39190ed25585 118 bool multiMaths = true;
aueangpanit 9:39190ed25585 119
aueangpanit 9:39190ed25585 120 DisplayNewQuestion();
aueangpanit 9:39190ed25585 121 while(multiMaths) {
aueangpanit 9:39190ed25585 122 UpdateRange();
aueangpanit 9:39190ed25585 123
aueangpanit 9:39190ed25585 124 if(CheckExit(r1, r2))
aueangpanit 9:39190ed25585 125 {
aueangpanit 9:39190ed25585 126 GameOption();
aueangpanit 9:39190ed25585 127 }
aueangpanit 9:39190ed25585 128
aueangpanit 8:8ce2ab8191cf 129 if(r1 < 20)
aueangpanit 8:8ce2ab8191cf 130 {
aueangpanit 8:8ce2ab8191cf 131 if(CheckCorrect(1))
aueangpanit 8:8ce2ab8191cf 132 {
aueangpanit 8:8ce2ab8191cf 133 UpdateScreen(questionScreen, "Correct!");
aueangpanit 8:8ce2ab8191cf 134 wait(1);
aueangpanit 8:8ce2ab8191cf 135 DisplayNewQuestion();
aueangpanit 8:8ce2ab8191cf 136 }
aueangpanit 8:8ce2ab8191cf 137 else
aueangpanit 8:8ce2ab8191cf 138 {
aueangpanit 8:8ce2ab8191cf 139 UpdateScreen(questionScreen, "Try Again!");
aueangpanit 8:8ce2ab8191cf 140 wait(1);
aueangpanit 8:8ce2ab8191cf 141 UpdateScreen(questionScreen, questions[questionCount]);
aueangpanit 8:8ce2ab8191cf 142 }
aueangpanit 8:8ce2ab8191cf 143 }
aueangpanit 8:8ce2ab8191cf 144 if(r2 < 20)
aueangpanit 8:8ce2ab8191cf 145 {
aueangpanit 8:8ce2ab8191cf 146 if(CheckCorrect(2))
aueangpanit 8:8ce2ab8191cf 147 {
aueangpanit 8:8ce2ab8191cf 148 UpdateScreen(questionScreen, "Correct!");
aueangpanit 8:8ce2ab8191cf 149 wait(1);
aueangpanit 8:8ce2ab8191cf 150 DisplayNewQuestion();
aueangpanit 8:8ce2ab8191cf 151 }
aueangpanit 8:8ce2ab8191cf 152 else
aueangpanit 8:8ce2ab8191cf 153 {
aueangpanit 8:8ce2ab8191cf 154 UpdateScreen(questionScreen, "Try Again!");
aueangpanit 8:8ce2ab8191cf 155 wait(1);
aueangpanit 8:8ce2ab8191cf 156 UpdateScreen(questionScreen, questions[questionCount]);
aueangpanit 8:8ce2ab8191cf 157 }
aueangpanit 8:8ce2ab8191cf 158 }
aueangpanit 8:8ce2ab8191cf 159
aueangpanit 5:2f13ec8efe0b 160 wait(0.5);
aueangpanit 5:2f13ec8efe0b 161 }
aueangpanit 4:c669026b6f6e 162 }
aueangpanit 4:c669026b6f6e 163
aueangpanit 8:8ce2ab8191cf 164 void DisplayNewQuestion()
aueangpanit 8:8ce2ab8191cf 165 {
aueangpanit 8:8ce2ab8191cf 166 if(questionCount >= 3)
aueangpanit 8:8ce2ab8191cf 167 {
aueangpanit 8:8ce2ab8191cf 168 questionCount = 0;
aueangpanit 8:8ce2ab8191cf 169 }
aueangpanit 8:8ce2ab8191cf 170 else
aueangpanit 8:8ce2ab8191cf 171 {
aueangpanit 8:8ce2ab8191cf 172 questionCount++;
aueangpanit 8:8ce2ab8191cf 173 }
aueangpanit 8:8ce2ab8191cf 174
aueangpanit 8:8ce2ab8191cf 175 UpdateScreen(questionScreen, questions[questionCount]);
aueangpanit 8:8ce2ab8191cf 176 UpdateScreen(screen1, screen1Answers[questionCount]);
aueangpanit 8:8ce2ab8191cf 177 UpdateScreen(screen2, screen2Answers[questionCount]);
aueangpanit 8:8ce2ab8191cf 178 }
aueangpanit 8:8ce2ab8191cf 179
aueangpanit 8:8ce2ab8191cf 180 bool CheckCorrect(int screenNumber)
aueangpanit 8:8ce2ab8191cf 181 {
aueangpanit 8:8ce2ab8191cf 182 if(screenNumber == correctScreen[questionCount])
aueangpanit 8:8ce2ab8191cf 183 {
aueangpanit 8:8ce2ab8191cf 184 return true;
aueangpanit 8:8ce2ab8191cf 185 }
aueangpanit 8:8ce2ab8191cf 186 else
aueangpanit 8:8ce2ab8191cf 187 {
aueangpanit 8:8ce2ab8191cf 188 return false;
aueangpanit 8:8ce2ab8191cf 189 }
aueangpanit 8:8ce2ab8191cf 190 }
aueangpanit 8:8ce2ab8191cf 191
aueangpanit 9:39190ed25585 192 void Jumping()
aueangpanit 9:39190ed25585 193 {
aueangpanit 9:39190ed25585 194
aueangpanit 9:39190ed25585 195 }
aueangpanit 9:39190ed25585 196
aueangpanit 9:39190ed25585 197 string exitOption[2] = {"Yes", "No"};
aueangpanit 9:39190ed25585 198 bool CheckExit(float r1, float r2)
aueangpanit 9:39190ed25585 199 {
aueangpanit 9:39190ed25585 200 if(r1 < 25 && r2 < 25)
aueangpanit 9:39190ed25585 201 {
aueangpanit 9:39190ed25585 202 return ExitScreen();
aueangpanit 9:39190ed25585 203 }
aueangpanit 9:39190ed25585 204 else
aueangpanit 9:39190ed25585 205 {
aueangpanit 9:39190ed25585 206 return false;
aueangpanit 9:39190ed25585 207 }
aueangpanit 9:39190ed25585 208 }
aueangpanit 9:39190ed25585 209
aueangpanit 9:39190ed25585 210 bool ExitScreen()
aueangpanit 9:39190ed25585 211 {
aueangpanit 9:39190ed25585 212 int exitOption_int = 0;
aueangpanit 9:39190ed25585 213 UpdateScreen(questionScreen, "AreYouSureYouWantToExit? >" + exitOption[exitOption_int]);
aueangpanit 9:39190ed25585 214
aueangpanit 9:39190ed25585 215 wait(1);
aueangpanit 9:39190ed25585 216
aueangpanit 9:39190ed25585 217 bool choosing = true;
aueangpanit 9:39190ed25585 218 while(choosing)
aueangpanit 9:39190ed25585 219 {
aueangpanit 9:39190ed25585 220 wait(0.5);
aueangpanit 9:39190ed25585 221 UpdateRange();
aueangpanit 9:39190ed25585 222 if(r1 < 25 && r2 < 25)
aueangpanit 9:39190ed25585 223 {
aueangpanit 9:39190ed25585 224 if(exitOption_int == 0)
aueangpanit 9:39190ed25585 225 {
aueangpanit 9:39190ed25585 226 choosing = false;
aueangpanit 9:39190ed25585 227 UpdateScreen(questionScreen, "Exiting...");
aueangpanit 9:39190ed25585 228 wait(1);
aueangpanit 9:39190ed25585 229 return true;
aueangpanit 9:39190ed25585 230 }
aueangpanit 9:39190ed25585 231 else
aueangpanit 9:39190ed25585 232 {
aueangpanit 9:39190ed25585 233 choosing = false;
aueangpanit 9:39190ed25585 234 UpdateScreen(questionScreen, "Returning to game");
aueangpanit 9:39190ed25585 235 wait(1);
aueangpanit 9:39190ed25585 236 return false;
aueangpanit 9:39190ed25585 237 }
aueangpanit 9:39190ed25585 238 }
aueangpanit 9:39190ed25585 239 else if(r1 < 20)
aueangpanit 9:39190ed25585 240 {
aueangpanit 9:39190ed25585 241 if(exitOption_int > 0) { exitOption_int--; UpdateScreen(questionScreen, "AreYouSureYouWantToExit? >" + exitOption[exitOption_int]); }
aueangpanit 9:39190ed25585 242 }
aueangpanit 9:39190ed25585 243 else if(r2 < 20)
aueangpanit 9:39190ed25585 244 {
aueangpanit 9:39190ed25585 245 if(exitOption_int < 1) { exitOption_int++; UpdateScreen(questionScreen, "AreYouSureYouWantToExit? >" + exitOption[exitOption_int]); }
aueangpanit 9:39190ed25585 246 }
aueangpanit 9:39190ed25585 247 }
aueangpanit 9:39190ed25585 248 }
aueangpanit 9:39190ed25585 249
aueangpanit 4:c669026b6f6e 250 void UpdateScreen(DigitalOut screen, string text)
aueangpanit 4:c669026b6f6e 251 {
aueangpanit 4:c669026b6f6e 252 //disable all E pin for all screens
aueangpanit 8:8ce2ab8191cf 253 questionScreen = 0;
aueangpanit 4:c669026b6f6e 254 screen1 = 0;
aueangpanit 4:c669026b6f6e 255 screen2 = 0;
aueangpanit 4:c669026b6f6e 256
aueangpanit 4:c669026b6f6e 257 //enable E pin for the scrren that we want to update
aueangpanit 4:c669026b6f6e 258 screen = 1;
aueangpanit 4:c669026b6f6e 259
aueangpanit 5:2f13ec8efe0b 260 //convert text to char array
aueangpanit 5:2f13ec8efe0b 261 char text_char_array[1024];
aueangpanit 5:2f13ec8efe0b 262 strcpy(text_char_array, text.c_str());
aueangpanit 4:c669026b6f6e 263 //some weird behaviour after disabling the E pin once means that we need to update the screen several times for it to display properly
aueangpanit 5:2f13ec8efe0b 264 for(int i = 0; i < 10; i++)
aueangpanit 4:c669026b6f6e 265 {
aueangpanit 3:5e0ba6e35849 266 lcd.cls();
aueangpanit 4:c669026b6f6e 267 lcd.printf(text_char_array);
aueangpanit 3:5e0ba6e35849 268 }
aueangpanit 5:2f13ec8efe0b 269 }
aueangpanit 5:2f13ec8efe0b 270
aueangpanit 5:2f13ec8efe0b 271 void UpdateScreen(DigitalOut screen, char text[1024])
aueangpanit 5:2f13ec8efe0b 272 {
aueangpanit 5:2f13ec8efe0b 273 //disable all E pin for all screens
aueangpanit 8:8ce2ab8191cf 274 questionScreen = 0;
aueangpanit 5:2f13ec8efe0b 275 screen1 = 0;
aueangpanit 5:2f13ec8efe0b 276 screen2 = 0;
aueangpanit 4:c669026b6f6e 277
aueangpanit 5:2f13ec8efe0b 278 //enable E pin for the scrren that we want to update
aueangpanit 5:2f13ec8efe0b 279 screen = 1;
aueangpanit 4:c669026b6f6e 280
aueangpanit 5:2f13ec8efe0b 281 //some weird behaviour after disabling the E pin once means that we need to update the screen several times for it to display properly
aueangpanit 5:2f13ec8efe0b 282 for(int i = 0; i < 10; i++)
aueangpanit 5:2f13ec8efe0b 283 {
aueangpanit 5:2f13ec8efe0b 284 lcd.cls();
aueangpanit 5:2f13ec8efe0b 285 lcd.printf(text);
aueangpanit 5:2f13ec8efe0b 286 }
simon 0:334327d1a416 287 }
aueangpanit 9:39190ed25585 288
aueangpanit 9:39190ed25585 289 void ClearAllScreen()
aueangpanit 9:39190ed25585 290 {
aueangpanit 9:39190ed25585 291 questionScreen = 1;
aueangpanit 9:39190ed25585 292 screen1 = 1;
aueangpanit 9:39190ed25585 293 screen2 = 1;
aueangpanit 9:39190ed25585 294
aueangpanit 9:39190ed25585 295 lcd.cls();
aueangpanit 9:39190ed25585 296 }
aueangpanit 9:39190ed25585 297
aueangpanit 9:39190ed25585 298 void UpdateRange()
aueangpanit 9:39190ed25585 299 {
aueangpanit 9:39190ed25585 300 // Trigger read, wait 49ms until ranger finder has
aueangpanit 9:39190ed25585 301 // finished, then read.
aueangpanit 9:39190ed25585 302 range1->triggerRead();
aueangpanit 9:39190ed25585 303 wait_ms(49);
aueangpanit 9:39190ed25585 304 r1 = range1->read();
aueangpanit 9:39190ed25585 305
aueangpanit 9:39190ed25585 306 range2->triggerRead();
aueangpanit 9:39190ed25585 307 wait_ms(49);
aueangpanit 9:39190ed25585 308 r2 = range2->read();
aueangpanit 9:39190ed25585 309 }