Buenos días foristas , soy nuevo en el foro y quiero pedirles un favor.
Tengo que implementar un contador de 8 bits, que visualice en formato binario a LCD 2x16. Como hasta ahora comienzo, decidí hacer primero un contador con longitud de un nibble, osea, de "0000" hasta "1111" (código ascii) para ver en lcd y luego implementar una subrutina que aproveche esto para que visualice un nibble y luego el otro y ver así el byte,pero como 1's y 0's.
Uso un PIC16F84A, el contador lo incrementa un pulsador en RBO, cargo el valor del contador en W y llamo una tabla con los caracteres ascii, y también uso otro registro llamado "puntero" que me cuenta si los caracteres visualizados a LCD son 4, si son menos, es porque no ha salido el último caracter 1/0 a LCD y vuelvo a la tabla para sacarlo.
Mi problema es que uso la técnica de DT"0000" DT"0001", el "contador" es puntero del mensaje (o nibble) y el "puntero" es el puntero dentro del mensaje, que indica ala posición del caracter para sacar a LCD.
La cosa es que el conteo en Proteus cuenta bien al principio y se estropea;
Inicializa en "0000", incremento a "0001", "0010" y luego cuanta mal, pero no es rebote, ya hice varios retardos y nada funciona, y al grabar el PIC sin darle pulso, cuenta como loco, lo cual es raro porque el incremento del contador y el puntero los controlo, pero hay algo de lo que no me he dado cuenta y que no puedo resolver.
Hasta me copié una rutina del libro "PIC16F84A Desarrollo de proyectos" llamada "LCD_MENS.INC", pero el asunto es que
en esta, se carga la etiqueta del mensaje (caracteres ascii) , pero en mi caso, yo cargo el valor del contador y lo uso como puntero para cada etiqueta en la tabla de mensajes y el puntero, para controlar el fin del mensaje, verificando que envió los 4 caracteres.
Este es el código que hice:
list p=16F84A ; list directive to define processor
#include <p16F84A.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;********************************************************************************************************************************
ORG 0X00
GOTO INICIO
contador EQU 0x0C
puntero EQU 0x0D
CBLOCK 0x0E
ENDC
;*********************************************************************************************************************************
Mensajes_BIN ADDWF PCL,1
BIN_0000
DT "0000"
;BIN_0001
DT "0001"
;BIN_0010
DT "0010"
;BIN_0011
DT "0011"
;BIN_0100
DT "0100"
;BIN_0101
DT "0101"
;BIN_0110
DT "0110"
;BIN_0111
DT "0111"
;BIN_1000
DT "1000"
;BIN_1001
DT "1001"
;BIN_1010
DT "1010"
;BIN_1011
DT "1011"
;BIN_1100
DT "1100"
;BIN_1101
DT "1101"
;BIN_1110
DT "1110"
;BIN_1111
DT "1111"
FinMensajes_BIN
;*******************************************************************************************************************************
INICIO
call LCD_Inicializa
clrf contador ;este registro comienza en 0 ,es el puntero para acceder a los valores binarios del nibble
clrf puntero ;este registro comienza en 0, cuenta el # de caracteres del valor binario, que deben ser 4
movlw '0' ;el conteo esta iniciado desde "0000"
call LCD_Caracter
movlw '0'
call LCD_Caracter
movlw '0'
call LCD_Caracter
movlw '0'
call LCD_Caracter
Principal
btfss PORTB,0 ;si se oprime pulsador en RB0
goto Principal ;
suelta btfsc PORTB,0 ;revisa que se halla soltado
goto suelta ;elimina rebote, 50ms
call Retardo_100ms
call LCD_Borra ;borra el caracter actual en lcd para visualizar otro valor, al que incrementa
incf contador,1 ;aumenta contador para que busque un nibble distinto cada vez
envia
movf contador,0 ;cargo el contador para que sea puntero de las tablas
addwf puntero,0 ;sumo el valor puntero que indica la posición del caracter
addlw BIN_0000 ;se carga la dirección BI_0000 como punto de partida
addlw .1 ;hasta donde los valores de puntero,contador+1 lo determinen
call Mensajes_BIN
call LCD_Caracter ;rutina lcd que muestra caracteres scii en la pantalla lcd
incf puntero
prueba ;cuando sale un caracter, registra cada vez hasta que llegue al cuarto
movlw 0x04 ;puntero=4?
xorwf puntero,0 ;acaba de escribir los 4 caracteres y si faltan, entonces sigue hasta el último
btfss STATUS,Z ;ya acabó?
goto envia ;no, apunta al siguiente caracter
clrf puntero ;si, puntero se borra y esperamos pulso para volver a incrementar
goto Principal
include<LCD_4BIT.INC>
include<RETARDOS.INC>
end