Saludos, me han dejado un proyecto para estas vacaciones pero estoy en la recta final, y tuve un problema al manejar dos tablas de datos, el proyecto consiste en realizar un contador ascendente y descendente, realice dos tablas, en una le sumo el valor del registro W al PCL y en otra se lo resto, pero al hacer el call para mi tabla descendente después de ir a la localidad de PCL me direcciona después a la localidad de la otra tabla lo que hace que ambos casos el contador sea descendente, no se como resolverlo, no llevo mucho metido en el lenguaje ensamblador y el empleo de tablas es obligatorio, el contador ascendente anda de maravilla. El contador (CT) en ambos casos hace su función el problema es al llamar la tabla, no se si pueda usar saltos de bits en la tabla para condicionar la operación de W con PCL, les dejo mi código: donde aparecen los
es donde tengo duda y los números representan el como se ve en el simulador de mpllab ide paso a paso
Utilizando un display de 7 segmentos, diseñar e implementar un contador ascendente,
;cuando el switch 1 este activo.
;Rediseñar el contador con la característica que ahora,
;cuando el switch 1 este inactivo el contador realice la cuenta en modo descendente.
;**********Configuracion del PIC**********
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON ;Configuracion para grabar el PIC
LIST P=16F84A ;PIC que se empleará
INCLUDE <P16F84A.INC> ;Definición de operandos/registros a incluir
;**********Definición de variables**********
CBLOCK 0x0C ; Inicia bloque de constantes en la memoria RAM apartir de la posicion 0x0C
CT ; Declaracion de variable CT (contador de programa incrementa o decrementa)
AUX ; Declaracion de variable AUX para igualar numeros.
CONT1
CONT2
CONT3
ENDC ; Termina el bloque de constantes
;**********Código deprograma**********
ORG 0
INICIO
bsf STATUS, RP0 ; Acceso a Banco 1
clrf PORTB ; TRISB se configuro como salida
movlw b'00011111' ; Guarda b'00011111' en W
movwf PORTA ; TRISA se configura como entrada
bcf STATUS, RP0 ; Acceso a Banco 0
clrf CT ; Iguala CT a 0
clrf AUX ; Iguala AUX a 0
Programa
TEST
movlw b'00001' ;
andwf PORTA, F ;
ESTADO
btfsc PORTA,0 ;
goto up
;**********Conteo en decremento**********
down
clrf PORTB
movlw d'16'
movwf CT
1 call decre
4 movwf PORTB
call Retardo_1s
decremento
decf CT, f
movf AUX, w ;
subwf CT, f
btfsc STATUS, Z
goto down
movf CT, w
call decre
movwf PORTB
call Retardo_1s
goto decremento
;**********Conteo en incremento**********
up
clrf PORTB
clrf CT
movf CT, w
call incre
movwf PORTB
call Retardo_1s
incremento
incf CT, f ;
movlw d'16' ;
subwf CT, w ;
btfsc STATUS, C ;
goto up
movf CT, w
call incre
movwf PORTB
call Retardo_1s
goto incremento
;Tabla de incremento
incre addwf PCL,F
retlw b'00111111'; 0
3 retlw b'00000110'; 1
retlw b'01011011'; 2
retlw b'01001111'; 3
retlw b'01100110'; 4
retlw b'01101101'; 5
retlw b'01111101'; 6
retlw b'00000111'; 7
retlw b'01111111'; 8
retlw b'01101111'; 9
retlw b'01110111'; A
retlw b'01111100'; B
retlw b'00111001'; C
retlw b'01011110'; D
retlw b'01111001'; E
retlw b'01110001'; F
;Tabla de decremento
decre subwf PCL,F
retlw b'00111111'; 0
retlw b'00000110'; 1
retlw b'01011011'; 2
retlw b'01001111'; 3
retlw b'01100110'; 4
retlw b'01101101'; 5
retlw b'01111101'; 6
retlw b'00000111'; 7
retlw b'01111111'; 8
retlw b'01101111'; 9
retlw b'01110111'; A
retlw b'01111100'; B
retlw b'00111001'; C
retlw b'01011110'; D
retlw b'01111001'; E
2 retlw b'01110001'; F
;;**********Retardo**********
Retardo_1s MOVLW 0X21
MOVWF CONT3
RETA2 MOVLW 0X64
MOVWF CONT2
RETA1 MOVLW 0X64
MOVWF CONT1
RETA0 DECFSZ CONT1,1
GOTO RETA0
DECFSZ CONT2,1
GOTO RETA1
DECFSZ CONT3,1
GOTO RETA2
RETURN
END