Está en la página 1de 5

EJERCICIOS ASM

Bloque 3

1. Convertir un número binario de 8 bits en BCD guardando las centenas, decenas y unidades en 3
registros de memoria distintos. Mostrar las decenas y unidades en 8 LEDs de salida. El número
a convertir será una constante Numero. Realizar el proceso mediante oka llamada a una
subrutina.

;*********************************** Subrutinas_01.asm **********************************


;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Un número binario de 8 bits es convertido a BCD. El resultado se guarda en tres
; posiciones de memorias RAM de datos llamadas Centenas, Decenas y Unidades.
; Finalmente también las unidades y las decenas se visualizarán en los diodos LEDs
; conectados al Puerto B. El número a convertir será la constante "Numero".
;
; Realizar este programa utilizando una subrutina que se llame BIN_a_BCD.
;
; ZONA DE DATOS **********************************************************************

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


LIST P=16F84A
INCLUDE <P16F84A.INC>

CBLOCK 0x0C ; En esta posición empieza la RAM de usuario.


ENDC

Numero EQU .124 ; Por ejemplo.

; ZONA DE CÓDIGOS ********************************************************************

ORG 0 ; El programa comienza en la dirección 0.


Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B se configuran como salida.
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal
movlw Numero
call BIN_a_BCD
movwf PORTB ; El resultado se visualiza por la salida.
goto $ ; Se queda permanentemente en este bucle.

; Subrutina "BIN_a_BCD" -----------------------------------------------------------------


;
; Un número binario de 8 bits es convertido en BCD. El procedimiento utilizado es mediante
; restas de 10, tal como se explicó en el capítulo 9.
;
; Entrada: En el registro W el número binario a convertir.
; Salidas: En (Centenas), (Decenas) y (Unidades).
; También las decenas (nibble alto) y unidades (nibble bajo) en el registro (W).

CBLOCK ; En las subrutinas no se debe fijar la dirección


Centenas ; de la RAM de usuario. Definida a continuación de
Decenas ; la última asignada.
Unidades
ENDC
;
BIN_a_BCD
clrf Centenas ; Carga los registros con el resultado inicial.
clrf Decenas ; En principio (Centenas)=0 y (Decenas)=0.
movwf Unidades ; Se carga el número binario a convertir.
Resta10
movlw .10 ; A las unidades se le va restando 10 en cada
subwf Unidades,W ; pasada. (W)=(Unidades)-10.
btfss STATUS,C ; ¿(Unidades)>=10?, ¿(W) positivo?, ¿C=1?
goto Fin_BIN_BCD ; No, es menor de 10. Se acabó.
IncrementaDecenas
movwf Unidades ; Recupera lo que queda por restar.
incf Decenas,F ; Incrementa las decenas y comprueba si ha
movlw .10 ; llegado a 10. Lo hace mediante una resta.
subwf Decenas,W ; (W)=(Decenas)-10).
btfss STATUS,C ; ¿C=1?, ¿(W) positivo?, ¿C=1?
goto Resta10 ; No. Vuelve a dar otra pasada, restándole 10.
IncrementaCentenas
clrf Decenas ; Pone a cero las decenas
incf Centenas,F ; e incrementa las centenas.
goto Resta10 ; Otra pasada: Resta 10 al número a convertir.
Fin_BIN_BCD
swapf Decenas,W ; En el nibbe alto de (W) también las decenas.
addwf Unidades,W ; En el nibble bajo de (W) las unidades.
return ; Vuelve al programa principal.

END ; Fin del programa.

; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
2. Recibir por el PORTA un valor binario y mostrarlo en DCB por el PORTB.

;*********************************** Subrutinas_03.asm **********************************


;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; El valor del puerto de entrada PORTA es convertido a BCD y el resultado se visualiza
; por el puerto de salida PORTB. Así por ejemplo, si por el PORTA se lee "---10111"
; (23 en decimal) por el PORTB se visualizará "00100011".
;
; ZONA DE DATOS **********************************************************************

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


LIST P=16F84A
INCLUDE <P16F84A.INC>

CBLOCK 0x0C ; En esta posición empieza la RAM de usuario.


ENDC

; ZONA DE CÓDIGOS ********************************************************************

ORG 0 ; El programa comienza en la dirección 0.


Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B se configuran como salida.
movlw b'00011111' ; Las 5 líneas del Puerto A se configuran como
entrada.
movwf TRISA
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal
movf PORTA,W ; Carga el número a convertir.
call BIN_a_BCD ; Lo pasa a BCD.
movwf PORTB ; Resultado se visualiza por el puerto de salida.
goto Principal ; Se queda permanentemente en este bucle.

INCLUDE <BIN_BCD.INC> ; La subrutina se añadirá al final del programa


END ; principal.

; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
Bloque 4

1. Emplear la instrucción retlw para obtener los 3 bits menos significativos del PORTA y
determinar el número de bits que se iluminan en el PORTB, mediante el empleo de tablas.

;************************************* Tablas_01.asm ************************************


;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Lee las tres líneas más bajas del puerto A, que fijan la cantidad del número de LEDs a
; iluminar. Por ejemplo, si (PORTA)=b'---00101' (cinco) se encenderán cinco diodos LEDs
; (D4, D3, D2, D1 y D0). Se resolverá utilizando tablas mediante la instrucción "retlw".
;
; ZONA DE DATOS **********************************************************************

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


LIST P=16F84A
INCLUDE <P16F84A.INC>

; ZONA DE CÓDIGOS ********************************************************************

ORG 0 ; El programa comienza en la dirección 0.


Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B se configuran como salida.
movlw b'00011111' ; Las 5 líneas del Puerto A se configuran como
entrada.
movwf TRISA
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal
movf PORTA,W ; Lee la entrada.
andlw b'00000111' ; Se queda con los tres bits más bajos de la
entrada.
call IluminarLEDs ; Obtiene el código deseado.
movwf PORTB ; El resultado se visualiza por la salida.
goto Principal

; Subrutina "IluminarLEDs" --------------------------------------------------------------


;
IluminarLEDs
addwf PCL,F
Tabla retlw b'00000000' ; Todos los LEDs apagados.
retlw b'00000001' ; Se enciende D0.
retlw b'00000011' ; Se enciende D1 y D0.
retlw b'00000111' ; Etc.
retlw b'00001111'
retlw b'00011111'
retlw b'00111111'
retlw b'01111111'

END ; Fin del programa.

; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
2. Implementar una tabla de verdad mediante el manejo de tablas grabadas en la ROM. Para ello,
emplear cualquier tabla de verdad de 3 bits con cualquier valor.

;************************************* Tablas_03.asm ************************************


;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Implementar una tabla de la verdad mediante el manejo de tablas grabadas en ROM. Por
; ejemplo, la tabla será de 3 entradas y 6 salidas:
;
; C B A | S5 S4 S3 S2 S1 S0
; -----------|---------------------------
; 0 0 0 | 0 0 1 0 1 0 ; (Configuración 0).
; 0 0 1 | 0 0 1 0 0 1 ; (Configuración 1).
; 0 1 0 | 1 0 0 0 1 1 ; (Configuración 2).
; 0 1 1 | 0 0 1 1 1 1 ; (Configuración 3).
; 1 0 0 | 1 0 0 0 0 0 ; (Configuración 4).
; 1 0 1 | 0 0 0 1 1 1 ; (Configuración 5).
; 1 1 0 | 0 1 0 1 1 1 ; (Configuración 6).
; 1 1 1 | 1 1 1 1 1 1 ; (Configuración 7).
;
; Las entradas C, B, A se conectarán a las líneas del puerto A: RA2 (C), RA1 (B) y RA0 (A).
; Las salidas se obtendrán del puerto B: RB5 (S5), RB4 (S4), RB3 (S3), RB2 (S2), RB1 (S1)
; y RB0 (S0).
;
; ZONA DE DATOS **********************************************************************

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


LIST P=16F84A
INCLUDE <P16F84A.INC>

; ZONA DE CÓDIGOS ********************************************************************

ORG 0 ; El programa comienza en la dirección 0.


Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B se configuran como salida.
movlw b'00011111' ; Las 5 líneas del Puerto A se configuran como
entrada.
movwf TRISA
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal
movf PORTA,W ; Lee el valor de las variables de entrada.
andlw b'00000111' ; Se queda con los tres bits bajos de entrada.
call TablaVerdad ; Obtiene la configuración de salida.
movwf PORTB ; Se visualiza por el puerto de salida.
goto Principal

; Subrutina "TablaVerdad" ---------------------------------------------------------------


;
TablaVerdad
addwf PCL,F
retlw b'00001010' ; (Configuración 0).
retlw b'00001001' ; (Configuración 1).
retlw b'00100011' ; (Configuración 2).
retlw b'00001111' ; (Configuración 3).
retlw b'00100000' ; (Configuración 4).
retlw b'00000111' ; (Configuración 5).
retlw b'00010111' ; (Configuración 6).
retlw b'00111111' ; (Configuración 7).

END

; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
3. Visualizar por un display conectado a la salida un carácter determinado dentro de un mensaje
grabado en la memoria ROM de programa mediante la directiva DT. El número del carácter a
visualizar será la cantidad leída por la entrada. Por ejemplo, si en la ROM se guarda la frase
“ESTUDIO ELECTRONICA” y la cantidad leída en la entrada es “—-01001” (9 decimal) en el
display aparecerá la letra “L”.

;************************************* Display_06.asm ***********************************


;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Visualiza por el display conectado a la salida, un carácter determinado dentro de un
; mensaje grabado en la memoria ROM de programa mediante la directiva "DT". El número del
; carácter a visualizar será la cantidad leída por la entrada.
;
; Así por ejemplo, si el texto grabado en la ROM es: "ESTUDIA ELECTRONICA" y la cantidad
; leída por la entrada es "---01001" (9 en decimal) por el display aparecerá "L" que es
; el carácter situado en el lugar 9 del mensaje (la primera letra "E" está en el lugar 0).
;
; Si el número de caracteres del mensaje es menor que la cantidad de entrada se encenderá
; el punto decimal.
;
; ZONA DE DATOS **********************************************************************

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


LIST P=16F84A
INCLUDE <P16F84A.INC>

CBLOCK 0x0C ; En esta posición empieza la RAM de usuario.


ENDC

; ZONA DE CÓDIGOS ********************************************************************

ORG 0 ; El programa comienza en la dirección 0.


Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf PORTB ; Las líneas del Puerto B se configuran como salida.
movlw b'00011111' ; Las 5 líneas del Puerto A se configuran como entrada.
movwf PORTA
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal
movlw (MensajeFin-MensajeInicio) ; Halla la longitud del mensaje.
subwf PORTA,W ; (W)=(PORTA)-Longitud Mensaje.
btfsc STATUS,C ; ¿C=0?, ¿(W) negativo?, ¿(PORTA)<Longitud Mensaje?
goto MensajeMenor ; No. Entonces la entrada se pasa de valor.
movf PORTA,W ; Lee el número de carácter dentro del mensaje.
call LeeCaracter ; Obtiene el carácter dentro del mensaje y lo
call ASCII_a_7Segmentos ; pasa a código de 7 segmentos.
goto ActivarSalida
MensajeMenor
movlw b'10000000' ; Como el mensaje es de menor longitud que el número de
ActivarSalida ; carácter solicitado, se enciende el punto decimal.
movwf PORTB ; Resultado se visualiza por el puerto de salida.
goto Principal
;
; Subrutina "LeeCaracter" ---------------------------------------------------------------
;
LeeCaracter
addwf PCL,F
MensajeInicio ; Indica la posición inicial del mensaje.
DT "ESTUDIA ELECTRONICA"
MensajeFin ; Indicar la posición final del mensaje.
;
INCLUDE <DISPLAY_7S.INC> ; Subrutina ASCII_a_7Segmentos.
END

; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================

También podría gustarte