Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- Experiment626
- Date:
- 2014-09-13
- Revision:
- 0:5552a00c7c9b
- Child:
- 1:d5d57d6ba20a
File content as of revision 0:5552a00c7c9b:
#include "mbed.h"
#include "TextLCD.h"
SPI spi(P0_21, P0_22, P1_15); // mosi, miso, sclk
TextLCD lcd(P0_23, P0_16, P0_14, P0_13, P0_12, P0_11); // RS, E, D4-D7, LCDType=LCD16x2, BL=NC, E2=NC, LCDTCtrl=HD44780
DigitalOut compassLED[] = {(P0_19), (P0_9), (P0_18), (P0_8)}; // The South, West, North, East LEDs
DigitalOut OutputEnable(P0_5);
DigitalOut Latch(P0_4);
DigitalOut Buzzer(P0_22);
DigitalIn userButton1(P0_17, PullUp);
InterruptIn selectButton(P0_1);
enum CompassPoints { SOUTH = 0, WEST = 1, NORTH = 2, EAST = 3 };
void initilize();
void printToLCD(const char* text);
void RotateLEDs(float delay);
void SetLED(uint32_t LEDBitMap);
bool ReadPlayerButton();
bool ReadSelectButton();
void soundBuzzer(int Hz);
void splash();
void gameLoop();
int checkTargetHit(int currentLED);
void displayHighestLevel();
void score();
void winner();
int level;
int highestLevel;
int rotateFactor;
int LEDBitmap;
char debugString [50];
void initilize()
{
level = 1;
highestLevel = 1;
rotateFactor = 5;
LEDBitmap = 1;
OutputEnable = false;
selectButton.mode(PullUp);
selectButton.rise(&displayHighestLevel);
lcd.putc('R');
lcd.putc('o');
lcd.putc('u');
lcd.putc('l');
lcd.putc('e');
lcd.putc('t');
lcd.putc('t');
lcd.putc('e');
spi.format(16,0); // Sets the bits to 16 to write; sets the clock's Polarity and Phase
spi.frequency(10 * 1000 * 1000); // Sets SPI clock to 20,000,000 Hz or 10MHz
}
void printToLCD(const char* text)
{
// Will add a text scrolling function here if the text is
// greater than 8 characters.
if (strlen(text) > 8) {
return;
}
int x = 0;
lcd.cls();
while (text[x] != '\0') {
lcd.putc(text[x]);
x++;
}
}
void SetLED(uint32_t LEDBitMap)
{
uint16_t shiftMap = 0;
// Ring Segments - all on linked shift registers
shiftMap = (LEDBitMap >> 1) &0xf;
shiftMap |= ((LEDBitMap >> 6) &0xf) << 4;
shiftMap |= ((LEDBitMap >> 11) &0xf) << 8;
shiftMap |= ((LEDBitMap >> 16) &0xf) << 12;
spi.write(shiftMap);
Latch = true;
Latch = false;
// Set the LEDs connected directly to the processor
compassLED[SOUTH] = LEDBitMap &0x1;
compassLED[WEST] = (LEDBitMap >> 5) &0x1;
compassLED[NORTH] = (LEDBitMap >> 10) &0x1;
compassLED[EAST] = (LEDBitMap >> 15) &0x1;
}
bool ReadPlayerButton()
{
// Logic High = True, Logic Low = False.
// userButton1 is set with an internal Pull-up which makes
// the button true by default and false when pressed.
// Must invert to make the read button function true.
return !userButton1; // Logic inverted
}
bool ReadSelectButton()
{
// Logic High = True, Logic Low = False.
// selectButton is set with an internal Pull-up which makes
// the button true by default and false when pressed.
// Must invert to make the read button function true.
return !selectButton; // Logic inverted
}
void soundBuzzer(int Hz)
{
int ticks = Hz/64;
int tickCount = 0;
float frequency = 1/(float)Hz;
while(tickCount < ticks) {
wait(frequency);
Buzzer = true;
wait(frequency);
Buzzer = false;
tickCount++;
}
}
void RotateLEDs(float delay)
{
if (LEDBitmap == (1 << 10)) {
soundBuzzer(300);
}
SetLED(LEDBitmap);
LEDBitmap <<= 1;
wait(delay);
if(LEDBitmap >= (1 << 20)) {
LEDBitmap = 1;
}
}
void splash()
{
int LEDBitmap = 1;
for (int x = 1; x <= 20; x++) {
LEDBitmap <<= 1;
SetLED(LEDBitmap);
soundBuzzer((x * 100) + 500);
wait(0.0078125);
}
for (int y = 0; y < 5; y++) {
SetLED(0xfffff);
soundBuzzer(600);
wait(.03125);
SetLED(0x0);
wait(.03125);
}
}
int checkTargetHit(int currentLED)
{
wait(.5);
if (currentLED == (1 << 11)) {
return 3;
} else if (currentLED == (1 << 10) || currentLED == (1 << 12)) {
return 2;
} else if (currentLED == (1 << 9) || currentLED == (1 << 13)) {
return 1;
} else {
return 0;
}
}
void displayHighestLevel()
{
sprintf (debugString, "H Lev %d",highestLevel);
printToLCD(debugString);
wait(2.5);
sprintf (debugString, "Level %d",level);
printToLCD(debugString);
}
void score()
{
int target = checkTargetHit(LEDBitmap);
switch (target) {
case 3:
level += 3;
break;
case 2:
if(level < 10) {
level += 2;
} else {
level -= 2;
}
break;
case 1:
level += 1;
break;
default:
level--;
if (level <= 1) {
level = 1;
}
}
if (level > highestLevel) {
highestLevel = level;
}
}
void winner()
{
int winCounter = 1;
while (winCounter++ <= 5) {
printToLCD("Winner!!");
SetLED(0xFFFFF);
wait(.5);
printToLCD("");
SetLED(0x0);
for (int x = 1; x <= 10; x++) {
soundBuzzer((x * 100) + 500);
wait(0.0078125);
}
}
while (true) {
printToLCD("Winner!!");
SetLED(0xFFFFF);
wait(.5);
}
}
void gameLoop()
{
while (true) {
sprintf (debugString, "Level %d", level);
printToLCD(debugString);
while (!ReadPlayerButton()) {
RotateLEDs(1/(((float)level * rotateFactor) + 19));
}
score();
if (level > 99) {
winner();
}
while (ReadPlayerButton()) { // Will hold game if hold on to button to prevent cheating
}
}
}
int main()
{
initilize();
splash();
gameLoop();
}