Fernando Maraz / Mbed 2 deprecated ATRAPALUZ

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 
00002 #include "mbed.h"
00003 #define CANT_PULSADORES 2
00004 Serial pc(USBTX, USBRX);
00005 Ticker tick;
00006 BusOut leds(D10,D9,D8,D6,D5,D4,D3,D2);
00007 DigitalOut A_D(PTB8);
00008 DigitalOut B_D(PTB9);
00009 DigitalOut C_D(PTB10);
00010 DigitalOut D_D(PTB11);
00011 DigitalOut E_D(PTE2);
00012 DigitalOut F_D(PTE3);
00013 DigitalOut G_D(PTE4);
00014 DigitalOut CAT(PTE5);
00015 BusIn pulsadores (D12,D11);
00016 int tiempo=0;
00017 int tiempo2=0;
00018 int valor = 0;
00019 int display=1;
00020 void funcion();
00021 void flip()
00022 {
00023     funcion(); //coloco acà la funciòn para que se ejecute todo el tiempo
00024     if(tiempo<=50000) {
00025         tiempo++;
00026     }
00027     if(tiempo2<=800) {
00028         tiempo2++;
00029     }
00030 }
00031 int Led_Step(); // declaro las funciones
00032 void Maquina_General(void);
00033 void inicio();
00034 void ganador();
00035 int main()
00036 {
00037     tick.attach(&flip, 0.01);
00038     pulsadores[0].mode(PullNone);
00039     pulsadores[1].mode(PullNone);
00040     while (true) {
00041         Maquina_General();
00042     }
00043 }
00044 ///
00045 void Maquina_General(void)
00046 {
00047     static int estado_A = 0;
00048     static int led_actual = 0;
00049     static int puntos_a = 0,puntos_b = 0; // lo pongo static porque sino me cambia el valor de los puntos
00050     int a=0, b=0;
00051     switch(estado_A) {
00052         case 0:
00053             inicio();
00054             if(pulsadores[0] == 1 && pulsadores[1] == 1) {
00055 
00056                 estado_A = 1; //se prende el sistema
00057                 puntos_a = 0;
00058                 puntos_b = 0;
00059                 tiempo=0;
00060             }
00061             break;
00062         case 1: //estado jugador 1
00063             Led_Step();
00064             if(tiempo>=20) { //pequeña demora para evitar problemas
00065                 if(pulsadores[0] == 1 ) {
00066                     leds=0;
00067                     led_actual = Led_Step(); //valor de estado de funcion Led_Step()
00068                     if (led_actual==8) //en caso que sea el segundo sentido y asi detectar el led en el que paro
00069                         a=2;
00070                     if (led_actual==9)
00071                         a=4;
00072                     if (led_actual==10)
00073                         a=6;
00074                     if (led_actual==11)
00075                         a=8;
00076                     if (led_actual==12)
00077                         a=10;
00078                     if (led_actual==13)
00079                         a=12;
00080                     if(led_actual > 7) {
00081                         led_actual = led_actual - a; // coloco esta variable en su led perteneciente
00082                     }
00083                     leds[led_actual]=1; //2 segundos prendido
00084                     if(led_actual == 7) {
00085                         puntos_a= puntos_a + 10;
00086                         printf("el jugador 1 suma un punto\n");
00087                         leds[0]=1;
00088                         leds[1]=1;
00089                         leds[2]=1;
00090                         leds[3]=1;
00091                         leds[4]=1;
00092                         leds[5]=1;
00093                         leds[6]=1;
00094                         leds[7]=1;
00095                     } // sumo 10 puntos para luego en el multuplexado poder usar los 2 displays juntos
00096                     valor = puntos_a + puntos_b; // valor que le llega al barrido
00097                     estado_A = 3; // paso a la espera
00098                     tiempo2=0; // hago que vuelva a contar el tiempo 2
00099                 }
00100             }
00101             break;
00102         case 2: //estado jugador 2
00103             Led_Step();
00104             if(pulsadores[1] == 1 ) {
00105                 leds=0;
00106                 led_actual = Led_Step(); //valor de estado de funcion Led_Step()
00107                 if (led_actual==8)
00108                     b=2;
00109                 if (led_actual==9)
00110                     b=4;
00111                 if (led_actual==10)
00112                     b=6;
00113                 if (led_actual==11)
00114                     b=8;
00115                 if (led_actual==12)
00116                     b=10;
00117                 if (led_actual==13)
00118                     b=12;
00119                 if(led_actual > 7) {
00120                     led_actual = led_actual - b;
00121                 }
00122                 leds[led_actual]=1; //2 segundos
00123                 if(led_actual == 0) {
00124                     puntos_b++;
00125                     printf("el jugador 2 suma un punto\n");
00126                     leds[0]=1;
00127                     leds[1]=1;
00128                     leds[2]=1;
00129                     leds[3]=1;
00130                     leds[4]=1;
00131                     leds[5]=1;
00132                     leds[6]=1;
00133                     leds[7]=1;
00134                 }
00135                 valor = puntos_a + puntos_b;
00136                 estado_A = 4;
00137                 tiempo2=0;
00138             }
00139             break;
00140         case 3: // Espero tiempo pausado jugador 1
00141             if(tiempo2==200) {
00142                 leds[led_actual]=0;
00143                 estado_A = 2;
00144                 if(puntos_a >= 50) {
00145                     estado_A = 0; // vuelvo al inicio asi en caso de que se desee se vuelva a iniciar el juego
00146                     puntos_a=0; // vuelvo todo a cero por las dudas
00147                     puntos_b=0;
00148                     valor=0;
00149                     printf("el jugaror 1 gana\n");
00150                 }
00151                 tiempo=0;
00152             }
00153             break;
00154         case 4: // Espero tiempo pausado jugador 2
00155             if(tiempo2==200) {
00156                 leds[led_actual]=0;
00157                 estado_A = 1;
00158                 if(puntos_b >= 2) {
00159                     estado_A = 0;
00160                     puntos_a=0;
00161                     puntos_b=0;
00162                     valor=0;
00163                     printf("el jugaror 2 gana\n");
00164                 }
00165                 tiempo=0;
00166             }
00167             break;
00168     }
00169 }
00170 ///
00171 int Led_Step(void) // funcion de secuencia ida y vuelva
00172 {
00173     static int estado = 0;
00174     switch(estado) {
00175         case 0:
00176             leds = 0;
00177             leds[0] = 1; //suma un punto jugador 2
00178             if(tiempo == 5) { // 0.05 SEG
00179                 estado = 1;
00180             }
00181             break;
00182         case 1:
00183             leds=0;
00184             leds[1] = 1;
00185             if(tiempo == 10) {
00186                 estado = 2;
00187             }
00188             break;
00189         case 2:
00190             leds=0;
00191             leds[2] = 1;
00192             if(tiempo == 15) {
00193                 estado = 3;
00194             }
00195             break;
00196         case 3:
00197             leds=0;
00198             leds[3] = 1;
00199             if(tiempo == 20) {
00200                 estado = 4;
00201             }
00202             break;
00203         case 4:
00204             leds=0;
00205             leds[4] = 1;
00206             if(tiempo == 25) {
00207                 estado = 5;
00208             }
00209             break;
00210         case 5:
00211             leds=0;
00212             leds[5] = 1;
00213             if(tiempo == 30) {
00214                 estado = 6;
00215             }
00216             break;
00217         case 6:
00218             leds=0;
00219             leds[6] = 1;
00220             if(tiempo == 35) {
00221                 estado = 7;
00222             }
00223             break;
00224         case 7:
00225             leds=0;
00226             leds[7] = 1; //suma un punto jugador 1
00227             if(tiempo == 40) {
00228                 estado = 8;
00229             }
00230             break;
00231         case 8:
00232             leds=0;
00233             leds[6] = 1;
00234             if(tiempo == 45) {
00235                 estado = 9;
00236             }
00237             break;
00238         case 9:
00239             leds=0;
00240             leds[5] = 1;
00241             if(tiempo == 50) {
00242                 estado = 10;
00243             }
00244             break;
00245         case 10:
00246             leds=0;
00247             leds[4] = 1;
00248             if(tiempo == 55) {
00249                 estado = 11;
00250             }
00251             break;
00252         case 11:
00253             leds=0;
00254             leds[3] = 1;
00255             if(tiempo == 60) {
00256                 estado = 12;
00257             }
00258             break;
00259         case 12:
00260             leds=0;
00261             leds[2] = 1;
00262             if(tiempo == 65) {
00263                 estado = 13;
00264             }
00265             break;
00266         case 13:
00267             leds=0;
00268             leds[1] = 1;
00269             if(tiempo == 70) {
00270                 estado = 0;
00271                 tiempo=0;
00272             }
00273             break;
00274     }
00275     return estado;
00276 }
00277 ///
00278 void inicio(void) // funcion de espera antes que se inicie el juego
00279 {
00280     static int est = 0;
00281     switch(est) {
00282         case 0:
00283             leds = 0;
00284             leds[0] = 1;
00285             if(tiempo == 100) { //1 seg
00286                 est = 1;
00287             }
00288             break;
00289         case 1:
00290             leds=0;
00291             leds[1] = 1;
00292             if(tiempo == 200) {
00293                 est = 2;
00294             }
00295             break;
00296         case 2:
00297             leds=0;
00298             leds[2] = 1;
00299             if(tiempo == 300) {
00300                 est = 3;
00301             }
00302             break;
00303         case 3:
00304             leds=0;
00305             leds[3] = 1;
00306             if(tiempo == 400) {
00307                 est = 4;
00308             }
00309             break;
00310         case 4:
00311             leds=0;
00312             leds[4] = 1;
00313             if(tiempo == 500) {
00314                 est = 5;
00315             }
00316             break;
00317         case 5:
00318             leds=0;
00319             leds[5] = 1;
00320             if(tiempo == 600) {
00321                 est = 6;
00322             }
00323             break;
00324         case 6:
00325             leds=0;
00326             leds[6] = 1;
00327             if(tiempo == 700) {
00328                 est = 7;
00329             }
00330             break;
00331         case 7:
00332             leds=0;
00333             leds[7] = 1;
00334             if(tiempo == 800) {
00335                 est=0;
00336                 tiempo = 0;
00337             }
00338             break;
00339     }
00340 }
00341 ///
00342 void funcion () // funcion de barrido multiplexado
00343 {
00344     int numeros[10]= {0b1111110, 0b0110000, 0b1101101, 0b1111001, 0b0110011, 0b1011011, 0b1011111, 0b1110000, 0b1111111, 0b1111011};
00345     int d1;
00346     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
00347         d1 = valor/10;
00348     else
00349         d1 = valor%10;
00350 
00351     A_D = (numeros[d1] & 0b1000000) >> 6;
00352     B_D = (numeros[d1] & 0b100000) >> 5;
00353     C_D = (numeros[d1] & 0b10000) >> 4;
00354     D_D = (numeros[d1] & 0b1000) >> 3;
00355     E_D = (numeros[d1] & 0b100) >> 2;
00356     F_D = (numeros[d1] & 0b10) >> 1;
00357     G_D = numeros[d1] & 1;
00358 
00359     display ? display = 0 : display = 1; //cambio el display
00360     CAT=display; // asigno ese cambio al cátodo
00361 }
00362 
00363 
00364