#include char columna = 4; char fila = 4; int estadoColumna = 0; int tecla = 0; const unsigned char teclado[4][4]= //[Fila][Columna] {{1,2,3,10}, {4,5,6,11}, {7,8,9,12}, {13,0,14,15},}; void main(void) { PM5CTL0 = 0x0000; //desactiva el modo de alta impedancia WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer //Del 1 al 4 son salidas (estado inicial = 0) y del 5 al 8 son entradas (resistencia Pull-Up) //Configuración de puertos P1 Y P3 /* Salidas: Todas las salidas deben tener estado inical de 1 P1.0 -> LED de prueba (rojo) P9.7 -> LED de prueba (verde) P1.3 -> 1 P1.5 -> 2 P1.6 -> 3 P1.7 -> 4 Entradas: Todas las entradas deben tener estado inicial de 0, por lo tanto, resistencia Pull-Down P3.0 -> 5 P3.1 -> 6 P3.3 -> 7 P3.6 -> 8 */ //Puerto de SALIDAS P1SEL0 = 0x00; P1SEL1 = 0x00; P1DIR = 0xE9; //"1110,1001" -> Salidas: P1.3,5,6,7 || P1.0 -> LED de prueba P1REN = 0x16; //"0001,0110" No habilita resistencia a las salidas P1OUT = 0xE8; //"1110,1000" Asigno un 1 lógico a los puertos de salida||A las entradas se les asigna resist. Pull-Down P9SEL0 = 0x00; P9SEL1 = 0x00; //SELECCIONAMOS FUNCION COMO I/O DIGITAL P9DIR = 0x80; //P9.7-> SALIDA P9.0-P9.6->ENTRADAS P9REN = 0x7f; P9OUT = 0x00; //Puerto de ENTRADAS P3SEL0 = 0x00; P3SEL1 = 0x00; P3DIR = 0xB4;//"1011,0100" -> Entradas: P3.0,1,3,6 P3REN = 0x4B; //"0100,1011" Habilito resist. a las entradas P3OUT = 0x00; //0xB4 1011,0100 -> Resistencias Pull Down para las entradas (estado inicial de 0) P3IE = 0x4B; //"0100,1011" -> Habilitador de interrupciones (sólo se hace en las entradas) P3IES = 0x00; //Lecura en Flanco de subida P3IFG = 0x00; //Se limpia el proceso __enable_interrupt(); for(;;){ switch(tecla){ case 1: P1OUT |= 0x01; break; case 2: P1OUT &= ~0x01; break; case 3: P9OUT |= 0x80; break; case 4: P9OUT &= ~0x80; break; default: break; } }//for infinito }//main //***Interrupciones**** //Las entradas son las que realizan la lectura // #pragma vector = PORT3_VECTOR // __interrupt void inter_puerto3(void) void __attribute__ ((interrupt(PORT3_VECTOR))) PORT3_ISR (void) { //** Lectura de entradas (columnas) ** //Si el estado de IFG es igual al del puerto 3.0 -> la columna detectada es la 1 if(P3IFG == 0x01) //lec = P3IFG; lec &= 0x01; columna = 0; //Si el estado de IFG es igual al del puerto 3.1 -> la columna detectada es la 2 else if(P3IFG == 0x02) columna = 1; //Si el estado de IFG es igual al del puerto 3.3 -> la columna detectada es la 3 else if(P3IFG == 0x08) columna = 2; //Si el estado de IFG es igual al del puerto 3.6 -> la columna detectada es la 4 else if(P3IFG == 0x40) columna = 3; if(columna!=4){ P1OUT &= 0x80; //se posiciona el puerto de salida en P1.7 for(fila=4; fila>=0;){ //Si el estado de la columna es 1 significa que se encontró la fila (por el paso de corrientre a través del btn) switch(columna){ case 0: estadoColumna = P3IN & 0x01; break; case 1: estadoColumna = P3IN & 0x02; break; case 2: estadoColumna = P3IN & 0x08; break; case 3: estadoColumna = P3IN & 0x40; break; default: break; }//switch //Si se detecta la fila se para el ciclo y continúa con la siguiente instrucción if(estadoColumna){ break; } if(P1OUT == 0x20) P1OUT >>= 2; else P1OUT >>= 1; //se desplaza un bit a la derecha fila--; }//for P1OUT = 0xE8; //"1110,1000" -> Se regresa al estado inicial }//if //Si se detectó una fila en esa columna, se asigna el valor de tecla if(fila) tecla = teclado[fila-1][columna]; columna = 0; estadoColumna = 0; P3IFG=0x00; }//interrupción