Contador sin multiplexar de 4 cifras.
Desarrolle un contador de 4 cifras multiplexado basado en un codigo asm para 16f84 de internet y me funciono a la perfeccion, y ahora me lo piden que no este multiplexado, entonces para eso estoy utilizando un 16f877 que nunca habia utilizado antes, los puertos b,c,d los conecto directamente a los digitos y cada pin de los puertos anteriores practicamente controla uno de los 7 segmentos en cada digito, el puerto (a) lo conecto al digito a travez de un decodificador BCD 74LS47 para compensar los pines que le hacen falta al puerto para trabajar directamente el digito, el asm lo modifique quizas hay esta el problem o en el conexionado del pic ummm no se.... bueno.....lo que hago es o lo que trato de hacer es, por medio de la entrada E0 del puerto E incrementar la cuenta no es nada mas, y esto ocurre, cuando enciende,osea que a veces no enciende, cuenta exactamente hasta 100 y se detiene, y despues de un rato se apaga, quizas sea algun detalle en la conexion o en el asambler el codigo asm que utilice es este:
agradezco cualquier ayuda que me deseen prestar.
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _RC_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF
;***** VARIABLE DEFINITIONS
;Contador de 4 digitos.
indo equ 00h ;registro de indireccion
pc equ 02h ;contador de programa
status equ 03h ;registro de estado
fsr equ 04h ;registro de seleccion
ptoa equ 05h ;puerto a
ptob equ 06h ;puerto b
ptoc equ 07h
ptod equ 08h
ptoe equ 09h
trisa equ 85h ;configuracion puerto a
trisb equ 86h ;configuracion puerto b
trisc equ 87h ;configuracion puerto c
trisd equ 88h ;configuracion puerto d
trise equ 89h ;configuracion puerto e
dig1 equ 22h ;acumulador miles
dig2 equ 23h ;acumulador centenas
dig3 equ 24h ;acumulador decenas
dig4 equ 25h ;acumulador unidades
limit equ 28h
z equ 02h ;flag de cero
c equ 00h ;flag de acarreo
w equ 00h ;bit de destino a variable de trabajo
;**********************************************************************
ORG 0x000 ; processor reset vector
clrf PCLATH ; ensure page bits are cleared
goto main ; go to beginning of program
retar movlw 0b1h
movwf limit
bucle nop
nop
nop
decfsz limit
goto bucle
retlw 0
s1000 ;rutina de incremento x 1000
clrf dig2 ;pone a cero las centenas
incf dig1 ;incrementa el contador de miles
movf dig1, w ;carga en work el conteo de los miles
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
clrf dig1 ;inicializa los miles
return
s100 ;rutina de incremento x 100
clrf dig3 ;pone a cero las decenas
incf dig2 ;incrementa el contador de centenas
movf dig2, w ;carga en work el conteo de las centenas
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call s1000 ;incrementa los miles
return
s10 ;rutina de incremento x 10
clrf dig4 ;pone a cero las unidades
incf dig3 ;incrementa el contador de decenas
movf dig3, w ;carga en work el conteo de las decenas
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call s100
return
subir ;rutina de incremento
incf dig4 ;incrementa el contador de unidades
movf dig4, w ;carga en work el conteo de las unidades
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call s10 ;incrementa las decenas
return
tabla ;genera los numeros sobre el display
addwf pc ;agrega al cont. programa el valor de work
retlw b"11000000" ;genera el 0
retlw b"11100111" ;genera el 1
retlw b"10001001" ;genera el 2
retlw b"10000011" ;genera el 3
retlw b"10100110" ;genera el 4
retlw b"10010010" ;genera el 5
retlw b"10010000" ;genera el 6
retlw b"11000111" ;genera el 7
retlw b"10000000" ;genera el 8
retlw b"10000010" ;genera el 9
main
; remaining code goes here
inicio ;programa principal
bcf status, 06h ;selecciona el banco 1 donde
bsf status, 05h ;estan las instr trisx
movlw b"0" ;configura el puerto a
movwf trisa ;como salidas.
movlw b"0" ;configura el puerto b
movwf trisb ;como salidas
movlw b"0" ;configura el puerto c
movwf trisc ;como salidas.
movlw b"0" ;configura el puerto d
movwf trisd ;como salidas
movlw b"111" ;configura el puerto e
movwf trise ;como input
bcf status, 06h ;
bcf status, 05h
clrf dig4
clrf dig3
clrf dig2
clrf dig1
empe btfss ptoe, 0 ;chequea el pulsador
call retar
btfss ptob, 0
call retar
btfss ptob, 0
call subir ;llama la rutina de incremento
disp movf dig4, w
call tabla
movwf ptoc
movf dig3, w
call tabla
movwf ptod
movf dig2, w
call tabla
movwf ptob
movf dig1, w
movwf ptoa
call retar
goto empe ;digito a mostrar
END ; directive "end of program"