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

;**************UNIVERSIDAD DE LAS FUERZAS ARMADAS ESPE**************************

;NOMBRES: ESTEBAN GUATO NRC:2094


; DANIELA SUNTASIG
; CHRISTIAN TERAN
;FECHA: 26/11/2017
;*****************************MICROCONTROLADORES********************************
; PROBLEMA: Implementar una calculadora capaz de realizar las operaciones como
; suma, resta y multiplicacion, las cuales deben ser escogidas; para su ejecucio
; PORTA, PORTB ingreso de numeros
; PORTE Seleccion de operacion
; PORTC y PORTD Salida de datos (BCD)
;****************************Inicio de CODIGO***********************************
; Las operaciones, que seran ingresadas por el PORTE seran:
; Suma b'00000001'
; Resta b'00000010'
; Multiplicacion b'00000100'
include "P16F877A.inc"
CBLOCK 20h ; Declaracion de dirreciones.
num1 ; 20h
num2 ; 21h
Centenas ; 22h
Decenas ; 23h
Unidades ; 24h
ENDC
org 0 ; Inicio del programa.

bsf STATUS,RP0 ; Posicionamiento en el Banco 1


bcf STATUS,RP1
;**************************Declaracion de entradas******************************
movlw b'00111111' ; PORTA como entrada
movwf TRISA
movlw b'11111111' ; PORTB como entrada
movwf TRISB
movlw b'00000111' ; PORTB como entrada
movwf TRISE
;**************************Declaracion de salidas*******************************
clrf TRISD ; PORTD como salida
clrf TRISC; PORTE como salida
;///////////////////////////////////////////////////////////////////////////////
Inicio
bcf STATUS,RP0 ; Posicionamiento en el Banco 0
bcf STATUS,RP1

btfsc PORTE,b'00000000' ;1 entra a call 0 no entra a call


call Suma
btfsc PORTE,b'00000001' ;1 entra a call 0 no entra a call
call Resta
btfsc PORTE,b'00000010' ;1 entra a call 0 no entra a call
call Multiplicacion
goto Inicio

Suma
movfw PORTA ;
Copio el Contenido de PORTA en W
movwf num1 ;
Copio el Contenido de W en num1
movfw PORTB ;
Copio el Contenido de PORTB en W
movwf num2 ;
Copio el Contenido de W en num2
clrw ;
Limpia W
movfw num1 ;
Muevo num1 a W
addwf num2,0 ; Sumo W = W + num2, el resultado se almacena en W
call Binario_Bcd ; Subrutina para convertir de Binario a Bcd
clrw ; Limpio a W
goto Inicio

Resta
movfw PORTA ; Copio el Contenido de PORTA en W
movwf num1
movfw PORTB ; Copio el Contenido de PORTA en W
movwf num2
clrw
movfw num1
subwf num2,0
call Binario_Bcd
movwf PORTD ; Copio el contenido de W en PORTD
clrw ; Limpio a W
goto Inicio

Multiplicacion
clrw
movfw PORTA
movwf num1
clrw
movfw PORTB
movwf num2
clrw
incf num2,1

ciclo
decfsz num2,1
goto sumasuce
call Binario_Bcd
clrw
goto Inicio

sumasuce
addwf num1,0
goto ciclo
;//////////////////////Conversion de Binario a BCD///////////////////////////////
; Un nmero binario de 8 bits es convertido a BCD. El resultado se guarda en tres
posiciones
; de memorias llamadas Centenas, Decenas y Unidades.
; El mximo nmero a convertir ser el 255 que es el mximo valor que puede
adquirir el
; nmero binario de entrada de 8 bits.
; El procedimiento utilizado es mediante restas de 10 tal como se explica en el
siguiente
; ejemplo que trata de la conversin del nmero 124 a BCD:
;----------------------------------------------------------------------------------
-------
; (Centenas) (Decenas) (Unidades) (Unidades)<10? (Decenas)=10?
; ---------- --------- ---------- --------------
-------------------------
;
; 0 0 124 NO, resta 10 Incrementa
(Decenas).
; 0 1 114 NO, resta 10 NO. Incrementa
(Decenas).
; 0 2 104 NO, resta 10 NO. Incrementa
(Decenas).
; 0 3 94 NO, resta 10 NO. Incrementa
(Decenas).
; 0 4 84 NO, resta 10 NO. Incrementa
(Decenas).
; 0 5 74 NO, resta 10 NO. Incrementa
(Decenas).
; 0 6 64 NO, resta 10 NO. Incrementa
(Decenas).
; 0 7 54 NO, resta 10 NO. Incrementa
(Decenas).
; 0 8 44 NO, resta 10 NO. Incrementa
(Decenas).
; 0 9 34 NO, resta 10 NO. Incrementa
(Decenas).
; 1 0 24 NO, resta 10 S. (Decenas)=0, y
adems
; incrementa (Centenas)
; 1 1 14 NO, resta 10 NO. Incrementa
(Decenas)
; 1 2 4 S, se acab.
;
; El nmero a convertir ser el resultado de las operaciones previas en la
calculadora
Binario_Bcd
clrf Centenas
clrf Decenas ; Limpia el registro
movwf Unidades ; Mueve W a Unidades
BCD_Resta10
movlw .10 ; A las unidades se les va restando 10 en cada
subwf Unidades,W ; pasada. (W)=(Unidades)-10.
btfss STATUS,C ; (C)=1?, (W) positivo?, (Unidades)>=10?.
goto BIN_BCD_Fin
BCD_IncrementaDecenas
movwf Unidades ; Recupera lo que queda por restar.
incf Decenas,F ; Incrementa las decenas y comprueba si llega a
movlw .10 ; 10. Lo hace mediante una resta.
subwf Decenas,W ; (W)= (Decenas)-10.
btfss STATUS,C ; (C)=1?, (W) positivo?, (Decenas)>=10?.
goto BCD_Resta10
BCD_IncrementaCentenas
clrf Decenas ; Pone a cero las decenas
incf Centenas,F ; e incrementa las centenas.
goto BCD_Resta10
BIN_BCD_Fin
swapf Decenas,W
addwf Unidades,W ; Suma W = Unidades + W.
movwf PORTD ; Resultado almacenado en PORTD (8 BITS) (Decenas y
Unidades)
clrw ; Limpio W
movfw Centenas
movwf PORTC ; Resultado almacenado en PORTC (8 BITS) (Centenas)
clrw ; Limpio W
goto Inicio
END

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