![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
mbed Simple \'Roulette\' Game. Example program making use of 7-Segment Display Driver Library (via an 8bit Shift Register)
main.cpp
- Committer:
- paul80nd
- Date:
- 2011-05-01
- Revision:
- 0:7f9842ec56b9
File content as of revision 0:7f9842ec56b9:
#include "mbed.h" #include "7SegSRDriver.h" /* mbed Simple 'Roulette' Game * Making use of 7-Segment Display Driver Library (via an 8bit Shift Register) * Copyright (c) 2011 Paul Law * * User chooses a number between 1 and 9 by pressing button A repeatedly * - Selection is shown on second 7seg display * User then presses button B to begin the game * - Number between 1 and 9 is chosen at random * - First display shows 'suspense' animation then shows number * - If the numbers match the 2 displays flash and the blue leds flash * - If the numbers don't match the 1st display flashes only * - Another round of the game starts, ad infinitum * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ // Pin outs // p17 - Play button +ve // p18 - Select button +ve // p22 - 1st Display Shift Register - Clock // p23 - 1st Display Shift Register - Latch // p24 - 1st Display Shift Register - Data // p25 - 2nd Display Shift Register - Clock // p26 - 2nd Display Shift Register - Latch // p27 - 2nd Display Shift Register - Data DigitalIn playButton(p17); DigitalIn selectButton(p18); SSegSRDriver lDisplay(p23,p21,p22, SSegSRDriver_COMN_ANODE); SSegSRDriver rDisplay(p27,p25,p26, SSegSRDriver_COMN_ANODE); DigitalOut leds[] = { (LED1),(LED2),(LED3),(LED4) }; // Display Roll Definitions (first element in array is number of items, followed by items #define ROLL_CWURC 0 #define ROLL_CCWLC 1 #define ROLL_CCWLRC 2 #define ROLL_CWUC 3 #define ROLL_FIG8 4 #define ROLL_CWO 5 unsigned char rollDefs[6][9] = { // A clockwise upper reverse C - abg {3,2,4,128}, // An anticlockwise lower C - ged {3,128,32,16}, // An anticlockwise lower reverse C - dcg {3,16,8,128}, // A clockwise upper C - gfa {3,128,64,2}, // A figure of 8 roll - abgedcgf {8,2,4,128,32,16,8,128,64}, // A clockwise O roll - abcdef {6,2,4,8,16,32,64} }; // Performs a single roll animation on the given display void rollDisplay(SSegSRDriver *display, unsigned char rollType, unsigned char repeats) { for (int r=0; r<repeats; r++) { for (int i=1; i<=rollDefs[rollType][0]; i++) { display->write_raw(rollDefs[rollType][i]); wait_ms(75); } } display->clear(); } int main() { unsigned char guess; while (1) { lDisplay.clear(); rDisplay.clear(); // New game animation (figure of 8 across two displays) rollDisplay(&rDisplay,ROLL_CWURC,1); rollDisplay(&lDisplay,ROLL_CCWLC,1); rollDisplay(&rDisplay,ROLL_CCWLRC,1); rollDisplay(&lDisplay,ROLL_CWUC,1); // User selects guess guess = 1; rDisplay.write(guess); while (!playButton) { if (selectButton) { guess++; if (guess==10) guess=1; rDisplay.write(guess); while (selectButton) { wait(0.25); } } wait(0.25); } // Choose random number and animate 'suspense' int target = (rand() % 9)+1; rollDisplay(&lDisplay,ROLL_CWO,2); // Show number and flash (both and leds if win, just target if lost) for (int i=0; i<5; i++) { lDisplay.clear(); if (target == guess) { rDisplay.clear(); leds[0] = leds[1] = leds[2] = leds[3] = 1; } wait_ms(250); lDisplay.write(target); if (target == guess) { rDisplay.write(guess); leds[0] = leds[1] = leds[2] = leds[3] = 0; } wait_ms(250); } // End of this game round } }