VersionFinal

Dependencies:   mbed

Committer:
NIcolasFernandezSanz
Date:
Mon Jun 17 21:10:56 2019 +0000
Revision:
2:0754ffd73dd0
Parent:
1:2aa790d91fb0
Version Final;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NIcolasFernandezSanz 0:9475a54ade9e 1 /*
NIcolasFernandezSanz 0:9475a54ade9e 2 FERNANDEZ-CLERICI
NIcolasFernandezSanz 1:2aa790d91fb0 3 EJER02 - TP01
NIcolasFernandezSanz 1:2aa790d91fb0 4
NIcolasFernandezSanz 1:2aa790d91fb0 5 PTB0 -- Pulsador Azul
NIcolasFernandezSanz 1:2aa790d91fb0 6 PTB1 -- Pulsador Verde
NIcolasFernandezSanz 1:2aa790d91fb0 7 PTB2 -- Pulsador Rojo
NIcolasFernandezSanz 0:9475a54ade9e 8
NIcolasFernandezSanz 0:9475a54ade9e 9 */
NIcolasFernandezSanz 0:9475a54ade9e 10
NIcolasFernandezSanz 1:2aa790d91fb0 11 /* Librerias*/
NIcolasFernandezSanz 0:9475a54ade9e 12 #include "mbed.h"
NIcolasFernandezSanz 0:9475a54ade9e 13
NIcolasFernandezSanz 0:9475a54ade9e 14 #define ESTADO_COMENZAR 0
NIcolasFernandezSanz 0:9475a54ade9e 15 #define ESTADO_REINICIO 1
NIcolasFernandezSanz 0:9475a54ade9e 16 #define ESTADO_MUESTREO 2
NIcolasFernandezSanz 0:9475a54ade9e 17 #define ESTADO_JUEGO 3
NIcolasFernandezSanz 0:9475a54ade9e 18 #define ESTADO_PERDER 4
NIcolasFernandezSanz 0:9475a54ade9e 19 #define ESTADO_GANAR 5
NIcolasFernandezSanz 0:9475a54ade9e 20
NIcolasFernandezSanz 1:2aa790d91fb0 21 #define INICIO_P 0
NIcolasFernandezSanz 1:2aa790d91fb0 22 #define RISING_P 1
NIcolasFernandezSanz 1:2aa790d91fb0 23 #define RETENCION_P 2
NIcolasFernandezSanz 0:9475a54ade9e 24
NIcolasFernandezSanz 1:2aa790d91fb0 25 #define NIVELES 25
NIcolasFernandezSanz 1:2aa790d91fb0 26 #define PA PTB0
NIcolasFernandezSanz 1:2aa790d91fb0 27 #define PV PTB1
NIcolasFernandezSanz 1:2aa790d91fb0 28 #define PR PTB2
NIcolasFernandezSanz 1:2aa790d91fb0 29
NIcolasFernandezSanz 1:2aa790d91fb0 30 //Creamos los tres leds para usar
NIcolasFernandezSanz 0:9475a54ade9e 31 DigitalOut Rojo(LED1);
NIcolasFernandezSanz 0:9475a54ade9e 32 DigitalOut Verde(LED2);
NIcolasFernandezSanz 0:9475a54ade9e 33 DigitalOut Azul(LED3);
NIcolasFernandezSanz 0:9475a54ade9e 34
NIcolasFernandezSanz 1:2aa790d91fb0 35 void timer();
NIcolasFernandezSanz 0:9475a54ade9e 36 void simon();
NIcolasFernandezSanz 1:2aa790d91fb0 37 bool antirrebote_A(bool lectura);
NIcolasFernandezSanz 1:2aa790d91fb0 38 bool antirrebote_R(bool lectura);
NIcolasFernandezSanz 1:2aa790d91fb0 39 bool antirrebote_V(bool lectura);
NIcolasFernandezSanz 1:2aa790d91fb0 40 int estado_a = 0, estado_r = 0, estado_v = 0;
NIcolasFernandezSanz 0:9475a54ade9e 41 char Pulsador ();
NIcolasFernandezSanz 0:9475a54ade9e 42 void leds(int num); // led(0b000) = apagados, led(0b100) = rojo, led(0b010) = Verde, led(0b001) = Azul, led(0b111) = Blanco,
NIcolasFernandezSanz 0:9475a54ade9e 43
NIcolasFernandezSanz 1:2aa790d91fb0 44 unsigned int semilla = 0;
NIcolasFernandezSanz 0:9475a54ade9e 45 char sec[50] = {0};
NIcolasFernandezSanz 0:9475a54ade9e 46 char nivelSec = 1;
NIcolasFernandezSanz 0:9475a54ade9e 47 char posSec = 0;
NIcolasFernandezSanz 0:9475a54ade9e 48 char posJuego = 0;
NIcolasFernandezSanz 1:2aa790d91fb0 49 int times = 0, espera = 0, tp_v = 0, tp_r = 0, tp_a = 0;
NIcolasFernandezSanz 0:9475a54ade9e 50 bool flagPulsador = 0;
NIcolasFernandezSanz 0:9475a54ade9e 51 char pulsador = 0;
NIcolasFernandezSanz 0:9475a54ade9e 52 char estado = ESTADO_COMENZAR;
NIcolasFernandezSanz 0:9475a54ade9e 53
NIcolasFernandezSanz 0:9475a54ade9e 54 bool pulsador1 = 1, pulsador2 = 1, pulsador3 = 1;
NIcolasFernandezSanz 0:9475a54ade9e 55 bool st1= 0, st2 = 0, st3 = 0, loop = 1, apagado = 0;
NIcolasFernandezSanz 0:9475a54ade9e 56
NIcolasFernandezSanz 0:9475a54ade9e 57
NIcolasFernandezSanz 0:9475a54ade9e 58 Ticker ti;
NIcolasFernandezSanz 0:9475a54ade9e 59
NIcolasFernandezSanz 0:9475a54ade9e 60
NIcolasFernandezSanz 0:9475a54ade9e 61 int main()
NIcolasFernandezSanz 0:9475a54ade9e 62 {
NIcolasFernandezSanz 1:2aa790d91fb0 63 ti.attach(&timer, 0.1);
NIcolasFernandezSanz 0:9475a54ade9e 64
NIcolasFernandezSanz 0:9475a54ade9e 65 //Prendemos los LEDS
NIcolasFernandezSanz 0:9475a54ade9e 66 leds(0b111);
NIcolasFernandezSanz 0:9475a54ade9e 67 printf("Toque cualquier pulsador para comenzar: \r\n");
NIcolasFernandezSanz 0:9475a54ade9e 68
NIcolasFernandezSanz 0:9475a54ade9e 69 while(true) {
NIcolasFernandezSanz 0:9475a54ade9e 70 //Cambio el estado de los pulsadores
NIcolasFernandezSanz 0:9475a54ade9e 71 Pulsador();
NIcolasFernandezSanz 0:9475a54ade9e 72 //Ejecuto la funcion principal
NIcolasFernandezSanz 0:9475a54ade9e 73 simon();
NIcolasFernandezSanz 0:9475a54ade9e 74 //Aseguro el reset de la habilitacion del pulsador
NIcolasFernandezSanz 0:9475a54ade9e 75 flagPulsador = 0;
NIcolasFernandezSanz 0:9475a54ade9e 76 }
NIcolasFernandezSanz 0:9475a54ade9e 77 }
NIcolasFernandezSanz 0:9475a54ade9e 78 void simon()
NIcolasFernandezSanz 0:9475a54ade9e 79 {
NIcolasFernandezSanz 0:9475a54ade9e 80 static int i;
NIcolasFernandezSanz 0:9475a54ade9e 81 switch(estado) {
NIcolasFernandezSanz 0:9475a54ade9e 82 case ESTADO_COMENZAR:
NIcolasFernandezSanz 0:9475a54ade9e 83 //Espero que pulsen un pulsador para empezar
NIcolasFernandezSanz 0:9475a54ade9e 84 times = 0;
NIcolasFernandezSanz 0:9475a54ade9e 85 if(pulsador != 0 && flagPulsador == 1) {
NIcolasFernandezSanz 0:9475a54ade9e 86 leds(0b000);
NIcolasFernandezSanz 0:9475a54ade9e 87 printf("Comencemos: \r\n\n");
NIcolasFernandezSanz 0:9475a54ade9e 88 estado = ESTADO_REINICIO;
NIcolasFernandezSanz 0:9475a54ade9e 89 flagPulsador = 0;
NIcolasFernandezSanz 0:9475a54ade9e 90 }
NIcolasFernandezSanz 0:9475a54ade9e 91 break;
NIcolasFernandezSanz 0:9475a54ade9e 92
NIcolasFernandezSanz 0:9475a54ade9e 93 case ESTADO_REINICIO:
NIcolasFernandezSanz 0:9475a54ade9e 94 //Seteo la semilla
NIcolasFernandezSanz 0:9475a54ade9e 95 srand (semilla*4920*1912);
NIcolasFernandezSanz 0:9475a54ade9e 96 //Genero la secuencia
NIcolasFernandezSanz 0:9475a54ade9e 97 for(i = 0; i <= NIVELES ; i ++) {
NIcolasFernandezSanz 0:9475a54ade9e 98 sec[i] = rand() % 3 + 1;
NIcolasFernandezSanz 0:9475a54ade9e 99 }
NIcolasFernandezSanz 0:9475a54ade9e 100 nivelSec = 1;
NIcolasFernandezSanz 0:9475a54ade9e 101 posSec = 0;
NIcolasFernandezSanz 0:9475a54ade9e 102 posJuego = 0;
NIcolasFernandezSanz 0:9475a54ade9e 103 estado = ESTADO_MUESTREO;
NIcolasFernandezSanz 0:9475a54ade9e 104 times = 0;
NIcolasFernandezSanz 0:9475a54ade9e 105 loop = 0;
NIcolasFernandezSanz 0:9475a54ade9e 106 break;
NIcolasFernandezSanz 0:9475a54ade9e 107
NIcolasFernandezSanz 0:9475a54ade9e 108 case ESTADO_MUESTREO:
NIcolasFernandezSanz 0:9475a54ade9e 109 //Muestro la secuencia generada
NIcolasFernandezSanz 0:9475a54ade9e 110 if(loop) {
NIcolasFernandezSanz 0:9475a54ade9e 111 //Cada vez que termino de mostrar un LED
NIcolasFernandezSanz 0:9475a54ade9e 112 if (apagado == 0) {
NIcolasFernandezSanz 0:9475a54ade9e 113 //Evaluo si mostre la cantidad de LEDs segun el nivel
NIcolasFernandezSanz 0:9475a54ade9e 114 if(posSec >= nivelSec) {
NIcolasFernandezSanz 0:9475a54ade9e 115 estado = ESTADO_JUEGO;
NIcolasFernandezSanz 0:9475a54ade9e 116 printf("\nA jugar Bro :) \r");
NIcolasFernandezSanz 0:9475a54ade9e 117 printf("\r\n\n");
NIcolasFernandezSanz 0:9475a54ade9e 118 espera = 0;
NIcolasFernandezSanz 0:9475a54ade9e 119 break;
NIcolasFernandezSanz 0:9475a54ade9e 120 }
NIcolasFernandezSanz 0:9475a54ade9e 121 switch(sec[posSec]) {
NIcolasFernandezSanz 0:9475a54ade9e 122 case 1:
NIcolasFernandezSanz 0:9475a54ade9e 123 //Muestro LED rojo
NIcolasFernandezSanz 0:9475a54ade9e 124 leds(0b100);
NIcolasFernandezSanz 0:9475a54ade9e 125 if(times > 5) {
NIcolasFernandezSanz 0:9475a54ade9e 126 times = 0;
NIcolasFernandezSanz 0:9475a54ade9e 127 printf("ROJO\r\n");
NIcolasFernandezSanz 0:9475a54ade9e 128 apagado = 1;
NIcolasFernandezSanz 0:9475a54ade9e 129 posSec++;
NIcolasFernandezSanz 0:9475a54ade9e 130 }
NIcolasFernandezSanz 0:9475a54ade9e 131 break;
NIcolasFernandezSanz 0:9475a54ade9e 132 case 2:
NIcolasFernandezSanz 0:9475a54ade9e 133 //Muestro LED verde
NIcolasFernandezSanz 0:9475a54ade9e 134 leds(0b010);
NIcolasFernandezSanz 0:9475a54ade9e 135 if(times > 5) {
NIcolasFernandezSanz 0:9475a54ade9e 136 apagado = 1;
NIcolasFernandezSanz 0:9475a54ade9e 137 times = 0;
NIcolasFernandezSanz 0:9475a54ade9e 138 printf("VERDE\r\n");
NIcolasFernandezSanz 0:9475a54ade9e 139 posSec++;
NIcolasFernandezSanz 0:9475a54ade9e 140 }
NIcolasFernandezSanz 0:9475a54ade9e 141 break;
NIcolasFernandezSanz 0:9475a54ade9e 142 case 3:
NIcolasFernandezSanz 0:9475a54ade9e 143 //Muestro LED azul
NIcolasFernandezSanz 0:9475a54ade9e 144 leds(0b001);
NIcolasFernandezSanz 0:9475a54ade9e 145 if(times > 5) {
NIcolasFernandezSanz 0:9475a54ade9e 146 apagado = 1;
NIcolasFernandezSanz 0:9475a54ade9e 147 times = 0;
NIcolasFernandezSanz 0:9475a54ade9e 148 printf("AZUL\r\n");
NIcolasFernandezSanz 0:9475a54ade9e 149 posSec++;
NIcolasFernandezSanz 0:9475a54ade9e 150 }
NIcolasFernandezSanz 0:9475a54ade9e 151 break;
NIcolasFernandezSanz 0:9475a54ade9e 152 }
NIcolasFernandezSanz 0:9475a54ade9e 153 } else {
NIcolasFernandezSanz 0:9475a54ade9e 154 //Dejo un espacio apagado entre los colores de las secuencias
NIcolasFernandezSanz 0:9475a54ade9e 155 leds(0b000);
NIcolasFernandezSanz 0:9475a54ade9e 156 if (times > 5) {
NIcolasFernandezSanz 0:9475a54ade9e 157 times = 0;
NIcolasFernandezSanz 0:9475a54ade9e 158 apagado = 0;
NIcolasFernandezSanz 0:9475a54ade9e 159 }
NIcolasFernandezSanz 0:9475a54ade9e 160 }
NIcolasFernandezSanz 0:9475a54ade9e 161 } else {
NIcolasFernandezSanz 0:9475a54ade9e 162 //Espero 5 times el ultimo LED encendido y lo apago
NIcolasFernandezSanz 0:9475a54ade9e 163 if (times > 5)
NIcolasFernandezSanz 0:9475a54ade9e 164 leds(0b000);
NIcolasFernandezSanz 0:9475a54ade9e 165 //Espero 5 times mas para separar el final de muestreo con el inicio del Juego
NIcolasFernandezSanz 0:9475a54ade9e 166 if (times > 10) {
NIcolasFernandezSanz 0:9475a54ade9e 167 loop = 1;
NIcolasFernandezSanz 0:9475a54ade9e 168 times = 0;
NIcolasFernandezSanz 0:9475a54ade9e 169 }
NIcolasFernandezSanz 0:9475a54ade9e 170 }
NIcolasFernandezSanz 0:9475a54ade9e 171 break;
NIcolasFernandezSanz 0:9475a54ade9e 172 case ESTADO_JUEGO:
NIcolasFernandezSanz 0:9475a54ade9e 173 //Detecto si el jugador tarda mucho tiempo en apretar un boton
NIcolasFernandezSanz 0:9475a54ade9e 174 if (espera > 50) {
NIcolasFernandezSanz 0:9475a54ade9e 175 printf("Tardaste demaciado tiempo en elegir\r\n");
NIcolasFernandezSanz 0:9475a54ade9e 176 estado = ESTADO_PERDER;
NIcolasFernandezSanz 0:9475a54ade9e 177 break;
NIcolasFernandezSanz 0:9475a54ade9e 178 }
NIcolasFernandezSanz 0:9475a54ade9e 179 //Detecto un cambio en los pulsadores
NIcolasFernandezSanz 0:9475a54ade9e 180 if(flagPulsador) {
NIcolasFernandezSanz 0:9475a54ade9e 181 espera = 0;
NIcolasFernandezSanz 0:9475a54ade9e 182 flagPulsador = 0;
NIcolasFernandezSanz 0:9475a54ade9e 183 times = 0;
NIcolasFernandezSanz 0:9475a54ade9e 184 //Detecto que pulsador precionaron y enciendo el LED
NIcolasFernandezSanz 0:9475a54ade9e 185 switch(pulsador) {
NIcolasFernandezSanz 0:9475a54ade9e 186 case 1:
NIcolasFernandezSanz 0:9475a54ade9e 187 printf("ROJO \r\n");
NIcolasFernandezSanz 0:9475a54ade9e 188 leds(0b100);
NIcolasFernandezSanz 0:9475a54ade9e 189 break;
NIcolasFernandezSanz 0:9475a54ade9e 190 case 2:
NIcolasFernandezSanz 0:9475a54ade9e 191 printf("VERDE \r\n");
NIcolasFernandezSanz 0:9475a54ade9e 192 leds(0b010);
NIcolasFernandezSanz 0:9475a54ade9e 193 break;
NIcolasFernandezSanz 0:9475a54ade9e 194 case 3:
NIcolasFernandezSanz 0:9475a54ade9e 195 printf("AZUL \r\n");
NIcolasFernandezSanz 0:9475a54ade9e 196 leds(0b001);
NIcolasFernandezSanz 0:9475a54ade9e 197 break;
NIcolasFernandezSanz 0:9475a54ade9e 198 }
NIcolasFernandezSanz 0:9475a54ade9e 199 //Comparo si el pulsador apretado es el correcto segun la secuencia
NIcolasFernandezSanz 0:9475a54ade9e 200 if(pulsador == sec[posJuego]) {
NIcolasFernandezSanz 0:9475a54ade9e 201 posJuego++;
NIcolasFernandezSanz 0:9475a54ade9e 202 //Si alcancé el nivel en el que estoy paso de nivel
NIcolasFernandezSanz 0:9475a54ade9e 203 if(posJuego == nivelSec) {
NIcolasFernandezSanz 0:9475a54ade9e 204 nivelSec++;
NIcolasFernandezSanz 0:9475a54ade9e 205 printf("\n\t--------------------------------\r");
NIcolasFernandezSanz 0:9475a54ade9e 206 //Si alcancé el máximo nivel paso al estado GANAR
NIcolasFernandezSanz 0:9475a54ade9e 207 if (nivelSec == NIVELES + 1) {
NIcolasFernandezSanz 0:9475a54ade9e 208 estado = ESTADO_GANAR;
NIcolasFernandezSanz 0:9475a54ade9e 209 } else {
NIcolasFernandezSanz 0:9475a54ade9e 210 //Si no llegué al máximo nivel paso de nivel
NIcolasFernandezSanz 0:9475a54ade9e 211 printf("\nPasaste al nivel %d!\r\n\n", nivelSec);
NIcolasFernandezSanz 0:9475a54ade9e 212 posSec = 0;
NIcolasFernandezSanz 0:9475a54ade9e 213 posJuego = 0;
NIcolasFernandezSanz 0:9475a54ade9e 214 estado = ESTADO_MUESTREO;
NIcolasFernandezSanz 0:9475a54ade9e 215 loop = 0;
NIcolasFernandezSanz 0:9475a54ade9e 216 times = 0;
NIcolasFernandezSanz 0:9475a54ade9e 217 }
NIcolasFernandezSanz 0:9475a54ade9e 218 }
NIcolasFernandezSanz 0:9475a54ade9e 219 } else {
NIcolasFernandezSanz 0:9475a54ade9e 220 //Si el pulsador no corresponde con la secuencia paso al estado PERDER
NIcolasFernandezSanz 0:9475a54ade9e 221 estado = ESTADO_PERDER;
NIcolasFernandezSanz 0:9475a54ade9e 222 }
NIcolasFernandezSanz 0:9475a54ade9e 223 }
NIcolasFernandezSanz 0:9475a54ade9e 224 //Espero 5 times el LED encendido
NIcolasFernandezSanz 0:9475a54ade9e 225 if (times > 5) {
NIcolasFernandezSanz 0:9475a54ade9e 226 leds(0b000);
NIcolasFernandezSanz 0:9475a54ade9e 227
NIcolasFernandezSanz 0:9475a54ade9e 228 }
NIcolasFernandezSanz 0:9475a54ade9e 229 break;
NIcolasFernandezSanz 0:9475a54ade9e 230 case ESTADO_PERDER:
NIcolasFernandezSanz 0:9475a54ade9e 231 //Prendo el LED blanco para mostrar que termino el juego y vuelvo al estado COMENZAR
NIcolasFernandezSanz 0:9475a54ade9e 232 printf("\nPerdiste Bro :(\r\n");
NIcolasFernandezSanz 0:9475a54ade9e 233 printf("Apreta cualquier boton para reiniciar!\r\n\n");
NIcolasFernandezSanz 0:9475a54ade9e 234 leds(0b111);
NIcolasFernandezSanz 0:9475a54ade9e 235 estado = ESTADO_COMENZAR;
NIcolasFernandezSanz 0:9475a54ade9e 236 break;
NIcolasFernandezSanz 0:9475a54ade9e 237
NIcolasFernandezSanz 0:9475a54ade9e 238 case ESTADO_GANAR:
NIcolasFernandezSanz 0:9475a54ade9e 239 //Mustro el LED blanco para mostrar que termino el juego y aviso que completo la secuencia
NIcolasFernandezSanz 0:9475a54ade9e 240 printf("\nGANASTE!!! :)\r\n\n");
NIcolasFernandezSanz 0:9475a54ade9e 241 printf("Apreta cualquier boton para reiniciar!\r\n\n");
NIcolasFernandezSanz 0:9475a54ade9e 242 leds(0b111);
NIcolasFernandezSanz 0:9475a54ade9e 243 estado = ESTADO_COMENZAR;
NIcolasFernandezSanz 0:9475a54ade9e 244 break;
NIcolasFernandezSanz 0:9475a54ade9e 245 }
NIcolasFernandezSanz 0:9475a54ade9e 246 }
NIcolasFernandezSanz 0:9475a54ade9e 247 void leds(int num)
NIcolasFernandezSanz 0:9475a54ade9e 248 {
NIcolasFernandezSanz 0:9475a54ade9e 249 //Funcion que codifica el encendido y apagado de los LEDs
NIcolasFernandezSanz 0:9475a54ade9e 250 switch(num) {
NIcolasFernandezSanz 0:9475a54ade9e 251 case 0:
NIcolasFernandezSanz 0:9475a54ade9e 252 Rojo = 1;
NIcolasFernandezSanz 0:9475a54ade9e 253 Verde = 1;
NIcolasFernandezSanz 0:9475a54ade9e 254 Azul = 1;
NIcolasFernandezSanz 0:9475a54ade9e 255 break;
NIcolasFernandezSanz 0:9475a54ade9e 256 case 4:
NIcolasFernandezSanz 0:9475a54ade9e 257 Rojo = 0;
NIcolasFernandezSanz 0:9475a54ade9e 258 Verde = 1;
NIcolasFernandezSanz 0:9475a54ade9e 259 Azul = 1;
NIcolasFernandezSanz 0:9475a54ade9e 260 break;
NIcolasFernandezSanz 0:9475a54ade9e 261 case 2:
NIcolasFernandezSanz 0:9475a54ade9e 262 Rojo = 1;
NIcolasFernandezSanz 0:9475a54ade9e 263 Verde = 0;
NIcolasFernandezSanz 0:9475a54ade9e 264 Azul = 1;
NIcolasFernandezSanz 0:9475a54ade9e 265 break;
NIcolasFernandezSanz 0:9475a54ade9e 266 case 1:
NIcolasFernandezSanz 0:9475a54ade9e 267 Rojo = 1;
NIcolasFernandezSanz 0:9475a54ade9e 268 Verde = 1;
NIcolasFernandezSanz 0:9475a54ade9e 269 Azul = 0;
NIcolasFernandezSanz 0:9475a54ade9e 270 break;
NIcolasFernandezSanz 0:9475a54ade9e 271 case 7:
NIcolasFernandezSanz 0:9475a54ade9e 272 Rojo = 0;
NIcolasFernandezSanz 0:9475a54ade9e 273 Verde = 0;
NIcolasFernandezSanz 0:9475a54ade9e 274 Azul = 0;
NIcolasFernandezSanz 0:9475a54ade9e 275 break;
NIcolasFernandezSanz 0:9475a54ade9e 276 }
NIcolasFernandezSanz 0:9475a54ade9e 277 }
NIcolasFernandezSanz 0:9475a54ade9e 278
NIcolasFernandezSanz 0:9475a54ade9e 279 char Pulsador()
NIcolasFernandezSanz 0:9475a54ade9e 280 {
NIcolasFernandezSanz 0:9475a54ade9e 281 //Funcion que aciva un flag con el cambio del pulsador y guarda el pulsado en una variable
NIcolasFernandezSanz 0:9475a54ade9e 282 pulsador = 0;
NIcolasFernandezSanz 0:9475a54ade9e 283
NIcolasFernandezSanz 1:2aa790d91fb0 284 if (antirrebote_A(PA)) {
NIcolasFernandezSanz 0:9475a54ade9e 285 flagPulsador = 1;
NIcolasFernandezSanz 0:9475a54ade9e 286 pulsador = 1;
NIcolasFernandezSanz 0:9475a54ade9e 287 return 0;
NIcolasFernandezSanz 0:9475a54ade9e 288 }
NIcolasFernandezSanz 1:2aa790d91fb0 289 if (antirrebote_V(PV)) {
NIcolasFernandezSanz 0:9475a54ade9e 290 flagPulsador = 1;
NIcolasFernandezSanz 0:9475a54ade9e 291 pulsador = 2;
NIcolasFernandezSanz 0:9475a54ade9e 292 return 0;
NIcolasFernandezSanz 0:9475a54ade9e 293 }
NIcolasFernandezSanz 1:2aa790d91fb0 294 if (antirrebote_R(PR)) {
NIcolasFernandezSanz 0:9475a54ade9e 295 flagPulsador = 1;
NIcolasFernandezSanz 0:9475a54ade9e 296 pulsador = 3;
NIcolasFernandezSanz 0:9475a54ade9e 297 return 0;
NIcolasFernandezSanz 0:9475a54ade9e 298 }
NIcolasFernandezSanz 0:9475a54ade9e 299
NIcolasFernandezSanz 0:9475a54ade9e 300 pulsador = 0;
NIcolasFernandezSanz 0:9475a54ade9e 301 flagPulsador = 0;
NIcolasFernandezSanz 0:9475a54ade9e 302 return 0;
NIcolasFernandezSanz 0:9475a54ade9e 303 }
NIcolasFernandezSanz 0:9475a54ade9e 304
NIcolasFernandezSanz 1:2aa790d91fb0 305 bool antirrebote_V(bool lectura)
NIcolasFernandezSanz 1:2aa790d91fb0 306 {
NIcolasFernandezSanz 1:2aa790d91fb0 307 //Funcion que hace un anti rebote y detecta el cambio de un pulsador
NIcolasFernandezSanz 1:2aa790d91fb0 308 static bool lecant_v = 0;
NIcolasFernandezSanz 1:2aa790d91fb0 309
NIcolasFernandezSanz 1:2aa790d91fb0 310 switch(estado_v) {
NIcolasFernandezSanz 1:2aa790d91fb0 311 case INICIO_P:
NIcolasFernandezSanz 1:2aa790d91fb0 312 //Si tengo un flanco ascendente
NIcolasFernandezSanz 1:2aa790d91fb0 313 if((lectura == 1) && (lecant_v == 0)) {
NIcolasFernandezSanz 1:2aa790d91fb0 314 estado_v = RISING_P;
NIcolasFernandezSanz 1:2aa790d91fb0 315 }
NIcolasFernandezSanz 1:2aa790d91fb0 316 break;
NIcolasFernandezSanz 1:2aa790d91fb0 317 case RISING_P:
NIcolasFernandezSanz 1:2aa790d91fb0 318 /*Devuelvo el estado uno , una unica vez (Saco el rebote)*/
NIcolasFernandezSanz 1:2aa790d91fb0 319 estado_v = RETENCION_P;
NIcolasFernandezSanz 1:2aa790d91fb0 320 tp_v = 0;
NIcolasFernandezSanz 1:2aa790d91fb0 321 return 1; //Devuelvo el estado alto ya que tuve un flanco
NIcolasFernandezSanz 1:2aa790d91fb0 322 case RETENCION_P:
NIcolasFernandezSanz 1:2aa790d91fb0 323 /*Durante un segundo y siempre que la lectura siga siendo alta retengo*/
NIcolasFernandezSanz 1:2aa790d91fb0 324 if((tp_v >= 3) && (lectura == 0)) {
NIcolasFernandezSanz 1:2aa790d91fb0 325 estado_v = INICIO_P;
NIcolasFernandezSanz 1:2aa790d91fb0 326 }
NIcolasFernandezSanz 1:2aa790d91fb0 327 break;
NIcolasFernandezSanz 1:2aa790d91fb0 328 }
NIcolasFernandezSanz 1:2aa790d91fb0 329 lecant_v = lectura; //Asigno el estado previo para el proximo ciclo..
NIcolasFernandezSanz 1:2aa790d91fb0 330 return 0; //Devuelvo el estado nulo o cero
NIcolasFernandezSanz 1:2aa790d91fb0 331 }
NIcolasFernandezSanz 1:2aa790d91fb0 332
NIcolasFernandezSanz 1:2aa790d91fb0 333 bool antirrebote_R(bool lectura)
NIcolasFernandezSanz 1:2aa790d91fb0 334 {
NIcolasFernandezSanz 1:2aa790d91fb0 335 //Funcion que hace un anti rebote y detecta el cambio de un pulsador
NIcolasFernandezSanz 1:2aa790d91fb0 336 static bool lecant_r=0;
NIcolasFernandezSanz 1:2aa790d91fb0 337
NIcolasFernandezSanz 1:2aa790d91fb0 338 switch(estado_r) {
NIcolasFernandezSanz 1:2aa790d91fb0 339 case INICIO_P:
NIcolasFernandezSanz 1:2aa790d91fb0 340 //Si tengo un flanco ascendente
NIcolasFernandezSanz 1:2aa790d91fb0 341 if((lectura == 1) && (lecant_r == 0)) {
NIcolasFernandezSanz 1:2aa790d91fb0 342 estado_r = RISING_P;
NIcolasFernandezSanz 1:2aa790d91fb0 343 }
NIcolasFernandezSanz 1:2aa790d91fb0 344 break;
NIcolasFernandezSanz 1:2aa790d91fb0 345 case RISING_P:
NIcolasFernandezSanz 1:2aa790d91fb0 346 /*Devuelvo el estado uno , una unica vez (Saco el rebote)*/
NIcolasFernandezSanz 1:2aa790d91fb0 347 estado_r = RETENCION_P;
NIcolasFernandezSanz 1:2aa790d91fb0 348 tp_r = 0;
NIcolasFernandezSanz 1:2aa790d91fb0 349 return 1; //Devuelvo el estado alto ya que tuve un flanco
NIcolasFernandezSanz 1:2aa790d91fb0 350 case RETENCION_P:
NIcolasFernandezSanz 1:2aa790d91fb0 351 /*Durante un segundo y siempre que la lectura siga siendo alta retengo*/
NIcolasFernandezSanz 1:2aa790d91fb0 352 if((tp_r >= 3) && (lectura == 0)) {
NIcolasFernandezSanz 1:2aa790d91fb0 353 estado_r = INICIO_P;
NIcolasFernandezSanz 1:2aa790d91fb0 354 }
NIcolasFernandezSanz 1:2aa790d91fb0 355 break;
NIcolasFernandezSanz 1:2aa790d91fb0 356 }
NIcolasFernandezSanz 1:2aa790d91fb0 357 lecant_r = lectura; //Asigno el estado previo para el proximo ciclo..
NIcolasFernandezSanz 1:2aa790d91fb0 358 return 0; //Devuelvo el estado nulo o cero
NIcolasFernandezSanz 1:2aa790d91fb0 359 }
NIcolasFernandezSanz 1:2aa790d91fb0 360
NIcolasFernandezSanz 1:2aa790d91fb0 361 bool antirrebote_A(bool lectura)
NIcolasFernandezSanz 1:2aa790d91fb0 362 {
NIcolasFernandezSanz 1:2aa790d91fb0 363 //Funcion que hace un anti rebote y detecta el cambio de un pulsador
NIcolasFernandezSanz 1:2aa790d91fb0 364 static bool lecant_a = 0;
NIcolasFernandezSanz 1:2aa790d91fb0 365
NIcolasFernandezSanz 1:2aa790d91fb0 366 switch(estado_a) {
NIcolasFernandezSanz 1:2aa790d91fb0 367 case INICIO_P:
NIcolasFernandezSanz 1:2aa790d91fb0 368 //Si tengo un flanco ascendente
NIcolasFernandezSanz 1:2aa790d91fb0 369 if((lectura == 1) && (lecant_a == 0)) {
NIcolasFernandezSanz 1:2aa790d91fb0 370 estado_a = RISING_P;
NIcolasFernandezSanz 1:2aa790d91fb0 371 }
NIcolasFernandezSanz 1:2aa790d91fb0 372 break;
NIcolasFernandezSanz 1:2aa790d91fb0 373 case RISING_P:
NIcolasFernandezSanz 1:2aa790d91fb0 374 /*Devuelvo el estado uno , una unica vez (Saco el rebote)*/
NIcolasFernandezSanz 1:2aa790d91fb0 375 estado_a = RETENCION_P;
NIcolasFernandezSanz 1:2aa790d91fb0 376 tp_a = 0;
NIcolasFernandezSanz 1:2aa790d91fb0 377 return 1; //Devuelvo el estado alto ya que tuve un flanco
NIcolasFernandezSanz 1:2aa790d91fb0 378 case RETENCION_P:
NIcolasFernandezSanz 1:2aa790d91fb0 379 /*Durante un segundo y siempre que la lectura siga siendo alta retengo*/
NIcolasFernandezSanz 1:2aa790d91fb0 380 if((tp_a >= 3) && (lectura == 0)) {
NIcolasFernandezSanz 1:2aa790d91fb0 381 estado_a = INICIO_P;
NIcolasFernandezSanz 1:2aa790d91fb0 382 }
NIcolasFernandezSanz 1:2aa790d91fb0 383 break;
NIcolasFernandezSanz 1:2aa790d91fb0 384 }
NIcolasFernandezSanz 1:2aa790d91fb0 385 lecant_a = lectura; //Asigno el estado previo para el proximo ciclo..
NIcolasFernandezSanz 1:2aa790d91fb0 386 return 0; //Devuelvo el estado nulo o cero
NIcolasFernandezSanz 1:2aa790d91fb0 387 }
NIcolasFernandezSanz 1:2aa790d91fb0 388
NIcolasFernandezSanz 1:2aa790d91fb0 389 void timer()
NIcolasFernandezSanz 0:9475a54ade9e 390 {
NIcolasFernandezSanz 0:9475a54ade9e 391 //Funcion que detecta las interrupciones del timer
NIcolasFernandezSanz 0:9475a54ade9e 392 times++;
NIcolasFernandezSanz 0:9475a54ade9e 393 semilla ++;
NIcolasFernandezSanz 0:9475a54ade9e 394 espera++;
NIcolasFernandezSanz 1:2aa790d91fb0 395 tp_a++;
NIcolasFernandezSanz 1:2aa790d91fb0 396 tp_v++;
NIcolasFernandezSanz 1:2aa790d91fb0 397 tp_r++;
NIcolasFernandezSanz 0:9475a54ade9e 398 }