| @ -0,0 +1,152 @@ | |||||
| #include <msp430fr6989.h> | |||||
| 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 | |||||