programar el PIC 16f877A

hola a todos bueno tengo una duda trato de programar mi pic de serie 16f877A
cotectado a un display que cuente del 0 al 10 en numero decimales despues del 11 al 15 en hexa decimales osea A, B, C, D, E, F y reincie nuevamente pero en la siguiente seire que solo llegue a E y en la siguiene llegue a D y asi susesivamente esta es la siguiente secuencia, que consta de la primera etapa en forma desendente y en la segunda etapa en forma ascendente y que todo sea seguido...

0, 1, 2, 3, ......, D, E, F
0, 1, 2, 3, ......, D, E
0, 1, 2, 3, ......, D
.
.
.
0, 1, 2, 3
0, 1, 2
0, 1
0

segunda etapa

F, E, D, ........, 3, 2, 1, 0
F, E, D, ........, 3, 2, 1
F, E, D, ........, 3, 2
.
.
.
F, E, D
F, E
F

y una ves que termine comiense nuevamente en un circulo vicioso

mi problema esque llega a F al momento de reiniciarse y empesar nuevamente se me cuelga y se queda en F que puedo hacer k esta mal del codigo que hice si tienen alguna idea o hay algo que le falta poarfa aganme saber ai esta la codigo....



Código:
LIST P=16F877A
       RADIX HEX
       INCLUDE <P16F877A.INC>
       __CONFIG 0X3D31
COUNTER1   EQU 20H
COUNTER2   EQU 21H
COUNTER3   EQU 22H
INDICE     EQU 23H
CONTADOR   EQU 24H
           org 0x00
           goto INICIO
           org 0x4
INICIO
           BSF STATUS,RP0
           MOVLW B'10000000'           
           MOVWF TRISB
     BCF STATUS,RP0
INI
           CLRF PORTB           
           CLRF INDICE
                MOVLW 0X0F
                MOVWF CONTADOR                                                
                INCF CONTADOR,F  
           GOTO BUCLE
DCR
           CLRF PORTB           
           CLRF INDICE
           DECF CONTADOR,F
           DECFSZ CONTADOR,F
           GOTO BUCLE
           GOTO INI 
                     
           
                
BUCLE
           MOVF INDICE,W
           CALL CODIGO
           MOVWF PORTB 
           CALL DELAY1S            
           INCF INDICE
           DECFSZ CONTADOR,F           
           GOTO BUCLE
           GOTO DCR
           

CODIGO
           ADDWF PCL,F
           RETLW 0X3F           ;0
           RETLW 0X06           ;1
           RETLW 0X5B           ;2
           RETLW 0X4F           ;3
           RETLW 0X66           ;4
           RETLW 0X6D           ;5
           RETLW 0X7D           ;6
           RETLW 0X07           ;7
           RETLW 0X7F           ;8
           RETLW 0X67           ;9
           RETLW 0X5F           ;10
           RETLW 0X7C           ;11
           RETLW 0X58           ;12
           RETLW 0X5E           ;13
           RETLW 0X79           ;14
           RETLW 0X71           ;15
DELAY1S
           MOVLW D'6'
           MOVWF COUNTER3
           MOVLW D'24'
           MOVWF COUNTER2
           MOVLW D'168'
           MOVWF COUNTER1
LOOP
           DECFSZ COUNTER1,1
           GOTO LOOP
           DECFSZ COUNTER2,1
           GOTO LOOP
           DECFSZ COUNTER3,1
           GOTO LOOP
           RETURN
     END

alguien tiene elguna idea??????
 
Última edición:
Hola:

El problema que veo es que en "DCR" no vuelves a cargar el contador con 0x0F
ya que al usar DECF CONTADOR,F estas haciendo que el contador vaya de 0 a 255, de esa forma al llegar a mostrarte F en el display, el contador tiene un valor de más de 200 y se pone loco.

Además tienes que modificar el código en "BUCLE" ya que cuando toca el bloque de "DCR"
borras el "INDICE" haciendo que los datos los coja desde RETLW 0X3F ;0 nuevamente.
Ahí deberías de cargar el "INDICE" con 0x0F para que coja el valor desde RETLW 0X71 ;15 y decrementar "INDICE" para que vaya cogiendo los datos hasta llegar a cero.
 
Atrás
Arriba