hola a todos quisiera saber si me pueden ayudar con un contador que despliego en un lcd 2x16 solo que al iniciar el conteo
inicia bien en cero pero al presionar el pulsador para que cuente inmediatamente se visualiza el numero 254 o el 255, si continuo presionando baja al 243 y el siguiente pulso 000 y asi se repite quiero saber en donde me equivoque el programa es el siguiente, les comento que el proyecto es el contador de las piezas que produce una maquina este programa es esclusivo del contador.
programa principal
;------------------------------------------------------------------------------------------
org h'00'
goto inicio
retfie
org h'05'
inicio
movlw h'1b'
bsf status,5
bcf status,6
movwf trisa
movlw h'04'
movwf adcon1
movlw h'00'
movwf trisb
movlw h'30'
movwf trisc
bcf status,5
bcf status,6
clrf porta
clrf portb
clrf cont
clrf palabra
clrf centena
clrf decena
clrf unidad
bcf portc,0
bcf portc,2
inicia_lcd
call lcd_ini ;llama a rutina de iniciar lcd
movlw b'00000001' ;borra lcd y envia a home
call lcd_reg ;llama a rutina para recibir comandos
call delay
movlw b'00000110'
call lcd_reg
call delay
movlw b'00001100' ;lcd on, cursor off, parpadeo off
call lcd_reg
call delay
movlw b'10000000'
call lcd_reg
call delay
repetir
movf palabra,w
call dato_1
iorlw 0
btfsc status,2
goto acabar
call lcd_datos
incf palabra
goto repetir
acabar
nop
goto decodi
dato_1
addwf pcl,1
retlw 'P'
retlw 'I'
retlw 'E'
retlw 'Z'
retlw 'A'
retlw 'S'
retlw h'00'
;lcd_ini esta rutina inicializa y configura lcd, caracteres de 5x7
;bus de 8 bits y 2 lineas de visualizacion
lcd_ini
movlw h'38'
call lcd_reg
movlw h'38'
call lcd_reg
movlw h'38'
call lcd_reg
return
;lcd_reg rutina para enviar comandos
lcd_reg
bcf portc,0
movwf portb
call lcd_busy
call lcd_e
return
;lcd_busy rutina para verificar que el lcd no este ocupado
lcd_busy
bsf portc,1 ;pone al lcd en modo leer
movlw h'ff'
bsf status,5 ;en estos tres siguientes renglones
movwf trisb ;cambio el puertob de salidas a
bcf status,5 ;entradas
bsf portc,2 ;activa lcd
busy
btfsc portb,7
goto busy
bcf portc,2 ;desactiva lcd
movlw b'00000000'
bsf status,5
movwf trisb ;nuevamente cambio a salidas el puertob
bcf status,5
bcf portc,1 ;pone el lcd en modo escribir
return
;lcd_e rutina para habilitar lcd y recibir comandos y datos
lcd_e
bsf portc,2 ;activa lcd
call delay
bcf portc,2 ;desactiva lcd
return
;delay rutina de tiempo de 10 microsegundos
delay
movlw h'01'
movwf reg1
dec1
movlw h'ff'
movwf reg2
dec decfsz reg2
goto dec
decfsz reg1
goto dec1
return
;lcd_datos rutina que envia los datos a lcd
lcd_datos
bsf portc,0 ;activa modo datos
movwf portb
call lcd_e
call delay
return
;-----------------------------------------------------------------------------
;sumar, aqui se realiza el incremento para posteriormente
;desplegarlo en el display
;------------------------------------------------------------------------------
sumar
btfsc portc,5
goto sumar
goto antireb
inc
bsf portc,7
incf cont
decodi
movlw .100
subwf cont,f
btfsc status,0
goto cent
movlw .100
addwf cont,f
yyy
movlw .10
subwf cont,f
btfsc status,0
goto dece
addwf cont,w
movwf unidad
goto visualizar
cent
incf centena
goto decodi
dece
incf decena
goto yyy
;visualizar es la rutina para ver el resultado de el
;conteo
visualizar
movlw b'10001100'
call lcd_reg
movf centena,w
call tabla
call lcd_datos
movlw b'10001101'
call lcd_reg
movf decena,w
call tabla
call lcd_datos
movlw b'10001110'
call lcd_reg
movf unidad,w
call tabla
call lcd_datos
clrf centena
clrf decena
clrf unidad
goto sumar
tabla
addwf pcl,1
retlw h'30' ;0
retlw h'31' ;1
retlw h'32' ;2
retlw h'33' ;3
retlw h'34' ;4
retlw h'35' ;5
retlw h'36' ;6
retlw h'37' ;7
retlw h'38' ;8
retlw h'39' ;9
antireb
btfss portc,5
goto antireb
goto inc
end