diff --git a/prueba.c b/prueba.c new file mode 100644 index 0000000..ed03a0b --- /dev/null +++ b/prueba.c @@ -0,0 +1,152 @@ +#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; + + }//pragma