| @ -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 | |||