A basic guide to show how to use interruptions on programs using a MSP430FR6989 microcontroller and the GCC tools on Linux.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

152 lines
4.6 KiB

#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