|
|
- #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;
-
- }//interrupción
|