Autor Tema: LCD 16x2 Desplazar texto  (Leído 3573 veces)

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

Desconectado Juan1345

  • PIC10
  • *
  • Mensajes: 3
LCD 16x2 Desplazar texto
« en: 18 de Agosto de 2014, 13:18:17 »
Buenas Amigos alquien que me pueda ayudar a desplazar un texto en una LCD 16x2 con pic 16f84a
Lo que tengo que hacer es escribir un texto en la LCD Ya lo hize pero tengo que desplazarlo a la izquierda o a la derecha
Aqui el codigo:
LIST      p=16F84A
      __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
      INCLUDE   <P16F84A.INC>
      STATUS       EQU    0X03
      PORTA        EQU    0X05
      PORTB        EQU    0X06
      TRISA        EQU    0X85
      TRISB        EQU    0X86
      LCD_LINEA1    EQU   84   
      LCD_LINEA2    EQU   0C4   
      LCD_CLR       EQU   01   
      LCD_CASA    EQU   02   
      LCD_INC       EQU   06   
      LCD_DEC       EQU   04   
      LCD_ON       EQU   0C   
      LCD_OFF       EQU   08   
      CURSOR_ON    EQU   0E   
      CURSOR_OFF    EQU   0C   
      CURSOR_PARP    EQU   0F
      LCD_IZDA    EQU   18   
      LCD_DECHA    EQU   1C   
      CURSOR_IZDA    EQU   10   
      CURSOR_DECHA EQU   14   
      LCD_FUNCIÓN    EQU   38   
      LCD_CGRAM    EQU   40   
      CBLOCK 0x0D
      ENDC
        ORG   00                  
INICIO   
        bsf         STATUS,RP0
          movlw      b'00011000'   
      movwf      TRISA      
      clrf      TRISB      
      bcf         STATUS,RP0            
      clrf      PORTA      
      clrf      PORTB
      movlw      LCD_FUNCIÓN   
      call      LCD_COMANDO   
      call      PAUSA_5ms   
      movlw      LCD_FUNCIÓN   
      call      LCD_COMANDO   
      call      PAUSA_5ms   
      movlw      LCD_FUNCIÓN   
      call      LCD_COMANDO   
      call      PAUSA_5ms   
      movlw      LCD_CLR      
      call      LCD_COMANDO   
      movlw      LCD_INC      
      call      LCD_COMANDO   
      movlw      LCD_ON      
      call      LCD_COMANDO   
      movlw      84      
      call      LCD_COMANDO   
ver
                        
      movlw   81
      call   LCD_COMANDO
                  movlw   'B'
      call   LCD_CARACTER      
      movlw   'L'         
      call   LCD_CARACTER      
      movlw   'O'                      
      call   LCD_CARACTER      
      movlw   'G'                  
      calL   LCD_CARACTER
      movlw   ' '                  
      calL   LCD_CARACTER            
      movlw   'R'
      call   LCD_CARACTER      
      movlw   'O'         
      call   LCD_CARACTER      
      movlw   'B'                      
      call   LCD_CARACTER      
      movlw   'O'                  
      calL   LCD_CARACTER      
      movlw   'T'         
      call   LCD_CARACTER
      movlw   ' '         
      call   LCD_CARACTER
      movlw   'R'         
      call   LCD_CARACTER      
      movlw   'H'         
      call   LCD_CARACTER            
      movlw   0C1
      call   LCD_COMANDO
             movlw   'E'
      call   LCD_CARACTER      
      movlw   'L'         
      call   LCD_CARACTER      
      movlw   'E'                      
      call   LCD_CARACTER      
      movlw   'C'                  
      calL   LCD_CARACTER
      movlw   'T'                  
      calL   LCD_CARACTER            
      movlw   'R'
      call   LCD_CARACTER
      movlw   'O'                      
      call   LCD_CARACTER      
      movlw   'N'                  
      calL   LCD_CARACTER
      movlw   'I'                  
      calL   LCD_CARACTER            
      movlw   'C'
      call   LCD_CARACTER
       movlw   'A'
      call   LCD_CARACTER
      sleep   
subrutinas       
        CBLOCK
      CONTA1
      CONTA2
      GUARDA_CARÁCTER
      ENDC
PAUSA_5ms   
        movlw      7
      movwf      CONTA2      
      clrf      CONTA1      
RETRASO1   
        decfsz      CONTA1,1   
      goto      RETRASO1   
      decfsz      CONTA2,1   
      goto      RETRASO1   
      return            
LCD_COMANDO   
        clrf      PORTA      
      movwf      PORTB      
      call      LCD_CHEQUEA
      goto      LCD_HABILITA
LCD_CARACTER
      clrf   PORTA         
      call   LCD_CARÁCTER_ESPECIAL
      movwf   PORTB         
      call   LCD_CHEQUEA      
      bsf     PORTA,0            
      goto   LCD_HABILITA      
LCD_CARÁCTER_ESPECIAL
      movwf   GUARDA_CARÁCTER      
      sublw   'ñ'          
      btfss   STATUS,Z      
      goto   LCD_EÑE_MAYÚSCULA   
      movlw   b'11101110'      
      movwf   GUARDA_CARÁCTER   
      goto   LCD_FIN_CARACTER_ESP   

LCD_EÑE_MAYÚSCULA
      movfw   GUARDA_CARÁCTER      
      sublw   'Ñ'          
      btfss   STATUS,Z      
      goto   LCD_GRADO      
      movlw   b'11101110'      
      movwf   GUARDA_CARÁCTER      
      goto   LCD_FIN_CARACTER_ESP   
LCD_GRADO
      movfw   GUARDA_CARÁCTER      
      sublw   'º'         
      btfss   STATUS,Z         
      goto   LCD_FIN_CARACTER_ESP   
      movlw   b'11011111'      
      movwf   GUARDA_CARÁCTER      

LCD_FIN_CARACTER_ESP
      movfw   GUARDA_CARÁCTER   
      return         
LCD_CHEQUEA         
      bsf         STATUS,RP0            
      movlw      0FF      
      movwf      TRISB      
      bcf         STATUS,RP0         
      bcf         PORTA,0         
      bsf         PORTA,1         
BUCLE      
        bsf         PORTA,2            
      movf      PORTB,0      
      bcf         PORTA,2            
      addlw      84   
      btfsc      STATUS,C       
      goto      BUCLE      
      bsf         STATUS,RP0            
      clrf      TRISB      
      bcf         STATUS,RP0            
      bcf         PORTA,1      
      return      
LCD_HABILITA   
      bsf         PORTA,2            
      nop            
      bcf         PORTA,2            
      return
      END   
Ahi tambien les dejo el .hex y la imagen de la simulacion para que me puedan ayudar

Desconectado Vangeluz

  • PIC12
  • **
  • Mensajes: 74
    • Vangeluzweb
Re: LCD 16x2 Desplazar texto
« Respuesta #1 en: 05 de Octubre de 2014, 01:41:50 »
Hola que tal, lo que deberías hacer es hacer un acarreamiento de bits, desplazando el texto hasta que quede fuera de la pantalla y luego hacerlo aparecer desde el otro extremo.
Yo te aconsejaría hacerlo de una forma mas compacta y simple con las rutinas de Microcontroladores Pic16f84a de Editorial RA-MA
.
Código: [Seleccionar]

__CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE  <P16F84A.INC>

CBLOCK  0x0C
ENDC

; ZONA DE CÓDIGOS ********************************************************************

ORG 0
Inicio
call LCD_Inicializa ; Prepara la pantalla.
Principal
movlw Mensaje0 ; Apunta al mensaje.
call LCD_MensajeMovimiento
goto Principal ; Repite la visualización.

; "Mensajes" ----------------------------------------------------------------------------
Mensajes
addwf PCL,F
Mensaje0 ; Posición inicial del mensaje.
DT "                 " ; Espacios en blanco al principio para mejor efecto
DT "BLOG ROBOT RH  ";  ****  ACA EL MENSAJE QUE QUIERAS ****
DT " ELECTRONICA."
DT "                ", 0x0 ; Espacios en blanco al final.

INCLUDE  <LCD_MENS.INC> ; Subrutina LCD_MensajeMovimiento.
INCLUDE  <LCD_4BIT.INC> ; Subrutinas de control del LCD.
INCLUDE  <RETARDOS.INC> ; Subrutinas de retardos.
END ; Fin del programa.

Ahí al final te pide 3 librerías con las rutinas necesarias tanto de retardos, varias opciones de pasar múltiples mensajes, en ambas lineas, fijas, intermitentes, etc... y también una conexión de 4 bits.
Quedaría la conexión algo así:


Esa seria la conexión, obviando RA3 que no se que hace, lo demás está conforme a las librerías.
Si te animas buscate esas librerías que suelen estar en la web, sino me dices y te las subo... saludos !!!
Vangeluz