Nooooo, si de verdad que el que sabe.... sabe!!!!!!!
Mil gracias BrunoF, la secuencia funciona de maravilla, a la perfección. Le hice unas modificaciones en cuanto al incremento de las posiciones cuando cambia a 2 y 3 dígitos, sólo que cuando cambia de 99 a 100 se sigue con la secuencia de sólo dos dígitos, el primero y el tercero el segundo como que se lo vuela, no lo muestra: 10, 11, 12, 13, etc. Aquí esta tu código con las modificaciones que menciono:
incf Uni,1 ;incremento unidades
movlw .10
xorwf Uni,W
btfss STATUS,Z
goto Muestra
clrf Uni
incf Dec,F
movlw .10
xorwf Dec,W
btfss STATUS,Z
goto Muestra
clrf Dec
incf Cen,F
Muestra movf Cen,w
btfsc STATUS,Z
goto MuestraDec
addlw 0x30
call LCD_DAT
call ADDRESS
MuestraDec movf Dec,w
btfsc STATUS,Z
goto MuestraUni
addlw 0x30
call LCD_DAT
call ADDRESS
MuestraUni movf Uni,w
addlw 0x30
call LCD_DAT
call ADDRESS
Y un último favor, considero que el hacer funcionar algo es importante, pero imprescindible saber cómo se hizo funcionar, podrías explicar un poco la filosofía de tu secuencia? de cómo es que funciona?
Mil gracias nuevamente
Buenas! Si. Es que me he equivocado un poquiño. Ahí lo soluciono.
incf Uni,1 ;incremento unidades
movlw .10 ;cargo 10 en W para comparar
xorwf Uni,W ;Si Uni XOR 10 da 0, entonces es hora de incrementar decenas
btfss STATUS,Z ;Dió cero?
goto Muestra ;No. Entonces listo el cálculo. Mostrar
clrf Uni ;Si. Dió cero y es hora de poner a cero las unidades e
incf Dec,F ;incrementar las decenas
movlw .10 ;Ahora cargo 10 en W para comparar
xorwf Dec,W ;Si Dec XOR 10 da cero, entonces es hora de incrementar decenas
btfss STATUS,Z ;Dió cero?
goto Muestra ;No. Entonces fin cálculos
clrf Dec ;Si. Dió cero. Entonces poner Decenas a cero e
incf Cen,F ;incrementar centenas
Muestra movf Cen,w ;copiar Cen en W(la instruccion movf afecta al flag Z, por lo que si Cen vale cero, Z se pone en alto)
btfsc STATUS,Z ;Z en bajo?(Hay al menos una centena?)
goto MuestraDec ;No. entonces pasar a mostrar decenas
addlw 0x30 ;Si. Entonces mostrar centenas
call LCD_DAT
call ADDRESS
movf Dec,w ;Cargar decenas(arregla error previo)
goto HayDecenas ;Línea para arreglar el error previo. Si al menos exíste una Centena, obligar a mostrar decenas
MuestraDec movf Dec,w ;copiar Dec en W(la instruccion movf afecta al flag Z, por lo que si Dec vale cero, Z se pone en alto)
btfsc STATUS,Z ;Al menos una decena?
goto MuestraUni ;No. Entonces pasar a mostrar unidades
HayDecenas
addlw 0x30 ;Si. Mostrar Decenas
call LCD_DAT
call ADDRESS
MuestraUni movf Uni,w ;Mostrar unidades(no es necesario verificarlas. Al menos siempre hay una medición)
addlw 0x30
call LCD_DAT
call ADDRESS
Debería arreglar el error que mencionaste. El código que hice antes salió mal sin querer en eso. Es que por ejemplo, mi código se fijaba en si al menos existe una decena para ser mostrada pero 100 por ejemplo, no posee decenas pero si centenas. Mi codigo anterior solo revisaba si existia al menos una decena. Como 100 no posee ninguna decena, no las mostraba. El codigo nuevo lo que hace es que si al menos existe una centena, obliga a mostrar las decenas tambien(en cualquier numero mayor a 100 deberían mostarse siempre las decenas, no?). El error no se propagó a las unidades porque asumí que debían mostrarse siempre.
El error iba a ocurrir(en realidad lo supongo porque imagino el comportamiento del programa mirando el código) siempre y cuando el número fuese del tipo X0Y con 0<X<10; 0<=Y<10.
Es decir, por ejemplo el error se iba a producir en los números 100,101,102,103,104...200,201,202...300....906,907,908,909.
Espero haya quedado claro.
Una variante que por ahí te gustaría probar para ver cuál te gusta como queda mejor en el LCD es la siguiente:
incf Uni,1 ;incremento unidades
movlw .10
xorwf Uni,W
btfss STATUS,Z
goto Muestra
clrf Uni
incf Dec,F
movlw .10
xorwf Dec,W
btfss STATUS,Z
goto Muestra
clrf Dec
incf Cen,F
Muestra movf Cen,w
addlw 0x30
call LCD_DAT
call ADDRESS
MuestraDec movf Dec,w
addlw 0x30
call LCD_DAT
call ADDRESS
MuestraUni movf Uni,w
addlw 0x30
call LCD_DAT
call ADDRESS
Saludos.