# Contador 0 a 9 en pic16f877



## madcv (Feb 26, 2009)

Hola espero me puedan ayudar necesito hacer un contador del 0 al 9 para un display de 7 segmentos pero mi practica es con un pic16f877 y usando mplab y lenguaje ensamblador es mi primer programa y espero me puedan ayudar hice esto pero me salen muchos errores y creo k me falta algo


```
list p=16f877
#include <p16f877.inc>
cblock 0x20
counter
resta
endc
iniciar 
clrf counter
movlw HIGH decoder
movwf PCLATH
movfw counter
call decoder
movwf PORTB
;call retardo
incf counter
movfw counter
movwf resta
movlw .10
subwf resta
btfss STATUS,Z
decoder addwf PCL,F
retlw b'1111110'
retlw b'0110000'
retlw b'1101101'
retlw b'1111001'
retlw b'0110011'
retlw b'1011011'
retlw b'1011111'
retlw b'1110000'
retlw b'1111111'
retlw b'1111011'
;retardo
END
```

El programa debe de ser con tablas como lo intendo hacer con la tabla "decoder" y pss pense que seria mas facil poner cada bit en el segmento requerido asi :

bo = a
b1 = b
.
.
.
.
.b7 = g

espero me puedan ayudar , gracias


----------



## Romyggar (Feb 27, 2009)

bueno, antes de analizar tu código, podrías nombrar cuales son los errores que detectaste? por el título del foro veo que usas el timer o rutinas de conteo en el programa.

PD: al parecer no esta todo el código, o estoy ciego?


----------



## mabauti (Feb 27, 2009)

cuales son los errores y;o warnings que te marca?

si posteas el codigo completo sera mas sencillo auxiliarte


----------



## Romyggar (Feb 28, 2009)

mabauti dijo:
			
		

> cuales son los errores y;o warnings que te marca?
> 
> si posteas el codigo completo sera mas sencillo auxiliarte


totalmente de acuerdo


----------



## FLUXWORM (Sep 11, 2009)

hola bueno me interesa demasiado conocer hacerca de los retardos lo que pasa es que estoy haciendo un contador de 0 a 255 por medio de los puerto b nada mas lo que mas me intriga es conocer si existe una formula en la que pueda calcular un retardo de 1 segundo con un cristal de 20mhz


----------



## erick1424 (Abr 19, 2010)

tengo un problema con mi programa no me sale la cuenta

              LIST P=P16F877A
              INCLUDE<P16F877A.INC>
CUENTA   EQU 0X20
              ORG 2007
              DW 0X3F7A
              BANKSEL TRISB
 A1:        CLRF TRISB
              CLRW
              MOVWF CUENTA
              BANKSEL PORTB
              CLRF PORTB
A2:          MOVWF PORTB
              CALL DELAY
              XORLW 0X0A
              BTFSC STATUS,Z
              GOTO A1
              INCF CUENTA,F
              MOVFW CUENTA
              GOTO A2
              END


----------



## tecnogirl (Abr 20, 2010)

erick1424: Parece estar bien el codigo. Solo me llama la atencion la direccion de ensamble: ORG 2007, estara bien ?. Prueba ORG 5 a ver si corre. Saludos


----------



## panchillo (Mar 22, 2011)

tengo este programa y mi pic16f877a no da los valores de 0-9 en orden y da algunos datos mal, me pueden ayudar??


    list        p=16f877a   ; list directive to define processor
    #include    <p16f877a.inc>  ; processor specific variable definitions

    __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF
		         ;LIST P=16f877   
PCL		EQU	02H
STATUS	EQU	03H
TRISA	EQU	85H	
PORTA	EQU	05H
TRISD	EQU	88H		
PORTD	EQU	08H
CUENTA	EQU	20H		;Registro para contar
RETARDO	EQU	21H		;Registro para el retardo


#DEFINE BANCO0	BCF	STATUS,5		;BANCO0 sustituye a BCF	STATUS,5 nos vamos al banco 0
#DEFINE BANCO1	BSF	STATUS,5		;BANCO1 sustituye a BSF	STATUS,5 nos vamos al banco 1
		ORG		00					;lugar donde se colocará la siguiente instrucción
		goto	inicio
		ORG		0x05

TABLA	MOVWF	PCL			
DISP	RETLW	40H			
		RETLW	79H			;retlw devuelve el valor de la instruccion al registro w
		RETLW	24H
		RETLW	30H
		RETLW	19H
		RETLW	12H
		RETLW	02H
		RETLW	78H
		RETLW	00H
		RETLW	10H			;9

inicio	BANCO1	;nos vamos a banco1
		MOVLW	B'00000110'
		MOVWF	ADCON1
		BSF		TRISA,0	;configuramos el puerto A como entrada
		CLRF	TRISD	;puerto D como salida
				BANCO0	
		CLRF	CUENTA	;ponemos en cero CUENTA
MUESTRA	MOVLW	DISP	;muestra en el acumulador la direccion de DISP (ox06)
		ADDWF	CUENTA,0
		call	TABLA	
		MOVWF	PORTD	;muestra el cero en el display (40h)
		BTFSS	PORTA,0
		call	SUMA1
		goto 	MUESTRA

SUMA1	INCF	CUENTA,1
		MOVLW 	0AH
		SUBWF	CUENTA,0
		BTFSC	STATUS,2
		call	REBOTE

ESPERA	BTFSS	PORTA,0	
		;goto	ESPERA  
		RETURN		;Fin de suma

REBOTE 	MOVLW	0FFH
		MOVWF	RETARDO
REB0	DECFSZ	RETARDO,1
		GOTO 	REB0
		RETURN		;Fin de rebote

END


----------



## Shawn (Mar 23, 2011)

Aqui hay una practica de contador con displays de 7 segmentos. Tiene una simulacion en Proteus  incluida. Espero que ayude.


----------



## snakewather (Mar 23, 2011)

HOLA 

Miren aqui les dejo un tutorial muy bien hecho de un colega, sobre estos temas les va servir, se los aseguro:

http://r-luis.xbot.es/descarga/files/Disp_Tab.pdf


----------



## tecnogat (Mar 25, 2011)

Uff yo podria ayudar, si el programa esta C jajaja. Ya que no tengo ni la menor idea del lenguaje ASM, si quieren yo les paso este mismo programa en C


----------



## DATAGENIUS (Mar 25, 2011)

TABLA	MOVWF	PCL

ADDWF	CUENTA,0
call	TABLA	
MOVWF	PORTD	;muestra el cero en el display (40h)


 Yo entiendo de ASM y... no te dio error al compilar ya que a PCL no le indicaste el destino del cambio... si el cambio queda en PCL se usa ",1" y si el cambio queda en W se usa ",0", de lo contrario creo que sale un destino indeterminado, por tanto un resultado no esperado.

No veo otra cosa... o debo estar usando lentes muy obscuros


----------

