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:
- rf4186
- Date:
- 2022-06-07
- Revision:
- 0:1afb8ee86b88
File content as of revision 0:1afb8ee86b88:
#include "mbed.h"
#include <stdio.h>
#define BASE_TIEMPO 0.0001
//Declaración de estados
enum{
NORMAL,
Juego1,
Juego2,
Juego3,
Gano,
Perdio
};
//Declaración de entradas y salidas
DigitalIn SW(D4);
DigitalIn C1(PTC7);
DigitalIn C2(PTC0);
DigitalIn C3(PTC3);
DigitalIn C4(PTC4);
DigitalOut ROJO(D2);
DigitalOut VERDE(D3);
DigitalOut BUZZER(D5);
DigitalOut A(PTC17);
DigitalOut B(PTC16);
DigitalOut C(PTC13);
DigitalOut D(PTC12);
DigitalOut BL(D8);
DigitalOut DISPLAY1(D9);
DigitalOut DISPLAY2(D10);
//Declaración de variables
Ticker tick;
Serial pc(USBTX, USBRX);
int segundos = 0 , music = 0 ,notime = 0;
int t = 0;
int E = 0;
int Cable = 4;
int MUSICA = 0;
int GREEN = 0 , RED = 0, BLINK = 0;
int valor = 0;
int mux_display = 0;
//Declaración de funciones
void bomba();
void display(int);
void secuencia();
void Interrupt(){
segundos++;
mux_display++;
music++;
//El buzzer modifica su oscilación dependiendo de MUSICA, siempre y cuando se encuentre en partida.
if(music >= 30000 - 9000*MUSICA && MUSICA >= 1 && MUSICA <= 3){
BUZZER ? BUZZER = 0 : BUZZER = 1;
music =0;
}else
BUZZER = 0;
//Cada medio segundo hago oscilar los leds y el display, solo si RED o GREEN se activan
if(segundos == 5000 || segundos == 10000){
if(GREEN)
VERDE ? (VERDE = 0) : (VERDE = 1);
else
VERDE = 0;
if(RED)
ROJO ? (ROJO = 0) : (ROJO = 1);
else
ROJO = 0;
if(BLINK)
BL ? (BL = 0) : (BL = 1);
else
BL = 1;
}
//Utilizo la siguiente secuencia para marcar los pasos de 1s (t)
if(segundos >= 10000 ){
if(t > 0)
t--;
segundos = 0;
}
//Utilizo la siguiente secuencia para marcar los pasos de 1s (t)
if(mux_display >= 41 ){
if(BLINK)
display(valor);
else
display(t);
mux_display = 0;
}
}
int main(){
tick.attach(&Interrupt , BASE_TIEMPO);
while(1){
bomba();
}
}
void bomba(){
static int estado = NORMAL;
//Declaro los estados como se diagramaron en la máquina de estados
switch(estado){
case NORMAL:
if(SW.read() == 1){
secuencia();
estado = Juego1;
t = 70;
MUSICA = 1;
RED = 0;
GREEN = 0;
pc.printf("El juego esta ahora en marcha. Primeros 30s\n");
}
break;
case Juego1:
secuencia();
if(t <= 40){
estado = Juego2;
MUSICA = 2;
pc.printf("La musica se intensifica\n");
}
if(E){
estado = Perdio;
valor = t;
t = 10;
RED = 1;
MUSICA = 5;
BLINK = 1;
pc.printf("Partida terminada, el jugador pierde.\n");
}
if(Cable == 0){
estado = Gano;
GREEN = 1;
MUSICA = 4;
BLINK = 1;
valor = t;
t = 10;
pc.printf("Partida terminada, el jugador gana.\n");
}
break;
case Juego2:
secuencia();
if(t <= 20){
estado = Juego3;
MUSICA = 3;
pc.printf("Queda poco tiempo\n");
}
if (E){
estado = Perdio;
RED = 1;
MUSICA = 5;
BLINK = 1;
valor = t;
t=10;
pc.printf("Partida terminada, el jugador pierde.\n");
}
if(Cable == 0){
estado = Gano;
GREEN = 1;
MUSICA = 4;
BLINK = 1;
valor = t;
t = 10;
pc.printf("Partida terminada, el jugador gana.\n");
}
break;
case Juego3:
secuencia();
if(t <= 10 || E){
estado = Perdio;
MUSICA = 5;
RED = 1;
BLINK = 1;
valor = t;
pc.printf("Partida terminada, el jugador pierde.\n");
}
if(t <= 10)
notime = 1;
if(Cable == 0){
estado = Gano;
GREEN = 1;
MUSICA = 4;
BLINK = 1;
valor = t;
t = 10;
pc.printf("Partida terminada, el jugador gana.\n");
}
break;
case Gano:
if(t == 0){
estado = NORMAL;
Cable = 4;
MUSICA = 0;
BLINK = 0;
GREEN = 0;
pc.printf("El juego se encuentra listo para comenzar.\n");
}
break;
case Perdio:
if(t == 0){
estado = NORMAL;
Cable = 4;
E = 0;
MUSICA = 0;
BLINK = 0;
RED = 0;
pc.printf("El juego se encuentra listo para comenzar.\n");
}
break;
default:
estado = NORMAL;
}
}
//Funcion de control de multiplexado
void display(int x){
char decenas;
char unidades;
if(x > 10){
decenas = (x-10)/10;
unidades = (x-10)%10;
}else{
decenas = 0;
unidades = 0;
}
static char estado = 0;
//estado indica el display a utilizar.
//En ambos casos se toma bit a bit el número (unidad o decena) y se la inserta en el CD4511 mediante A, B, C y D
//Los displays se apagan por un breve momento mientras se configura el Cd4511
if(estado == 0){
DISPLAY2 = 0;
A = (decenas & 0b1000)>>3;
B = (decenas & 0b100)>>2;
C = (decenas & 0b10)>>1;
D = decenas & 1;
DISPLAY1 = 1;
estado = 1;
}else if(estado == 1){
DISPLAY1 = 0;
A = (unidades & 0b1000)>>3;
B = (unidades & 0b100)>>2;
C = (unidades & 0b10)>>1;
D = unidades & 1;
DISPLAY2 = 1;
estado = 0;
}
}
//Funcion que se encarga de modificar la secuencia y su correcto seguimiento durante la partida.
void secuencia(){
static int flag = 0 , flagc1 = 0 , flagc2 = 0 , flagc3 = 0 , flagc4 = 0;
static int secuencia[4];
if (flag == 0){
flagc1 = 0;
flagc2 = 0;
flagc3 = 0;
flagc4 = 0;
secuencia[0]= 0;
secuencia[1]= 0;
secuencia[2]= 0;
secuencia[3]= 0;
//Declaro las variables dentro de la secuencia hasta que tenga un ejemplar de cada numereo del 1 al 4
for(int i = 0 ; i < 4 ;){
secuencia[i] = rand() % 4 + 1;
for(int j = i - 1 ; j >= 0 ; j--){
if (secuencia[i] == secuencia[j]){
i--;
break;
}
}
i++;
}
pc.printf("LA SECUENCIA A REPRODUCIR ES %d %d %d %d\n" , secuencia[0] , secuencia[1] , secuencia[2] , secuencia[3]);
flag++;
}else{
//Cada cable tiene su propio número asignado. Cuando lo desconecto
//ese código debe conincidir con la secuencia, de otro modo será un
//error. Una vez desactivado se utiliza una variable para descartarlos
//hatsa la proxima partida.
if(C1.read() == 1){
if(secuencia [flag-1] == 1 && !flagc1){
Cable--;
flag++;
flagc1 = 1;
}else if(!flagc1)
E = 1;
}
if(C2.read() == 1 && !flagc2){
if(secuencia [flag-1] == 2){
Cable--;
flag++;
flagc2 = 1;
}else if(!flagc2)
E = 1;
}
if(C3.read() == 1 && !flagc3){
if(secuencia [flag-1] == 3){
Cable--;
flag++;
flagc3 = 1;
}else if(!flagc3)
E = 1;
}
if(C4.read() == 1 && !flagc4){
if(secuencia [flag-1] == 4){
Cable--;
flag++;
flagc4 = 1;
}else if(!flagc4)
E = 1;
}
//Cuando se terina la secuencia, se comete un error o se acaba el
// tiempo se vuelve al primer estado flag = 0
if (flag == 5 || E == 1 || notime == 1){
flag = 0;
notime = 0;
}
}
}