Fernando Maraz / Mbed 2 deprecated ATRAPALUZ

Dependencies:   mbed

Revision:
0:e30c05ee1b0a
Child:
1:a8699ad87eee
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Jun 04 22:36:50 2022 +0000
@@ -0,0 +1,342 @@
+
+#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
+}
+
+
+