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