En esta práctica combinaremos las dos prácticas pasadas, utilizaremos el enmascaramiento para saber el estado de los pulsadores, con esto podremos modificar la velocidad a la que avanza un contador binario de 8 bits.
Lo primero que haremos será definir las 4 velocidades a las que puede aumentar el contador:
#define vel0 0 //velocidad 0 #define vel1 1 //velocidad 1 #define vel2 2 //velocidad 2 #define vel3 3 //velocidad 3
Declararemos dos variables, una llamada x que será nuestro contador, y otra llamada velocidad que almacenará la información de la velocidad actual.
unsigned int velocidad = vel0; //se declara variable para almacenar la velocidad unsigned int x = 0;
Cuando se presione el pulsador D1 aumentaremos la velocidad a la siguiente, por ejemplo si la velocidad es vel0, aumentará a vel1, y así sucesivamente.
if ((input_d() & 0x02) == 0x00){ //¿Se presionó D1? if (velocidad == 0){ //Si la velocidad es 0 velocidad = vel1; //Se pasa a la velocidad 1 } else if (velocidad == 1){ //Si la velocidad es 1 velocidad = vel2; //Pasa a la velocidad 2 } else if (velocidad == 2){ //Si la velocidad es 2 velocidad = vel3; //Pasa a la velocidad 3 } else{ //sino velocidad = vel0; //La velocidad es 0 } }
Ahora verificaremos en que velocidad se encuentra para que de esta forma entre a un ciclo donde aumente el contador y espere el tiempo determinado, los tiempos serán de 100ms, 250ms, 500ms y 1s.
if (velocidad == vel0){ output_j(x); //Se muestra el contador en los leds x++; //Aumenta el contador delay_ms(100); //Retardo de 100ms } else if (velocidad == vel1){ output_j(x); //Se muestra el contador en los leds x++; //Aumenta el contador delay_ms(250); //Retardo de 250ms } else if (velocidad == vel2){ output_j(x); //Se muestra el contador en los leds x++; //Aumenta el contador delay_ms(500); //Retardo de 500ms } else{ output_j(x); //Se muestra el contador en los leds x++; //Aumenta el contador delay_ms(1000); //Retardo de 1000ms = 1s }
Esto resultará en el siguiente código:
#include <18F87J50.h> #fuses HSPLL, NOWDT, NOPROTECT, NODEBUG, PLL2 #use delay (clock=24M) #use standard_io(J) //Predefine el puerto J #use standard_io(D) //Predefine el puerto D #define vel0 0 //velocidad 0 #define vel1 1 //velocidad 1 #define vel2 2 //velocidad 2 #define vel3 3 //velocidad 3 unsigned int velocidad = vel0; //se declara variable para almacenar la velocidad unsigned int x = 0; void main(){ set_tris_j(0x00); //Puerto J como salida set_tris_d(0xFF); //Puerto D como entrada while(true){ //Bucle infinito if ((input_d() & 0x02) == 0x00){ //¿Se presionó D1? if (velocidad == 0){ //Si la velocidad es 0 velocidad = vel1; //Se pasa a la velocidad 1 } else if (velocidad == 1){ //Si la velocidad es 1 velocidad = vel2; //Pasa a la velocidad 2 } else if (velocidad == 2){ //Si la velocidad es 2 velocidad = vel3; //Pasa a la velocidad 3 } else{ //sino velocidad = vel0; //La velocidad es 0 } } if (velocidad == vel0){ output_j(x); //Se muestra el contador en los leds x++; //Aumenta el contador delay_ms(100); //Retardo de 100ms } else if (velocidad == vel1){ output_j(x); //Se muestra el contador en los leds x++; //Aumenta el contador delay_ms(250); //Retardo de 250ms } else if (velocidad == vel2){ output_j(x); //Se muestra el contador en los leds x++; //Aumenta el contador delay_ms(500); //Retardo de 500ms } else{ output_j(x); //Se muestra el contador en los leds x++; //Aumenta el contador delay_ms(1000); //Retardo de 1000ms = 1s } } }