# Programar en ASM para que LCD 16x2 muestre mas de 16 caracteres ?



## sAhkl (Nov 16, 2009)

Como programar en ASM,  para que una LCD 16x2 pueda mostrar texto mayor a 16 caracteres

quisiera mostrar texto en una lcd mayor a 16 caracteres no encuentro el datasheet asi que quisiera saber, como hacer para que la lcd me mueva de un lado a otro el texto para mostrar en una linea de esta lcd un texto largo mas de 16 caracteres, o como hacer un programa en la lcd para que me muestre un texto primero ,y despues otra parte del texto, y vuelva a mostrar el mismo  texto de nuevo ;yo estoy trabajando con el pic 18f452 programando en ASM


----------



## Chyryes (Nov 16, 2009)

Hay un comando de configuración que hace que la pantalla se vaya moviendo a la par que el cursor. La manera mas cómoda (o la manera que yo lo haría, que no tiene por que ser la mas cómoda  ) consistiría en escribir todos los caracteres en el display, poner el cursor en la mitad de la pantalla, e ir avanzando el cursor para que se vaya mostrando todo el mensaje.

Aquí te dejo el datasheet del HD44780, que es el que explica el funcionamiento de este tipo de displays con todo lujo de detalles. http://electronica.webcindario.com/componentes/HD44780.pdf (en las páginas 24 y 25 se explican los comandos)

Saludos,


----------



## tecnogirl (Nov 17, 2009)

Y... tambien puedes emular por programa que aparezcan mensajes desplazandose, conocido como scrolling. Salu2.


----------



## sAhkl (Nov 17, 2009)

tecnogirl dijo:


> Y... tambien puedes emular por programa que aparezcan mensajes desplazandose, conocido como scrolling. Salu2.


como hago para realizar el llamado scrolling desde el programa del pic, es que ese me serviria yo creo que mas

el corrimiento a la izquierda o a la derecha es el scrolling esa es mi   duda


----------



## tecnogirl (Nov 18, 2009)

Ahh... pues no tengo el codigo para que lo implementes en un PIC (pero navega en Google... quiza ya alguien lo hizo), pero te doy una pista de cómo hacerlo... El mensaje lo pones como un array de caracteres, p. e:

msg[]="Hola amigos del Foro, como estan ?";

transfieres los primeros 16 caracteres ("Hola....F") al display, haces una pausa y luego le envias otros 16 pero a partir de la letra "o" ("ola ami... o"), otra pausa y asi sigues... Si lo haces a la velocidad correcta, en el display pareciera que el texto se mueve (scroll).... Salu2.


----------



## yuhc91 (May 11, 2013)

me pasaron este código no es propio, como hacer para que el lcd muestre mas de 16 caracteres, como quien dice para que giren las letras


```
;****************************************************************
 processor 16F887
   include <P16F887.INC>
   
;Variables para DELAY
val1 equ 0x30
val2 equ 0x31        

        org 0               ;Vector de RESET
        goto INICIO            
        org 5              ;Inicio del Programa

;configuraón de puertos
INICIO:
        clrf PORTB           ;Limpia PORTB    
        clrf PORTD           ;Limpia PORTD
        bsf STATUS, RP0  
        bcf STATUS, RP1   ;Selecciona el banco 1
        clrf TRISB        ;Configura PORTB como salida
        clrf TRISD        ;Configura PORTD como salida
        bcf STATUS,RP0       ;Regresa al banco 0

START_LCD:        
        call INICIA_LCD   ;Configura el LCD
        call M1           ;Muestra Mensaje
        call LINEA2       ;Configura linea 2
        call M2           ;Muestra Mensaje
        goto START_LCD

;Mensaje a enviar

M1:
        movlw 'U'         ;Mueve 'H' a W
        movwf PORTB       ;Mueve lo que hay en W a PORTB
        call ENVIA        ;Imprime en LCD
        movlw 'N'
        movwf PORTB
        call ENVIA
        movlw 'I'
        movwf PORTB
        call ENVIA
        movlw 'V'
        movwf PORTB
        call ENVIA
        movlw 'E'
        movwf PORTB
        call ENVIA
        movlw 'R'
        movwf PORTB
        call ENVIA
        movlw 'S'
        movwf PORTB
        call ENVIA
        movlw 'I'
        movwf PORTB
        call ENVIA
        movlw 'D'
        movwf PORTB
        call ENVIA
        movlw 'A'
        movwf PORTB
        call ENVIA
        movlw 'D'
        movwf PORTB
        call ENVIA 
        movlw ' '
        movwf PORTB
        call ENVIA
        movlw 'A'
        movwf PORTB
        movlw 'U'
        movwf PORTB
        movlw 'T'
        movwf PORTB
        movlw 'O'
        movwf PORTB
        movlw 'N'
        movwf PORTB
        movlw 'O'
        movwf PORTB
        movlw 'M'
        movwf PORTB
        movlw 'A'
        movwf PORTB
        movlw ' '
        movwf PORTB
        movlw 'D'
        movwf PORTB
        movlw 'E'
        movwf PORTB
        movlw ' '
        movwf PORTB
        movlw 'N'
        movwf PORTB
        movlw 'A'
        movwf PORTB
        movlw 'Y'
        movwf PORTB
        movlw 'A'
        movwf PORTB
        movlw 'R'
        movwf PORTB
        movlw 'I'
        movwf PORTB
        movlw 'T'
        movwf PORTB
        
        return      


M2:
        movlw 'F'         ;Mueve 'I' a W
        movwf PORTB       ;Mueve lo que hay en W a PORTB
        call ENVIA        ;Imprime en LCD
        movlw 'E'
        movwf PORTB
        call ENVIA
        movlw 'L'
        movwf PORTB
        call ENVIA
        movlw 'I'
        movwf PORTB
        call ENVIA
        movlw 'P'
        movwf PORTB
        call ENVIA
        movlw 'E'
        movwf PORTB
        call ENVIA
        movlw ' '
        movwf PORTB
        call ENVIA
        movlw 'N'
        movwf PORTB
        call ENVIA
        movlw 'A'
        movwf PORTB
        call ENVIA
        movlw 'V'
        movwf PORTB
        call ENVIA
        movlw 'A'
        movwf PORTB
        call ENVIA
        movlw 'R'
        movwf PORTB
        movlw 'R'
        movwf PORTB
        movlw 'O'
        movwf PORTB
        movlw ' '
        movwf PORTB
        movlw 'B'
        movwf PORTB
        movlw 'A'
        movwf PORTB
        movlw 'S'
        movwf PORTB
        movlw 'I'
        movwf PORTB
        movlw 'L'
        movwf PORTB
        movlw 'I'
        movwf PORTB
        movlw 'O'
        movwf PORTB

        call ENVIA
        return     




 
;Subrutina para inicializar el lcd
INICIA_LCD:
        bcf PORTD,0      ; RS=0 MODO INSTRUCCION
        movlw 0x01         ; El comando 0x01 limpia la pantalla en el LCD
        movwf PORTB
        call COMANDO     ; Se da de alta el comando
        movlw 0x0C       ; Selecciona la primera línea
        movwf PORTB
        call COMANDO     ; Se da de alta el comando
        movlw 0x3C       ; Se configura el cursor
        movwf PORTB
        call COMANDO     ; Se da de alta el comando
        bsf PORTD, 0     ; Rs=1 MODO DATO
        return
        
;Subrutina para enviar comandos
COMANDO:
        bsf PORTD,1        ; Pone la ENABLE en 1
        call DELAY      ; Tiempo de espera
        call DELAY
        bcf PORTD, 1    ; ENABLE=0    
        call DELAY
        return     
 
;Subrutina para enviar un dato
ENVIA:
        bsf PORTD,0     ; RS=1 MODO DATO
        call COMANDO    ; Se da de alta el comando
        return
;Configuración Lineal 2 LCD
LINEA2:
           bcf PORTD, 0    ; RS=0 MODO INSTRUCCION
        movlw 0xc0        ; Selecciona linea 2 pantalla en el LCD
        movwf PORTB
        call COMANDO    ; Se da de alta el comando
        return

; Subrutina de retardo
DELAY:            
        movlw 0xFF
        movwf val2 
ciclo:
        movlw 0xFF
        movwf val1
    
ciclo2:
        decfsz val1,1
        goto ciclo2
        decfsz val2,1
        goto ciclo
        return
     END
;*************************************************************
```


----------



## D@rkbytes (May 11, 2013)

yuhc91 dijo:


> me pasaron este código no es propio, como hacer para que el lcd muestre mas de 16 caracteres, como quien dice para que giren las letras


Saludos.
Ese programa que muestras, lo que haría es mostrar letra por letra hacia la derecha.
Me supongo que lo que quieres hacer es que se desplace el texto sobre la pantalla. "Efecto Scroll"
Bien, si es eso, modifique un programa el cual se supone que lo haría, pero no funcionaba.
Ahora ya funciona, prácticamente solo tome la rutina de desplazamiento, el resto tenía errores.
Lo que hace este programa, es mostrar el texto sobre la pantalla con desplazamiento hacia la izquierda.
Lo realice para un PIC16F628A, ya que muchos lo tienen, si lo quieres para un PIC16F887,
tan solo debes hacer la adaptación del código. (No es nada complicado)
La ventaja de este programa, es que se usan 4 Bits de datos, y no se usa el pin R/W del LCD

Espero les guste.

Suerte.


----------

