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

2 years ago
2 years ago
  1. #include <msp430fr6989.h>
  2. char columna = 4;
  3. char fila = 4;
  4. int estadoColumna = 0;
  5. int tecla = 0;
  6. const unsigned char teclado[4][4]= //[Fila][Columna]
  7. {{1,2,3,10},
  8. {4,5,6,11},
  9. {7,8,9,12},
  10. {13,0,14,15},};
  11. void main(void)
  12. {
  13. PM5CTL0 = 0x0000; //desactiva el modo de alta impedancia
  14. WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
  15. //Del 1 al 4 son salidas (estado inicial = 0) y del 5 al 8 son entradas (resistencia Pull-Up)
  16. //Configuración de puertos P1 Y P3
  17. /*
  18. Salidas:
  19. Todas las salidas deben tener estado inical de 1
  20. P1.0 -> LED de prueba (rojo)
  21. P9.7 -> LED de prueba (verde)
  22. P1.3 -> 1
  23. P1.5 -> 2
  24. P1.6 -> 3
  25. P1.7 -> 4
  26. Entradas:
  27. Todas las entradas deben tener estado inicial de 0, por lo tanto, resistencia Pull-Down
  28. P3.0 -> 5
  29. P3.1 -> 6
  30. P3.3 -> 7
  31. P3.6 -> 8
  32. */
  33. //Puerto de SALIDAS
  34. P1SEL0 = 0x00;
  35. P1SEL1 = 0x00;
  36. P1DIR = 0xE9; //"1110,1001" -> Salidas: P1.3,5,6,7 || P1.0 -> LED de prueba
  37. P1REN = 0x16; //"0001,0110" No habilita resistencia a las salidas
  38. P1OUT = 0xE8; //"1110,1000" Asigno un 1 lógico a los puertos de salida||A las entradas se les asigna resist. Pull-Down
  39. P9SEL0 = 0x00;
  40. P9SEL1 = 0x00; //SELECCIONAMOS FUNCION COMO I/O DIGITAL
  41. P9DIR = 0x80; //P9.7-> SALIDA P9.0-P9.6->ENTRADAS
  42. P9REN = 0x7f;
  43. P9OUT = 0x00;
  44. //Puerto de ENTRADAS
  45. P3SEL0 = 0x00;
  46. P3SEL1 = 0x00;
  47. P3DIR = 0xB4;//"1011,0100" -> Entradas: P3.0,1,3,6
  48. P3REN = 0x4B; //"0100,1011" Habilito resist. a las entradas
  49. P3OUT = 0x00; //0xB4 1011,0100 -> Resistencias Pull Down para las entradas (estado inicial de 0)
  50. P3IE = 0x4B; //"0100,1011" -> Habilitador de interrupciones (sólo se hace en las entradas)
  51. P3IES = 0x00; //Lecura en Flanco de subida
  52. P3IFG = 0x00; //Se limpia el proceso
  53. __enable_interrupt();
  54. for(;;){
  55. switch(tecla){
  56. case 1:
  57. P1OUT |= 0x01;
  58. break;
  59. case 2:
  60. P1OUT &= ~0x01;
  61. break;
  62. case 3:
  63. P9OUT |= 0x80;
  64. break;
  65. case 4:
  66. P9OUT &= ~0x80;
  67. break;
  68. default:
  69. break;
  70. }
  71. }//for infinito
  72. }//main
  73. //***Interrupciones****
  74. //Las entradas son las que realizan la lectura
  75. // #pragma vector = PORT3_VECTOR
  76. // __interrupt void inter_puerto3(void)
  77. void __attribute__ ((interrupt(PORT3_VECTOR))) PORT3_ISR (void)
  78. {
  79. //** Lectura de entradas (columnas) **
  80. //Si el estado de IFG es igual al del puerto 3.0 -> la columna detectada es la 1
  81. if(P3IFG == 0x01) //lec = P3IFG; lec &= 0x01;
  82. columna = 0;
  83. //Si el estado de IFG es igual al del puerto 3.1 -> la columna detectada es la 2
  84. else if(P3IFG == 0x02)
  85. columna = 1;
  86. //Si el estado de IFG es igual al del puerto 3.3 -> la columna detectada es la 3
  87. else if(P3IFG == 0x08)
  88. columna = 2;
  89. //Si el estado de IFG es igual al del puerto 3.6 -> la columna detectada es la 4
  90. else if(P3IFG == 0x40)
  91. columna = 3;
  92. if(columna!=4){
  93. P1OUT &= 0x80; //se posiciona el puerto de salida en P1.7
  94. for(fila=4; fila>=0;){
  95. //Si el estado de la columna es 1 significa que se encontró la fila (por el paso de corrientre a través del btn)
  96. switch(columna){
  97. case 0:
  98. estadoColumna = P3IN & 0x01;
  99. break;
  100. case 1:
  101. estadoColumna = P3IN & 0x02;
  102. break;
  103. case 2:
  104. estadoColumna = P3IN & 0x08;
  105. break;
  106. case 3:
  107. estadoColumna = P3IN & 0x40;
  108. break;
  109. default:
  110. break;
  111. }//switch
  112. //Si se detecta la fila se para el ciclo y continúa con la siguiente instrucción
  113. if(estadoColumna){
  114. break;
  115. }
  116. if(P1OUT == 0x20)
  117. P1OUT >>= 2;
  118. else
  119. P1OUT >>= 1; //se desplaza un bit a la derecha
  120. fila--;
  121. }//for
  122. P1OUT = 0xE8; //"1110,1000" -> Se regresa al estado inicial
  123. }//if
  124. //Si se detectó una fila en esa columna, se asigna el valor de tecla
  125. if(fila)
  126. tecla = teclado[fila-1][columna];
  127. columna = 0;
  128. estadoColumna = 0;
  129. P3IFG=0x00;
  130. }//interrupción