Você está na página 1de 16

Código

/*Decodificador de binario a decimal, mostrando los resultados en un display de siete


segmentos.
autor: biblioman
www.aquihayapuntes.com*/

# include <16F84A.h>
# use delay(clock=4000000)
# fuses XT,NOWDT
# byte puerto_b=06 //Dirección del puerto B
# byte puerto_a=05 //Dirección del puerto A

void main() {

set_tris_b(0x00); //Configuro la puerta B como salida y RA0, RA1, RA2, RA3 y RA4 como
set_tris_a(0x1F); //entradas aunque por defecto ya están configuradas como entradas

puerto_b=0; //inicializo todos los bits de la puerta B a cero

while(true) //bucle infinito


{
if (input(PIN_A0)==false && input(PIN_A1)==false&& input(PIN_A2)==false)
{
puerto_b=0b0111111; //configura los bits de la puerta B
}
if (input(PIN_A0)==true && input(PIN_A1)==false&& input(PIN_A2)==false)
{
puerto_b=0b00000110;
}
if (input(PIN_A0)==false && input(PIN_A1)==true&& input(PIN_A2)==false)
{
puerto_b=0b01011011;
}
if (input(PIN_A0)==true && input(PIN_A1)==true&& input(PIN_A2)==false)
{
puerto_b=0b01001111;
}
if (input(PIN_A0)==false && input(PIN_A1)==false&& input(PIN_A2)==true)
{
puerto_b=0b01100110;
}
if (input(PIN_A0)==true && input(PIN_A1)==false&& input(PIN_A2)==true)
{
puerto_b=0b01101101;
}
if (input(PIN_A0)==false && input(PIN_A1)==true&& input(PIN_A2)==true)
{
puerto_b=0b01011110;
}
if (input(PIN_A0)==true && input(PIN_A1)==true&& input(PIN_A2)==true)
{
puerto_b=0b00000111;
}
}
}
Comentario:

Circuito sencillo que hace las funciones de un decodificador de binario a decimal de un


dígito y muestra los resultados en un display de siete segmentos de cátodo común, lo que
quiere decir que el PIC debe proporcionar valores positivos en su salida de la puerta B.
La relación entre las patillas del display y el valor de las letras de cada segmento es la
siguiente:

luego se puede hacer una pequeña tabla de verdad donde se muestre por cada
combinación en la entrada que patillas del PIC se tienen que activar:

La lógica del programa lo único que hace es chequear el estado de las entradas, en este
caso representadas por los interruptores A0, A1 y A2 y activar el conjunto de patillas
correspondientes en el PIC que alimentarán los ánodos del display.

Una versión mejorada del ejemplo la tenéis aqui.

Un saludo y hasta la próxima.

volver al índice

CREAR UN PROYECTO DESDE EL MPLAB IDE

Para la realización de nuestros programas para los microcontroladores Pic utilizamos el


software MPLAB IDE de Microchip. Lo primero que tenemos que hacer para comenzar con
nuestras prácticas es crear un proyecto, de esta forma nos vamos familiarizando con el
entorno de desarrollo del Mplab.

La creación de un proyecto puede ser realizada por el “Proyect Wizard― desde el


menú Proyect > Proyect Wizard, en este caso lo vamos a realizar en forma manual para
conocer los pasos, particularmente es la que utilizo siempre.

Comenzamos creando una carpeta en el disco de la PC con el nombre que elijamos, por
ejemplo Pic , Proyecto, Prácticas, etc. A continuación abrimos el programa Mplab
y realizamos lo siguiente:

1. Lo primero es seleccionar el microcontrolador Pic que vamos a utilizar en nuestro programa,


en este caso es el Pic 16F84A. En el menú desplegable cliqueamos con el mouse Configure
> Select Device,

Se abrirá una ventana y buscamos en el casillero “Device― el Pic 16F84A, lo


seleccionamos y aceptamos en OK.

2. Desde el menú cliqueamos en File > New

Aparecerá la ventana del editor de texto del MPLAB, aquí es donde escribiremos nuestro
programa fuente o bien podemos “pegar― el código desde otro archivo de texto donde
fuera escrito dicho programa.

3. Estando la ventana del editor de texto del MPLAB en blanco, tal cual apareció, la
guardamos con el nombre de nuestro proyecto con “Save As―

en la carpeta que habíamos creado para nuestras practicas sin olvidar de escribir el tipo de
extensión, que en nuestro caso sería “.asm― (ensamblador), si fuera en otro lenguaje
con la extensión que corresponda.

Si ya disponemos del archivo fuente podemos saltear esta etapa, simplemente copiamos
dicho archivo a la carpeta creada para nuestras prácticas o bien copiamos y pegamos el
código en el editor del MPLAB.

4. Una vez salvado el archivo, Cliqueamos con el mouse en el menú Project > New...

se abrirá una ventana donde debemos escribir el nombre del proyecto, en nuestro caso lo
nombraremos Proyecto_1. En segundo lugar escribimos la ruta donde será guardado, que
será la carpeta creada en un principio y que ya contiene el archivo que guardamos
anteriormente; en nuestro ejemplo escribiríamos C:\Proyectos_Pic\Proyecto_1 o bien
cliqueamos sobre Browse y buscamos manualmente la carpeta. Aceptamos en el botón OK .

5. Volvemos nuevamente al menú Project, buscamos y cliqueamos en la lista Add Files to


Projet (sumar archivos al proyecto).

Se abrirá la ventana de diálogo donde se encuentra el archivo que habíamos guardado al


comienzo, lo seleccionamos

y será incorporado a nuestro proyecto.

También se puede realizar clikeando con el botón derecho del Mouse sobre la ventana de
proyecto en Source Files > Add Files…

6. Cliqueamos sobre el archivo anexado, en nuestro caso “Proyecto_1.asm―, para que


aparezca nuevamente la ventana del editor de texto del MPLAB.

7. En el menú abrimos Project y salvamos el proyecto con Save Project.

Ahora ya tenemos todo preparado para comenzar a escribir nuestro programa.

8. Seguidamente en el menú desplegable Proyect ubicamos Build All, o bien desde la barra
de herramientas:

cliqueamos con el mouse y entonces el Mplab compilará nuestro proyecto, esto significa que
el Mplab ensamblará el archivo fuente, para que nosotros podamos corregir, si los hubiera, los
errores de sintaxis que pudimos haber cometido y a su vez traducir las instrucciones del
mismo a códigos binarios, que son los que posteriormente se grabarán en la memoria del
microcontrolador Pic.

9. Si todo está en orden y no aparece ningún error, el Mplab generará el archivo con
extensión .hex necesario para trasladar nuestro programa a la memoria de programa del
microcontrolador Pic.

NOTA: El MPLAB no admite rutas de archivo mayores a 64 caracteres. Por eso es


conveniente crear una carpeta de proyecto en C:\ u otro directorio como se explicó
anteriormente. Si se excede el máximo de 64 caracteres en la ruta del proyecto, el MPLAB
generará un error al momento de compilar el archivo fuente, aunque este último no tenga
ningún error.

 0

#3 Guest_Jose Fco_*


 Visitante
Escrito 11 marzo 2009 - 06:40
Gracias WillyP, ya con ese ejemplo pues el MPLAB se dejo.

Un Saludo.

#4 WillyP
Member


 Miembro Platino

 22 mensajes
Escrito 16 marzo 2009 - 02:51
Continuamos:

Anteriormente habíamos visto como crear un proyecto desde el MPLAB IDE. Ahora ya
podemos escribir los programas o bien copiar y pegar algún código en el editor, la siguiente
etapa es compilar desde la barra de herramientas -> Buill Hall para que se genere el archivo
con extensión .hex que es el que necesitamos para grabar la memoria del Pic con un
programador.

Otro circuito más fácil de implementar con un microcontrolador 16F627A, donde ocho leds
están conectados al puerto B.

Este microcontrolador tiene mejores características y precio que el 16F84. En este caso no
utilizamos un oscilador externo sino que implementamos el oscilador interno del
microcontrolador, de esta forma reducimos los componentes del circuito.

El siguiente programa incrementa el encendido de los leds conectados al puerto B, desde 0


hasta 255, repitiéndose el ciclo infinitamente.
1. ;TITULO : Led_incf.asm
2. ;DESCRIPCION : Los leds conectados al puerto b se encienden en código
binario incrementandose
3. ;desde 0 a 255, al ser un incremento el sentido de la cuenta en port B,
va desde RB0 hacia RB7
4. ;cuando llega al final comienza nuevamente en forma infinita.
5. ;La temporización es de aproximadamente 100 mls.
6. ;========================================================================
====================
7. ; Tipo de microcontrolador
8.
9. list p=16F627A ; directiva que define al
microcontrolador
10. #include <p16F627A.inc> ; definición de variables del
microcontrolador
11. ; configuración:
12.
13. __config _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_ON & _MCLRE_ON &
_PWRTE_OFF & _WDT_OFF & _INTOSC_OSC_NOCLKOUT
14. ;===============================
15. ; Registros utilizados
16. CONTA_1 EQU 0x20 ; registro de usuario en dirección 0x20
17. CONTA_2 EQU 0x21 ; registro de usuario en dirección 0x21
18. ;===========================
19. ; configura puerto B
20. RESET
21. ORG 0x00 ; origen en vector de reset, dirección 0x00
22. GOTO START ; ir a START
23. START
24. ORG 05H ; origen en dirección 0x05, salta el vector de reset
25. BSF STATUS,RP0 ; selecciona banco 1
26. MOVLW B'00000000' ; configuración de port b todo salidas
27. MOVWF PORTB ; el W mueve la configuración a port b
28. BCF STATUS,RP0 ; retorna a banco 0
29. CLRF PORTB ; borra port b
30. GOTO INICIO ; ir a inicio
31. ;===========================
32. ; Inicia el programa
33. INICIO
34. INCF PORTB,F ; comenzamos incrementando una unidad en port b
35. ;===========================
36. ; temporización
37. MOVLW .110 ; cargamos literal 110 en W
38. MOVWF CONTA_2 ; el W lo mueve al registro CONTA_2
39. LOOP_2
40. MOVLW .181 ; cargamos literal 181 en W
41. MOVWF CONTA_1 ; el W lo mueve al registro CONTA_1
42. LOOP_1
43. NOP ; nop = consume un ciclo de instrucción
44. NOP ; idem
45. DECFSZ CONTA_1,F ; decrementa CONTA_1
46. GOTO LOOP_1 ; si no es "0", continúa el loop 1
47. DECFSZ CONTA_2,F ; al finalizar loop 1, decrementa CONTA_2
48. GOTO LOOP_2 ; si no es "0", continúa el loop 2, recarga
49. NOP ; nuevamente el registro CONTA_1
50. NOP ;
51. GOTO INICIO ; al finalizar salta a INICIO y comienza de nuevo
52. END

 0

#5 WillyP
Member


 Miembro Platino

 22 mensajes
Escrito 16 marzo 2009 - 02:59
En este programa decrementamos los leds del puerto B desde 255 hasta 0 en un ciclo infinito.
ASM
1. ;TITULO : Led_decfsz.asm
2. ;DESCRIPCION : Los leds conectados al puerto B se encienden en código
binario decrementandose
3. ;desde 255 hasta 0, al ser un decremento el sentido de la cuenta va desde
RB7 hacia RB0,
4. ;cuando llega al final comienza nuevamente en forma infinita.
5. ;La temporización es de aproximadamente 100 mls.
6.
7.
8. list p=16F627A ; directiva que define al
microcontrolador
9. #include <p16F627A.inc> ; definición de variables del
microcontrolador
10. ; configuración:
11.
12. __config _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_ON & _MCLRE_ON &
_PWRTE_OFF & _WDT_OFF & _INTOSC_OSC_NOCLKOUT
13. ;===============================
14. ; REGISTROS DE UTILIZADOS
15. ;===============================
16. CONTA_1 EQU 0x20 ; registro de usuario en dirección 0x20
17. CONTA_2 EQU 0x21 ; registro de usuario en dirección 0x21
18. ;===============================
19. RESET
20. ORG 0x00 ; origen en vector de reset, dirección 0x00
21. GOTO START ; ir a START
22. START
23. ORG 05H ; origen en dirección 0x05, salta el vector de reset
24. BSF STATUS,RP0 ; selecciona banco 1
25. MOVLW B'00000000' ; configuración de port b todo salidas
26. MOVWF PORTB ; el W mueve la configuración a port b
27. BCF STATUS,RP0 ; retorna a banco 0
28. CLRF PORTB ; borra port b
29. GOTO INICIO ; ir a inicio
30. INICIO
31. DECF PORTB,F ; comenzamos decrementando una unidad port b
32. ;===============================
33. ; temporización
34. MOVLW .110 ; cargamos literal 110 en W
35. MOVWF CONTA_2 ; el W lo mueve al registro CONTA_2
36. LOOP_2
37. MOVLW .181 ; cargamos literal 181 en W
38. MOVWF CONTA_1 ; el W lo mueve al registro CONTA_1
39. LOOP_1
40. NOP ; nop = consume un ciclo de instrucción
41. NOP ; idem
42. DECFSZ CONTA_1,F ; decrementa CONTA_1
43. GOTO LOOP_1 ; si no es "0", continúa el loop 1
44. DECFSZ CONTA_2,F ; al finalizar loop 1, decrementa CONTA_2
45. GOTO LOOP_2 ; si no es "0", continúa el loop 2, recarga
46. NOP ; nuevamente el registro CONTA_1
47. NOP ;
48. GOTO INICIO ; al finalizar salta a INICIO y comienza de nuevo
49. END
 0

#6 WillyP
Member


 Miembro Platino

 22 mensajes
Escrito 16 marzo 2009 - 03:14
Complemento del puerto B

ASM
1. ;DESCRIPCION : Los leds conectados al puerto b encienden y apagan por el
resultado de la instrucción
2. ;comf, que realiza el complemento bit a bit, en este caso del puerto b
.-
3.
4. ; Tipo de microcontrolador
5.
6. list p=16F627A ; directiva que define al
microcontrolador
7. #include <p16F627A.inc> ; definición de variables del
microcontrolador
8. ; configuración:
9.
10. __config _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_ON & _MCLRE_ON &
_PWRTE_OFF & _WDT_OFF & _INTOSC_OSC_NOCLKOUT
11. ;==================================
12. ; Registros utilizados
13.
14. CONTA_1 EQU 0x20
15. CONTA_2 EQU 0x21
16. CONTA_3 EQU 0x22
17. BYTE EQU 0x23
18. ;===================================
19.
20. RESET
21. ORG 00H ;dirección origen 00hex
22. GOTO START ;ir a start
23. START
24. ORG 05H ;salta vector de interrupción
(04hex), y origen 05hex
25. BSF STATUS,5 ;se sitúa en página 1
26. MOVLW B'00000000' ;configura port b como salidas
27. MOVWF PORTB ;
28. BCF STATUS,5 ;regresa a página 0
29. CLRF PORTB ;reset de port b
30. GOTO INICIO ;ir a inicio para comenzar el programa
31.
32. INICIO
33. COMF PORTB,F
34. ;===================================
35. ; temporización
36.
37. MOVLW .14
38. MOVWF CONTA_1
39. LOOP_1 MOVLW .72
40. MOVWF CONTA_2
41. LOOP_2 MOVLW .247
42. MOVWF CONTA_3
43. LOOP_3 NOP
44. DECFSZ CONTA_3,F
45. GOTO LOOP_3
46. DECFSZ CONTA_2,F
47. GOTO LOOP_2
48. DECFSZ CONTA_1,F
49. GOTO LOOP_1
50. INCFSZ BYTE,F
51. GOTO INICIO
52.
53. END

 0

#7 WillyP
Member


 Miembro Platino

 22 mensajes
Escrito 16 marzo 2009 - 03:33
Manejo de una tabla Rom:

ASM
1. ;TITULO : Led_tabla.asm
2. ;DESCRIPCION :Los leds conectados al puerto b se encienden de acuerdo a
la secuencia de bits
3. ;alojados en una tabla de datos.-
4.
5. ; Tipo de microcontrolador
6.
7. list p=16F627A ; directiva que define al
microcontrolador
8. #include <p16F627A.inc> ; definición de variables del
microcontrolador
9. ; configuración:
10.
11. __config _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_ON & _MCLRE_ON &
_PWRTE_OFF & _WDT_OFF & _INTOSC_OSC_NOCLKOUT
12. ;===============================
13. ; Registros utilizados
14.
15. CONTA_1 EQU 0x20
16. CONTA_2 EQU 0x21
17. CONTA_3 EQU 0x22
18. BYTE EQU 0x23
19. RESET
20. ORG 00H ;dirección origen 00hex
21. GOTO START ;ir a start
22. START
23. ORG 05H ;salta vector de interrupción (04hex), y
origen 05hex
24. BSF STATUS,5 ;se sitúa en página 1
25. MOVLW B'00000000' ;configura port b como salidas
26. MOVWF PORTB ;
27. BCF STATUS,5 ;regresa a página 0
28. CLRF PORTB ;reset de port b
29. CLRF BYTE
30. GOTO INICIO ;ir a inicio para comenzar el programa
31.
32. INICIO
33. BTFSC BYTE,3
34. CLRF BYTE
35. MOVF BYTE,W
36. CALL TABLA
37. MOVWF PORTB
38. MOVLW .20
39. MOVWF CONTA_1
40. LOOP_1
41. MOVLW .20
42. MOVWF CONTA_2
43. LOOP_2
44. MOVLW .150
45. MOVWF CONTA_3
46. LOOP_3
47. NOP
48. DECFSZ CONTA_3,F
49. GOTO LOOP_3
50. DECFSZ CONTA_2,F
51. GOTO LOOP_2
52. DECFSZ CONTA_1,F
53. GOTO LOOP_1
54. INCF BYTE,F
55. GOTO INICIO
56. TABLA
57. ADDWF PCL,1 ;suma el contenido de W al PCL
58.
59. RETLW B'10000001'
60. RETLW B'01000010'
61. RETLW B'00100100'
62. RETLW B'00011000'
63. RETLW B'00100100'
64. RETLW B'01000010'
65. RETLW B'10000001'
66. RETLW B'11111111'
67.
68. END

 0

#8 WillyP
Member


 Miembro Platino

 22 mensajes
Escrito 16 marzo 2009 - 03:45
Los leds encienden rotando hacia la derecha en el Puerto B

ASM
1. ;TITULO : Led_rlf.asm
2. ;DESCRIPCION : Los leds conectados al puerto b se encienden
secuencialmente uno por vez desde
3. ;rb0 a rb7 rotando hacia la derecha, cuando llega al final comienza
nuevamente en forma infinita.
4.
5. ; Tipo de microcontrolador
6.
7. list p=16F627A ; directiva que define al
microcontrolador
8. #include <p16F627A.inc> ; definición de variables del
microcontrolador
9. ; configuración:
10.
11. __config _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_ON & _MCLRE_ON &
_PWRTE_OFF & _WDT_OFF & _INTOSC_OSC_NOCLKOUT
12. ;===============================
13. ; Registros utilizados
14.
15. CONTA_1 EQU 0x20
16. CONTA_2 EQU 0x21
17. ROTACION EQU 0x22
18.
19. RESET
20. ORG 0x00 ;dirección origen 00hex
21. GOTO START ;ir a start
22. START
23. ORG 0x05 ;salta vector de interrupción (04hex), y
origen 05hex
24. BSF STATUS,5 ;se sitúa en página 1
25. MOVLW B'00000000' ;configura port b como salidas
26. MOVWF PORTB ;
27. BCF STATUS,5 ;regresa a página 0
28. CLRF PORTB ;reset de port b
29. BSF STATUS,C ;pone en 1 el bit c del registro status
30. GOTO INICIO ;ir a inicio para comenzar el programa
31. INICIO
32. MOVLW .66
33. MOVWF CONTA_1
34. LOOP_1
35. MOVLW .181
36. MOVWF CONTA_2
37. LOOP_2
38. NOP
39. NOP
40. DECFSZ CONTA_2,F
41. GOTO LOOP_2
42. DECFSZ CONTA_1,F
43. GOTO LOOP_1
44. NOP
45. NOP
46. RLF PORTB,F
47. GOTO INICIO
48. END
Los leds encienden rotando hacia la izquierda en el puerto B

ASM
1. ;TITULO : Led_rrf.asm
2. ;DESCRIPCION : Los leds conectados al puerto b se encienden
secuencialmente uno por vez desde
3. ;rb0 a rb7 rotando hacia la izquierda, cuando llega al final comienza
nuevamente en forma infinita.
4. ; Tipo de microcontrolador
5.
6. list p=16F627A ; directiva que define al
microcontrolador
7. #include <p16F627A.inc> ; definición de variables del
microcontrolador
8. ; configuración:
9.
10. __config _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_ON & _MCLRE_ON &
_PWRTE_OFF & _WDT_OFF & _INTOSC_OSC_NOCLKOUT
11. ;===============================
12. ; Registros utilizados
13.
14. CONTA_1 EQU 0x20
15. CONTA_2 EQU 0x21
16. ROTACION EQU 0x22
17. RESET
18. ORG 0x00 ;dirección origen 00hex
19. GOTO START ;ir a start
20. START
21. ORG 0x05 ;salta vector de interrupción (04hex), y
origen 05hex
22. BSF STATUS,5 ;se sitúa en página 1
23. MOVLW B'00000000' ;configura port b como salidas
24. MOVWF PORTB ;
25. BCF STATUS,5 ;regresa a página 0
26. CLRF PORTB ;reset de port b
27. BSF STATUS,C ;pone en 1 el bit c del registro status
28. GOTO INICIO ;ir a inicio para comenzar el programa
29. INICIO
30. MOVLW .66
31. MOVWF CONTA_1
32. LOOP_1
33. MOVLW .181
34. MOVWF CONTA_2
35. LOOP_2
36. NOP
37. NOP
38. DECFSZ CONTA_2,F
39. GOTO LOOP_2
40. DECFSZ CONTA_1,F
41. GOTO LOOP_1
42. NOP
43. NOP
44. RRF PORTB,F
45. GOTO INICIO
46. END

 0
#10 WillyP
Member


 Miembro Platino

 22 mensajes
Escrito 16 marzo 2009 - 04:01
Intercambio de bits -> Msb a Lsb y Lsb a Msb

ASM
1. ;TITULO : Led_swapf.asm
2.
3. ;DESCRIPCION : Se intercambian los 4 bits de mayor peso (msb)con los 4
bits de menor peso
4. ;(lsb)en un registro del microcontrolador y se envian al puerto b
visualizandose por los leds.
5.
6. ; Tipo de microcontrolador
7.
8. list p=16F627A ; directiva que define al
microcontrolador
9. #include <p16F627A.inc> ; definición de variables del
microcontrolador
10.
11. ; configuración:
12.
13. __config _CP_OFF & _DATA_CP_OFF & _LVP_OFF
14. & _BOREN_ON & _MCLRE_ON & _PWRTE_OFF & _WDT_OFF & _INTOSC_OSC_NOCLKOUT
15.
16. ;===============================
17. ; Registros utilizados
18.
19. CONTA_1 EQU 0x20
20. CONTA_2 EQU 0x21
21. CONTA_3 EQU 0x22
22. INV EQU 0x23
23.
24. ;===============================
25.
26. RESET
27. ORG 0x00 ;dirección origen 00hex
28. GOTO START ;ir a start
29. START
30. ORG 0x05 ;salta vector de interrupción (04hex), y
origen 05hex
31. BSF STATUS,5 ;se sitúa en página 1
32. MOVLW B'00000000' ;configura port b como salidas
33. MOVWF PORTB ;
34. BCF STATUS,5 ;regresa a página 0
35. CLRF PORTB ;reset de port b
36. MOVLW .8
37. MOVWF CONTA_3
38. MOVLW B'11110000'
39. MOVWF INV
40. GOTO INICIO ;ir a inicio para comenzar el programa
41. INICIO
42. SWAPF INV,F
43. MOVF INV,W
44. MOVWF PORTB
45. MOVLW .37
46. MOVWF CONTA_1
47. LOOP_1
48. MOVLW .20
49. MOVWF CONTA_2
50. LOOP_2
51. MOVLW .80
52. MOVWF CONTA_3
53. LOOP_3
54. NOP
55. DECFSZ CONTA_3,F
56. GOTO LOOP_3
57. DECFSZ CONTA_2,F
58. GOTO LOOP_2
59. DECFSZ CONTA_1,F
60. GOTO LOOP_1
61. GOTO INICIO
62.
63. END

Você também pode gostar