Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Hora: V1-V3
Contenido
1.- Descripción del Problema .............................................................................................................. 3
1. Se requiere decodificar un teclado hexadecimal matricial de membrana, y desplegar la
tecla presionada de derecha a izquierda. ................................................................................... 3
2.- Objetivo .......................................................................................................................................... 3
1. Utilizar interrupciones para codificar el teclado matricial 4x4 hexadecimal. ..................... 3
2. Programar el barrido para lograr el efecto de persistencia visual. ..................................... 3
3. Aprender a utilizar un teclado matricial 4x4 hexadecimal.................................................. 3
4. Practicar la lógica cableada respetando el código de colores............................................. 3
5. Practicar la lógica programada en lenguaje C embebido.................................................... 3
3.- Diagrama de Flujo Propuesto......................................................................................................... 4
4.- Diagrama de la Implementación del Circuito................................................................................. 6
5.- Evidencia Grafica ............................................................................................................................ 7
6.- Programación ................................................................................................................................. 8
1.- Descripción del Problema
1. Se requiere decodificar un teclado hexadecimal matricial de membrana, y desplegar la
tecla presionada de derecha a izquierda.
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 2
0 0 0 0 0 1 2 3
0 0 0 0 1 2 3 4
0 0 0 1 2 3 4 5
0 0 1 2 3 4 5 6
0 1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 9
3 4 5 6 7 8 9 1
2.- Objetivo
1. Utilizar interrupciones para codificar el teclado matricial 4x4 hexadecimal.
2. Programar el barrido para lograr el efecto de persistencia visual.
3. Aprender a utilizar un teclado matricial 4x4 hexadecimal.
4. Practicar la lógica cableada respetando el código de colores.
5. Practicar la lógica programada en lenguaje C embebido.
3.- Diagrama de Flujo Propuesto
Programa principal
Subrutina de interrupción
Llamada de la interrupción
4.- Diagrama de la Implementación del Circuito
Nota: Una vez activadas las interrupciones (PA0, PA1, PB2 y PB3) en el apartado NVIC, es
necesario activar el modo y las resistencias de Pull-Up como se muestra en la imagen.
5.- Evidencia Grafica
6.- Programación
Agregue los prototipos de las funciones utilizadas para:
En la línea 14 se manda a llamar la función setDisplay con las con los parámetros definidos
de los dígitos correspondientes.
En la línea 17 se concatena el valor del digito 8, con el ánodo correspondiente al digito 8,
transfiriendo el valor correspondiente al ODR del puerto C.
En la línea 18 se mantiene este número por 1 milisegundo.
En la línea 19 se concatena el valor del digito 7, con el ánodo correspondiente al digito 8,
transfiriendo el valor correspondiente al ODR del puerto C.
En la línea 20 se mantiene este número por 1 milisegundo.
En la línea 21 se concatena el valor del digito 6, con el ánodo correspondiente al digito 8,
transfiriendo el valor correspondiente al ODR del puerto C.
En la línea 22 se mantiene este número por 1 milisegundo.
En la línea 23 se concatena el valor del digito 5, con el ánodo correspondiente al digito 8,
transfiriendo el valor correspondiente al ODR del puerto C.
En la línea 24 se mantiene este número por 1 milisegundo.
En la línea 25 se concatena el valor del digito 4, con el ánodo correspondiente al digito 8,
transfiriendo el valor correspondiente al ODR del puerto C.
En la línea 26 se mantiene este número por 1 milisegundo.
En la línea 27 se concatena el valor del digito 3, con el ánodo correspondiente al digito 8,
transfiriendo el valor correspondiente al ODR del puerto C.
En la línea 28 se mantiene este número por 1 milisegundo.
En la línea 29 se concatena el valor del digito 2, con el ánodo correspondiente al digito 8,
transfiriendo el valor correspondiente al ODR del puerto C.
En la línea 30 se mantiene este número por 1 milisegundo.
En la línea 31 se concatena el valor del digito 1, con el ánodo correspondiente al digito 8,
transfiriendo el valor correspondiente al ODR del puerto C.
En la línea 32 se mantiene este número por 1 milisegundo.
14. void setDisplay(int dig1, int dig2, int dig3, int dig4, int dig5, int
dig6, int dig7, int
15. dig8)
16. {
17. GPIOC->ODR=D8+numeros[dig8];
18. HAL_Delay(1);
19. GPIOC->ODR=D7+numeros[dig7];
20. HAL_Delay(1);
21. GPIOC->ODR=D6+numeros[dig6];
22. HAL_Delay(1);
23. GPIOC->ODR=D5+numeros[dig5];
24. HAL_Delay(1);
25. GPIOC->ODR=D4+numeros[dig4];
26. HAL_Delay(1);
27. GPIOC->ODR=D3+numeros[dig3];
28. HAL_Delay(1);
29. GPIOC->ODR=D2+numeros[dig2];
30. HAL_Delay(1);
31. GPIOC->ODR=D1+numeros[dig1];
32. HAL_Delay(1);
33. }
• Subrutina de interrupción.
Subrutina de interrupción
En la línea 1 se hace la llamada a la función que gestiona la generación interrupción de la
línea EXTI0.
En la línea 3 esta función gestiona la solicitud de interrupción de todas las interrupciones
externas, y da como parámetro de entrada el GPIO_PIN_0.
1. void EXTI0_IRQHandler(void)
2. {
3. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
4. }
En la línea 1 se declara la función Callback, la cual manda a llamar a las interrupciones en el archivo
it.c
En la línea 3 se utiliza la función HAL_GetTick(); la cual lee el tiempo actual del sistema y lo almacena
en la variable acM.
En la línea 4 por medio de la sentencia if se verifica si han pasado más de 500 milisegundos desde
la última interrupción, lo que evita la detección de señales falsas debido al rebote del botón.
1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
2. {
3. acM = HAL_GetTick();
4. if (acM - anM > 500)
5. {
En la línea 3 se tiene un switch que selecciona el caso en base al valor de la variable “GPIO Pin”
En línea 8 se tiene una sentencia “if” que lee el pin 0 del puerto A y tiene como condición si este
PIN este en 0.
En la línea 11 se iguala la variable “teclado” al producto del valor de la variable entre 1,000,000
luego se multiplica por 10 y se concatena el valor de la tecla, para que se imprima el valor en el
último display.
En la línea 15 se tiene una sentencia “if” que lee el pin 0 del puerto A y tiene como condición si
este PIN este en 0.
En la línea 18 se iguala la variable “teclado” al producto del valor de la variable entre 1,000,000
luego se multiplica por 10 y se concatena el valor de la tecla, para que se imprima el valor en el
último display.
En la línea 22 se tiene una sentencia “if” que lee el pin 0 del puerto A y tiene como condición si
este PIN este en 0.
En la línea 25 se iguala la variable “teclado” al producto del valor de la variable entre 1,000,000
luego se multiplica por 10 y se concatena al valor de la tecla, para que se imprima el valor en el
último display.
En la línea 32 se iguala la variable “teclado” al producto del valor de la variable entre 1,000,000
luego se multiplica por 10 y se concatena al valor de la tecla, para que se imprima el valor en el
último display.
3. switch(GPIO_Pin)
4. {
5. case GPIO_PIN_0:
6. GPIOA->ODR=0xF0;
7. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
8. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)
9. {
10. tecla=13;
11. teclado=(teclado%10000000)*100 + tecla;
12. }
13. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
14. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
15. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)
16. {
17. tecla=12;
18. teclado=(teclado%10000000)*100 + tecla;
19. }
20. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
21. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
22. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)
23. {
24. tecla=11;
25. teclado=(teclado%10000000)*100 + tecla;
26. }
27. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
28. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
29. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)
30. {
31. tecla=10;
32. teclado=(teclado%10000000)*100 + tecla;
33. }
34. GPIOA->ODR=0x00;
35. break;
En la línea 4 se tiene un “if” que lee el pin 1 del puerto A y tiene como condición si este PIN este
en 0.
En la línea 7 se iguala la variable “teclado” al producto del valor de la variable entre 1,000,000
luego se multiplica por 10 y se concatena al valor de la tecla, para que se imprima el valor en el
último display.
En la línea 11 se tiene un “if” que lee el pin 1 del puerto A y tiene como condición si este PIN este
en 0.
En la línea 14 se iguala la variable “teclado” al producto del valor de la variable entre 1,000,000
luego se multiplica por 10 y se concatena al valor de la tecla, para que se imprima el valor en el
último display.
En la línea 18 se tiene un “if” que lee el pin 1 del puerto A y tiene como condición si este PIN este
en 0.
En la línea 21 se iguala la variable “teclado” al producto del valor de la variable entre 1,000,000
luego se multiplica por 10 y se concatena al valor de la tecla, para que se imprima el valor en el
último display.
En la línea 25 se tiene un “if” que lee el pin 1 del puerto A y tiene como condición si este PIN este
en 0.
En la línea 4 se tiene un “if” que lee el pin 2 del puerto A y tiene como condición si este PIN este
en 0.
En la línea 16 se tiene un “if” que lee el pin 2 del puerto A y tiene como condición si este PIN este
en 0.
En la línea 22 se tiene un “if” que lee el pin 2 del puerto A y tiene como condición si este PIN este
en 0.
En la línea 26 se iguala la variable “teclado” al producto del valor de la variable entre 1,000,000
luego se multiplica por 10 y se concatena al valor de la tecla, para que se imprima el valor en el
último display.
En la línea 4 se tiene un “if” que lee el pin 1 del puerto A y tiene como condición si este PIN este
en 0.
En la línea 7 se iguala la variable “teclado” al producto del valor de la variable entre 1,000,000
luego se multiplica por 10 y se concatena al valor de la tecla, para que se imprima el valor en el
último display.
En la línea 11 se tiene un “if” que lee el pin 1 del puerto A y tiene como condición si este PIN este
en 0.
En la línea 14 se iguala la variable “teclado” al producto del valor de la variable entre 1,000,000
luego se multiplica por 10 y se concatena al valor de la tecla, para que se imprima el valor en el
último display.
En la línea 18 se tiene un “if” que lee el pin 1 del puerto A y tiene como condición si este PIN este
en 0.
En la línea 21 se iguala la variable “teclado” al producto del valor de la variable entre 1,000,000
luego se multiplica por 10 y se concatena al valor de la tecla, para que se imprima el valor en el
último display.
En la línea 25 se tiene un “if” que lee el pin 1 del puerto A y tiene como condición si este PIN este
en 0.
En la línea 28 se iguala la variable “teclado” al producto del valor de la variable entre 1,000,000
luego se multiplica por 10 y se concatena al valor de la tecla, para que se imprima el valor en el
último display.
30. GPIOA->ODR=0x00;
31. break;
1. }