En esta práctica encenderemos los leds de Miuva Pro mediante los pulsadores, asociando cada led a un pulsador diferente y enmascarando el estado de los pulsadores.
Lo primero será definir el puerto J como salida (leds) y el puerto D como entrada (pulsadores):
set_tris_J(0x00); //Puerto J como salida set_tris_D(0xFF); //Puerto D como entrada
Asignaremos los pulsadores y leds de la siguiente forma:
Pulsador -> Led
D1 -> J4
D2 -> J3
D3 -> J2
D4 -> J1
Crearemos ciclos de condición para el caso de cada pulsador, en cada ciclo primero leeremos el valor del puerto D (pulsadores), posteriormente según el pin que estemos analizando decidiremos si encender o apagar el led correspondiente, cabe resaltar que los pulsadores son de tipo normalmente cerrado, por lo tanto al presionarlos nos envían un “0” lógico y cuando no se presionan nos envían un “1” lógico, esto se puede realizar de la siguiente forma para analizar el pin D4:
1. Leemos el valor del puerto D
2. Lo multiplicamos por 0x10 (con esto eliminamos la información que no nos interesa de los demás pines)
3. Si lo que nos resulta de la multiplicación es igual a 0, quiere decir que el pulsador está presionado, por lo tanto guarda la información actual y se enciende el led.
4. Si lo que resulta es diferente de 0, quiere decir que el pulsador no está presionado, por lo tanto apagamos el led correspondiente.
Por ejemplo, si presionamos el pulsador D4:
1. PortD = XXX0XXXX
2. PortD * 0x10 = 00000000
Como la multiplicación nos da 0, significa que el pulsador está presionado.
PuertoJ = J + 0x02 = XXXXXX1X (Encendimos el led J1)
if ((input_d() & 0x10) == 0x00){ //Enmascaramiento de entrada para D4 output_j(input_j() | 2); //Enmascaramiento de salida para led J1 } else{ output_j(input_j() & ~2); }
Un procedimiento similar utilizaremos para los demás pulsadores y leds, resultando 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 puerti D 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() & 0x10) == 0x00){ //Enmascaramiento de entrada para D4 output_j(input_j() | 2); //Enmascaramiento de salida para led J1 } else{ output_j(input_j() & ~2); } if ((input_d() & 0x08) == 0x00){ //Enmascaramiento de entrada para D3 output_j(input_j() | 4); //Enmascaramiento de salida para led J2 } else{ output_j(input_j() & ~4); } if ((input_d() & 0x04) == 0x00){ //Enmascaramiento de entrada para D2 output_j(input_j() | 8); //Enmascaramiento de salida para led J3 } else{ output_j(input_j() & ~8); } if ((input_d() & 0x02) == 0x00){ //Enmascaramiento de entrada para D1 output_j(input_j() | 16); //Enmascaramiento de salida para led J4 } else{ output_j(input_j() & ~16); } } }