Hola tengo esta rutina, que funciona, pasa 6 digitos decimales a ascii para que se vea en una lcd, es un contador que va de 000000 a 99.999 y vuelve a 000000, mi pregunta es si se puede reducir el codigo para hacerlo mas eficiente, revise en el foro pero no me convencieron algunos ejemplos o no los podia aplicar, yo debo mantener los registros originales para seguir contando.
les paso el cod.
;---------------------------------------------------------------
; Borra los registros de envio usados para Juegos Jugados
Reset_Games_Play
MOVLW d'8'
MOVWF LCD_GAMES_Unidad
MOVLW d'9'
MOVWF LCD_GAMES_Decena
MOVLW d'9'
MOVWF LCD_GAMES_Centena
MOVLW d'9'
MOVWF LCD_GAMES_Unidad_Mil
MOVLW d'9'
MOVWF LCD_GAMES_Decena_Mil
CALL Games_Play_to_ASCII
RETLW 0X00
;-------------------------------------------------------------
; Solo cuenta hasta 99.999 y luego vuelve a cero.
Games_Play
MOVLW d'10'
INCF LCD_GAMES_Unidad,F ; Unidades
XORWF LCD_GAMES_Unidad,W
BTFSS STATUS,Z ; Salto si Z=1
GOTO Games_Play_to_ASCII ; Convierto a ASCII
MOVLW D'0'
MOVWF LCD_GAMES_Unidad ; Vuelvo a 0.
;----------------------------------------------------------------
;DECENAS
MOVLW d'10'
INCF LCD_GAMES_Decena,F ; Unidades
XORWF LCD_GAMES_Decena,W ; Comparo para no pasarme
BTFSS STATUS,Z ; Salto si Z=1
GOTO Games_Play_to_ASCII ; Convierto a ASCII
MOVLW D'0'
MOVWF LCD_GAMES_Decena ; Vuelvo a 0.
;----------------------------------------------------------------
;CENTENAS
MOVLW d'10'
INCF LCD_GAMES_Centena,F ; Unidades
XORWF LCD_GAMES_Centena,W ; Comparo para no pasarme
BTFSS STATUS,Z ; Salto si Z=1
GOTO Games_Play_to_ASCII ; Convierto a ASCII
MOVLW D'0'
MOVWF LCD_GAMES_Centena ; Vuelvo a 0.
;----------------------------------------------------------------
;UNIDAD DE MIL
MOVLW d'10'
INCF LCD_GAMES_Unidad_Mil,F ; Unidades
XORWF LCD_GAMES_Unidad_Mil,W ; Comparo para no pasarme
BTFSS STATUS,Z ; Salto si Z=1
GOTO Games_Play_to_ASCII ; Convierto a ASCII
MOVLW D'0'
MOVWF LCD_GAMES_Unidad_Mil ; Vuelvo a 0.
;----------------------------------------------------------------
;DECENAS DE MIL
MOVLW d'10'
INCF LCD_GAMES_Decena_Mil,F ; Unidades
XORWF LCD_GAMES_Decena_Mil,W ; Comparo para no pasarme
BTFSS STATUS,Z ; Salto si Z=1
GOTO Games_Play_to_ASCII ; Convierto a ASCII
MOVLW D'0'
MOVWF LCD_GAMES_Decena_Mil ; Vuelvo a 0.
;----------------------------------------------------------------
; Rutina para convertir de decimal a ASCII
Games_Play_to_ASCII
MOVFF LCD_GAMES_Unidad,TEMP1 ; Vuelco los valores para
MOVFF LCD_GAMES_Decena,TEMP2 ; poder convertirlos sin
MOVFF LCD_GAMES_Centena,TEMP3 ; modificar los registros
MOVFF LCD_GAMES_Unidad_Mil,TEMP4 ; originales y asi seguir
MOVFF LCD_GAMES_Decena_Mil,TEMP5 ; controlandolos.
MOVLW D'48' ; Convierto a ASCII
ADDWF TEMP1,F ; Sumo para pasar a ASCII
ADDWF TEMP2,F
ADDWF TEMP3,F
ADDWF TEMP4,F
ADDWF TEMP5,F
;------------------------------------------------------------------------
; Forma el numero que quiero visualizar en la LCD
Games_Play_to_LCD
MOVLW d'10'
CALL LCD_PosicionLinea3 ; Rutina para enviar el dato a la tercer linea del LCD
MOVFF TEMP1,LCD_CHAR ; Unidades
CALL LCD_SEND_CHAR_2 ; Envio el dato a la LCD
MOVLW d'9'
CALL LCD_PosicionLinea3
MOVFF TEMP2,LCD_CHAR ; Decenas
CALL LCD_SEND_CHAR_2
MOVLW d'8'
CALL LCD_PosicionLinea3
MOVFF TEMP3,LCD_CHAR ; Centenas
CALL LCD_SEND_CHAR_2
MOVLW d'7'
CALL LCD_PosicionLinea3
MOVFF TEMP4,LCD_CHAR ; Unidades de Mil
CALL LCD_SEND_CHAR_2
MOVLW d'6'
CALL LCD_PosicionLinea3
MOVFF TEMP5,LCD_CHAR ; Decenas de Mil
CALL LCD_SEND_CHAR_2
RETLW 0x00
Esto muestra 999998 solo para ver si funcionaba.
Se me da que es muy largo para hacer una suma y luego volcarla a la LCD.
Que opinan.
Saludos