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