Pulsadores
1. Introducción:
En esta práctica, habilitaremos el uso de los pulsadores de la placa y
los combinaremos con los led para conseguir efectos.
2. Pulsadores de la placa:

3. Adaptando librerías existentes:
Revisando el directorio dónde instalamos las MLA, se encuentran librerías que podemos adaptar para que nos sea más cómodo
acceder a los pulsadores.
Modificaremos los ficheros "buttons.h" y "buttons.c" del directorio C:\Program Files(x86)\Microchip\MLA\v2016_11_07\bsp\picdem_fs_usb:
- Los registros TRIS, son usados para configurar los pines como entrada (1), o salida (0).
- Leyendo los registros PORT, sabremos en qué estado están las entradas. En nuestra placa, botón pulsado = 0; botón en reposo = 1.
- La función "BUTTON isPressed (BUTTON button)" nos devuelve "true" o "false" según el estado de la entrada en concreto.
- La función "BUTTON Enable (BUTTON button)", es usada para habilitar el pin conectado al pulsador como entrada.
3.1. Adaptando "button.h":

3.2. Adaptando "button.c":


4. Ejemplo Pulsador controla led:
En este primer ejemplo, usaremos las librerías creadas anteriormente para realizar el control de un led según el estado de un pulsador.
La estructura y ficheros que integran este primer ejemplo es la siguiente:

/* * File: main.c * Author: Eduardo * * Created on 5 de junio de 2017, 17:16 */ #include#include "config.h" #include "typedefs.h" #include "led.h" #include "button.h" #define _XTAL_FREQ 48000000 // se define la frecuencia FOSC -- Hay que tener en cuenta los preescalers usados void delay_ms(uint16_t); unsigned long value = 0; uint8_t a = 0; void main(void) { for (a=0; a<4; a++) { LED_Enable(LED_D1 + a); //Habilitamos los led. Configura como salida los pines LED_Off(LED_D1 + a); //Empezamos con todos los led apagados BUTTON_Enable(BUTTON_S1 + a); //Habilitamos los pulsadores. Configura como entrada los pines } while (true) { for (a=0; a<4; a++) { if (BUTTON_IsPressed(BUTTON_S1 + a)) LED_On(LED_D1 + a); else LED_Off(LED_D1 + a); delay_ms(100); } } } void delay_ms(uint16_t i) { for ( uint16_t x=0; x < i; x++ ) { __delay_ms(1); } }
Compilamos, cargamos el .hex y ya lo tenemos funcionando.
Como se puede observar, primero habilitamos los led y pulsadores a utilizar y luego consultamos secuencialmente el estado de los
pulsadores .
- Ejemplo led y pulsadores simple:
5. Ejemplo Pulsadores y led avanzado:
En este ejemplo, usaremos dos pulsadores. Uno modificará la frecuencia y el otro la función de los led.
/* * File: main.c * Author: Eduardo * * Created on 5 de junio de 2017, 17:16 */ //////////////////////////////////////////////////////////////////////////////// // JUEGO DE LED // // S1 Modifica el modo // // S2 Modifica la frecuencia // //////////////////////////////////////////////////////////////////////////////// #include#include "config.h" #include "typedefs.h" #include "led.h" #include "button.h" #define _XTAL_FREQ 48000000 //Se define la frecuencia FOSC -- Hay que tener en cuenta los preescalers usados void setup(); void delay_ms(uint16_t); void botonPulsado(); void barridoIzq(); void barridoDer(); void barridoBid(); uint8_t a = 0; uint8_t b = 1; uint8_t modo = 0; //Variable que almacena el modo seleccionado uint8_t freq = 1; //Variable que almacena la frecuencia seleccionada void main(void) { setup(); while (true) { if (modo == 0) //Barrido a izquierda barridoIzq(); else if (modo == 1) barridoDer(); else if (modo == 2) barridoBid(); } } void setup() { for (a=0; a<8; a++) { LED_Enable(LED_D1 + a); //Habilitamos los led. Configura como salida los pines LED_Off(LED_D1 + a); //Empezamos con todos los led apagados } BUTTON_Enable(BUTTON_S1); //Habilitamos los pulsadores. Configura como entrada los pines BUTTON_Enable(BUTTON_S2); //Habilitamos los pulsadores. Configura como entrada los pines } void botonPulsado() { if (BUTTON_IsPressed(BUTTON_S1)) modo ++; if (BUTTON_IsPressed(BUTTON_S2)) freq ++; if (modo > 2) modo = 0; if (freq > 4) freq = 1; while (BUTTON_IsPressed(BUTTON_S1) || BUTTON_IsPressed(BUTTON_S2)); //Espera hasta soltar boton } void barridoIzq() { for (a=8; a>0; a--) { LED_On(LED_D1 + a); delay_ms(100 * freq ); LED_Off(LED_D1 + a); } } void barridoDer() { for (a=0; a<8; a++) { LED_On(LED_D1 + a); delay_ms(100 * freq); LED_Off(LED_D1 + a); } } void barridoBid() { if (a > 6) b = -1; if (a < 1) b = 1; LED_On(LED_D1 + a); delay_ms(100 * freq); LED_Off(LED_D1 + a); a=a+b; } void delay_ms(uint16_t i) { if (BUTTON_IsPressed(BUTTON_S1) || BUTTON_IsPressed(BUTTON_S2)) botonPulsado(); for ( uint16_t x=0; x < i; x++ ) { __delay_ms(1); } }
- Ejemplo led y pulsadores avanzados:
6. Descargas: