Está en la página 1de 12

LIST p=16f887 ; Assembly source line config statements

#include "p16f887.inc"
FIXDIV MACRO A1,A2
LOCAL MULTDIV
MOVF A2,0
ADDWF A1,1
MOVLW D'9'
MOVWF CONTDIV
MOVF A1,0
MULTDIV
ADDWF A1,1
BTFSC STATUS,0
INCF CONTDIV2,1
DECF CONTDIV,1
BTFSS STATUS,2
GOTO MULTDIV

ENDM

DATO1 EQU 0X21


DATO2 EQU 0X22
RESULTADO EQU 0X23
CARRY EQU 0X24
SUSTRAENDO EQU 0X25
PRUEBA EQU 0X26
PRODUCTO1 EQU 0X27
PRODUCTO2 EQU 0X28
ACUMULADOR EQU 0X29
QHI EQU 0X30
QLO EQU 0X31
DDLO EQU 0X32
DDHI EQU 0X33
ENTERO EQU 0X34
CONTDIV EQU 0X35
DEC1 EQU 0X36
DEC2 EQU 0X37
DEC3 EQU 0X38
DEC4 EQU 0X39
DEC5 EQU 0X40
DEC6 EQU 0X41
CONTDIV2 EQU 0X42
ORG 00H

INICIO

BCF STATUS,RP0
BCF STATUS,RP1
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE; PUERTOS REINICIADOS

BSF STATUS,RP0
BCF STATUS,RP1
MOVLW B'11111111'
MOVWF TRISA
MOVWF TRISB
MOVWF TRISE
CLRF TRISC
CLRF TRISD; PUERTOS CONFIGURADOS

BSF STATUS,RP0
BSF STATUS,RP1
CLRF ANSEL
CLRF ANSELH; DIGITAL
BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
;
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAA
MIPROGRAMA ;MI PROGRAMA

MOVFW PORTA
MOVWF DATO1

MOVFW PORTB
MOVWF DATO2
CLRF ACUMULADOR
CLRF CONTDIV
CLRF CONTDIV2
CLRF DEC6
CLRF DEC5
CLRF DEC4
CLRF DEC3
CLRF DEC2
CLRF DEC1
CLRF ENTERO
GOTO ESCERO
BCF STATUS,2
GOTO OPERACIONES

OPERACIONES
;SELECCION DE OPERACIONES
;SUMA
MOVFW PORTE ;SUMA
XORLW B'00000000'
MOVWF PRUEBA
MOVF PRUEBA,F
BTFSS STATUS,2
GOTO RESTA_TEST
GOTO SUMA

RESTA_TEST
MOVF PORTE,0 ;RESTA
XORLW B'00000001'
MOVWF PRUEBA
MOVF PRUEBA,F
BTFSS STATUS,2
GOTO MULT_TEST
GOTO RESTA

MULT_TEST
MOVF PORTE,0 ;MULTIPLICACION
XORLW B'00000010'
MOVWF PRUEBA
MOVF PRUEBA,F
BTFSS STATUS,2
GOTO DIV_TEST
GOTO PRUEBA_CERO

DIV_TEST
MOVF PORTE,0 ;DIVISION
XORLW B'00000011'
MOVWF PRUEBA
MOVF PRUEBA,F
BTFSS STATUS,2
GOTO PORCENTAJE_TEST
GOTO ESCERO

PORCENTAJE_TEST
MOVF PORTE,0 ;DIVISION
XORLW B'00000100'
MOVWF PRUEBA
MOVF PRUEBA,F
BTFSS STATUS,2
GOTO EXPONENTE_TEST
GOTO PORCENTAJE

EXPONENTE_TEST
MOVF PORTE,0 ;DIVISION
XORLW B'00000101'
MOVWF PRUEBA
MOVF PRUEBA,F
BTFSS STATUS,2
GOTO RAIZ_TEST
GOTO EXPONENTE

RAIZ_TEST
MOVF PORTE,0 ;DIVISION
XORLW B'00000110'
MOVWF PRUEBA
MOVF PRUEBA,F
BTFSS STATUS,2
GOTO INICIO
GOTO RAIZ

PRUEBA_CERO
MOVFW DATO1
XORLW 00H ; checkear si hay un cero en en puerto para multiplicacion
BTFSS STATUS,2
GOTO MULT
GOTO CERO
;
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA
SUMA
MOVF DATO1,W
ADDWF DATO2,W
MOVWF RESULTADO
MOVF RESULTADO,F
BTFSS STATUS,C
GOTO MUESTRA_SUMA
GOTO CARRY_SUMA
CARRY_SUMA
MOVLW D'1'
MOVWF PORTD
MOVF RESULTADO,W
MOVWF PORTC
GOTO MIPROGRAMA

MUESTRA_SUMA
CLRF PORTD
MOVF RESULTADO,W
MOVWF PORTC
GOTO MIPROGRAMA

GOTO MIPROGRAMA
RESTA
MOVFW PORTA
SUBWF DATO2,W
MOVWF RESULTADO
BTFSS STATUS,0
GOTO AJUSTE_RESTA
MOVWF PORTC ; LA RESTA DIO POSITIVA
GOTO MIPROGRAMA

AJUSTE_RESTA
COMF RESULTADO,W;COMPLEMENTO A UNO
ADDLW B'00000001' ; SUMO 1 PARA COMPLEMENTO A DOS
MOVWF PORTC
GOTO MIPROGRAMA

MULT
MOVF PORTA,W
MOVWF DATO1
MOVF PORTB,W
MOVWF DATO2
CLRW
CLRF PRODUCTO1
CLRF PRODUCTO2
GOTO BUCLE

BUCLE
MOVFW DATO2
ADDWF PRODUCTO2,F
BTFSC STATUS,0
INCF PRODUCTO1,F

DECFSZ DATO1
GOTO BUCLE
MOVFW PRODUCTO2
MOVWF PORTC
MOVFW PRODUCTO1
MOVWF PORTD
GOTO MIPROGRAMA

ESCERO
MOVF DATO1,0
XORLW D'0'
BTFSS STATUS,2
GOTO DIV
MOVF DATO2,0
XORLW D'0'
BTFSS STATUS,2
GOTO DIV
MOVLW D'0'
MOVWF PORTC
MOVWF PORTD
GOTO MIPROGRAMA

DIV
MOVF DATO2,0
SUBWF DATO1,1
BTFSS STATUS,0
GOTO FIX1
INCF ENTERO,1
MOVF DATO1,1
BTFSS STATUS,2
GOTO DIV
GOTO IMPRIMIR

FIX1

FIXDIV DATO1,DATO2
MOVF CONTDIV2,0
XORLW B'00000000'
BTFSS STATUS,2
GOTO DIVCARRY1
MOVF DATO2,0
GOTO DIV1

DIV1
SUBWF DATO1,1
BTFSS STATUS,0
GOTO FIX2
INCF DEC1,1
MOVF DATO1,1
BTFSS STATUS,2
GOTO DIV1
GOTO IMPRIMIR

DIVCARRY1
MOVF DATO2,0
SUBWF DATO1,1
BTFSS STATUS,0
DECF CONTDIV2,1
INCF DEC1,1
MOVF CONTDIV2,1
BTFSS STATUS,2
GOTO DIVCARRY1

DIVFINAL1
SUBWF DATO1,1
BTFSS STATUS,0
GOTO FIX2
INCF DEC1
GOTO DIVFINAL1

FIX2
FIXDIV DATO1,DATO2
MOVF CONTDIV2,0
XORLW b'00000000'
BTFSS STATUS,2
GOTO DIVCARRY2
MOVF DATO2,0
GOTO DIV2

DIV2
SUBWF DATO1,1
BTFSS STATUS,0
GOTO FIX3
INCF DEC2,1
MOVF DATO1,1
BTFSS STATUS,2
GOTO DIV2
GOTO IMPRIMIR

DIVCARRY2
MOVF DATO2,0
SUBWF DATO1,1
BTFSS STATUS,0
DECF CONTDIV2,1
INCF DEC2,1
MOVF CONTDIV2,1
BTFSS STATUS,2
GOTO DIVCARRY2

DIVFINAL2

SUBWF DATO1,1
BTFSS STATUS,0
GOTO FIX3
INCF DEC2
GOTO DIVFINAL2

FIX3
FIXDIV DATO1,DATO2
MOVF CONTDIV2,0
XORLW b'00000000'
BTFSS STATUS,2
GOTO DIVCARRY3
MOVF DATO2,0
GOTO DIV3
DIV3
SUBWF DATO1,1
BTFSS STATUS,0
GOTO FIX4
INCF DEC3,1
MOVF DATO1,1
BTFSS STATUS,2
GOTO DIV3
GOTO IMPRIMIR

DIVCARRY3
MOVF DATO2,0
SUBWF DATO1,1
BTFSS STATUS,0
DECF CONTDIV2,1
INCF DEC3,1
MOVF CONTDIV2,1
BTFSS STATUS,2
GOTO DIVCARRY3

DIVFINAL3
SUBWF DATO1,1
BTFSS STATUS,0
GOTO FIX4
INCF DEC3
GOTO DIVFINAL3

FIX4

FIXDIV DATO1,DATO2
MOVF CONTDIV2,0
XORLW b'00000000'
BTFSS STATUS,2
GOTO DIVCARRY4
MOVF DATO2,0
GOTO DIV4

DIV4
SUBWF DATO1,1
BTFSS STATUS,0
GOTO FIX5
INCF DEC4,1
MOVF DATO1,1
BTFSS STATUS,2
GOTO DIV4
GOTO IMPRIMIR

DIVCARRY4
MOVF DATO2,0
SUBWF DATO1,1
BTFSS STATUS,0
DECF CONTDIV2,1
INCF DEC4,1
MOVF CONTDIV2,1
BTFSS STATUS,2
GOTO DIVCARRY4

DIVFINAL4
SUBWF DATO1,1
BTFSS STATUS,0
GOTO FIX5
INCF DEC4
GOTO DIVFINAL4

FIX5
FIXDIV DATO1,DATO2
MOVF CONTDIV2,0
XORLW b'00000000'
BTFSS STATUS,2
GOTO DIVCARRY5
MOVF DATO2,0
GOTO DIV5

DIV5
SUBWF DATO1,1
BTFSS STATUS,0
GOTO FIX6
INCF DEC5,1
MOVF DATO1,1
BTFSS STATUS,2
GOTO DIV5
GOTO IMPRIMIR

DIVCARRY5
MOVF DATO2,0
SUBWF DATO1,1
BTFSS STATUS,0
DECF CONTDIV2,1
INCF DEC5,1
MOVF CONTDIV2,1
BTFSS STATUS,2
GOTO DIVCARRY5
DIVFINAL5
SUBWF DATO1,1
BTFSS STATUS,0
GOTO FIX6
INCF DEC5
GOTO DIVFINAL5

FIX6
FIXDIV DATO1,DATO2
MOVF CONTDIV2,0
XORLW b'00000000'
BTFSS STATUS,2
GOTO DIVCARRY6
MOVF DATO2,0
GOTO DIV6

DIV6
SUBWF DATO1,1
BTFSS STATUS,0
GOTO IMPRIMIR
INCF DEC6,1
MOVF DATO1,1
BTFSS STATUS,2
GOTO DIV6
GOTO IMPRIMIR

DIVCARRY6
MOVF DATO2,0
SUBWF DATO1,1
BTFSS STATUS,0
DECF CONTDIV2,1
INCF DEC6,1
MOVF CONTDIV2,1
BTFSS STATUS,2
GOTO DIVCARRY6
DIVFINAL6

SUBWF DATO1,1
BTFSS STATUS,0
GOTO IMPRIMIR
INCF DEC6
GOTO DIVFINAL6

IMPRIMIR
SWAPF DEC1,0
ADDWF DEC2,1
MOVF DEC2,0
MOVWF PORTC
MOVF ENTERO,0
MOVWF PORTD
GOTO MIPROGRAMA

PORCENTAJE

MOVF PORTA,W
MOVWF DATO1
MOVF PORTB,W
MOVWF DATO2
CLRW
CLRF PRODUCTO1
CLRF PRODUCTO2
GOTO LOOP

LOOP
MOVFW DATO2
ADDWF PRODUCTO2,F
BTFSC STATUS,0
INCF PRODUCTO1,F

DECFSZ DATO1
GOTO LOOP
MOVFW PRODUCTO2
MOVWF DDLO
MOVFW PRODUCTO1
MOVWF DDHI
;Subroutine to divide by 10 by repeated subtraction of 10.
;Argument: 16-bit dividend in DDHI,DDLO.
;Returns: 16-bit quotient in QHI,QLO, remainder in DDLO.

METHOD2 CLRW
CLRF QHI ; Clear quotient registers
CLRF QLO ;
MOVLW 64 ; W = divisor
STEP SUBWF DDLO,F ; Subtract 10 from dividend LSB
BTFSC STATUS,C ; Carry?
GOTO BUMP ; No. Jump
MOVF DDHI,F ; Yes. Is dividend MSB 0?
BTFSC STATUS,Z ;
GOTO SALIDA ; Yes. Done
DECF DDHI,F ; No. Decrement dividend MSB
BUMP INCF QLO,F ; Bump quotient LSB
BTFSC STATUS,Z ; Is it 0?
INCF QHI,F ; Yes. Increment quotient MSB
GOTO STEP
SALIDA
MOVFW QHI
MOVWF PORTD
MOVFW QLO
MOVWF PORTC

GOTO MIPROGRAMA

EXPONENTE
MOVF PORTA,0
XORLW D'0'
BTFSC STATUS,2
GOTO BASE0
MOVF PORTB,0
XORLW D'0'
BTFSC STATUS,2
GOTO ELEVADOACERO
MOVLW D'1'
MOVWF DEC1
POTENCIA1
MOVF ENTERO,0
ADDWF CARRY,1
BTFSC STATUS,0
GOTO OVERFLOW
MOVF DEC1,0
DECF DATO1,1
ADDWF RESULTADO,1
BTFSC STATUS,0
INCF CARRY,1
MOVF DATO1,1
BTFSS STATUS,2
GOTO POTENCIA1
DECF DATO2,1
BTFSS STATUS,2
GOTO FIXPOTENCIA
MOVF RESULTADO,0
MOVWF PORTC
MOVF CARRY,0
MOVWF PORTD
GOTO MIPROGRAMA

FIXPOTENCIA
MOVF PORTA,0
MOVWF DATO1
MOVF CARRY,0
MOVWF ENTERO
CLRF CARRY
MOVF RESULTADO,0
MOVWF DEC1
CLRF RESULTADO
GOTO POTENCIA1

ELEVADOACERO
MOVLW D'1'
MOVWF PORTC
GOTO MIPROGRAMA

BASE0
MOVLW D'0'
MOVWF PORTC
MOVWF PORTD
GOTO MIPROGRAMA

OVERFLOW
MOVLW D'255'
MOVWF PORTC
MOVWF PORTD
CALL DELAY
CLRF PORTC
CLRF PORTD
GOTO MIPROGRAMA

DELAY
MOVLW D'8'
MOVWF TMR0
BCF INTCON,T0IF
DELAY_BUCLE
BTFSS INTCON,T0IF
GOTO DELAY_BUCLE
RETURN

RAIZ
MOVLW 0XFC
MOVWF PORTC
MOVWF PORTD
GOTO MIPROGRAMA

CERO
CLRF PORTC
CLRF PORTD
GOTO MIPROGRAMA

VAINARANDOM
MOVWF DATO2
INCF DATO2,F
MOVFW DATO1
ADDWF DATO2,W
MOVWF PORTD
GOTO MIPROGRAMA
END

También podría gustarte