Está en la página 1de 19

UNIVERSIDAD AUTÓNOMA DE NUEVO LEÓN

FACULTAD DE INGENIERÍA MECÁNICA Y ELÉCTRICA

Diseño de Sistemas Embebidos


Docente: Dr. Héctor Gilberto Barrón González

Actividad Fundamental 4: Decodificación del teclado.

Nombre: Luis Fernando Martínez Ovalle Matricula: 1754102

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 1 se configura la fuente de reloj del microcontrolador utilizado en el sistema.


En la línea 2 se utiliza para inicializar y configurar los pines de entrada/salida del
microcontrolador STM32 que se utilizan para la gestión de los periféricos que dependen de
los pines GPIO. El modificador static indica que esta función solo es visible dentro del
archivo en el que se encuentra definida.
En la línea 3 se encarga de generar el barrido junto a la función setdisplay, esta nos permitirá
mostrar en los displays el número concatenado como parámetro.
En la línea 4 se establece los valores de cada uno de los ocho dígitos del display de siete
segmentos, esta es nuestra etapa de concatenación.
De la línea 6 a la 9 se muestran las funciones que indican que hay manejadores de
interrupción para las líneas externas EXTI0, EXTI1, EXTI2 y EXTI3 (PA0, PA1, PB2 y PB3)
respectivamente. A través de ellas se realizará la decodificación del teclado.
En la línea 10 se realiza el retorno a la subrutina de interrupción a través de una llamada.
1. void SystemClock_Config(void);
2. static void MX_GPIO_Init(void);
3. void displayNumber(int numero);
4. void setDisplay(int dig1, int dig2, int dig3, int dig4, int dig5, int
5. dig6, int dig7, int dig8);
6. void EXTI0_IRQHandler(void)
7. void EXTI1_IRQHandler(void)
8. void EXTI2_IRQHandler(void)
9. void EXTI3_IRQHandler(void)
10. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

• Funcionamiento del barrido.

Generación del barrido


En la línea 1 se inicia la función “displayNumber”.
En la línea 3 las variables correspondientes a los 8 dígitos son declaradas.
En la línea 4 la variable de dig1, almacenará las unidades y este será igual al “número”
módulo de 10, es decir, esta operación obtiene el dígito más a la derecha de “numero”
dividiendo el número por 10 y tomando el resto. Por ejemplo, si “número” es igual a 456,
entonces dig1 será igual a 6, ya que 456 % 10 es igual a 6.
En la línea 5 el valor de dig2 se almacenan las decenas y este será igual al “número” entre
100, es decir, se obtiene el segundo dígito de derecha a izquierda dividiendo el “número”
por 100 (para eliminar los dos dígitos más a la derecha) y luego dividiendo el resultado por
10 (para obtener el dígito en la posición deseada). Por ejemplo, si “número” es igual a
456, entonces dig2 será igual a 5, ya que (456 % 100) / 10 es igual a 5.
En la línea 6 el valor de dig3 se almacenan las centenas y este será igual al “número” entre
1000, es decir, esta operación sigue el mismo principio que la anterior, pero ahora se
divide por 1000 (para eliminar los tres dígitos más a la derecha) y luego se divide por 100
(para obtener el dígito en la posición deseada). Por ejemplo, si “número” es igual a 456,
entonces dig3 será igual a 4, ya que (456 % 1000) / 100 es igual a 4.
Las operaciones de las líneas 7 a la 11 siguen el mismo patrón, dividiendo el número por
un múltiplo cada vez mayor de 10 y luego dividiendo el resultado por 10 para obtener el
dígito correspondiente en cada posición.
En la línea 12 manda llamar a la función setDisplay, con los parámetros correspondientes
a los dígitos definidos en displayNumber.
1. void displayNumber(int numero)
2. {
3. int dig1,dig2,dig3,dig4,dig5,dig6,dig7,dig8;
4. dig1= numero%10;
5. dig2= (numero%100)/10;
6. dig3= (numero%1000)/100;
7. dig4= (numero%10000)/1000;
8. dig5= (numero%100000)/10000;
9. dig6= (numero%1000000)/100000;
10. dig7= (numero%10000000)/1000000;
11. dig8= (numero%100000000)/10000000;
12. setDisplay(dig1,dig2,dig3,dig4,dig5,dig6,dig7,dig8);
13. }

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.

Describa el funcionamiento de la subrutina de interrupción y funciones que de el se derivan.

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 hace la llamada a la función que gestiona la solicitud de interrupción de


todas las interrupciones externas.
En la línea 3 a través de la sentencia if, se comprueba sí el pin que se presionó en la
interrupción se encuentra activo.
En la línea 5 se borran los bits pendientes de línea del EXTI, especificando el GPIO_Pin que
se activo.
En la línea 6 manda llamar a la función HAL_GPIO_EXTI_Callback(GPIO_Pin), que ejecutara
la llamada a la subrutina de interrupción.
1. void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
2. {
3. if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
4. {
5. __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
6. HAL_GPIO_EXTI_Callback(GPIO_Pin);
7. }
8. }

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. {

Llamada a las interrupciones

En la línea 1 La función HAL_GPIO_EXTI_Callback y se llama cuando se detecta una interrupción en


cualquiera de los pines de entrada y salida del microcontrolador.

En la línea 2a La variable acM se establece en el valor de HAL_GetTick(). HAL_GetTick() devuelve el


tiempo actual en milisegundos desde que se inició el sistema.
En la línea 2b Si la diferencia entre acM y anM es mayor que 500 milisegundos, entonces se
ejecuta el código en el siguiente bloque de instrucciones.

En la línea 3 se tiene un switch que selecciona el caso en base al valor de la variable “GPIO Pin”

En la línea 5 comienza el caso GPIO_PIN_0.

En la línea 6 se pone la salida del puerto A en 0.

En la línea 7 se desactiva el pin 4 del puerto A.

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 10 se establece la tecla con el valor de 13.

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 13 se activa el Pin 4 del puerto A

En la línea 14 se desactiva el Pin 5 del puerto A

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 17 se encuentra lo que se ejecuta si el if es verdadero, que sería escribir el número 12


en la variable “tecla”

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 20 se activa el Pin 5 del puerto A.

En la línea 21 se desactiva el Pin 6 del puerto A.

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 24 se encuentra lo que se ejecuta si el if es verdadero, que sería escribir el número 11


en la variable “tecla”

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 27 se activa el Pin 6 del puerto A.

En la línea 28 se desactiva el Pin 7 del puerto A.


En la línea 29 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 31 se encuentra lo que se ejecuta si el if es verdadero, que sería escribir el número 10


en la variable “tecla”

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.

En la línea 34 se le asigna el valor 0xF0 a los pines de salida del puerto A.

En la línea 35 se tiene un break que cierra la función.


1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
2. {
a. acM = HAL_GetTick();
b. if (acM - anM > 500)
c. {

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 1 comienza el caso GPIO_PIN_1.


En la línea 2 la salida del puerto A se establece como 0.

En la línea 3 se desactiva el pin 4 del puerto A.

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 6 se encuentra lo que se ejecuta si el if es verdadero, que sería escribir el número 15 en


la variable “tecla”

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 9 se activa el Pin 4 del puerto A

En la línea 10 se desactiva el Pin 5 del puerto A

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 13 se encuentra lo que se ejecuta si el if es verdadero, que sería escribir el número 9 en


la variable “tecla”.

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 16 se activa el Pin 5 del puerto A

En la línea 17 se desactiva el Pin 6 del puerto A

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 20 se encuentra lo que se ejecuta si el if es verdadero, que sería escribir el número 6 en


la variable “tecla”.

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 23 se activa el Pin 6 del puerto A

En la línea 24 se desactiva el Pin 7 del puerto A

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 27 se encuentra lo que se ejecuta si el if es verdadero, que sería escribir el número 3 en


la variable “tecla”
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.

En la línea 30 se le asigna el valor 0xF0 a los pines de salida del puerto A.

En la línea 31 se tiene un break que cierra la función.


1. case GPIO_PIN_1:
2. GPIOA->ODR=0xF0;
3. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
4. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==0)
5. {
6. tecla=15;
7. teclado=(teclado%10000000)*100 + tecla;
8. }
9. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
10. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
11. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==0)
12. {
13. tecla=9;
14. teclado=(teclado%10000000)*10 + tecla;
15. }
16. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
17. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
18. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==0)
19. {
20. tecla=6;
21. teclado=(teclado%10000000)*10 + tecla;
22. }
23. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
24. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
25. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==0)
26. {
27. tecla=3;
28. teclado=(teclado%10000000)*10 + tecla;
29. }
30. GPIOA->ODR=0x00;
31. break;

En la línea 1 comienza el caso GPIO_PIN_2.

En la línea 2 la salida del puerto A se establece como 0.

En la línea 3 se desactiva el pin 4 del puerto A.

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 6 se encuentra lo que se ejecuta si el if es verdadero, que sería escribir el número 0 en


la variable “tecla”

En la línea 8 se activa el Pin 4 del puerto A.

En la línea 9 se desactiva el Pin 5 del puerto A


En la línea 10 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 12 se encuentra lo que se ejecuta si el if es verdadero, que sería escribir el número 8 en


la variable “tecla”

En la línea 14 se activa el Pin 5 del puerto A

En la línea 15 se desactiva el Pin 6 del puerto A.

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 18 se encuentra lo que se ejecuta si el if es verdadero, que sería escribir el número 5 en


la variable “tecla”

En la línea 20 se activa el Pin 6 del puerto A.

En la línea 21 se desactiva el Pin 7 del puerto A.

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 24 se encuentra lo que se ejecuta si el if es verdadero, que sería escribir el número 2 en


la variable “tecla”

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 27 se le asigna el valor 0xF0 a los pines de salida del puerto B.

En la línea 28 se tiene un break que cierra la función.


1. case GPIO_PIN_2:
2. GPIOA->ODR=0xF0;
3. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
4. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)
5. {
6. tecla=0;
7. }
8. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
9. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
10. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)
11. {
12. tecla=8;
13. }
14. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
15. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
16. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)
17. {
18. tecla=5;
19. }
20. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
21. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
22. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)
23. {
24. tecla=2;
25. }
26. teclado=(teclado%10000000)*10 + tecla;
27. GPIOA->ODR=0x00;
28. break;

En la línea 1 comienza el caso GPIO_PIN_3.

En la línea 2 la salida del puerto A se establece como 0.

En la línea 3 se desactiva el pin 4 del puerto A.

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 6 se encuentra lo que se ejecuta si el if es verdadero, que sería escribir el número 14 en


la variable “tecla”

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 9 se activa el Pin 4 del puerto A

En la línea 10 se desactiva el Pin 5 del puerto A

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 13 se encuentra lo que se ejecuta si el if es verdadero, que sería escribir el número 7 en


la variable “tecla”.

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 16 se activa el Pin 5 del puerto A

En la línea 17 se desactiva el Pin 6 del puerto A

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 20 se encuentra lo que se ejecuta si el if es verdadero, que sería escribir el número 4 en


la variable “tecla”.

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 23 se activa el Pin 6 del puerto A


En la línea 24 se desactiva el Pin 7 del puerto A

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 27 se encuentra lo que se ejecuta si el if es verdadero, que sería escribir el número 1 en


la variable “tecla”

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.

En la línea 30 se le asigna el valor 0xF0 a los pines de salida del puerto A.

En la línea 31 se tiene un break que cierra la función.

En la línea 31 ii. Se compara los valores de anM = acM


1. case GPIO_PIN_3:
2. GPIOA->ODR=0xF0;
3. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
4. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==0)
5. {
6. tecla=14;
7. teclado=(teclado%10000000)*100 + tecla;
8. }
9. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
10. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
11. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==0)
12. {
13. tecla=7;
14. teclado=(teclado%10000000)*10 + tecla;
15. }
16. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
17. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
18. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==0)
19. {
20. tecla=4;
21. teclado=(teclado%10000000)*10 + tecla;
22. }
23. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
24. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
25. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==0)
26. {
27. tecla=1;
28. teclado=(teclado%10000000)*10 + tecla;
29. }

30. GPIOA->ODR=0x00;
31. break;
1. }

ii. anM = acM;


32. }
33. }
• Funciones propietarias para decodificación del teclado.

Describa el funcionamiento del loop de control principal y funciones que de el se derivan.

Loop de control principal

En la línea 1 se establece el loop de control principal.

En la línea 3 se manda a llamar a la función displayNumber continuamente que devolverá el valor


almacenado en la variable teclado.
1. while (1)
2. {
3. displayNumber(teclado);
4. }

También podría gustarte