Para utilizar los botones, debemos primero comprender cómo funcionan. Como siempre, el punto de partida es el esquemático del PIC-MT.
Es posible notar que los botones (B1, …, B6), están conectados a los pines 0, 1 y 2 del puerto B (RB0, RB1 y RB2, respectivamente).
La manera de leer un botón, es poner uno de los bits como salida, y los restantes como entradas. Por ejemplo, para ver si B1 está siendo pulsado, debemos poner a RB0 como salida y hacer RB0 = 1. A continuación, seteamos a RB1 y a RB2 como entradas. Si entonces (teniendo a RB0 = 1), RB1 es 1, entonces B1 está siendo pulsado. Lo anterior se debe a la configuración de los diodos ubicados cerca de los botones, en el caso del ejemplo para B1, tenemos,
Si quisiéramos revisar si B3 está siendo pulsado, entonces deberíamos dejar a RB2 = 1 como salida, y a RB0 y RB1 como entradas. Si el botón B3 estuviese siendo presionado, entonces RB0 = 1 (ver figura).
Estamos entonces en condiciones de escribir un programa que trabaje con los botones. Como ejemplo, escribiremos un programa que al presionar un botón, haga parpadear el LED una cantidad de veces igual al número del botón.
Es necesario partir realizando algunas definiciones que nos pueden hacer la tarea más fácil y permiten que nuestro código sea más legible.
//Botones #defineRB0PORTB.0 #defineRB1PORTB.1 #defineRB2PORTB.2 //Led #defineRB4PORTB.4 //Constantes #defineCERO0b00000001 #defineUNO0b00000010 #defineDOS0b00000100
Se pudo definir las contantes como 1,2 y 4 respectivamente, pero es más explicativo por el momento utilizar la notación de bits.
Inicializamos el puerto B con el Led apagado,
PORTB = 0b.0001.0000;
Para terminar con las inicializaciones, configuramos el registro de dirección de datos del puerto B (TRISB), con todos pines como salidas (0 = salida, 1 = entrada).
TRISB = 0b.0000.0000;
Guardaremos el botón pulsado en la variable boton. Para empezar a monitorear, se debe configurar uno de los pines asignados a los botones como salida de datos. Por ejemplo, si queremos monitorear B1 y B6, el código necesario sería,
//Apagaelbit0,porlotantoelpin0essalida TRISB &= ~CERO; //Prendelosbits1y2,porlotantoslospines1y2sonentradas TRISB |= (UNO | DOS); //Entradas RB1 = 0; RB2 = 0; //Seteaelbit0paraluegorevisarRB1yRB2. RB0 = 1; //VeresquemáticoyobservarquepasacuandoRB0=1 if(RB1) boton = 1; else if(RB2) boton = 6;
El código para el resto de los botones es similar, pero cambiando los roles del pin configurado como salida, y el par de pines configurados como entradas.
Por ejemplo, para el ver si fue presionado el botón 4 o el botón 2,
//Siáunnohemosdetectadounbotónpresionado if(!boton) { //Apagaelbit1,porlotantoelpin1esunasalida TRISB &= (~UNO); //Prendelosbits0y2,porlotantoslospines0y2sonentradas TRISB |= (CERO | DOS); //Entradas RB0 = 0; RB2 = 0; //Seteaelbit1paraluegorevisarRB0yRB2 RB1 = 1; //Probamoselbotón4y2 if(RB0) boton = 4; else if(RB2) boton = 2; }
Finalmente, hacemos parpadear el led según el botón presionado,
//Dependiendodelbotón,parpadeaelled for(i = 0; i < boton; ++i) { RB4 = 0; delay(200); RB4 = 1; delay(200); }
El código completo de este ejemplo se encuentra en el archivo tut_btn0.c.