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
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 }
Generated on Tue Jul 12 2022 11:21:00 by
1.7.2