Autor Tema: 6 dígitos decimales a ASCII  (Leído 1873 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
6 dígitos decimales a ASCII
« en: 04 de Febrero de 2012, 15:44:55 »
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.
Código: [Seleccionar]
;---------------------------------------------------------------
; 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
 

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: 6 dígitos decimales a ASCII
« Respuesta #1 en: 04 de Febrero de 2012, 17:10:50 »
Hola, una forma de "achicar" codigo, es que trabajes con los valores decimales del ASCII, es decir en lugar de 0 que ya sea 48... para el caso,es el mismo, y limitas en lugar de 9, en 57... y te estás evitando de trabajar con 2 registros para cada número...

Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: 6 dígitos decimales a ASCII
« Respuesta #2 en: 06 de Febrero de 2012, 10:22:43 »
Hola tenes razón trabajar directamente con los valores de los caracteres y me ahorro un paso en el programa.
Gracias.


 

anything