Está en la página 1de 18

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 5: Calculadora.

Nombre: Luis Fernando Martínez Ovalle Matricula: 1754102

Hora: V1-V3
Contenido
1.- Marco Teórico ................................................................................................................................ 3
2.- Algoritmo ....................................................................................................................................... 4
3.- Diagrama Eléctrico ......................................................................................................................... 7
4.- Evidencia Grafica ............................................................................................................................ 8
5.- Escriba y/o explique el código utilizado para los siguientes apartados ......................................... 9
CALCULADORA

Utilizando un displays de 4 dígitos de ánodo común se generará un barrido generando


persistencia visual en los displays. Para ello se utilizará un CI 74238 para controlar el
ánodo que enciende cada digito y un CI 7447 para generar el número que se escribirá en
cada digito. Para lograr el funcionamiento adecuado siga las siguientes instrucciones:

a) Desarrolle el código necesario para enviar un número y su correspondiente señal de


activación en el lugar que le corresponda del display.
b) Genere el efecto de persistencia visual de forma simultánea en los 4 dígitos del display.
c) Desarrolle el Código necesario para leer un teclado hexadecimal matricial utilizando
interrupciones y las indicaciones dadas en la actividad fundamental 4.
d) Desarrolle e implemente un Código que permita operar una calculadora básica
tomando en cuenta las siguientes indicaciones:

A Tecla de suma
B Tecla de resta
C Tecla de multiplicación
D Tecla de división
* Establecer calculadora a 0
# Resultado

e) Modele solamente el algoritmo de interrupción en un diagrama de flujo (deberá iniciar


en la llamada y terminar en el concatenamiento del número de resultado antes de
enviarse al displayNumber(numero)).

Indicaciones para el reporte del Proyecto:

1.- Marco Teórico


Describir:
Persistencia de la visión
La persistencia visual es un fenómeno que ocurre cuando la imagen que se muestra en una
pantalla permanece en la retina del ojo durante un corto período de tiempo después de que
se ha retirado la fuente de luz. Esto se debe a la capacidad del ojo humano para retener la
imagen durante un tiempo breve después de que ha desaparecido la fuente de luz. Esta
capacidad de retener la imagen en la retina se conoce como persistencia visual.
En electrónica, la persistencia visual se aplica en el uso de displays para mostrar
información. Un display es un dispositivo que muestra información gráfica o numérica en
una pantalla. Los displays pueden ser de varios tipos, como LCD, OLED, LED, CRT, entre
otros. Todos estos tipos de displays utilizan la persistencia visual para crear la ilusión de
movimiento en la pantalla.
En el caso de los displays LED, la persistencia visual se utiliza para crear la ilusión de
movimiento al encender y apagar los LEDs en una secuencia específica. Por lo tanto, la
velocidad de parpadeo de los LEDs y la duración de cada parpadeo se utilizan para
controlar el efecto visual.
La persistencia visual es una propiedad importante en el diseño de displays electrónicos, y
se utiliza para crear la ilusión de movimiento y la continuidad de la imagen en la pantalla.
La comprensión de la persistencia visual es fundamental para diseñar displays eficientes y
atractivos visualmente.
Ilustre gráficamente de la mejor forma posible el fenómeno de persistencia de la visión

2.- Algoritmo

Elabore un diagrama de flujo que muestre el comportamiento de la subrutina de


interrupción y todas las funciones que de el se derivan.
Programa principal

Subrutina de interrupción
Llamada de la interrupción (PA0 y PA1)
3.- Diagrama Eléctrico

Elabore un diagrama eléctrico que muestre todas las conexiones de los componentes
utilizados.

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.
4.- Evidencia Grafica

(Fotografía de la implementación del circuito)


Suma 2 + 3 = 5

Resta 6 – 4 = 2

Multiplicación 5 * 3 = 15

División 25 / 5 = 5
5.- Escriba y/o explique el código utilizado para los siguientes apartados

Escriba todos los prototipos de funciones utilizados en el código y describa en una línea
para que es cada prototipo.

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)

Describa el funcionamiento de la subrutina de interrupción y de las subrutinas que de el se


deriven utilizando un párrafo y el código por separado para cada funció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 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. {

Describa el funcionamiento de las funciones para programar las operaciones.


Programación de las operaciones

De la línea 1 a la 24 se establece la decodificación para la tercer columna y la cuarta fila, es decir,


para el # que será utilizado para desplegar el valor de las operaciones realizadas, esto es visible de
mejor manera de la línea 7 a la 22. Cabe mencionar que no se pueden plasmar números negativos
ni decimales y las variables num y res serán plasmadas de mejor manera en la decodificación de
cada una de las teclas.
1. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
2. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==0)
3. {
4. num2=teclado;
5. switch(operacion)
6. {
7. case 'D':
8. res = num1 / num2;
9. teclado = res;
10. break;
11. case 'C':
12. res = num1 * num2;
13. teclado = res;
14. break;
15. case 'B':
16. res = num1 - num2;
17. teclado = res;
18. break;
19. case 'A':
20. res = num1 + num2;
21. teclado = res;
22. break;
23. }
24. }

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


derivan (displayNumber y setDisplay)
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. }
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. }

Llamada a las interrupciones

En la línea 5 se inicia el proceso de decodificación de todo el teclado hexadecimal por medio de la


función switch case, esta, está en función de la variable GPIO_Pin que hace referencia a los pines
de las interrupciones.

En la línea 7 empieza el primer caso, es decir, la decodificación de la columna 4, empezando por el


renglón 4 hacia arriba.
De la línea 8 a la 10, se decodifica para la letra D.

De la línea 11 a la 15, se localiza la decodificación de a letra D, la cual será utilizada para efectuar
una división. La variable operación, es la utilizada en la decodificación de # para imprimir los
resultados. En la variable num1 se almacena el valor que se le introduzca al teclado,
posteriormente el teclado es igualado a 0 mostrando ocho 0 en los displays.

De la línea 16 a la 18 se decodifica para la letra C, detectando las transiciones entre pines.

De la línea 19 a la 23 se decodifica para la letra C de manera similar que para la letra D. La letra C
se utiliza para la multiplicación.

De la línea 27 a la 31 se decodifica para la letra B, es decir, para la resta.

De la línea 35 a la 39 se decodifica para la letra A, es decir, para la suma.


5. switch(GPIO_Pin)
6. {
7. case GPIO_PIN_0:
8. GPIOA->ODR=0xF0;
9. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
10. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)
11. {
12. operacion = 'D';
13. num1= teclado;
14. teclado = 0;
15. }
16. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
17. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
18. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)
19. {
20. operacion = 'C';
21. num1= teclado;
22. teclado = 0;
23. }
24. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
25. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
26. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)
27. {
28. operacion = 'B';
29. num1= teclado;
30. teclado = 0;
31. }
32. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
33. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
34. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)
35. {
36. operacion = 'A';
37. num1= teclado;
38. teclado = 0;
39. }
40. GPIOA->ODR=0x00;
41. break;
En la línea 42 empieza el segundo caso, es decir, la decodificación de la columna 3, empezando
por el renglón 4 hacia arriba.

De la línea 43 a la 66, se decodifica para el caracter #. A través de este, se efectuarán las


diferentes operaciones aritméticas.

En la línea 47 se iguala la variable num2 al valor que tenga la variable teclado en el momento de la
interrupción, esta variable se utiliza para efectuar las operaciones.

En la línea 49 empieza el switch case para la variable operación (A, B, C y D).

De la línea 50 a la 53 se genera la división de las variables num1 y num2, el resultado es guardado


en la variable res y así mismo, la variable teclado es igualada a la variable res mostrándonos el
resultado de dicha operación en los displays.

De la línea 54 a la 57 se genera la multiplicación de las variables num1 y num2, el resultado es


guardado en la variable res y así mismo, la variable teclado es igualada a la variable res
mostrándonos el resultado de dicha operación en los displays.

De la línea 58 a la 61 se genera la resta de las variables num1 y num2, el resultado es guardado en


la variable res y así mismo, la variable teclado es igualada a la variable res mostrándonos el
resultado de dicha operación en los displays.

De la línea 62 a la 65 se genera la suma de las variables num1 y num2, el resultado es guardado en


la variable res y así mismo, la variable teclado es igualada a la variable res mostrándonos el
resultado de dicha operación en los displays.

En las líneas 69 y 70 se evalúa para la transición del renglón 4 al 3.

En la línea 71 se evalúa para la detección de la segunda interrupción es decir la columna 3.

En las líneas 73 y 74 se decodifica para la tecla 9.

En las líneas 76 y 77 se evalúa para la transición del renglón 3 al 2.

En la línea 78 se evalúa para la detección de la segunda interrupción es decir la columna 3.

En las líneas 80 y 81 se decodifica para la tecla 6.

En las líneas 83 y 84 se evalúa para la transición del renglón 2 al 1.

En la línea 85 se evalúa para la detección de la segunda interrupción es decir la columna 3.

En las líneas 87 y 88 se decodifica para la tecla 3.


42. case GPIO_PIN_1:
43. GPIOA->ODR=0xF0;
44. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
45. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==0)
46. {
47. num2=teclado;
48.
49. switch(operacion){
50. case 'D':
51. res = num1 / num2;
52. teclado = res;
53. break;
54. case 'C':
55. res = num1 * num2;
56. teclado = res;
57. break;
58. case 'B':
59. res = num1 - num2;
60. teclado = res;
61. break;
62. case 'A':
63. res = num1 + num2;
64. teclado = res;
65. break;
66. }
67.
68. }
69. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
70. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
71. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==0)
72. {
73. tecla=9;
74. teclado=(teclado%10000000)*10 + tecla;
75. }
76. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
77. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
78. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==0)
79. {
80. tecla=6;
81. teclado=(teclado%10000000)*10 + tecla;
82. }
83. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
84. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
85. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==0)
86. {
87. tecla=3;
88. teclado=(teclado%10000000)*10 + tecla;
89. }
90.
91. GPIOA->ODR=0x00;
92. break;

En la línea 93 empieza el tercer caso, es decir, la decodificación de la columna 2, empezando por el


renglón 4 hacia arriba.

De la línea 94 a la 99, se decodifica para la tecla 0.

En las líneas 100 y 101 se evalúa para la transición del renglón 4 al 3.

En la línea 102 se evalúa para la detección de la tercera interrupción es decir la columna 2.

En la línea 104 se decodifica para la tecla 8.

En las líneas 106 y 107 se evalúa para la transición del renglón 3 al 2.


En la línea 108 se evalúa para la detección de la tercera interrupción es decir la columna 2.

En las líneas 110 se decodifica para la tecla 5.

En las líneas 112 y 113 se evalúa para la transición del renglón 2 al 1.

En la línea 114 se evalúa para la detección de la segunda interrupción es decir la columna 2.

En las líneas 116 se decodifica para la tecla 2.


93. case GPIO_PIN_2:
94. GPIOA->ODR=0xF0;
95. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
96. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)
97. {
98. tecla=0;
99. }
100. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
101. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
102. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)
103. {
104. tecla=8;
105. }
106. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
107. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
108. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)
109. {
110. tecla=5;
111. }
112. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
113. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
114. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)
115. {
116. tecla=2;
117. }
118. teclado=(teclado%10000000)*10 + tecla;
119. GPIOA->ODR=0x00;
120. break;

En la línea 121 empieza el cuarto caso, es decir, la decodificación de la columna 1, empezando por
el renglón 4 hacia arriba.

De la línea 122 a la 127, se decodifica para la tecla 0.

En las líneas 128 y 129 se evalúa para la transición del renglón 4 al 3.

En la línea 130 se evalúa para la detección de la tercera interrupción es decir la columna 1.

En las líneas 132 y 133 se decodifica para la tecla 7.

En las líneas 135 y 136 se evalúa para la transición del renglón 3 al 2.

En la línea 137 se evalúa para la detección de la tercera interrupción es decir la columna 1.

En las líneas 139 y 140 se decodifica para la tecla 4.


En las líneas 142 y 143 se evalúa para la transición del renglón 2 al 1.

En la línea 144 se evalúa para la detección de la segunda interrupción es decir la columna 1.

En las líneas 146 y 147 se decodifica para la tecla 1.


121. case GPIO_PIN_3:
122. GPIOA->ODR=0xF0;
123. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
124. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==0)
125. {
126. teclado=0;
127. }
128. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
129. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
130. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==0)
131. {
132. tecla=7;
133. teclado=(teclado%10000000)*10 + tecla;
134. }
135. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
136. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
137. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==0)
138. {
139. tecla=4;
140. teclado=(teclado%10000000)*10 + tecla;
141. }
142. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
143. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
144. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==0)
145. {
146. tecla=1;
147. teclado=(teclado%10000000)*10 + tecla;
148. }
149.
150. GPIOA->ODR=0x00;
151. break;
152. }
153.
154. anM = acM;
155. }
156. }
157.

También podría gustarte