You are on page 1of 3

Ejercicios de Programación en Lenguaje Ensamblador

para PIC
Se pide:
a. Hacer el diagrama de flujo
b. Escribir el código y ensamblar sin errores.
c. Simular el funcionamiento para verificar la solución dada y auto validar tu respuesta como correcta.

Los siguientes ejercicios se consideran completos solamente si se realizan estas tres acciones.

 Todos los ejercicios usan un PIC16F84A y como clock un cristal de 4MHz

1. Hacer que por el PORTB aparezca el valor binario b’11010101’


2. En el pin RA4 se conectará un led. Al ejecutar el programa se debe encender el LED. (*)
3. En el pin RB0 se conecta un pulsador y en RA0 un led. Si RB0 = 0 entonces el led debe encenderse, de lo
contrario se debe apagar. La aplicación debe preguntar permanentemente por el estado del pulsador y
realizar lo solicitado.
4. El PORTA actúa como entrada de datos y el PORTB como salida. El PORTB debe “copiar” el estado del
PORTA. Si en el PORTA hay b’10111’, entonces en el PORTB se deberá mostrar b’xxx10111’.
5. Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A al que están conectado un array de
interruptores. Por ejemplo, si por el Puerto A se introduce b"---11001", por el Puerto B aparecerá el
valor complementado para este caso b"xxx00110" (el valor de las tres líneas superiores no importa).
Esta operación la realizará una única vez. Después el programa entrará en modo "Standby" o de bajo
consumo del cual no podrá salir.
6. Ídem 04, pero ahora en el nibble alto del PORTB siempre deberá aparecer b‘1111’,
independientemente el valor que adopte RA4.
7. Declarar una variable llamada ‘var_1’, y asignarle el valor 28 (decimal).
8. Declarar una variable llamada ‘var_2’ en la dirección de RAM 0x21 y otra llamada ‘resultado’ en la
dirección RAM 0x3A. Asignarle un valor cualquiera a cada una.
9. Tomando en cuenta los ejercicios 7 y 8, sumar los valores de las variables ‘var_1’ y ‘var_2’ y el resultado
de la suma asignarlo a la variable ‘resultado’.
10. Ídem 9, pero además mostrar el valor del acarreo de la suma en el pin 3 del PORTA.
11. El uC realiza la resta entre el valor presente en la entrada del PORTA (todo el PORTA como entrada de
datos) y una constate, como por ejemplo el número 23. El resultado lo muestra en el PORTB.
Interpretar el resultado positivo y negativo. (PORTB) = (PORTA) – 23
12. Leer el PORTA y copiar el valor en PORTB, teniendo en cuenta que los bits impares (RB1, RB3, etc.) del
PORTB siempre deberán ser ‘1’. Se debe resolver utilizando una máscara.
13. Leer el PORTA y copiar el valor en PORTB, teniendo en cuenta que los bits impares (RB1, RB3, etc.) del
PORTB siempre deberán ser ‘0’. Se debe resolver utilizando una máscara.
14. Implementar una compuerta EXOR de 4 entradas y una salida usando el PORTA (RA0 a RA3 entradas –
RA4 salida).
15. El PORTB actúa como entrada en su nibble inferior, mientras que el nibble superior actúa como salida.
El PORTA, los bits 0 a 4, cumplen la función de máscara, mientras que el bit 5 como “selector” de
operación lógica (0 -> OR, 1 -> AND). Leer el nibble bajo del PORTB, a dicho valor junto a la máscara
aplicarle la operación lógica seleccionada y mostrarla en el nibble alto del PORTB. En símbolos:
(PORTB[7-4]) <- (PORTB[3-0]) & (PORTA[3-0]) { si RA4 == 1}
(PORTB[7-4]) <- (PORTB[3-0]) | (PORTA[3-0]) { si RA4 == 0}
16. Por el Puerto B se obtiene el dato del Puerto A intercambiando los nibbles alto y bajo. Por ejemplo, si
por el Puerto A se introduce "---11001" por el Puerto B aparecerá "1001xxx1".
17. Por el Puerto B obtiene el dato del Puerto A rotando un bit hacia la izquierda, por la derecha entrará un
"1". Por ejemplo, si por el Puerto A se introduce "---11001", por el Puerto B aparecerá "xx110011" (no
importa el estado de los dos bits superiores del Puerto B).
18. El PORTA actúa como entrada de datos y el PORTB como salida. Al PORTB se le conecta un display 7
segmentos. Comparar el dato del puerto de entrada PORTA con un "NUMERO" por ejemplo el 12. Se
pueden dar tres posibilidades:
- Si (PORTA) = NUMERO, entonces se deberá mostrar una E en el display (EQUAL)
- Si (PORTA) > NUMERO, entonces se deberá mostrar una H en el display (HIGHER)
- Si (PORTA) < NUMERO, entonces se deberá mostrar una L en el display (LOWER)
19. Programar una sencilla cerradura codificada. El PIN RB4 tendrá un uno lógico por cinco segundos si y
sólo si se pulsan de manera secuencial y ordenadamente cada uno de los cinco pulsadores conectados
al PORTA. La secuencia debe ser la siguiente RA3 RA0 RA1 RA2 RA4.
20. Encender un led conectado al pin RB4 durante 100ms y apagarlo por 400ms, permanentemente.
21. Los LEDs conectados al Puerto B se encienden de acuerdo a la secuencia de bits alojados en una tabla
de datos.
22. Si se presiona un pulsador conectado al pin RB0 se deberá encender y apagar el led conectado a RB4
tres veces. Después de ello el led deberá permanecer apagado. Para reiniciar el programa se debe
resetear el uC.
23. Se modifica el programa anterior de tal forma que, una vez realizada la secuencia de tres encendidos, al
presionar por segunda vez el pulsador repite la secuencia el doble de veces, o sea 6 encendidos. Al
presionar por tercera vez se encenderá 9 veces y así sucesivamente.
24. Encender el número 23 en un display de 7 segmentos de dos cifras. Tanto la unidad como la decena
estarán conectadas al PORTB (RB0 a RB6). La unidad se encenderá con la salida RA0 y la decena con la
salida RA1.
25. Las tres líneas más bajas del puerto A fijan la cantidad del número de LEDs a iluminar. Por ejemplo, si
(PORTA) = b'---00101' (cinco) se encenderán cinco diodos LEDs del PORTB (RB4 = RB3 = RB2 = RB1 = RB0
= 1).
26. Usar el TMR0 como temporizador, realizar un programa en lenguaje ensamblador para el PIC16F84A
funcionando con un clock a cristal de 4 MHz, que genere una señal cuadrada en el pin RB7, de tal
manera que el periodo de la señal sea de 2,048 ms con un ciclo de trabajo del 50%. No usar delays.
27. Programar al uC PIC16F84A para que al recibir un pulso ascendente (Low to High) por RB0 se
incremente la variable ‘contar’. El valor de la variable se mostrará de manera binaria en el PORTA.
Cuando el valor llegue a 32 debe volver a comenzar en 0. Resolver este problema usando la
interrupción por RB0.
28. Hacer un segundero con un display 7 segmentos conectado al PORTB. No usar delays.
29. Contar interrupciones por RB0/INT. La cuenta se debe realizar en un solo dígito BCD y mostrarla en el
PORTA, usando para ello los bits RA0 a RA3. El décimo pulso debe reiniciar el valor mostrado en cero y
seguir contando.
30. Programar al uC PIC16F84A para que al recibir un pulso por RB0 (flanco descendente) se incremente
una variable denominada ‘contador’. Mostrar el valor en un display 7 segmentos conectado en PORTB
(RB1 a RB7). Cuando ese valor llegue a 10 se mostrará el cero y seguirá contando las interrupciones.
31. Contar flancos ascendentes y descendentes por RB0 y mostrar la cantidad de flancos contados en un
display multiplexado conectado en el PORTB (RB1 a RB7) RA0 controla la unidad RA1 controla la
decena. Al llegar a 99 vuelve a comenzar su cuenta desde cero.
32. El display multiplexado conectado al PORTB debe contar segundos usando el clock del uC y el TMR0. Al
llegar a 59 debe comenzar de cero nuevamente.
33. Se conecta un display LCD de 2x16 basado en el HD44780 al PIC16F84A, y al encender el sistema se
visualiza la leyenda "Hola Mundo".
34. En un display LCD de dos líneas y 16 caracteres basado en el HD44780 se muestran cuatro posibles
carteles:
- Si RA0 = 0 y RA1 = 0  “Encendido”
- Si RA0 = 1 y RA1 = 0  “Velocidad Min”
- Si RA0 = 0 y RA1 = 1  “Velocidad Max”
- Si RA0 = 1 y RA1 = 1  “Apagado”
35. Al presionar un pulsador en RB0 disparar el sonido de una sirena. La frecuencia de la señal generada
debe aumentar y disminuir rítmicamente. Usar un parlante y la salida RB4.
36. Hacer que un led se vaya encendiendo y apagando lentamente de manera continua y rítmica, usando la
técnica de PWM.
37. Mediante un display 7 segmentos hacer un sistema que permita discriminar el ancho de pulsos
entrantes. Los pulsos entran por RB0. Éstos tienen una frecuencia de entrada fija de 20 Hz y una
amplitud de 0 a 5 Volts. Al conectar el sistema a la alimentación y sin tener señal de entrada por RB0, se
enciende el display mostrando la letra P (preparado). Al inyectar la señal en el pin RB0 cambiará la
indicación en el display 7 segmentos de acuerdo a las siguientes condiciones:
Si el ancho del pulso es de:
- 20 ms (+/- 50 %) el display mostrará un – (Guion)
- 10 ms o menor el display mostrará una H (HIGH)
- 30 ms o mayor el display mostrará una L (LOW)
38. Al recibir por RS232 la letra “A” o “a”, un led conectado al uC se apagará. En el caso de recibir una “E” o
una “e” el led se encenderá.
39. Se debe guardar en memoria EEPROM la cantidad de veces que el uC se enciende. Si ese valor supera
los 10 encendidos, entonces en RA0 debe aparecer un 1 lógico.
40. Encender y apagar un led de tal forma que se pueda apreciar con la vista, sin usar retardos. Usar para
ello el temporizador del WDT y la instrucción sleep.

You might also like