Вы находитесь на странице: 1из 11

CICLO: 2019 - I

SOLUCIONARIO DEL LABORATORIO CALIFICADO #1


GRUPO A
Autor: Prof. César Martín Cruz S
1) Desarrolle un programa que muestre un MENU:
CONTADOR
a) Contador Creciente
b) Contador Decreciente
c) Salir
Ingrese Seleccion:
Cuando selección “a” debe contar cada medio segundo (generar este tiempo usando el
TIMER 0 en modo 1) en forma creciente en el display y en el terminal de 0 a C en
hexadecimal. Si selecciona “b” debe contar en forma decreciente desde C hasta 0. Si
selecciona “c” debe salir del programa y retornar al monitor.
Usar el botón P3.2 para que al presionarlo lance de nuevo el MENU.
Sol.
print equ 136h
getchr equ 121h
display equ 11Bh
sndchr equ 148h
org 8000h
mov TMOD,#21h
menu:
lcall print
db 0dh,0ah,"CONTADOR",0dh,0ah
db 0dh,0ah,"a)Contador Creciente",0dh,0ah
db 0dh,0ah,"b)Contador Decreciente",0dh,0ah
db 0dh,0ah,"c)Salir",0dh,0ah
db 0dh,0ah,"Ingrese Seleccion: ",0ah,0
lcall getchr
cjne A,#'a',otraOpcion
sjmp creciente
otraOpcion:
cjne A,#'b',salir
Ajmp decreciente
salir:
ljmp 2F0h
creciente:
mov A,#0dh
lcall sndchr
mov A,#0Ah
lcall sndchr
Otra_vez:
mov R2,#0
mov R3,#13
lazo1:
mov A,R2
lcall display
cpl A
mov P1,A
mov A,R2
subb A,#10
jnc otra_cantidad
mov A,R2
add A,#30h
lcall sndchr
mov A,#0dh
lcall sndchr
sjmp salto
otra_cantidad:
mov A,R2
cjne A,#10,otro
mov A,#41h
lcall sndchr
mov A,#0dh
lcall sndchr
sjmp salto
otro:
mov A,R2
cjne A,#11,otro2
mov A,#'b'
lcall sndchr
mov A,#0dh
lcall sndchr
sjmp salto
otro2:
mov A,R2
cjne A,#12,salto
mov A,#'C'
lcall sndchr
mov A,#0dh
lcall sndchr
salto:
jnb P3.2,MENU_
lcall medio_segundo
jnb P3.2,MENU_
inc R2
djnz R3,lazo
Ajmp otra_vez
lazo:
ajmp lazo1
MENU_:
Ajmp menu
decreciente:
mov A,#0dh
lcall sndchr
mov A,#0Ah
lcall sndchr
otra_vez2:
mov R2,#12
mov R3,#13
lazo1_:
mov A,R2
lcall display
cpl A
mov P1,A
mov A,R2
otro2_:
cjne A,#13,otro3_
mov A,#'d'
lcall sndchr
mov A,#0dh
lcall sndchr
sjmp salto_
otro3_:
cjne A,#12,otro4_
mov A,#'C'
lcall sndchr
mov A,#0dh
lcall sndchr
sjmp salto_
otro4_:
cjne A,#11,otro5_
mov A,#'b'
lcall sndchr
mov A,#0dh
lcall sndchr
sjmp salto_
otro5_:
cjne A,#10,otra_cantidad_
mov A,#'A'
lcall sndchr
mov A,#0dh
lcall sndchr
sjmp salto_
otra_cantidad_:
mov A,R2
add A,#30h
lcall sndchr
mov A,#0dh
lcall sndchr
salto_:
jnb P3.2,MENU__
lcall medio_segundo
jnb P3.2,MENU__
dec R2
djnz R3,lazo_
Ajmp otra_vez2
lazo_:
ajmp lazo1_
MENU__:
ajmp menu

medio_segundo:
setb TR0
mov R7,#7
espera:
jnb TF0,espera
clr TF0
jnb P3.2,fuera
djnz R7,espera
fuera:
clr TR0
ret
end

2) Hacer un programa que usando la tarjeta de LEDS muestre un MENU:


Juego de Luces
01) Auto Fantastico
02) Cortina
03) Barra de progreso
04) Salir
Ingrese Seleccion:
Selecciona el juego de luces Auto Fantástico al seleccionar “01”. Y selecciona el juego
de luces Cortina al seleccionar “02” y así sucesivamente. El retardo de tiempo en cada
juego que sea de un cuarto de segundo y generarlo con el TIMER 0 en modo 0.
Sol.
print equ 136h
getbyt equ 11Eh
display equ 11Bh
sndchr equ 148h
org 8000h
mov TMOD,#20h
menu:
lcall print
db 0dh,0ah,"Juego de Luces",0dh,0ah
db 0dh,0ah,"01)Auto Fantastico",0dh,0ah
db 0dh,0ah,"02)Cortina",0dh,0ah
db 0dh,0ah,"03)Barra de Progreso",0dh,0ah
db 0dh,0ah,"04)Salir",0dh,0ah
db 0dh,0ah,"Ingrese Seleccion: ",0ah,0
lcall getbyt
cjne A,#1,otraOpcion
ajmp auto_fantastico
otraOpcion:
cjne A,#2,otraOpcion2
ajmp cortina
otraOpcion2:
cjne A,#3,otraOpcion3
ajmp barraProg
otraOpcion3:
cjne A,#4,termina
ljmp 2F0h
termina:
lcall print
db 0dh,0ah,"La seleccion no es valida",0dh,0ah,0
ljmp menu
auto_fantastico:
lcall autoFan
jnb P3.2,menu_
sjmp auto_fantastico
menu_:
ajmp menu
cortina:
lcall juego_cortina
jnb P3.2,menu_
sjmp cortina
barraProg:
lcall barra_prog
jnb P3.2,menu_
sjmp barraProg
autoFan:
mov R0,#8 ;En R0 se tiene el contador
mov A,#1
OtraVez:
mov P1,A ;envío al Puerto P1 el valor de A
jnb P3.2,va_fuera
lcall retardo
jnb P3.2,va_fuera
rl A ;Se rota a la izquierda
djnz R0,OtraVez ;Va a "OtraVez" y se repite mientras R0 no es cero
mov R0,#8 ;De nuevo inicializo el contador para el otro sentido
mov A,#80h ;Valor inicial del puerto en el otro sentido
OtraVez2:
mov P1,A
jnb P3.2,va_fuera
lcall retardo
jnb P3.2,va_fuera
rr A ;Se rota a la derecha
djnz R0,OtraVez2
va_fuera:
ret
retardo:
setb TR0
mov R7,#28
wait_:
jnb TF0,wait_
clr TF0
jnb P3.0,se_va
djnz R7,wait_
se_va:
clr TR0
ret
juego_cortina:
mov R1,#3
mov R2,#10h ;R2•0001 0000
mov R3,#8 ;R3•0000 1000
mov A,R2 ;A •R2
orl A,R3 ;A•R2 OR R3, entonces A=11h
;cpl A
mov P1,A ;P1•A, entonces P1=11100111
lcall Retardo ;llamo a subrutina de retardo de tiempo
jnb P3.2,va_fuera_
loop: ;empieza un sentido de desplazamiento
mov A,R2 ;A•0001 0000
rl A ;A•0010 0000
mov R2,A ;R2•0010 0000
mov A,R3 ;R3•0000 1000
rr A ;A•0000 0100
mov R3,A ;R3•0000 0100
orl A,R2 ;se juntan ambos nibbles(R2 y R3) para mandarlo al puerto P1
;A•0000 0100 OR 0010 0000= 0010 0100
;cpl A
mov P1,A
lcall Retardo
jnb P3.2,va_fuera_
djnz R1,loop ;así sucesivamente 2 veces más
mov R1,#3
loop2: ;empieza otro sentido de desplazamiento
mov A,R2
rr A
mov R2,A
mov A,R3
rl A
mov R3,A
orl A,R2
;cpl A
mov P1,A
lcall retardo
jnb P3.2,va_fuera_
djnz R1,loop2
va_fuera_:
ret
barra_prog:
mov R3,#8
mov R2,#0
lazo_:
mov A,R2
lcall trae_valor
mov P1,A
lcall retardo
jnb P3.2,va_fuera__
inc R2
djnz R3,lazo_
va_fuera__:
ret
trae_valor:
inc A
movc A,@A+PC
ret
db 1h,3h,7h,0Fh,1Fh,3Fh,7Fh,0FFh
END

3) Desarrolle un programa que calcule (S - T + U - V - W - X + Y - Z) /2-91. Considerar


S=80, T=40, U=100, V=20, W=15, X=9, Y=100 y Z=10. Mostrar el resultado en el
display de 7 segmentos y en el terminal.

Sol.

prthex equ 13Fh


display equ 11Bh
org 8000h
mov A,#80 ;A<-80
clr C
subb A,#40 ;A<-80-40
add A,#100 ;A<-A+100
subb A,#20
subb A,#15
subb A,#9
add A,#100
subb A,#10
mov B,#2 ;Divisor igual a 2
div AB
subb A,#91
mov 30h,A
lcall prthex
mov A,30h
lcall display
cpl A
mov P1,A
ljmp 2F0h
end

4) Hacer un programa que cada vez que presione el botón P3.2 se muestre un MENU en
el terminal:
Averigua si un numero es primo
Ingrese un numero :
Este número si es primo debe mostrar en el terminal “Es primo”. Si no es debe mostrar
“No es primo”. También, debe mostrar en el display de 7 segmentos la letra “P” si es
primo y “0” si no es. Si presiona el botón P3.3 debe terminar el programa.
Sol.

print equ 136h


getbyt equ 11Eh
sndchr equ 148h
org 8000h
wait_:
jnb P3.2,menu
sjmp wait_
menu:
lcall print
db 0dh,0ah,"Averigua si un numero es primo",0dh,0ah
db 0dh,0ah,"Ingrese un numero: ",0ah,0
lcall getbyt
mov 30h,A
cjne A,#2,otroN
sjmp SiPrimo
otroN:
mov R2,#2
continua:
mov A,30h
mov B,R2
div AB
mov A,B
cjne A,#0,sigue
sjmp NoPrimo
sigue:
inc R2
mov A,R2
cjne A,30h,continua
sjmp SiPrimo
NoPrimo:
mov A,30h
lcall print
db " No es Primo",0dh,0Ah,0
mov P1,#63
esperar:
jnb P3.2,menu_
jnb P3.3,salir
sjmp esperar
menu_:
ljmp menu
salir:
lcall print
db 0dh,0ah,"Hasta la proxima...",0dh,0ah,0
ljmp 2F0h
SiPrimo:
mov A,30h
lcall print
db " Es Primo",0dh,0Ah,0
mov P1,#115
esperar_:
jnb P3.2,menu__
jnb P3.3,salir_
sjmp esperar_
menu__:
ljmp menu
salir_:
lcall print
db 0dh,0ah,"Hasta la proxima...",0dh,0ah,0
ljmp 2F0h
end

Вам также может понравиться