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 #include <stdio.h> 00003 00004 #define BASE_TIEMPO 0.0001 00005 00006 //Declaración de estados 00007 enum{ 00008 NORMAL, 00009 Juego1, 00010 Juego2, 00011 Juego3, 00012 Gano, 00013 Perdio 00014 }; 00015 00016 //Declaración de entradas y salidas 00017 DigitalIn SW(D4); 00018 DigitalIn C1(PTC7); 00019 DigitalIn C2(PTC0); 00020 DigitalIn C3(PTC3); 00021 DigitalIn C4(PTC4); 00022 DigitalOut ROJO(D2); 00023 DigitalOut VERDE(D3); 00024 DigitalOut BUZZER(D5); 00025 DigitalOut A(PTC17); 00026 DigitalOut B(PTC16); 00027 DigitalOut C(PTC13); 00028 DigitalOut D(PTC12); 00029 DigitalOut BL(D8); 00030 DigitalOut DISPLAY1(D9); 00031 DigitalOut DISPLAY2(D10); 00032 00033 //Declaración de variables 00034 Ticker tick; 00035 Serial pc(USBTX, USBRX); 00036 int segundos = 0 , music = 0 ,notime = 0; 00037 int t = 0; 00038 int E = 0; 00039 int Cable = 4; 00040 int MUSICA = 0; 00041 int GREEN = 0 , RED = 0, BLINK = 0; 00042 int valor = 0; 00043 int mux_display = 0; 00044 00045 //Declaración de funciones 00046 void bomba(); 00047 void display(int); 00048 void secuencia(); 00049 void Interrupt(){ 00050 segundos++; 00051 mux_display++; 00052 music++; 00053 //El buzzer modifica su oscilación dependiendo de MUSICA, siempre y cuando se encuentre en partida. 00054 if(music >= 30000 - 9000*MUSICA && MUSICA >= 1 && MUSICA <= 3){ 00055 BUZZER ? BUZZER = 0 : BUZZER = 1; 00056 music =0; 00057 }else 00058 BUZZER = 0; 00059 //Cada medio segundo hago oscilar los leds y el display, solo si RED o GREEN se activan 00060 if(segundos == 5000 || segundos == 10000){ 00061 if(GREEN) 00062 VERDE ? (VERDE = 0) : (VERDE = 1); 00063 else 00064 VERDE = 0; 00065 if(RED) 00066 ROJO ? (ROJO = 0) : (ROJO = 1); 00067 else 00068 ROJO = 0; 00069 if(BLINK) 00070 BL ? (BL = 0) : (BL = 1); 00071 else 00072 BL = 1; 00073 } 00074 //Utilizo la siguiente secuencia para marcar los pasos de 1s (t) 00075 if(segundos >= 10000 ){ 00076 if(t > 0) 00077 t--; 00078 segundos = 0; 00079 } 00080 //Utilizo la siguiente secuencia para marcar los pasos de 1s (t) 00081 if(mux_display >= 41 ){ 00082 if(BLINK) 00083 display(valor); 00084 else 00085 display(t); 00086 mux_display = 0; 00087 } 00088 } 00089 00090 int main(){ 00091 tick.attach(&Interrupt , BASE_TIEMPO); 00092 while(1){ 00093 bomba(); 00094 } 00095 } 00096 00097 void bomba(){ 00098 static int estado = NORMAL; 00099 //Declaro los estados como se diagramaron en la máquina de estados 00100 switch(estado){ 00101 case NORMAL: 00102 if(SW.read() == 1){ 00103 secuencia(); 00104 estado = Juego1; 00105 t = 70; 00106 MUSICA = 1; 00107 RED = 0; 00108 GREEN = 0; 00109 pc.printf("El juego esta ahora en marcha. Primeros 30s\n"); 00110 } 00111 break; 00112 case Juego1: 00113 secuencia(); 00114 if(t <= 40){ 00115 estado = Juego2; 00116 MUSICA = 2; 00117 pc.printf("La musica se intensifica\n"); 00118 } 00119 if(E){ 00120 estado = Perdio; 00121 valor = t; 00122 t = 10; 00123 RED = 1; 00124 MUSICA = 5; 00125 BLINK = 1; 00126 pc.printf("Partida terminada, el jugador pierde.\n"); 00127 } 00128 if(Cable == 0){ 00129 estado = Gano; 00130 GREEN = 1; 00131 MUSICA = 4; 00132 BLINK = 1; 00133 valor = t; 00134 t = 10; 00135 pc.printf("Partida terminada, el jugador gana.\n"); 00136 } 00137 break; 00138 case Juego2: 00139 secuencia(); 00140 if(t <= 20){ 00141 estado = Juego3; 00142 MUSICA = 3; 00143 pc.printf("Queda poco tiempo\n"); 00144 } 00145 if (E){ 00146 estado = Perdio; 00147 RED = 1; 00148 MUSICA = 5; 00149 BLINK = 1; 00150 valor = t; 00151 t=10; 00152 pc.printf("Partida terminada, el jugador pierde.\n"); 00153 } 00154 if(Cable == 0){ 00155 estado = Gano; 00156 GREEN = 1; 00157 MUSICA = 4; 00158 BLINK = 1; 00159 valor = t; 00160 t = 10; 00161 pc.printf("Partida terminada, el jugador gana.\n"); 00162 } 00163 break; 00164 case Juego3: 00165 secuencia(); 00166 if(t <= 10 || E){ 00167 estado = Perdio; 00168 MUSICA = 5; 00169 RED = 1; 00170 BLINK = 1; 00171 valor = t; 00172 pc.printf("Partida terminada, el jugador pierde.\n"); 00173 } 00174 if(t <= 10) 00175 notime = 1; 00176 if(Cable == 0){ 00177 estado = Gano; 00178 GREEN = 1; 00179 MUSICA = 4; 00180 BLINK = 1; 00181 valor = t; 00182 t = 10; 00183 pc.printf("Partida terminada, el jugador gana.\n"); 00184 } 00185 break; 00186 case Gano: 00187 if(t == 0){ 00188 estado = NORMAL; 00189 Cable = 4; 00190 MUSICA = 0; 00191 BLINK = 0; 00192 GREEN = 0; 00193 pc.printf("El juego se encuentra listo para comenzar.\n"); 00194 } 00195 break; 00196 case Perdio: 00197 if(t == 0){ 00198 estado = NORMAL; 00199 Cable = 4; 00200 E = 0; 00201 MUSICA = 0; 00202 BLINK = 0; 00203 RED = 0; 00204 pc.printf("El juego se encuentra listo para comenzar.\n"); 00205 } 00206 break; 00207 default: 00208 estado = NORMAL; 00209 } 00210 } 00211 00212 //Funcion de control de multiplexado 00213 void display(int x){ 00214 char decenas; 00215 char unidades; 00216 if(x > 10){ 00217 decenas = (x-10)/10; 00218 unidades = (x-10)%10; 00219 }else{ 00220 decenas = 0; 00221 unidades = 0; 00222 } 00223 static char estado = 0; 00224 //estado indica el display a utilizar. 00225 //En ambos casos se toma bit a bit el número (unidad o decena) y se la inserta en el CD4511 mediante A, B, C y D 00226 //Los displays se apagan por un breve momento mientras se configura el Cd4511 00227 if(estado == 0){ 00228 DISPLAY2 = 0; 00229 A = (decenas & 0b1000)>>3; 00230 B = (decenas & 0b100)>>2; 00231 C = (decenas & 0b10)>>1; 00232 D = decenas & 1; 00233 DISPLAY1 = 1; 00234 estado = 1; 00235 }else if(estado == 1){ 00236 DISPLAY1 = 0; 00237 A = (unidades & 0b1000)>>3; 00238 B = (unidades & 0b100)>>2; 00239 C = (unidades & 0b10)>>1; 00240 D = unidades & 1; 00241 DISPLAY2 = 1; 00242 estado = 0; 00243 } 00244 } 00245 00246 //Funcion que se encarga de modificar la secuencia y su correcto seguimiento durante la partida. 00247 void secuencia(){ 00248 static int flag = 0 , flagc1 = 0 , flagc2 = 0 , flagc3 = 0 , flagc4 = 0; 00249 static int secuencia[4]; 00250 if (flag == 0){ 00251 flagc1 = 0; 00252 flagc2 = 0; 00253 flagc3 = 0; 00254 flagc4 = 0; 00255 secuencia[0]= 0; 00256 secuencia[1]= 0; 00257 secuencia[2]= 0; 00258 secuencia[3]= 0; 00259 00260 //Declaro las variables dentro de la secuencia hasta que tenga un ejemplar de cada numereo del 1 al 4 00261 for(int i = 0 ; i < 4 ;){ 00262 secuencia[i] = rand() % 4 + 1; 00263 for(int j = i - 1 ; j >= 0 ; j--){ 00264 if (secuencia[i] == secuencia[j]){ 00265 i--; 00266 break; 00267 } 00268 } 00269 i++; 00270 } 00271 pc.printf("LA SECUENCIA A REPRODUCIR ES %d %d %d %d\n" , secuencia[0] , secuencia[1] , secuencia[2] , secuencia[3]); 00272 flag++; 00273 }else{ 00274 //Cada cable tiene su propio número asignado. Cuando lo desconecto 00275 //ese código debe conincidir con la secuencia, de otro modo será un 00276 //error. Una vez desactivado se utiliza una variable para descartarlos 00277 //hatsa la proxima partida. 00278 if(C1.read() == 1){ 00279 if(secuencia [flag-1] == 1 && !flagc1){ 00280 Cable--; 00281 flag++; 00282 flagc1 = 1; 00283 }else if(!flagc1) 00284 E = 1; 00285 } 00286 if(C2.read() == 1 && !flagc2){ 00287 if(secuencia [flag-1] == 2){ 00288 Cable--; 00289 flag++; 00290 flagc2 = 1; 00291 }else if(!flagc2) 00292 E = 1; 00293 } 00294 if(C3.read() == 1 && !flagc3){ 00295 if(secuencia [flag-1] == 3){ 00296 Cable--; 00297 flag++; 00298 flagc3 = 1; 00299 }else if(!flagc3) 00300 E = 1; 00301 } 00302 if(C4.read() == 1 && !flagc4){ 00303 if(secuencia [flag-1] == 4){ 00304 Cable--; 00305 flag++; 00306 flagc4 = 1; 00307 }else if(!flagc4) 00308 E = 1; 00309 } 00310 //Cuando se terina la secuencia, se comete un error o se acaba el 00311 // tiempo se vuelve al primer estado flag = 0 00312 if (flag == 5 || E == 1 || notime == 1){ 00313 flag = 0; 00314 notime = 0; 00315 } 00316 } 00317 }
Generated on Fri Jul 29 2022 09:49:40 by
1.7.2