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:
- fm_4186
- Date:
- 2022-06-04
- Revision:
- 0:e30c05ee1b0a
- Child:
- 1:a8699ad87eee
File content as of revision 0:e30c05ee1b0a:
#include "mbed.h"
#define CANT_PULSADORES 2
Serial pc(USBTX, USBRX);
Ticker tick;
BusOut leds(D10,D9,D8,D6,D5,D4,D3,D2);
DigitalOut A_D(PTB8);
DigitalOut B_D(PTB9);
DigitalOut C_D(PTB10);
DigitalOut D_D(PTB11);
DigitalOut E_D(PTE2);
DigitalOut F_D(PTE3);
DigitalOut G_D(PTE4);
DigitalOut CAT(PTE5);
BusIn pulsadores (D12,D11);
int tiempo=0;
int tiempo2=0;
int valor = 0;
int display=1;
void funcion();
void flip()
{
funcion(); //coloco acà la fuciòn para que se ejecute todo el tiempo
if(tiempo<=50000) {
tiempo++;
}
if(tiempo2<=800) {
tiempo2++;
}
}
int Led_Step(); // declaro las funciones
void Maquina_General(void);
void inicio();
void ganador();
int main()
{
tick.attach(&flip, 0.01);
pulsadores[0].mode(PullNone);
pulsadores[1].mode(PullNone);
while (true) {
Maquina_General();
}
}
///
void Maquina_General(void)
{
static int estado_A = 0;
static int led_actual = 0;
static int puntos_a = 0,puntos_b = 0; // lo pongo static porque sino me cambia el valor de los puntos
int a=0, b=0;
switch(estado_A) {
case 0:
inicio();
if(pulsadores[0] == 1 && pulsadores[1] == 1) {
estado_A = 1; //se prende el sistema
puntos_a = 0;
puntos_b = 0;
tiempo=0;
}
break;
case 1: //estado jugador 1
Led_Step();
if(tiempo>=20) { //pequeña demora para evitar problemas
if(pulsadores[0] == 1 ) {
leds=0;
led_actual = Led_Step(); //valor de estado de funcion Led_Step()
if (led_actual==8) //en caso que sea el segundo sentido y asi detectar el led en el que paro
a=2;
if (led_actual==9)
a=4;
if (led_actual==10)
a=6;
if (led_actual==11)
a=8;
if (led_actual==12)
a=10;
if (led_actual==13)
a=12;
if(led_actual > 7) {
led_actual = led_actual - a; // coloco esta variable en su led perteneciente
}
leds[led_actual]=1; //2 segundos prendido
if(led_actual == 7)
puntos_a= puntos_a + 10; // sumo 10 puntos para luego en el multuplexado poder usar los 2 displays juntos
valor = puntos_a + puntos_b; // valor que le llega al barrido
estado_A = 3; // paso a la espera
tiempo2=0; // hago que vuelva a contar el tiempo 2
}
}
break;
case 2: //estado jugador 2
Led_Step();
if(pulsadores[1] == 1 ) {
leds=0;
led_actual = Led_Step(); //valor de estado de funcion Led_Step()
if (led_actual==8)
b=2;
if (led_actual==9)
b=4;
if (led_actual==10)
b=6;
if (led_actual==11)
b=8;
if (led_actual==12)
b=10;
if (led_actual==13)
b=12;
if(led_actual > 7) {
led_actual = led_actual - b;
}
leds[led_actual]=1; //2 segundos
if(led_actual == 0)
puntos_b++;
valor = puntos_a + puntos_b;
estado_A = 4;
tiempo2=0;
}
break;
case 3: // Espero tiempo pausado jugador 1
if(tiempo2==200) {
leds[led_actual]=0;
estado_A = 2;
if(puntos_a >= 20) {
estado_A = 0; // vuelvo al inicio asi en caso de que se desee se vuelva a iniciar el juego
puntos_a=0; // vuelvo todo a cero por las dudas
puntos_b=0;
valor=0;
}
tiempo=0;
}
break;
case 4: // Espero tiempo pausado jugador 2
if(tiempo2==200) {
leds[led_actual]=0;
estado_A = 1;
if(puntos_b >= 2) {
estado_A = 0;
puntos_a=0;
puntos_b=0;
valor=0;
}
tiempo=0;
}
break;
}
}
///
int Led_Step(void) // funcion de secuencia ida y vuelva
{
static int estado = 0;
switch(estado) {
case 0:
leds = 0;
leds[0] = 1; //suma un punto jugador 2
if(tiempo == 5) { // 0.05 SEG
estado = 1;
}
break;
case 1:
leds=0;
leds[1] = 1;
if(tiempo == 10) {
estado = 2;
}
break;
case 2:
leds=0;
leds[2] = 1;
if(tiempo == 15) {
estado = 3;
}
break;
case 3:
leds=0;
leds[3] = 1;
if(tiempo == 20) {
estado = 4;
}
break;
case 4:
leds=0;
leds[4] = 1;
if(tiempo == 25) {
estado = 5;
}
break;
case 5:
leds=0;
leds[5] = 1;
if(tiempo == 30) {
estado = 6;
}
break;
case 6:
leds=0;
leds[6] = 1;
if(tiempo == 35) {
estado = 7;
}
break;
case 7:
leds=0;
leds[7] = 1; //suma un punto jugador 1
if(tiempo == 40) {
estado = 8;
}
break;
case 8:
leds=0;
leds[6] = 1;
if(tiempo == 45) {
estado = 9;
}
break;
case 9:
leds=0;
leds[5] = 1;
if(tiempo == 50) {
estado = 10;
}
break;
case 10:
leds=0;
leds[4] = 1;
if(tiempo == 55) {
estado = 11;
}
break;
case 11:
leds=0;
leds[3] = 1;
if(tiempo == 60) {
estado = 12;
}
break;
case 12:
leds=0;
leds[2] = 1;
if(tiempo == 65) {
estado = 13;
}
break;
case 13:
leds=0;
leds[1] = 1;
if(tiempo == 70) {
estado = 0;
tiempo=0;
}
break;
}
return estado;
}
///
void inicio(void) // funcion de espera antes que se inicie el juego
{
static int est = 0;
switch(est) {
case 0:
leds = 0;
leds[0] = 1;
if(tiempo == 100) { //1 seg
est = 1;
}
break;
case 1:
leds=0;
leds[1] = 1;
if(tiempo == 200) {
est = 2;
}
break;
case 2:
leds=0;
leds[2] = 1;
if(tiempo == 300) {
est = 3;
}
break;
case 3:
leds=0;
leds[3] = 1;
if(tiempo == 400) {
est = 4;
}
break;
case 4:
leds=0;
leds[4] = 1;
if(tiempo == 500) {
est = 5;
}
break;
case 5:
leds=0;
leds[5] = 1;
if(tiempo == 600) {
est = 6;
}
break;
case 6:
leds=0;
leds[6] = 1;
if(tiempo == 700) {
est = 7;
}
break;
case 7:
leds=0;
leds[7] = 1;
if(tiempo == 800) {
est=0;
tiempo = 0;
}
break;
}
}
///
void funcion () // funcion de barrido multiplexado
{
int numeros[10]= {0b1111110, 0b0110000, 0b1101101, 0b1111001, 0b0110011, 0b1011011, 0b1011111, 0b1110000, 0b1111111, 0b1111011};
int d1;
if(display==0) //ponemos estas 2 cuentas para distinto display y asi cambiarlo en cada catodo, por esto es que los puntos a se suman de a 10
d1 = valor/10;
else
d1 = valor%10;
A_D = (numeros[d1] & 0b1000000) >> 6;
B_D = (numeros[d1] & 0b100000) >> 5;
C_D = (numeros[d1] & 0b10000) >> 4;
D_D = (numeros[d1] & 0b1000) >> 3;
E_D = (numeros[d1] & 0b100) >> 2;
F_D = (numeros[d1] & 0b10) >> 1;
G_D = numeros[d1] & 1;
display ? display = 0 : display = 1; //cambio el display
CAT=display; // asigno ese cambio al cátodo
}