Control de Display LCD con microcontrolador PIC

Hola a todos los amigos de la comunidad, acabo de unirme por recomendación de un amigo...en fin, estoy trabajando en microcontroladores y actualmente utilizo el ccs para crear los códigos de mi micro. Mi misión es crear un código que me muestre es una pantalla lcd 2*16 un mensaje que vaya apareciendo letra a letra, al final el mensaje debe empezar a parpadear; como si prendiera y apagara la pantalla pero con el mensaje ahí, ya tengo la primera parte lo de letra a letra me gustaría saber si existe alguna función para lo del parpadeo....
Código:
#INCLUDE <18F4550.H>
#FUSES HS,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOPBADEN  //PALABRA DE CONFIGURACION
#USE DELAY(CLOCK=20M)
#INCLUDE <LCD.C>


VOID MAIN(VOID)
{
   LCD_INIT();
   DELAY_MS(50);
   
   
  
LCD_GOTOXY(4,1);

  INT J;
   FOR(J=1;J<15;J=J+1)
   {

   SWITCH(J)
   {
   CASE 1:
   PRINTF(LCD_PUTC,"B");
   BREAK;
   CASE 2:
   PRINTF(LCD_PUTC,"I");
   BREAK;
   CASE 3:
   PRINTF(LCD_PUTC,"E");
   BREAK;
   CASE 4:
   PRINTF(LCD_PUTC,"N");
   BREAK;
   CASE 5:
   PRINTF(LCD_PUTC,"V");
   BREAK;
   CASE 6:
   PRINTF(LCD_PUTC,"E");
   BREAK;
   CASE 7:
   PRINTF(LCD_PUTC,"N");
   BREAK;
   CASE 8:
   PRINTF(LCD_PUTC,"I");
   BREAK;
   CASE 9:
   PRINTF(LCD_PUTC,"D");
   BREAK;
   CASE 10:
   PRINTF(LCD_PUTC,"O");
   BREAK;
   CASE 11:
   PRINTF(LCD_PUTC,"S");
   BREAK;
   
   }
   
  DELAY_MS(100);
   }
   

}
 
Mira en las librerias el tipo de LCD y si es compatible con el protocolo Hitachi HD44780, existe un comando que pone el display en On/Off (mensaje no mensaje) que con el ratardo adecuado puede simular el parpadeo.

En este enlace tienes un ficherito con los comandos del protocolo Hitachi (no hace falta que el LCD sea marca Hitachi):

ftp://80.24.233.45/ELCA/ASI/PIC/COMANDOS_LCD.pdf
 
hola buen día a todos yo tambn soy un principiante en esto de los pics y lcd's y tengo un problema que ya fue posteado aquí en el foro y es que en mi lcd solo aparecen los cuadritos en negro en una sola linea (mi lcd es un JHD162A 16x2) y y seguí todos los consejos que aparecen y nada me funciona seguí lo que mencionaron acerca del contraste y lo hice con un potenciómetro y si puedo manejar el contraste pero sigue sin aparecer el texto revise ya todas las conexiones y todo parece estar en su lugar investigue y según vi en casos es necesario poner transistores en las salidas y también leí que la corriente que sale del pic debería ser suficiente para prender un led normal lo cual hice la prueba poniendo leds en donde deberían de ser los bits 0-7 y pues igual no prenden quizá el problema sea mi pic o mi programa ya que estoy seguro que el circuito (sin transistores) esta bien hecho algún consejo de como saber si mi pic esta trabajando correctamente???? y tambn les dejo el programa que hice ya lo simule en proteus y en proteus si funciona perfectamente el pic que uso es un PIC16F887 uso el puerto c para los bits 0-7 y D0-D1 para RS y E baje la velocidad del oscilador a 4 MHZ y ya no se que hacer ni que este mal del por que no funciona ayuda por-favor :confused:

PD soy nuevo en el foro espero me ayuden gracias


Código:
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
        
    ;Configuración de puertos
INICIO:
     clrf PORTC         ;Limpia PORTC    
    clrf PORTD         ;Limpia PORTD
    bsf STATUS, RP0  
    bcf STATUS, RP1    ;Selecciona el banco 1
    clrf TRISC         ;Configura PORTC 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
    call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
   
    goto START_LCD1
START_LCD1:
call INICIA_LCD    ;Configura el LCD
    call M3            ;Muestra Mensaje
    call LINEA2        ;Configura linea 2
    call M4            ;Muestra Mensaje
       call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    
    goto START_LCD2
START_LCD2:
    call INICIA_LCD    ;Configura el LCD
    call M5            ;Muestra Mensaje
    call LINEA2        ;Configura linea 2
    call M6            ;Muestra Mensaje
       call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    
    goto START_LCD3
START_LCD3:
    call INICIA_LCD    ;Configura el LCD
    call M7            ;Muestra Mensaje
    call LINEA2        ;Configura linea 2
    call M8            ;Muestra Mensaje
       call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    
    goto START_LCD
    
    ;Mensaje a enviar
M1:
    movlw 'P'          ;Mueve 'P' a W
    movwf PORTC        ;Mueve lo que hay en W a PORTC
    call ENVIA         ;Imprime en LCD
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'S'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'O'
    movwf PORTC
    call ENVIA
    movlw 'N'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '1'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA 
    movlw 'P'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    return     
M2:
    movlw 'B'         ;Mueve 'B' a W
    movwf PORTC       ;Mueve lo que hay en W a PORTc
    call ENVIA        ;Imprime en LCD
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'B'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'D'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '1'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    
    return     
    
    M3:
    movlw 'P'          ;Mueve 'p' a W
    movwf PORTC        ;Mueve lo que hay en W a PORTc
    call ENVIA         ;Imprime en LCD
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'S'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'O'
    movwf PORTC
    call ENVIA
    movlw 'N'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '2'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA 
    movlw 'P'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    return    
    
    M4:
    movlw 'B'         ;Mueve 'b' a W
    movwf PORTC       ;Mueve lo que hay en W a PORTc
    call ENVIA        ;Imprime en LCD
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'B'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'D'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '2'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    return     
    
    M5:
    movlw 'P'          ;Mueve 'p' a W
    movwf PORTC        ;Mueve lo que hay en W a PORTc
    call ENVIA         ;Imprime en LCD
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'S'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'O'
    movwf PORTC
    call ENVIA
    movlw 'N'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '3'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA 
    movlw 'P'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    return    
    
    M6:
    movlw 'B'         ;Mueve 'b' a W
    movwf PORTC       ;Mueve lo que hay en W a PORTc
    call ENVIA        ;Imprime en LCD
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'B'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'D'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '3'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
       movwf PORTC
    call ENVIA   
    return
    
    M7:
    movlw 'P'          ;Mueve 'p' a W
    movwf PORTC        ;Mueve lo que hay en W a PORTC
    call ENVIA         ;Imprime en LCD
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'S'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'O'
    movwf PORTC
    call ENVIA
    movlw 'N'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '4'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA 
    movlw 'P'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    return    
    
    M8:
    movlw 'B'         ;Mueve 'B' a W
    movwf PORTC       ;Mueve lo que hay en W a PORTC
    call ENVIA        ;Imprime en LCD
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'B'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'D'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '4'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    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 PORTC
    call COMANDO     ; Se da de alta el comando
    movlw 0x0C       ; Selecciona la primera línea
    movwf PORTC
    call COMANDO     ; Se da de alta el comando
    movlw 0x3C       ; Se configura el cursor
    movwf PORTC
    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 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 Líneal 2 LCD
LINEA2:
    bcf PORTD, 0    ; RS=0 MODO INSTRUCCION
    movlw 0xc0      ; Selecciona línea 2 en el LCD
    movwf PORTC
    call COMANDO    ; Se da de alta el comando
    return

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

;subrutina de retardo 2 para espera en cambio de texto
    
DELAY2:
movlw 0xFF
    movwf val2 
ciclo3:
    movlw 0x100
    movwf val1
ciclo4:
    decfsz val1,1
    goto ciclo4
    decfsz val2,1
    goto ciclo3
    return

    
 END
 
Última edición por un moderador:
lo que pasa es que necesito adaptar un programa en asm de 16f84 a 16f877 para controlar un display, pero lo que hize medio funciona papadean los numero y despues ya o se ve nada, lo que hize fue cambiar el aceso a los bancos nada mas, ya que el 16f84 tiene 2 y el 877 4, noc si hay que hacerle otra cosa, o de lo contrario si alguien me puede brindar un programa para gobernar un lcd 16x2 para 16f877 en asm, por que c lo medio entiendo, ahi subo los archivos, el que dice 877 es que modifique, el otro es el original y lo tome de un libro
 

Adjuntos

  • PIC.rar
    7.2 KB · Visitas: 76
Hola!
Veran, tengo el microcontrolador 18F4550, Y un display LCD JDH 162A, por lo cual me puse a investigar un poco sobre el manejo del mismo, pero al montarlo en el protoboard, la primera vez se mostraron cuadros en la parte superior de la pantalla, a lo cual revise mi código, hice la simulación y vi que no era problema del código, así que lo volví a programar (el PIC) y ahora ya no enciende la pantalla!!

Este es mi código (uso PIC C) :

Código:
#include <18F4550.h>
#include <string.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#fuses NODEBUG,PLL5,CPUDIV4,NOMCLR
#use delay(clock= 8000000)
#define LCD_DATA_PORT getenv("SFR:PORTB")
#define use_portb_lcd TRUE
#define LCD_ENABLE_PIN PIN_B2
#define LCD_RS_PIN PIN_B3
#define LCD_RW_PIN PIN_B1
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B7
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B5 
#include <LCD.C>



void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   
   char nom[]="Alumno: Fernando";
   char cod[]="Codigo:207425449";
   delay_ms(2);
   lcd_init();
   delay_ms(2);
   while(TRUE)
   {
      delay_us(40);
      printf(lcd_putc,nom);
      delay_ms(1000);
      delay_us(40);
      lcd_gotoxy(1,2);
      delay_us(40);
      printf(lcd_putc,cod);
      delay_ms(1000);
      delay_ms(3000);
   }

}
Estoy un poco desesperado! consejos? gracias!
 
Última edición por un moderador:
hola como estan, reciente compre una lcd 16x4, pero cuando hago la simulacion en proteus la linea 3 y 4 me salen 4 caracteres mas hacia la derecha e intentado todo para colocarlo en el principio de la fila pero no resulta, igualmente cuando lo hago en la verdadera lcd, estoy usando proton ide.
 

Adjuntos

  • lcd16x2.rar
    23.1 KB · Visitas: 39
Última edición:
hola como están, reciente compre una lcd 16x4, pero cuando hago la simulación en proteus la linea 3 y 4 me salen 4 caracteres mas hacia la derecha e intentado todo para colocarlo en el principio de la fila pero no resulta, igualmente cuando lo hago en la verdadera lcd, estoy usando proton ide.
Saludos.

Para trabajar con las líneas 3 y 4 usa esto...

Print $FE,$90,"Linea 3"
Print $FE,$D0,"Linea 4"

Suerte.
 
Hola!
Veran, tengo el microcontrolador 18F4550, Y un display LCD JDH 162A, por lo cual me puse a investigar un poco sobre el manejo del mismo, pero al montarlo en el protoboard, la primera vez se mostraron cuadros en la parte superior de la pantalla, a lo cual revise mi código, hice la simulación y vi que no era problema del código, así que lo volví a programar (el PIC) y ahora ya no enciende la pantalla!!

Estoy un poco desesperado! consejos? gracias!

Si te sirve de algo, partiendo de la base que estoy aprendiendo, yo lo hago con un 16f877a y con unos pequeños cambios va bien tu programa.
Te pongo el código y mira ver si el problema lo tienes hay ya que creo que el error lo tienes ahí:
Código:
#include <16F877A.h>
#include <string.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP, NODEBUG

#use delay(clock= 8000000)

#include <LCD.C>

   [B]char nom[]="Alumno: Fernando";
   char cod[]="Codigo:207425449";[/B]
  
 
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   
   lcd_init();
   delay_ms(2);
   while(TRUE)
   {
      [B]lcd_gotoxy(1,1);[/B]
      delay_us(40);
      printf(lcd_putc,nom);
      delay_ms(1000);
      delay_us(40);
      lcd_gotoxy(1,2);
      delay_us(40);
      printf(lcd_putc,cod);
      delay_ms(1000);
      delay_ms(3000);
   }

}
 
Última edición por un moderador:
Buenos días queridos colegas...

Hice un sistema para lavarropas que está en http://planocomplejo.com.ar/wp/?p=12#more-12. Usé el PIC 16F877A, La fuente es la típica de un Trafo de 220/12V con puente de diodos, capacitor de 4700µF, filtré la fuente con capacitores de .1µF, 22nF, etc. y aguas abajo ya filtrado un 7812 y conectado a éste un 7805, cada uno con un capacitor de .1µF a la salida. Al PIC le puse un capacitor de 22nF entre las patitas VSS y VDD muy cercano al integrado.

Le hice algunas correcciones en lo operativo, en los comandos para motor, cambié los tiempos de carga y descarga, etc., y sobreescribí algunos de los mensajes que envía al LCD 16x2 cuidando el largo de las líneas, etc. ¡En el PROTEUS funciona perfecto!

En la práctica, el sistema de lavado también funciona bien. Pero el display se comporta errático mostrando caracteres extraños, aunque todos son ASCII, pero no son los que le envío. No siempre muestra lo mismo. A veces, muy A VECES, muestra algo correctamente.

ACLARACIÓN: El display no funcionó bien nunca. Por lo que no es un problema de ruido del lavarropas. Lo tuve que instalar porque después de 2 semanas no se podía vivir lavando a mano.:cry:

Intenté de todo pero no hubo caso. Probé (y quemé accidentalmente) 3 displays, y en todos mostraban lo mismo. El display es un WINSTAR 16x2 azul.
Ya instalé el dispositivo en el lavarropas y, como dije, todo funciona bien, entradas y salidas digitales, lo único que me está volviendo loco es el DISPLAY. Ya no se qué hacer.

¿Alguien tuvo ese problema? No he leido ningún mensaje de esos.
 
Última edición:
Probé (y quemé accidentalmente) 3 displays, y en todos mostraban lo mismo. El display es un WINSTAR 16x2 azul.
¿Ya probaste con otra pantalla que no sea WINSTAR?
Según el fabricante son estandard y usan el controlador ST7032, que es compatible con el HD44780.
Prueba con otro LCD genérico para que salgas de dudas.
Si llegaras a usar el pin RB3 para la pantalla, verifica que no tengas activo el fuse LVP.
 
¿Ya probaste con otra pantalla que no sea WINSTAR?

¡Gracias por responder D@rkBytes! No. No probe con otro. Por aquí no consigo otra marca. Sin embargo a todo el mundo le funciona bien, eso me llamó la atención.

Prueba con otro LCD genérico para que salgas de dudas.
Si llegaras a usar el pin RB3 para la pantalla, verifica que no tengas activo el fuse LVP.

Voy a ver de probar con otra marca, ya veremos. Por otro lado quemé el led en los otros. De puro bruto, porque no puse la resistencia adecuada, sin embargo aún funcionan como display, sólo que hay que hacer malabarismos para ver.. :D

La cosa es que también muestran ese "ruido". Voy a tratar de filmarlo para mostrar. Es extraño que 3 displays tengan la misma falla, por eso creo que se debe al PIC. No recuerdo si conté que usé el CCS C, y en general funciona bien.

No he leido que nadie tenga ese problema con el Display. Si llegara a ser ruido, la pregunta es cómo quitárselo. Porque el ruido está en la señal desde el PIC. Y usé un cable apantallado UTP de 25cm para conectarlo, con una ficha.No creo que sea ese el problema porque suelen usar una ProtoBoard y así funciona bien... Pero voy a probar soldar los cables.

De todos modos si alguien tuvo el problema... Espero me cuente al menos a qué se debe.
Gracias. Saludos.
 
Hola a todos, aprovechado este tema del manejo de los lcd quisiera que alguien me ayudara a cómo logro poner un mensaje que se desplace por el lcd. por ejemplo: "HOLA A TODOS COMO ESTAN", ya he trabajado estos pero en mensajes fijos, la idea es hacer lo mismo pero que se desplace, tengo un lcd 2x16 y quiero montarlo en CCS o lenguaje C. Gracias por su colaboración.
 
Buen día a todos compañeros.
Mi duda es que, ¿por qué no puedo imprimir caracteres en la primera linea de mi pantalla?
Ya lo he intentado en otras partes de la pantalla lcd y si puedo, pero no sé.
Acá les anexo el código y una imagen de la distribución del lcd que estoy usando.
Código:
Pause 500 ' Pausa de 500 milisegundos
LCDOut $fe, 1 ' Limpia la pantalla
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
' Cargamos el caracter en la posición cero:
LCDOut $fe,$40,$02,$06,$1A,$1A,$1A,$06,$02,$00
' Muestra el caracter en la pantalla:
LCDOut $fe,1, 0
Inicio:
GoTo Inicio
 

Adjuntos

  • pantalla.JPG
    pantalla.JPG
    60 KB · Visitas: 22
Última edición por un moderador:
Parece ser que le hace falta la rutina de inicializacion del LCD a tu programa, es decir indicarle que tipo de comunicación tendrá (8 ó 4 bits), llenado de caracteres (izq, der), etc
 
PICBasic Pro asume una configuración de pines por defecto para pantalla LCD cuando no se ha definido por el usuario y establece un bus de 4 Bits.
Esto también lo hace el compilador PCWHD de CCS pero con otros pines y de acuerdo al PIC utilizado.

Los pines de la configuración por defecto que usa PBB para la pantalla LCD son los siguientes.
Modo de 4 Bits con dos pines de control (RS, E).

RA0 --> D4
RA1 --> D5
RA2 --> D6
RA3 --> D7
RA4 --> RS
RB3 --> E


Como en algunos PIC's el pin RA4 es drenador abierto, se debe colocar una resistencia pull-up de 4.7k.
En esta configuración el pin RW debe colocarse hacia VSS.

Está configuración no cambia con el tipo de PIC, puede ser un 16F84A, 16F628A, 16F877A,18FXXXX, etc.

La inicialización de la pantalla en PBP es automática con tan solo escribir la instrucción LCDOut.
Tampoco es necesario dar un tiempo antes de escribir, porque esto también lo hace la instrucción.
Si no se define la velocidad de trabajo, PBP asume una velocidad de 4MHz por defecto.

Para la configuración de pines por usuario se usa lo siguiente y puede ser encontrado en la ayuda de PBP.
' Set LCD Data port
DEFINE LCD_DREG PORTB
' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_DBIT 4
' Set LCD Register Select port
DEFINE LCD_RSREG PORTB
' Set LCD Register Select bit
DEFINE LCD_RSBIT 1
' Set LCD Enable port
DEFINE LCD_EREG PORTB
' Set LCD Enable bit
DEFINE LCD_EBIT 0
' Set LCD bus size (4 or 8 bits)
DEFINE LCD_BITS 4
' Set number of lines on LCD
DEFINE LCD_LINES 2
' Set command delay time in us
DEFINE LCD_COMMANDUS 2000
' Set data delay time in us
DEFINE LCD_DATAUS 50


Una escritura en pantalla con una configuración sencilla sería de esta forma...
Código:
[COLOR=SeaGreen]@ Device PIC16F877A[/COLOR] [COLOR=Blue]; Microcontrolador utilizado
; Palabra de configuración:[/COLOR]
[COLOR=SeaGreen]@ Device XT_OSC, WDT_OFF, PWRT_ON, BOD_OFF[/COLOR]

Inicio:
    [B]Low[/B]     PORTD.1[COLOR=Blue] ; Inicia el pin RD1 en 0[/COLOR]
    [B]LCDOut [/B] $FE,$80,[COLOR=Red]"Hola Mundo"[/COLOR]    [COLOR=Blue]; Escribe en la primer línea desde la posición 1.[/COLOR]
    [B]LCDOut [/B] $FE,$C0,[COLOR=Red]"Hello World" [/COLOR]  [COLOR=Blue]; Escribe en la segunda línea desde la posición 1.[/COLOR]
    
Programa:
    [B]Toggle[/B]  PORTD.1     [COLOR=Blue]; Cambia de estado el pin RD1[/COLOR]
    [B]Pause[/B]   500        [COLOR=Blue] ; Retardo de 500Ms.[/COLOR]
    [B]GoTo[/B]    Programa   [COLOR=Blue] ; Bucle infinito a la etiqueta Programa[/COLOR]
    
    [B]End[/B]                [COLOR=Blue] ; Fin del programa.[/COLOR]
El programa tan solo escribe una vez en la pantalla sobre las dos líneas y enciende un LED por RD1 (pin 20)
Es el clásico LED que parpadea para decir "Estoy Vivo".

Nótese que el programa es para un PIC16F877A y que los pines para RA3, RA2, RA1 y RA0 son análogos,
y que no se ha configurado el registro ADCON1 para hacer que funcionen cómo digitales.
Pese a esto, el programa funciona sin dicha configuración del modo digital.
Tampoco se declaró la frecuencia de trabajo que será de 4MHz por defecto.
Si se omite la palabra de configuración en el 16F877A también será por defecto XT_OSC,
pero se tendrán los fuses Watch Dog Timer y Brown Out Reset activos, y desactivado el Power On Reset.

Saludos.
 
Última edición:
Atrás
Arriba