Contador 0 a 9 en pic16f877

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

Código:
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
 
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?
 
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
 
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
 
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
 
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
 
TABLA MOVWF PCL

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


:unsure: 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 :cool:

:LOL:
 
Atrás
Arriba