Juan Manuel Rodriguez Aguado
/
Ejer03
Bomba
Revision 0:d570b80c224b, committed 2019-06-21
- Comitter:
- Jumaroag
- Date:
- Fri Jun 21 02:55:49 2019 +0000
- Commit message:
- Ejer03
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r d570b80c224b main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Jun 21 02:55:49 2019 +0000 @@ -0,0 +1,574 @@ +#include "mbed.h" + +//Defines maquinas de estados +#define Esperando_Inicio 0 +#define Codigo 1 +#define Esperando_Desactivacion 2 +#define Comparacion_Codigo 3 +#define Termino 4 +#define Control_Tiempo 5 + +//Entradas Digitales +DigitalIn Cable_0(PTE5); +DigitalIn Cable_1(PTE4); +DigitalIn Cable_2(PTE3); +DigitalIn Cable_3(PTE2); +DigitalIn Pulsador(PTB11); + +//Salidas Digitales +DigitalOut Segmento_A(PTC7); +DigitalOut Segmento_B(PTC0); +DigitalOut Segmento_C(PTC3); +DigitalOut Segmento_D(PTC4); +DigitalOut Segmento_E(PTC5); +DigitalOut Segmento_F(PTC6); +DigitalOut Segmento_G(PTC10); +DigitalOut Habilitacion_Decenas(PTA4); +DigitalOut Habilitacion_Unidades(PTA12); + +DigitalOut led_verde(LED_GREEN); +DigitalOut led_rojo(LED_RED); + +//Variables +unsigned char combinacion[4],Estado_General=Esperando_Inicio,tiempo_rebote=0,a=0; +unsigned char estado_mostrar=0,decena=0,unidad=0,tiempo_decenas=0,tiempo_unidades=0,tiempo_exploto=0,b=0,flag=0,hab_parpadeo=0,estado_anterior=0;//display +unsigned char n;//Tiempo regresivo + +//Ticker y sus funciones +Ticker T_rebote,tiempo,barrido; + +void anti_rebote(void); +void tiempito(void); +void parpadeo(void); +void tiempo_barrido(void); + +//Funciones +void mostrar(unsigned char n);//Funcion que muestra por los displays el nro que le pases +int main() +{ + //Habilito PullUp interno para los cables y el pulsador + Cable_0.mode(PullUp); + Cable_1.mode(PullUp); + Cable_2.mode(PullUp); + Cable_3.mode(PullUp); + Pulsador.mode(PullUp); + + T_rebote.attach(&anti_rebote, 0.1);//Inicio timmer 1ms + barrido.attach(&tiempo_barrido, 0.01);//inciio timmer para barrido de displays + + unsigned char codigo[4],for_a=0,antirebote_pulsador=0,antirebote_cables=0,antiprintf=0,habilitacion_pulsador=0; + unsigned char hab_cable_3=0,hab_cable_2=0,hab_cable_1=0,hab_cable_0=0; + + led_verde=1; + led_rojo=1; + + printf("-----Juego de la Bomba-----\n");//Introduccion al juego + while(1) + { + switch (Estado_General)//Maquina de estados General del programa + { + default: + + case Esperando_Inicio://Se espera a que se active el juego + hab_cable_3=0; + hab_cable_2=0; + hab_cable_1=0; + hab_cable_0=0; + led_verde=0;//Enciendo el led verde + led_rojo=1; + n=20;//Seteo el tiempo + mostrar(n); + for(a=0;a<4;a++) + { + combinacion[a]=0; + } + a=0; + antirebote_cables=0; + while(antiprintf==0) + { + printf("Pulse para iniciar\n"); + antiprintf=1; + tiempo.detach();//reinicio los timmers + } + + //Boton INICIO - si lo pulso incia el juego y cambio de estdado + if(Pulsador==0 && antirebote_pulsador==0 && habilitacion_pulsador==1) + { + tiempo_rebote=0; + antirebote_pulsador=1; + } + if(tiempo_rebote==1 && Pulsador==0 && habilitacion_pulsador==1) + { + Estado_General=Codigo;//Cambio de estado + antirebote_pulsador=0; + antiprintf=0; + led_verde=1; + habilitacion_pulsador=0; + } + if(tiempo_rebote==1 && Pulsador==1 && habilitacion_pulsador==1) + antirebote_pulsador=0; + + if(Pulsador==1 && antirebote_pulsador==0) + { + tiempo_rebote=0; + antirebote_pulsador=1; + } + if(tiempo_rebote==1 && Pulsador==1) + { + antirebote_pulsador=0; + habilitacion_pulsador=1; + } + if(tiempo_rebote==1 && Pulsador==0) + antirebote_pulsador=0; + break; + + case Codigo://Se genera el codigo de desactivacion y se imprime + mostrar(n); + printf("-El CODIGO es: "); + codigo[0]=rand()%4+1; + do//Genero un codigo aleatorio de 4 digitos entre 1 y 4 sin repetir + { + codigo[1]=rand()%4+1; + } + while(codigo[0]==codigo[1]); + do + { + codigo[2]=rand()%4+1; + } + while((codigo[0]==codigo[2]) || (codigo[1]==codigo[2])); + do + { + codigo[3]=rand()%4+1; + } + while((codigo[0]==codigo[3]) || (codigo[1]==codigo[3]) || (codigo[2]==codigo[3])); + for(for_a=0;for_a<4;for_a++) + { + printf("%i",codigo[for_a]); + if(for_a==3) + printf("\n"); + } + Estado_General=Esperando_Desactivacion;//Una vez generado el codigo cambio de estado + tiempo.attach(&tiempito, 1);//Inicia la cuenta regresiva + break; + + case Esperando_Desactivacion://Se desactiva la bomba + mostrar(n); + //Cable 0 + if(Cable_0==1 && antirebote_cables==0 && hab_cable_0==0) + { + tiempo_rebote=0; + antirebote_cables=1; + hab_cable_0=1; + } + if(Cable_0==1 && antirebote_cables==1 && tiempo_rebote==1) + { + combinacion[a]=1; + Estado_General=Comparacion_Codigo; + a++; + antirebote_cables=0; + } + if(Cable_0==0 && antirebote_cables==1 && tiempo_rebote==1) + { + antirebote_cables=0; + hab_cable_0=0; + } + //Cable 1 + if(Cable_1==1 && antirebote_cables==0 && hab_cable_1==0) + { + tiempo_rebote=0; + antirebote_cables=2; + hab_cable_1=1; + } + if(Cable_1==1 && antirebote_cables==2 && tiempo_rebote==1) + { + combinacion[a]=2; + Estado_General=Comparacion_Codigo; + a++; + antirebote_cables=0; + } + if(Cable_1==0 && antirebote_cables==2 && tiempo_rebote==1) + { + antirebote_cables=0; + hab_cable_1=0; + } + + //Cable 2 + if(Cable_2==1 && antirebote_cables==0 && hab_cable_2==0) + { + tiempo_rebote=0; + antirebote_cables=3; + hab_cable_2=1; + } + if(Cable_2==1 && antirebote_cables==3 && tiempo_rebote==1) + { + combinacion[a]=3; + Estado_General=Comparacion_Codigo; + a++; + antirebote_cables=0; + } + if(Cable_2==0 && antirebote_cables==3 && tiempo_rebote==1) + { + antirebote_cables=0; + hab_cable_2=0; + } + + //Cable 3 + if(Cable_3==1 && antirebote_cables==0 && hab_cable_3==0) + { + tiempo_rebote=0; + antirebote_cables=4; + hab_cable_3=1; + } + if(Cable_3==1 && antirebote_cables==4 && tiempo_rebote==1) + { + combinacion[a]=4; + Estado_General=Comparacion_Codigo; + a++; + antirebote_cables=0; + } + if(Cable_3==0 && antirebote_cables==4 && tiempo_rebote==1) + { + antirebote_cables=0; + hab_cable_3=0; + } + + //Boton Para RESET - si se pulsa vuelvo a Esperando Inicio + if(Pulsador==0 && antirebote_pulsador==0 && habilitacion_pulsador==1) + { + tiempo_rebote=0; + antirebote_pulsador=1; + } + if(tiempo_rebote==1 && Pulsador==0 && habilitacion_pulsador==1) + { + Estado_General=Esperando_Inicio;//Reseteo y vuelvo al estado inicial + antirebote_pulsador=0; + antiprintf=0; + printf("RESET\n"); + habilitacion_pulsador=0; + } + if(tiempo_rebote==1 && Pulsador==1 && habilitacion_pulsador==1) + antirebote_pulsador=0; + + if(Pulsador==1 && antirebote_pulsador==0) + { + tiempo_rebote=0; + antirebote_pulsador=1; + } + if(tiempo_rebote==1 && Pulsador==1) + { + antirebote_pulsador=0; + habilitacion_pulsador=1; + } + if(tiempo_rebote==1 && Pulsador==0) + antirebote_pulsador=0; + break; + + case Comparacion_Codigo://comparo el codigo con la combinacion + if(combinacion[a-1]!=codigo[a-1])//Si el cable es incorrecto perdes + { + printf("\n-----PERDISTE-----\n"); + Estado_General=Termino; + } + if(combinacion[a-1]== codigo[a-1])//si es correcto seguis jugando + Estado_General=Esperando_Desactivacion; + if((a==4) && (Estado_General==Esperando_Desactivacion))//si sacas el ultimo cable y es correcto ganas + { + printf("\n-----GANASTE-----\n"); + Estado_General=Termino; + } + break; + + case Termino://Hago parpadear el diaplay y el led correspondiente - espero boton para volver a inicio + mostrar(n); + while(antiprintf==0) + { + printf("Conecte todos los cables\nPulse para iniciar de nuevo\n\n"); + tiempo.detach();//freno el tiempo donde haya quedado + tiempo.attach(&parpadeo, 0.2);//inicio el parpadeo + antiprintf=1; + } + if((b%2)==1 && hab_parpadeo==0) + { + estado_mostrar=5; + if(a==4) + led_verde=0; + if(a!=4) + led_rojo=0; + hab_parpadeo=1; + } + if((b%2)==0 && hab_parpadeo==1) + { + estado_mostrar=1; + if(a==4) + led_verde=1; + if(a!=4) + led_rojo=1; + hab_parpadeo=0; + } + if(b==10) + { + tiempo.detach(); + led_verde=1; + led_rojo=1; + b=0; + } + if(Pulsador==0 && antirebote_pulsador==0 && habilitacion_pulsador==1) + { + tiempo_rebote=0; + antirebote_pulsador=1; + } + if(tiempo_rebote==1 && Pulsador==0 && habilitacion_pulsador==1) + { + Estado_General=Esperando_Inicio;//Vuelvo al estado de inicio + antirebote_pulsador=0; + antiprintf=0; + } + if(tiempo_rebote==1 && Pulsador==1 && habilitacion_pulsador==1) + antirebote_pulsador=0; + + if(Pulsador==1 && antirebote_pulsador==0) + { + tiempo_rebote=0; + antirebote_pulsador=1; + } + if(tiempo_rebote==1 && Pulsador==1) + { + antirebote_pulsador=0; + habilitacion_pulsador=1; + } + if(tiempo_rebote==1 && Pulsador==0) + antirebote_pulsador=0; + break; + }//sw + }//while +}//main + + +void anti_rebote(void)//cada 1ms +{ + tiempo_rebote++; + if(tiempo_rebote==10) + tiempo_rebote=0; +} + +void tiempito(void)//Cuenta regresiva cada 1 seg +{ + n--; + if(n==0) + { + printf("\nPERDISTE\n"); + Estado_General=Termino; + a=0; + } +} + +void parpadeo(void) +{ + b++; +} + +void tiempo_barrido(void) +{ + if(estado_mostrar==2) + if(tiempo_decenas == 0)//if del demonio + tiempo_decenas++; + if(estado_mostrar==4) + if(tiempo_unidades == 0)//if del demonio + tiempo_unidades++; +} + +void mostrar(unsigned char n)//Funcion que muestra por los displays el nro que le pases +{ + switch (estado_mostrar) + { + default: + + case 0: + estado_anterior=0; + decena=n/10; + unidad=n%10; + Habilitacion_Decenas=1; + Habilitacion_Unidades=1; + estado_mostrar=1; + break; + + case 1: + estado_anterior=1; + if(decena==0) + { + Segmento_A=1; + Segmento_B=1; + Segmento_C=1; + Segmento_D=1; + Segmento_E=1; + Segmento_F=1; + Segmento_G=0; + } + if(decena==1) + { + Segmento_A=0; + Segmento_B=1; + Segmento_C=1; + Segmento_D=0; + Segmento_E=0; + Segmento_F=0; + Segmento_G=0; + } + if(decena==2) + { + Segmento_A=1; + Segmento_B=1; + Segmento_C=0; + Segmento_D=1; + Segmento_E=1; + Segmento_F=0; + Segmento_G=1; + } + if(decena==3) + { + Segmento_A=1; + Segmento_B=1; + Segmento_C=1; + Segmento_D=1; + Segmento_E=0; + Segmento_F=0; + Segmento_G=1; + } + estado_mostrar=2; + break; + + case 2: + estado_anterior=2; + Habilitacion_Decenas=0; + Habilitacion_Unidades=1; + if(tiempo_decenas==1) + { + tiempo_decenas=0; + estado_mostrar=3; + Habilitacion_Decenas=1; + Habilitacion_Unidades=1; + } + break; + + case 3: + estado_anterior=3; + if(unidad==0) + { + Segmento_A=1; + Segmento_B=1; + Segmento_C=1; + Segmento_D=1; + Segmento_E=1; + Segmento_F=1; + Segmento_G=0; + } + if(unidad==1) + { + Segmento_A=0; + Segmento_B=1; + Segmento_C=1; + Segmento_D=0; + Segmento_E=0; + Segmento_F=0; + Segmento_G=0; + } + if(unidad==2) + { + Segmento_A=1; + Segmento_B=1; + Segmento_C=0; + Segmento_D=1; + Segmento_E=1; + Segmento_F=0; + Segmento_G=1; + } + if(unidad==3) + { + Segmento_A=1; + Segmento_B=1; + Segmento_C=1; + Segmento_D=1; + Segmento_E=0; + Segmento_F=0; + Segmento_G=1; + } + if(unidad==4) + { + Segmento_A=0; + Segmento_B=1; + Segmento_C=1; + Segmento_D=0; + Segmento_E=0; + Segmento_F=1; + Segmento_G=1; + } + if(unidad==5) + { + Segmento_A=1; + Segmento_B=0; + Segmento_C=1; + Segmento_D=1; + Segmento_E=0; + Segmento_F=1; + Segmento_G=1; + } + if(unidad==6) + { + Segmento_A=1; + Segmento_B=0; + Segmento_C=1; + Segmento_D=1; + Segmento_E=1; + Segmento_F=1; + Segmento_G=1; + } + if(unidad==7) + { + Segmento_A=1; + Segmento_B=1; + Segmento_C=1; + Segmento_D=0; + Segmento_E=0; + Segmento_F=0; + Segmento_G=0; + } + if(unidad==8) + { + Segmento_A=1; + Segmento_B=1; + Segmento_C=1; + Segmento_D=1; + Segmento_E=1; + Segmento_F=1; + Segmento_G=1; + } + if(unidad==9) + { + Segmento_A=1; + Segmento_B=1; + Segmento_C=1; + Segmento_D=0; + Segmento_E=0; + Segmento_F=1; + Segmento_G=1; + } + estado_mostrar=4; + break; + + case 4: + estado_anterior=4; + Habilitacion_Decenas=1; + Habilitacion_Unidades=0; + if(tiempo_unidades==1) + { + tiempo_unidades=0; + estado_mostrar=0; + } + break; + + case 5: + Habilitacion_Decenas=1; + Habilitacion_Unidades=1; + break; + }//sw +}//funcion \ No newline at end of file
diff -r 000000000000 -r d570b80c224b mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Fri Jun 21 02:55:49 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file