Hola KILLERJC como estas? Muchas gracias por su ayuda.
Ahora te consulto por otro problema que estoy intentando resolver...
En mi programa quiero hacer lo siguiente: Hacer una resta de digito a digito (son 3 digitos en 3 displays), pero tengo un problema al querer hacer una resta negativa con 3 cifras (por ejemplo 114-132 = se me rompe el programa.) lo que si pude hacer es la resta negativa con 2 cifras o 1 cifra.
Lo que hice fue lo siguiente: Primero incremento los numeros de 3 digitos, por ejemplo si quiero poner 114. voy guardando en las variables DIGITO1A = 1, DIGITO2A = 1, DIGITO3A = 4. Luego con un boton, reseteo los numeros e incremento denuevo, en este caso quiero poner 132, que voy guardando en otras variables que seria DIGITO1B=1, DIGITO2B=3, DIGITO3B=2 y con esas variables, hacer una resta presionando un boton restar.
hago lo siguiente en el digito 4 de display para que me muestre el signo menos ( - ) del negativo.
MOVLW b'10000001'
MOVWF D4
Aqui esta el codigo de las restas que es lo mas importante:
RESTA_1
MOVF D1,W
MOVWF DIGITO1B
MOVF D2,W
MOVWF DIGITO2B
MOVF D3,W
MOVWF DIGITO3B
MOVF DIGITO1B,W ;file pasa a w.
SUBWF DIGITO1A,W ;f-w. Se guarda en w.
BTFSS STATUS,C ;si es positivo salta
GOTO RESTAR_NEG
MOVWF D1
MOVF DIGITO2B,W ;file pasa a w.
SUBWF DIGITO2A,W ;f-w. Se guarda en w.
BTFSS STATUS,C ;si es positivo salta
GOTO RESTAR_NEG
MOVWF D2
GOTO FIN
RESTAR_NEG
MOVF DIGITO2B,W ;file pasa a w.
SUBWF DIGITO2A,W ;f-w. Se guarda en w.
BTFSC STATUS,Z ;SI ES 0 NO SALTA
GOTO NEGATIVOASEGURADO
BTFSS STATUS,C ;SI ES POSITIVO SALTA. SI NO SALTA NOS ASEGURAMOS QUE EL NUM ES NEGATIVO(SOLO DOS CIFRAS)
GOTO NEGATIVOASEGURADO
MOVLW .10
ADDWF DIGITO1A,F ;se guarda en file=1. en w=0.
MOVF DIGITO1B,W
SUBWF DIGITO1A,W ;f-w
MOVWF D1
MOVLW .1
SUBWF DIGITO2A
MOVF DIGITO2B,W ;file pasa a w.
SUBWF DIGITO2A,W ;f-w. Se guarda en w.
MOVWF D2
GOTO FIN
NEGATIVOASEGURADO
MOVF DIGITO1A,W ;file pasa a w.
SUBWF DIGITO1B,W ;f-w. Se guarda en w.
BTFSS STATUS,C ;si es positivo salta
GOTO RESTAR_NEGNEG
MOVWF D1
MOVF DIGITO2A,W ;file pasa a w.
SUBWF DIGITO2B,W ;f-w. Se guarda en w.
MOVWF D2
MOVLW b'10000001'
MOVWF D4
; GOTO $
GOTO FIN
RESTAR_NEGNEG
MOVLW .10
ADDWF DIGITO1B,F ;se guarda en file=1. en w=0.
MOVF DIGITO1A,W
SUBWF DIGITO1B,W ;f-w
MOVWF D1
MOVLW .1
SUBWF DIGITO2B
MOVF DIGITO2A,W ;file pasa a w.
SUBWF DIGITO2B,W ;f-w. Se guarda en w.
MOVWF D2
MOVLW b'10000001'
MOVWF D4
GOTO $
FIN
RETURN
por las dudas dejo el codigo completo:
#INCLUDE<P16F628A.INC>
__CONFIG 3F10
;DECLARACION DE ESPACIOS DE MEMORIA A USAR
CBLOCK 0X20
D1
D2
D3
D4
AUX_W
AUX_STATUS
CONT_AR
CONT_AR_2
DIGITO1A
DIGITO2A
DIGITO3A
DIGITO1B
DIGITO2B
DIGITO3B
AUX
ENDC
;DECLARACION DE CONSTATNES
#DEFINE BTN_G1 PORTA,6
#DEFINE BTN_G2 PORTA,7
#DEFINE BTN_R PORTA,4
#DEFINE BTN_M PORTB,0
#DEFINE PIN_D4 3 ;D1 POR D4
#DEFINE PIN_D3 2 ;D2 POR D3
#DEFINE PIN_D1 1 ;D3 POR D1
#DEFINE PIN_D2 0 ;D4 POR D2
#DEFINE CTRL_DISPLAY PORTA
#DEFINE APAGAR_DISPLAYS CLRF PORTA
;DECLARACION DE MACROS
MOSTRAR MACRO DIGITO,PIN
APAGAR_DISPLAYS
MOVF DIGITO,W
CALL TAB_DISPLAY
MOVWF PORTB
BSF CTRL_DISPLAY,PIN
ENDM
;INICIO DEL PROGRAMA
ORG 0X00
GOTO CONFI
ORG 0X04
;RUTINA DE INTERRUPCION
;DESBORDA EL TIMER CADA 15ms
;MUESTRA TODOS LOS DIGITOS DE ACUERDO A LAS VARIABLES D1:4
;GUARDA STATUS Y W EN VARIABLES AUXILIARES
BCF INTCON,T0IF
BCF INTCON,GIE
MOVWF AUX_W
MOVLW STATUS
MOVWF AUX_STATUS
;MULTIPLEXADO DE DISPLAYS
BTFSC CTRL_DISPLAY,PIN_D1
GOTO MOSTRAR_D2
BTFSC CTRL_DISPLAY,PIN_D2
GOTO MOSTRAR_D3
BTFSC CTRL_DISPLAY,PIN_D3
GOTO MOSTRAR_D4
MOSTRAR_D1
MOSTRAR D1,PIN_D1
GOTO FIN_T0I
MOSTRAR_D2
MOSTRAR D2,PIN_D2
GOTO FIN_T0I
MOSTRAR_D3
MOSTRAR D3,PIN_D3
GOTO FIN_T0I
MOSTRAR_D4
MOSTRAR D4,PIN_D4
FIN_T0I
;REINICIA TIMER Y RECUPERA STATUS Y W
MOVLW .198
MOVWF TMR0
MOVF AUX_STATUS,W
MOVWF STATUS
MOVF AUX_W,W
RETFIE
;CONFIGURACION
CONFI
MOVLW 0X07
MOVWF CMCON ;CMCON SE TIENE QUE ESTABLECER EN 7 PARA USAR TODO EL PORTA
MOVLW .198
MOVWF TMR0
BSF STATUS,RP0
MOVLW b'00000001'
MOVWF TRISB
MOVLW b'11110000'
MOVWF TRISA
BCF OPTION_REG,T0CS
BCF OPTION_REG,PSA
BSF OPTION_REG,PS0
BSF OPTION_REG,PS1
BSF OPTION_REG,PS2
BSF INTCON,GIE
BSF INTCON,T0IE
BCF STATUS,RP0
;RUTINA PRINCIPAL
;INCREMENTA DE 0 A (F) CADA DIGITO DEPENDIENDO QUE BOTON SE TOCA.
CLRF PORTA
CLRF PORTB
CLRF D1
CLRF D2
CLRF D3
CLRF D4
BOTONES
BTFSC BTN_G1
CALL DEMORA_AR
BTFSC BTN_G1
CALL SUMAR
BTFSC BTN_G2
CALL DEMORA_AR
BTFSC BTN_G2
CALL RESTAR
BTFSC BTN_R
CALL DEMORA_AR
BTFSC BTN_R
CALL LIMPIAR
BTFSC BTN_M
CALL DEMORA_AR
BTFSC BTN_M
CALL LIMPIAR
GOTO BOTONES
BOTONES2
BTFSC BTN_G1
CALL DEMORA_AR
BTFSC BTN_G1
CALL SUMAR4
BTFSC BTN_G2
CALL DEMORA_AR
BTFSC BTN_G2 ;SI ESTA APRETADO NO SALTA
CALL RESTAR
BTFSC BTN_M
CALL DEMORA_AR
BTFSC BTN_M ;SI ESTA APRETADO no SALTA
CALL RESTA_1
BTFSC BTN_R
CALL DEMORA_AR
BTFSC BTN_R
CALL LIMPIAR
GOTO BOTONES2
;Demora
DEMORA_AR
MOVLW .255
MOVWF CONT_AR
LOOP_AR
MOVLW .255
MOVWF CONT_AR_2
LOOP_AR_2
DECFSZ CONT_AR_2,1
GOTO LOOP_AR_2
DECFSZ CONT_AR,1
GOTO LOOP_AR
RETURN
SUMAR
INCF D1,1
MOVF D1,W
XORLW .10
BTFSS STATUS,Z ;IF LLEGA A 16 SALTA
GOTO VOLVER
CALL SUMAR2
VOLVER
RETURN
SUMAR2
INCF D2,1
MOVF D2,W
CLRF D1
XORLW .10
BTFSS STATUS,Z ;IF LLEGA A 16 SALTA
GOTO VOLVER2
CALL SUMAR3
VOLVER2
RETURN
SUMAR3
INCF D3,1
MOVF D3,W
CLRF D2
RETURN
SUMAR4
INCF D1,1
MOVF D1,W
XORLW .10
BTFSS STATUS,Z ;IF LLEGA A 16 SALTA
GOTO VOLVER4
CALL SUMAR5
VOLVER4
RETURN
SUMAR5
INCF D2,1
MOVF D2,W
CLRF D1
XORLW .10
BTFSS STATUS,Z ;IF LLEGA A 16 SALTA
GOTO VOLVER5
CALL SUMAR6
VOLVER5
RETURN
SUMAR6
INCF D3,1
MOVF D3,W
CLRF D2
RETURN
RESTAR
DECF D1, F
MOVF D1,W
XORLW .255
BTFSS STATUS,Z ;SI LLEGA A 0 SALTA
RETURN
RESTAR2
MOVLW .9 ;RECARGO CON 9
MOVWF D1
DECF D2, F
MOVF D2, W
XORLW .255
BTFSS STATUS,Z ;SI LLEGA A 0 SALTA
RETURN
RESTAR3
MOVLW .9 ;RECARGO CON 9
MOVWF D2
DECF D3, F
MOVF D3, W
XORLW .255
BTFSS STATUS,Z ;SI LLEGA A 0 SALTA
RETURN
MOVLW .9
MOVWF D3
RETURN
LIMPIAR
MOVF D1,W
MOVWF DIGITO1A
MOVF D2,W
MOVWF DIGITO2A
MOVF D3,W
MOVWF DIGITO3A
CLRF D1
CLRF D2
CLRF D3
GOTO BOTONES2
RETURN
;la resta funciona medio limitada.
;resta entre numeros de una cifra -> funciona.
;resta de doscifras-unacifra -> funciona.
;resta de unacifra-doscifras -> segun el caso. Ejemplo: 7-18 si. 7-16 no.
;resta de tres cifras -> ni intente jej.
RESTA_1
MOVF D1,W
MOVWF DIGITO1B
MOVF D2,W
MOVWF DIGITO2B
MOVF D3,W
MOVWF DIGITO3B
MOVF DIGITO1B,W ;file pasa a w.
SUBWF DIGITO1A,W ;f-w. Se guarda en w.
BTFSS STATUS,C ;si es positivo salta
GOTO RESTAR_NEG
MOVWF D1
MOVF DIGITO2B,W ;file pasa a w.
SUBWF DIGITO2A,W ;f-w. Se guarda en w.
BTFSS STATUS,C ;si es positivo salta
GOTO RESTAR_NEG
MOVWF D2
GOTO FIN
RESTAR_NEG
MOVF DIGITO2B,W ;file pasa a w.
SUBWF DIGITO2A,W ;f-w. Se guarda en w.
BTFSC STATUS,Z ;SI ES 0 NO SALTA
GOTO NEGATIVOASEGURADO
BTFSS STATUS,C ;SI ES POSITIVO SALTA. SI NO SALTA NOS ASEGURAMOS QUE EL NUM ES NEGATIVO(SOLO DOS CIFRAS)
GOTO NEGATIVOASEGURADO
MOVLW .10
ADDWF DIGITO1A,F ;se guarda en file=1. en w=0.
MOVF DIGITO1B,W
SUBWF DIGITO1A,W ;f-w
MOVWF D1
MOVLW .1
SUBWF DIGITO2A
MOVF DIGITO2B,W ;file pasa a w.
SUBWF DIGITO2A,W ;f-w. Se guarda en w.
MOVWF D2
GOTO FIN
NEGATIVOASEGURADO
MOVF DIGITO1A,W ;file pasa a w.
SUBWF DIGITO1B,W ;f-w. Se guarda en w.
BTFSS STATUS,C ;si es positivo salta
GOTO RESTAR_NEGNEG
MOVWF D1
MOVF DIGITO2A,W ;file pasa a w.
SUBWF DIGITO2B,W ;f-w. Se guarda en w.
MOVWF D2
MOVLW b'10000001'
MOVWF D4
; GOTO $
GOTO FIN
RESTAR_NEGNEG
MOVLW .10
ADDWF DIGITO1B,F ;se guarda en file=1. en w=0.
MOVF DIGITO1A,W
SUBWF DIGITO1B,W ;f-w
MOVWF D1
MOVLW .1
SUBWF DIGITO2B
MOVF DIGITO2A,W ;file pasa a w.
SUBWF DIGITO2B,W ;f-w. Se guarda en w.
MOVWF D2
MOVLW b'10000001'
MOVWF D4
GOTO $
FIN
RETURN