Está en la página 1de 3

LIST P=16F877A

#INCLUDE<P16F877A.INC>
ORG 0X0000
goto inicio
ORG 0X0005
inicio
BCF STATUS,RP0 ;ubicacin bank0 del registro 0x30h
BCF STATUS,RP1
MOVLW .133 ;chequeo primer caso
XORWF 0x30,0 ;comparacin del contenido en 0x30h con lo que tiene
w
BTFSS STATUS,Z ;z=1?
GOTO comparacion ;no z=0 ir a comparacin con el siguiente codigo
GOTO resta ;s son iguales ir a resta
comparacion
BCF STATUS,RP0 ;bank0 del registro 0x30h
BCF STATUS,RP1
MOVLW .65 ;chequeo segundo caso
XORWF 0x30,0 ;comparacin del contenido en 0x30h con lo que tiene
w
BTFSC STATUS,Z ;z=0?
GOTO suma ;no z=1 son iguales ir a suma
GOTO inicio ;s son diferentes entonces me devuelvo
suma
BSF 0x0A,3 ;memoria room 08FA pagina1
BCF 0x0A,4 ;bits 3 y 4 del pclath
GOTO suma_indirecta
resta
BSF 0x0A,3 ;memoria room 18AAh pgina3
BSF 0x0A,4 ;bits 3 y 4 del pclath
GOTO resta_directa

ORG 0x18AA
resta_directa
BSF STATUS,RP0 ;ubicacion bank1
BCF STATUS,RP1
MOVF 0xA1,0 ;contenido de num1l
BSF STATUS,RP1
BCF STATUS,RP0 ;ubicacion bank2
SUBWF 0x121,0 ;num2l-num1l resto parte 1 de 16 bits f-w
BCF STATUS,RP0
BCF STATUS,RP1 ;ubicacion bank0 para resultadol
MOVWF 0x22 ;s guardar contenido de w en resultado_bajo
BSF STATUS,RP0
BCF STATUS,RP1 ;ubicacion bank1
MOVF 0xA0,0 ;contenido de num1h
BTFSS STATUS,C ;c=1?
ADDLW .1 ;no.resta(-) sumo 1 para seguir la resta
BSF STATUS,RP1 ;si.resta(+)
BCF STATUS,RP0 ;ubicacion bank2
SUBWF 0x120,0 ;num2h-num1h resto parte 2 de 16 bits f-w
BCF STATUS,RP0
BCF STATUS,RP1 ;ubicacion bank0 para resultadol
MOVWF 0x23 ;si guardar contenido de w en resultado_alto
BTFSS STATUS,C ;c=1?
GOTO negativo ;no.c=0 resta(-),ir a complementar a 2 para ver su
verdadero valor
positivo
CLRF PCLATH ;si.resultado total (+), limpio pclath
GOTO inicio ;salir
negativo
BCF STATUS,RP0 ;complemento a 1 el resultado y le sumo 1= complem
ento a 2
BCF STATUS,RP1
COMF 0X22,F ;complemento a 1
INCF 0X22,F ;sumo 1
MOVF 0X23,W ;coloco el resultado
BTFSS STATUS,C ;c=1?
ADDLW .1
MOVWF 0X23 ;si.coloco el valor arrojado
CLRF PCLATH ;limpio el pclath y vuelvo al inicio
goto inicio
ORG 0x08FA
suma_indirecta
MOVLW 0XA1 ;dir relativa a colocar en el FSR
BCF STATUS,IRP ;irp=0 indirectamente en el bank0 y 1
MOVWF FSR ;puntero esta ubicado en la dir correspondiente
MOVF INDF,W ;muevo su contenido a w
BCF FSR,7 ;cambio el bit 7 del fsr aprovechando la dir relat
iva de 0xA1
BSF STATUS,IRP ;irp=1 indirectamente en el bank2 y 3
ADDWF INDF,W ;sumo la num2l+num1l
BCF STATUS,IRP ;irp=0 indirectamente en el bank0 y 1
BSF FSR,1 ;
BCF FSR,0 ;ubico la direccion relativa de 0x22 para deposita
r resultadol
MOVWF INDF ;indf contiene el resultado de resultado_bajo

BTFSC STATUS,C ;c=0?
CALL aca ;no. c=1 es decir, llevo 1 hay acarreo
MOVLW 0XA0 ;si c=0
MOVWF FSR ;el fsr esta apuntando a la dir 0xA0, donde esta n
um1h
MOVF INDF,W
BCF FSR,7 ;aprovecho la dir relativa de 0xA0, modifico el bi
t 7 del FSR para ubicarme en la dir 0x120h
BSF STATUS,IRP ;colocando el irp=1 indirectamente estoy en el ban
co2 y 3
ADDWF INDF,W ;sumo los valores de num2h+num1h
BCF STATUS,IRP ;irp=0 indirectamente pase a los bancos 0 y 1
BSF FSR,1 ;aprovecho la direccion relatica que llevaba para
ubicarme en 0x23h
BSF FSR,0
MOVWF INDF ;indf contiene el resultado de resultado_alto
CLRF PCLATH ;limpio el pclath, regreso a inicio
GOTO inicio
aca
MOVLW 0XA0 ;aca sumo el acarreo que llevaba al num1h
MOVWF FSR ;el fsr apunta a la dir.relativa 0xA0
INCF INDF,F ;incrementa el contenido de esta direccion a trave
s del indf
RETURN ;retorna el valor para seguir sumando la parte alt
a
fin
GOTO $ ;finaliza el programa
end

También podría gustarte