esto deberia funcionar:
;definicion de directivas para microcontrolador
__CONFIG _CP_ON & _WDT_OFF & _PWRTE_ON & _XT_OSC
list p=16f84a
#include<p16f84a.inc>
cblock 0x0c
;definicion de constantes para retardo del boton
d1
d2
endc
;se configura el microcontrolador
org 0x00
bsf STATUS,RP0 ;cambiamos a BANCO1
clrf TRISB ;establece PORTB como salida
movlw b'11111111' ;establece PORTA como entrada
movwf TRISA
bcf STATUS,RP0 ;cambiamos a BANCO0
clrf PORTB ;estado inicial de PORTB (leds apagados)
bsf PORTB,0 ;Comenzamos con el primero activo
;aqui inicia el programa del microcontrolador
push
btfss PORTA,0 ;testea si se ha pulsado el boton
goto push
call retardo ;ejecuta a retardo hasta que se estabilice la señal
push2
btfsc PORTA,0
goto push2
rrl PORTB,F
btfss STATUS,C
goto push
rrl PORTB,F
goto push
;subrutina de retardo que evita rebote al pulsar boton (20 milisegundos)
retardo
movlw 0x9E
movwf d1
movlw 0x10
movwf d2
retardo_0
decfsz d1,f
goto $+2
decfsz d2,f
goto retardo_0
goto $+1
nop
return
end
Ahora vamos a tu codigo. Cualquiera de eso:
push1 equ d'0' ;identifica a RA0
cont equ d'0' ;indica el led a encender
cblock 0x0c
;definicion de constantes para retardo del boton
d1
d2
endcdefine constantes, nada mas, luego el compilador reemplaza la palabra por ese numero
Entonces si haces esto:
incf cont,fSe reemplazaria por esto:
incf 0,f
El registro 0x00 es el INDF, es a lo que apunta el registro FSR. En fin NO es lo que vos queres hacer. fijate en el datasheet sobre la memoria y vas a notar que el rango de los registros de proposito general comienzan en la direccion 0x0C para el PIC16F84A.
Por eso cuando usas el Cblock pones el 0x0C, ya que el equivalente de ese cblock es:
d1 equ 0x0C
d2 equ 0x0D
Entonces cuando se usan
movwf d1
es igual a:
movwf 0x0C
es decir se guardan en esa direccion de memoria.
-------------------
Otro problema. como estaba tu programa, si se mantenia presionado el boton, a pesar que existia un retardo de 20ms, este se iba a ejecutar continuamente, entonces seria MUY rapido el cambio y se veria casi como que todos estan prendidos a la vez.
-------------------
Aunque el programa corra correctamente tenes un error de concepto, los registros que modificas para indicar si son salidas/entradas son los TRISA / TRISB (que se encuentran en el banco 1) que curiosamente comparten la ""misma"" direccion que los PORTA / PORTB y que por eso te funciona. PERO tenes que tenerlo en cuenta. por eso yo lo corregi en todos los codigos
---------------------
Aca otra forma de hacer lo que hice arriba, pero masomenos como lo queres hacer vos:
(Observa que puse el cont dentro del cblock y luego de arreglar los pines como entrada/salida procedo a ponerlo a 0, esta en el banco 0 )
;definicion de directivas para microcontrolador
__CONFIG _CP_ON & _WDT_OFF & _PWRTE_ON & _XT_OSC
list p=16f84a
#include<p16f84a.inc>
cblock 0x0c
;definicion de constantes para retardo del boton
d1
d2
cont
endc
;se configura el microcontrolador
org 0x00
bsf STATUS,RP0 ;cambiamos a BANCO1
clrf TRISB ;establece PORTB como salida
movlw b'11111111' ;establece PORTA como entrada
movwf TRISA
bcf STATUS,RP0 ;cambiamos a BANCO0
clrf PORTB ;estado inicial de PORTB (leds apagados)
clrf cont ;Comienzo de 0
;aqui inicia el programa del microcontrolador
push
btfss PORTA,0 ;testea si se ha pulsado el boton
goto push
call retardo ;ejecuta a retardo hasta que se estabilice la señal
push2
btfsc PORTA,0 ;espero que suelte
goto push2
movf cont ;Muevo cont a W
call tabla ;LLamo a la tabla
incf cont,F ; Incremento cont
movwf PORTB ; Lo que me devuelve la tabla (W) lo pongo en PORTB
sublw 0x80,W ; Me fijo si es el ultimo valor ( es decir 0x80 )
btfsc STATUS,Z
clrf cont ; Si lo es entonces reseteo cont a 0 para que comienze nuevamente.
goto push
tabla
addwf PCL,F
retlw 0x01
retlw 0x02
retlw 0x04
retlw 0x08
retlw 0x10
retlw 0x20
retlw 0x40
retlw 0x80
;subrutina de retardo que evita rebote al pulsar boton (20 milisegundos)
retardo
movlw 0x9E
movwf d1
movlw 0x10
movwf d2
retardo_0
decfsz d1,f
goto $+2
decfsz d2,f
goto retardo_0
goto $+1
nop
return
end
Y si no la mas simple que seria sumar 1 como estuviste haciendo:
;definicion de directivas para microcontrolador
__CONFIG _CP_ON & _WDT_OFF & _PWRTE_ON & _XT_OSC
list p=16f84a
#include<p16f84a.inc>
cblock 0x0c
;definicion de constantes para retardo del boton
d1
d2
endc
;se configura el microcontrolador
org 0x00
bsf STATUS,RP0 ;cambiamos a BANCO1
clrf TRISB ;establece PORTB como salida
movlw b'11111111' ;establece PORTA como entrada
movwf TRISA
bcf STATUS,RP0 ;cambiamos a BANCO0
clrf PORTB ;estado inicial de PORTB (leds apagados)
;aqui inicia el programa del microcontrolador
push
btfss PORTA,0 ;testea si se ha pulsado el boton
goto push
call retardo ;ejecuta a retardo hasta que se estabilice la señal
push2
btfsc PORTA,0 ;espero que suelte
goto push2
incf PORTB,F ;Incremento PORTB
goto push
;subrutina de retardo que evita rebote al pulsar boton (20 milisegundos)
retardo
movlw 0x9E
movwf d1
movlw 0x10
movwf d2
retardo_0
decfsz d1,f
goto $+2
decfsz d2,f
goto retardo_0
goto $+1
nop
return
end