Problema con display de 7-SEGMENTOS y PIC16F877

Hola muy buenas, estoy intentando hacer un simple contador descendente, utilizo el PIC16F877 y dos displays de 7 segmentos conectados al PORTB y PORTD.

Tengo una subrutina llamada BIN_7SEG que lo que hace es mediante una tabla devolverme la configuracion de pins de salida para mostrar en el display el valor que hay guardado en W

Si hago eso:

movlw .3
call BIN_7SEG
movwf PORTB

Funciona perfecto y muestra el numero 3 por el display, pero si intento enviarle un valor desde un registro por ejemplo:

movlw .3
movwf TiempoEngrase
movlw Display1
call BIN_7SEG
movwf PORTB

Asi no muestra nada por el display se queda apagado completamente. He cambiado la subrutina que tiene la tabla haciendola con saltos condicionales y me envia que el numero es mas grande que 10

Puede ser que al copiar entre registros se cuele algun bit mas alto o algo asi?

os pongo el codigo para ver si me podeis ayudar.


Principal

clrw
movf TiempoEngrase,W

movwf Display1
movwf Display2

movf Display1,W
call BCD_7SEG
movwf PORTB

movf Display2,W
call BCD_7SEG
movwf PORTD



goto Principal ; Crea un bucle cerrado.


; SUBRUTINAS *************************************************************************

BCD_7SEG ; Tabla para display de 7 segmentos.

movwf IndiceTabla

movlw .10
subwf IndiceTabla,W
btfsc STATUS,C
retlw 0x40


movlw .0
subwf IndiceTabla,W
btfsc STATUS,Z
retlw 0x3F

movlw .1
subwf IndiceTabla,W
btfsc STATUS,Z
retlw 0x06

movlw .2
subwf IndiceTabla,W
btfsc STATUS,Z
retlw 0x5B

movlw .3
subwf IndiceTabla,W
btfsc STATUS,Z
retlw 0x4F

movlw .4
subwf IndiceTabla,W
btfsc STATUS,Z
retlw 0x66

movlw .5
subwf IndiceTabla,W
btfsc STATUS,Z
retlw 0x6D

movlw .6
subwf IndiceTabla,W
btfsc STATUS,Z
retlw 0x7D

movlw .7
subwf IndiceTabla,W
btfsc STATUS,Z
retlw 0x07

movlw .8
subwf IndiceTabla,W
btfsc STATUS,Z
retlw 0x7F

movlw .9
subwf IndiceTabla,W
btfsc STATUS,Z
retlw 0x6F


END ; Fin del programa.




Muchas gracias de antemano!
 
La rutina que dices que mandas llamar se llama BIN_7SEG, y la que pones se llama BCD_7SEG

de todos modos creo que el error podria estar aqui:

movlw .3
movwf TiempoEngrase
movlw Display1
call BIN_7SEG
movwf PORTB

Estas enviando una literal Display1 en vez del dato del registro... me parece que la orden debe ser
movf Display1,w
 
Última edición:
Buenas, gracias por responder, si lo de BIN_7SEG a sido un error al escribir el post, el el codigo fuente esta bien.

Lo que me comentas de cambiar movlw por movf lo he probado, de echo en el codigo fuente que he puesto esta asi, y lo que consigo es que aparezca en el display un 0, pero no el valor que yo le digo...


Alguna otra idea?
 
No veo que inicializes TiempoEngrase,


clrw <---- borra w
movf TiempoEngrase,W <---- carga Tiempo engrase en W

movwf Display1 <- carga TiempoEngrase en Display 1
movwf Display2 <- carga TiempoEngrase en Display 2

movf Display1,W <- Recupera Display1 y convierte
call BCD_7SEG
movwf PORTB

Intenta haciendo esto:

Código:
movlw .5
movwf TiempoEngrase
movf TiempoEngrase,W

movwf Display1
movwf Display2

Si la rutina funciona bien ambos displays deben mostrar 55
 
No veo que inicializes TiempoEngrase,




Intenta haciendo esto:

Código:
movlw .5
movwf TiempoEngrase
movf TiempoEngrase,W

movwf Display1
movwf Display2

Si la rutina funciona bien ambos displays deben mostrar 55


Correcto! ahora si que funciona bien :D muchisimas gracias! Por cierto, cual es el motivo por el que asi si que funciona?

Muchas gracias!
 
Atrás
Arriba