Renzo Villani / Mbed 2 deprecated Atrapa_la_Luz

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001  #include "mbed.h"
00002 
00003 Ticker tick;    //Definición del ticker
00004 
00005 // Entradas y salidas
00006 
00007 // Leds indicadores de turno
00008 DigitalOut LED_JUG_1(PTE30);
00009 DigitalOut LED_JUG_2(PTE29);
00010 
00011 //Control de catodos para la multiplexación
00012 DigitalOut K_1(PTA13);
00013 DigitalOut K_2(PTD5);
00014 
00015 //Segmentos del los displays
00016 DigitalOut SEGMENTO_A(PTC12);
00017 DigitalOut SEGMENTO_B(PTC13);
00018 DigitalOut SEGMENTO_C(PTC16);
00019 DigitalOut SEGMENTO_D(PTC17);
00020 DigitalOut SEGMENTO_E(PTA16);
00021 DigitalOut SEGMENTO_F(PTA17);
00022 DigitalOut SEGMENTO_G(PTE31);
00023 
00024 //Fila de leds de juego
00025 BusOut myleds(PTC7,PTC0,PTC3,PTC4,PTC5,PTC6,PTC10,PTC11);  //Funcion para vectorizar la salida
00026 
00027 //Pulsadores
00028 BusIn mypuls(PTC8,PTC9); //Funcion para vectorizar la entrada (jugador 1 y 2 respectivamente)
00029 
00030 
00031 // Definicion de estados
00032 enum{
00033     STANDBY = 0, //0
00034     TURNO_J1, // 1
00035     TURNO_J2, // 2
00036     TRANSICION, //3
00037     GANADOR //4
00038 };
00039 
00040 
00041 #define BASE_TIEMPO 0.01 // Base de tiempo 10ms
00042 
00043 //Declaración de variables universales
00044 unsigned int t = 0;     //Timer de la maquinada de estados
00045 unsigned int clk = 0;       //Timer de multiplexación
00046 unsigned char tipo_de_transicion = 0;      //Define que transición se ejecutará y a que estado pasara despues de pasar por el estado TRANSICION
00047 static int posicion_leds;       //Define que led de juego estara encendido una vez el juego comenzado
00048 unsigned char direccion;        //Define el recorrido de "la luz"
00049 unsigned char prox_turno;       //Define a posicion inicial y dirección de "la luz"
00050 static int parpadeo = 0;        //Define la cantidad de veces que el/los leds parpadean
00051 unsigned char puntuacion[2] = {0};      
00052 unsigned char numero_display[10] = {0b1111110,0b0110000,0b1101101,0b1111001,0b0110011,0b1011011,0b1011111,0b1110000,0b1111111,0b1111011};       //Vector con todos los valores binarios necesarios para el control de los displays usando operaciones de bits
00053 
00054 //Maquina de estados
00055 void Input_Pulso(int indice);
00056 
00057 //Funcion para el manejo de displays
00058 void Display(int numero_1, int numero_2);
00059 
00060 // Funcion del ticker
00061 void Interrupcion(void)
00062 {
00063     t++;
00064     clk++;
00065 }
00066 
00067 //Inicialización de comunicación serial
00068 Serial pc(USBTX, USBRX, 115200);
00069 
00070 int main() {
00071     // Inicializaciones
00072     mypuls[0].mode(PullNone);
00073     mypuls[1].mode(PullNone);
00074     tick.attach(&Interrupcion, BASE_TIEMPO);
00075     
00076     //Bucle infinito
00077     while(1){
00078         Input_Pulso(0);
00079         Display(puntuacion[0], puntuacion[1]); 
00080     }
00081 }
00082 
00083 void Input_Pulso(int indice){
00084     static int estado = STANDBY;        //Estado inicial
00085     switch(estado){
00086         case STANDBY:
00087         //Antes de iniciar el juego
00088             LED_JUG_1 = 1;      //Se encienden ambos leds indicadores de turnos
00089             LED_JUG_2 = 1;
00090             if(t<100){      //Durante 1s...
00091                 for(int p=0;p<8;p++){       //Los leds de juego pares permaneceran prendidos mientras que los impares apagados
00092                     if(p % 2 == 0)
00093                         myleds[p] = 1;
00094                     else
00095                         myleds[p] = 0;
00096                 }
00097             }
00098             if(t>=100 && t<200){            //Durante 1s pasado el anterior...
00099                 for(int p=0;p<8;p++){       //Los leds de juego impares permaneceran prendidos mientras que los pares apagados
00100                     if(p % 2 != 0)
00101                         myleds[p] = 1;
00102                     else
00103                         myleds[p] = 0;
00104                 }
00105             }
00106             if(t>=200)      //Cada 2s el timer t se resetea
00107                 t=0;
00108             if(mypuls[0]==1 && mypuls[1]==1){       //Si ambos pulsadores se presionan simutaneamente...
00109                 estado = TRANSICION;                //Se cambia el estado dando inicio al juego
00110                 t = 0;                              //Se resetea el timer t
00111                 tipo_de_transicion = 0;             //Se indica que trancición se ejecutara
00112                 for(int p=0;p<8;p++){               //Se apagan todos los leds de juego
00113                     myleds[p] = 0;       
00114                 }
00115             }
00116         break;
00117         case TRANSICION:        
00118         //Abarca todas las tranciciones del juego
00119             if(puntuacion[0]>=5 || puntuacion[1]>=5){           //Primero se revisa si alguno de los dos jugadores ganó
00120                 estado = GANADOR;                               //Cabio de estado a GANADOR
00121                 if(puntuacion[0] > puntuacion[1])               //Luego se revisa cual de los dos jugadores gano y se comunica serialmente
00122                     pc.printf("EL JUGARDOR 1 GANA!!!!\n");
00123                 else
00124                     pc.printf("EL JUGARDOR 2 GANA!!!!\n");
00125                 for(int p=0;p<8;p++){                           //Se apagan todos los leds de juego
00126                     myleds[p] = 0; 
00127                 }
00128                 
00129             }
00130             switch(tipo_de_transicion){
00131                 case 0:     //Transición del estado STANDBY a TURNO_J1
00132                 //Todos los leds de juego parpaderan lentamente tres veces antes de dar inicio al juego
00133                     if(t<50){                       //Los primeros 500ms...
00134                         for(int p=0;p<8;p++){       //Se encienden todos los leds de juego
00135                             myleds[p] = 1;       
00136                         }
00137                     }
00138                     else if(t>=50 && t<100){        //Los siguientes 500ms...
00139                         for(int p=0;p<8;p++){       //Se apagan todos los leds de juego
00140                             myleds[p] = 0;       
00141                         }
00142                     }
00143                     else if(t>=100 && t<150){       //Los siguientes 500ms...
00144                         for(int p=0;p<8;p++){       //Se encienden todos los leds de juego
00145                             myleds[p] = 1;       
00146                         }
00147                     }
00148                     else if(t>=150 && t<200){       //Los siguientes 500ms...
00149                         for(int p=0;p<8;p++){       //Se apagan todos los leds de juego
00150                             myleds[p] = 0;       
00151                         }
00152                     }
00153                     else if(t>=200 && t<400){       //El siguiente segundo...
00154                         for(int p=0;p<8;p++){       //Se encienden todos los leds de juego
00155                             myleds[p] = 1; 
00156                         }
00157                     }
00158                     else if(t>=400){                //Luego de 4s del ultimo reinicio del timer...
00159                         for(int p=0;p<8;p++){       //Se apagan todos los leds de juego
00160                             myleds[p] = 0;       
00161                         }
00162                         t = 0;                      //Se reinicia el timer t
00163                         estado = TURNO_J1;          //Se cambia el estado al turno del jugador 1
00164                         direccion = 0;              //Se ajustan las condiciones iniciales de "la luz"
00165                         posicion_leds = 0;
00166                         LED_JUG_2 = 0;              //Se apaga el led de turno 2 mientras que el otro se deja encendido
00167                     }
00168                 break;
00169                 case 1:     //Trancición entre los turnos de los jugadores
00170                 //El led de juego que se encontraba encendido al momento de la pulsación del jugador en su turno se pondra a parpadear rapidamente (100ms) por un breve periodo de tiempo antes del siguiente turno
00171                     if(t>10 && parpadeo<15){
00172                         parpadeo++;
00173                         myleds[posicion_leds]=!myleds[posicion_leds];
00174                         t = 0;      //Se reinicia el timer t
00175                     }
00176                     if(parpadeo>=15){
00177                         //En función de la variable "proximo_turno" se cambia el estado a "TURNO_J1" o "TURNO_J2" y se ajustan las condiciones iniciales y al estado que se cambiara
00178                         if(prox_turno==0){
00179                             direccion = 0;
00180                             posicion_leds = 0;
00181                             LED_JUG_1 = 1;
00182                             LED_JUG_2 = 0;
00183                             estado = TURNO_J1;
00184                         }
00185                         else if(prox_turno==1){
00186                             direccion = 1;
00187                             posicion_leds = 7;
00188                             LED_JUG_1 = 0;
00189                             LED_JUG_2 = 1;
00190                             estado = TURNO_J2;
00191                         }
00192                         parpadeo = 0;       //Se resetea la variable
00193                     }
00194                 break;
00195                 default:    //No deberia pasar nunca pero esta puesto por las dudas
00196                     tipo_de_transicion = 0;
00197                 break;
00198             }
00199         break;
00200         case TURNO_J1:
00201             switch(direccion){      //Controla que la variable "posicion_leds" vaya de 0 a 7 y viceversa
00202                 case 0:             //Dirección estandar
00203                     if(t >= 5){     //Tiempo en el que tarda un "pasar la  luz de un led al siguiente"
00204                         posicion_leds++;
00205                         t = 0;      //Se resetea el tiempo
00206                     }
00207                     if(posicion_leds >=7)   //Una vez llegando al ultimo led de juego...
00208                         direccion = 1;      //Cambio de dirección
00209                 break;
00210                 case 1:             //Dirección inversa
00211                     if(t >= 5){     //Tiempo en el que tarda un "pasar la  luz de un led al anterior"
00212                         posicion_leds--;
00213                         t = 0;      //Se resetea el tiempo
00214                     }
00215                     if(posicion_leds <=0)   ///Una vez llegando al primer led de juego...
00216                         direccion = 0;      //Cambio de dirrección
00217                 break;
00218                 default:        //No deberia pasar nunca pero esta puesto por las dudas
00219                     direccion = 0;
00220                 break;
00221             }
00222             for(int p=0;p<8;p++){       //Primero se apagan todos los leds de juego
00223                 myleds[p] = 0;       
00224             }
00225             myleds[posicion_leds] = 1;  //Luego se prende unicamente el led de juego que la variable "posicion_leds" defina
00226             if(mypuls[0] == 1){         //Pulsación del jugador 1
00227                 if(posicion_leds==7)    //Si el led se juego encendido es el ultimo...
00228                     puntuacion[0]++;    //Se logra puntuar
00229                 t = 0;                  //Se resetea el tiempo
00230                 tipo_de_transicion = 1; //Se indica que trancición de ejecutara
00231                 estado = TRANSICION;    //Se cambia el estado
00232                 prox_turno = 1;         //Se indica que el proximo turno es del jugador 2
00233                 pc.printf("JUGARDOR 1:%d JUGADOR 2:%d\n",puntuacion[0],puntuacion[1]);      //Se comunica la puntuación por comunicación serial
00234             }
00235         break;
00236         case TURNO_J2:
00237             switch(direccion){      //Controla que la variable "posicion_leds" vaya de 0 a 7 y viceversa
00238                 case 0:             //Dirección estandar
00239                     if(t >= 5){     //Tiempo en el que tarda un "pasar la  luz de un led al siguiente"
00240                         posicion_leds++;
00241                         t = 0;      //Se resetea el tiempo
00242                     }
00243                     if(posicion_leds >=7)   //Una vez llegando al ultimo led de juego...
00244                         direccion = 1;      //Cambio de dirección
00245                 break;
00246                 case 1:             //Dirección inversa
00247                     if(t >= 5){     //Tiempo en el que tarda un "pasar la  luz de un led al anterior"
00248                         posicion_leds--;
00249                         t = 0;      //Se resetea el tiempo
00250                     }
00251                     if(posicion_leds <=0)   //Una vez llegando al primer led de juego...  
00252                         direccion = 0;      //Cambio de dirrección
00253                 break;
00254                 default:        //No deberia pasar nunca pero esta puesto por las dudas
00255                     direccion = 0;
00256                 break;
00257             }
00258             for(int p=0;p<8;p++){       //Primero se apagan todos los leds de juego
00259                 myleds[p] = 0;       
00260             }
00261             myleds[posicion_leds] = 1;  //Luego se prende unicamente el led de juego que la variable "posicion_leds" defina
00262             if(mypuls[1] == 1){         //Pulsación del jugador 2
00263                 if(posicion_leds==0)    //Si el led se juego encendido es el primero...
00264                     puntuacion[1]++;    //Se logra puntuar
00265                 t = 0;                  //Se resetea el tiempo
00266                 tipo_de_transicion = 1; //Se indica que trancición de ejecutara
00267                 estado = TRANSICION;    //Se cambia el estado
00268                 prox_turno = 0;         //Se indica que el proximo turno es del jugador 1
00269                 pc.printf("JUGARDOR 1:%d JUGADOR 2:%d\n",puntuacion[0],puntuacion[1]);      //Se comunica la puntuación por comunicación serial
00270             }
00271         break;
00272         case GANADOR:
00273         //Todos los leds de juego parpaderan
00274             if(t>10 && parpadeo<50){        //Ajuste de tiempo y cantidad de veces que los leds parpadearan
00275                 parpadeo++;
00276                 for(int p=0;p<8;p++){
00277                     myleds[p]=!myleds[p];
00278                 }
00279                 t = 0;
00280             }
00281             if(parpadeo>=50){       //Una vez finalizado el parpadeo...
00282                 parpadeo = 0;
00283                 estado = STANDBY;   //Se cambia al estado inicial
00284                 puntuacion[0] = 0;  //Se reinician ambas puntuaciones
00285                 puntuacion[1] = 0;
00286             }
00287         break;
00288     }
00289 }
00290 
00291 
00292 void Display(int numero_1, int numero_2){
00293     //A la funcion se le ingresan dos variales: puntuacion[0] y puntuacion[1]
00294     static int posicion=0;      //Variable que difine los estados de los transistores colocados en los catodos de los displays
00295     if(clk==1){                 //Tiempo de multiplexación: 10ms
00296         if(posicion==1){
00297             posicion = 0;       //Cambio de la variable para el siguiento uso
00298             K_2 = 0;            //Transistor 2 al corte
00299             K_1 = 1;            //Transistor 1 en saturación
00300             //Impresión de la puntuación del jugador 1 en el primer display
00301             SEGMENTO_A = numero_display[numero_1]&0b1000000;
00302             SEGMENTO_B = numero_display[numero_1]&0b0100000;
00303             SEGMENTO_C = numero_display[numero_1]&0b0010000;
00304             SEGMENTO_D = numero_display[numero_1]&0b0001000;
00305             SEGMENTO_E = numero_display[numero_1]&0b0000100;
00306             SEGMENTO_F = numero_display[numero_1]&0b0000010;
00307             SEGMENTO_G = numero_display[numero_1]&0b0000001;
00308         }
00309         else{
00310             posicion = 1;       //Cambio de la variable para el siguiento uso
00311             K_1 = 0;            //Transistor 1 al corte
00312             K_2 = 1;            //Transistor 2 en saturación
00313             //Impresión de la puntuación del jugador 2 en el segundo display
00314             SEGMENTO_A = numero_display[numero_2]&0b1000000;
00315             SEGMENTO_B = numero_display[numero_2]&0b0100000;
00316             SEGMENTO_C = numero_display[numero_2]&0b0010000;
00317             SEGMENTO_D = numero_display[numero_2]&0b0001000;
00318             SEGMENTO_E = numero_display[numero_2]&0b0000100;
00319             SEGMENTO_F = numero_display[numero_2]&0b0000010;
00320             SEGMENTO_G = numero_display[numero_2]&0b0000001;
00321         }
00322         clk = 0;                //Reseteo del clock
00323     }
00324 }