TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ncoliv en 17 de Julio de 2008, 20:43:10

Título: inicio en lcd
Publicado por: ncoliv en 17 de Julio de 2008, 20:43:10
como puedo visualizar una leyenda en un LCD 2X16. Como se utiliza el driver lcd.c del compilador ccsc en el posible programa. Existirá algún programa ejemplo?
MUchas gracias
Título: Re: inicio en lcd
Publicado por: Micro23 en 17 de Julio de 2008, 21:01:47
Hola ncoliv, en la carpeta donde se instala el PICC CCS ejemplos de todo tipo.
Aca va un ejemplo sencillito:
Código: C
  1. #include <16F877.h>
  2. #fuses HS,NOWDT,NOPROTECT,NOLVP
  3. #use delay(clock=20000000)
  4.  
  5.  
  6. #include <lcd.c>
  7.  
  8.  
  9. void main() {
  10.  
  11.    lcd_init();
  12.    delay_ms(6);
  13.  
  14.  
  15.    while(TRUE)
  16.    {
  17.      
  18.  
  19.       printf(lcd_putc,"Hello ncoliv");
  20.       delay_ms(500);
  21.    }
  22. }

Saludos espero que te sirva
Título: Re: inicio en lcd
Publicado por: MLO__ en 17 de Julio de 2008, 23:21:25
Hola.

Habria que fijar la direccion de la lcd para que no se corra el mensaje y la lcd se "llene" de saludos!!!!  :-)
Código: C
  1. #include <16F877.h>
  2. #fuses HS,NOWDT,NOPROTECT,NOLVP
  3. #use delay(clock=20000000)  
  4. #include <lcd.c>  
  5. void main()
  6. {  
  7.   lcd_init();
  8.   delay_ms(6);
  9.   while(TRUE)  
  10.  {    
  11.    lcd_gotoxy(1,1);    
  12.    printf(lcd_putc,"Hello ncoliv");
  13.    delay_ms(500);  
  14.  }
  15. }

saludos
Título: Re: inicio en lcd
Publicado por: ncoliv en 17 de Julio de 2008, 23:55:25
Muchas gracias por las respuestas.¿ Seria muy dificil implmentar un programita que muestre el incremento de un registro cuando el pic f877a reciba un pulso externo por uno de sus pines?
Gracias nuevamente.
Título: Re: inicio en lcd
Publicado por: MLO__ en 18 de Julio de 2008, 01:06:11
Hola.

No es complicado, debes asignar una variable unicamente y para mostrarla en la lcd usas la misma funcion printf
Código: C
  1. printf(lcd_putc,"Valor Registro = %u ", variable);

Revisa en la ayuda del CCS la funcion printf, para saber que letra colocar despues del simbolo %, ya que la letra varia si la variable es un entero(u) o un long(lu) o un hexadecimal(x) o un string(s) o un float(f) y hay mas.

Un codigo seria el siguiente (no lo he simulado ni lo he probado lo hice aqui aprovechando el que ya esta hecho, asi que revisalo)

Código: C
  1. #include <16F877.h>
  2. #fuses HS,NOWDT,NOPROTECT,NOLVP
  3. #use delay(clock=20000000)  
  4. #include <lcd.c>  
  5.  
  6. int8 pulsos=0;
  7.  
  8. #define in_pulsos pin_c0
  9.  
  10. void main()
  11. {    
  12.  lcd_init();  
  13.  lcd_putc("\fContador...");    
  14.  while(TRUE)  
  15.  {
  16.   while(!input_state(in_pulsos));//Espero hasta que el pulsador sea presionado  
  17.   delay_ms(300);//antirrebotes      
  18.   lcd_gotoxy(1,2);
  19.   printf(lcd_putc,"Variable= %u", pulsos++);  
  20.   delay_ms(1000);//una pulsacion por segundo    
  21.   }
  22. }

Saludos
Título: Re: inicio en lcd
Publicado por: ncoliv en 18 de Julio de 2008, 18:43:05
Gracias nuevamente. tengo el programa acrgado en el micro. LA conexión con el pic esta de acuerod a una pag que encontre al investigar, ( de cuatro para el bus de datos , puerto D y tres para el e, rs, rw)  . sucede que tengo encendido el LCD y no aparece ninún caracter, que puede estar pasando?  Los pines del LCD están dispuestos en dos filas de ocho columnas , tengo identificado los pines 1 y 2 y tbien el 15 y 16 estos últimos son positivo ( +5) y masa respectivamente. Tal disposición es standar para todos los LCD?. Tampoco se que controlador utiliza este  LCD. No tengo la hoja de características del LCD.
gracias.
Título: Re: inicio en lcd
Publicado por: Cryn en 18 de Julio de 2008, 19:13:46
talvez si usas el puerto b tengas que colocar:
#define use_portb_lcd TRUE
antes de incluir la libreria, qeudaria asi:

#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000) 
#define use_portb_lcd TRUE
#include <lcd.c>

y tendría que funcionar, ya que por defecto la lib de ccs te lleva el lcd al puerto d
Título: Re: inicio en lcd
Publicado por: ncoliv en 18 de Julio de 2008, 21:00:09
Estoy utilizando el puerto D del micro, la pregunta, sigue siendo si los pines del LCD son standares. No consigo visualización alguna. solo se ilumina el LCD.
Gracias
Título: Re: inicio en lcd
Publicado por: MLO__ en 18 de Julio de 2008, 23:12:58
Hola.

Revisa dentro de la libreria lcd.c la asignacion de pines para RW, E y RS ademas de los de D4, D5, D6 y D7. Si no corresponden puedes modificar la estructura para hacerlos coincidir.

Saludos
Título: Re: inicio en lcd
Publicado por: Cryn en 19 de Julio de 2008, 10:50:27
no te olvides tb colocar condensadores en la alimentacion uno de 100nF y por si las moscas de 10u tb a veces en fuentes de trafo ayuda mucho a suprimir picos, variaciones.
Título: Re: inicio en lcd
Publicado por: ncoliv en 20 de Julio de 2008, 18:54:44
Muchas gracias por las respuestas. Aún sigo sin observar nada en el LCD. Como puedo saber si un diplay está en condiciones, es decir no esta quemado. Lo que extraña es que al compilarlo no aparecen señales de error y al grabarlo los mensajes son todos satisfactortios ( trabajo con el picstart plus y con el mplab) .Con otros programas esta todo bien. Les mando elprograma que estoy probando, ademas de los que me enviaron Uds. por los que estoy muy agradecido.

//------Directivas para el compilador--------
#include <16f877a.h>                      //PIC utilizado
#fuses XT,NOWDT,NOPROTECT,NOLVP           //Configuramos los fuses
#use delay (clock=4000000)                //Oscilador a 4Mhz
#use fast_io(b)                           //Optimizamos E/S del PORTB
#use fast_io(c)                           //Optimizamos E/S del PORTC
#INCLUDE "lcd.c"                         //Incluyo LCD.C
//
//------Prototipos de funciones-----
void lcd_saludo_inicial(void);
//
//------------------------------------------------------------------------------
//------Programa principal----------
//------------------------------------------------------------------------------
void main(void) {
   //------Puertos y pines-------------
   #byte PORTB=0xF81
   #byte PORTC=0xF82
   #byte PORTD=0xF82
   //-----Inicializo el LCD y muestro el saludo inicial----------
   lcd_init();
   lcd_saludo_inicial();
}
//
//------------------------------------------------------------------------------
//FUNCIONES
//------------------------------------------------------------------------------
//Imprime saludo inicial.
void lcd_saludo_inicial(void) {
   Lcd_putc ("uControl.com.ar");   //Escribo en la primera fila
   delay_ms(2000);                 //Espero dos segundos
   lcd_gotoxy(4,2);                //columna 4, fila 2
   Lcd_putc( " LCD en CCS");       //Escribo en la segunda fila
   delay_ms(3000);                 //Espero tres segundos
   Lcd_putc( "\f");                //Limpio pantalla
}
Título: Re: inicio en lcd
Publicado por: MLO__ en 20 de Julio de 2008, 23:05:23
Hola.

La manera de probarlo es con el contraste, el cual se controla con el potenciometro que va a VEE de la LCD, recorrelo de extremo a extremo y en uno de los extremos van a aparecer cuadritos negros en la primera fila de la LCD.

Saludos
Título: Re: inicio en lcd
Publicado por: Cryn en 21 de Julio de 2008, 12:49:27
otra forma de probarlo podría ser en una forma manual, si te sabes, o por lo menos puedes comprender un poquito de ingles (como mi caso) este (http://www.4shared.com/file/45432416/6c16fcd/lcd1.html) pdf te puede servir, es muy util, aprendí muchas cosas de los lcd's con ese pdf

espero te sirva, un saludo.
Título: Re: inicio en lcd
Publicado por: ncoliv en 21 de Julio de 2008, 19:06:48
Gracias por los comentarios, solucione el problemita del lcd. continuaré incursionando en este apasionante tema. De nuevo gracias por su colaboración.
Título: Re: inicio en lcd
Publicado por: MLO__ en 21 de Julio de 2008, 23:23:40
Hola.

Que bien que lo solucionaras, seria bueno que compartieras que hiciste y en que consistio el error.

Saludos
Título: Re: inicio en lcd
Publicado por: ncoliv en 22 de Julio de 2008, 21:16:10
1° No tuve en cuenta la conección del contraste. 2°Habia una sentencia que me limpiaba el display al final del programa por eso es que no apreciaba ninguna leyenda.
evidentemente los pines son standares. por lo menos en los de 2X16.
Si duda que se aprende cuando las cosas no salen en la primera conexíón........
Título: Re: inicio en lcd
Publicado por: Cryn en 23 de Julio de 2008, 11:25:57
errores que uno casi siempre comente, pero de eso siempre se aprende, esa es la mejor parte

ahora sobre la compatibilidad, los lcd's hitachi hd44780 me animo a decir que siempre tienen compatibilidad de pines, pero otros lcd's con otro controlador quizá difieran en pines, siempre hay qeu tener en ceunta ese detalle
Título: Re: inicio en lcd
Publicado por: ncoliv en 24 de Julio de 2008, 14:26:53
Respecto a la configuración de una variable a la que voy a llamar pulsos (número entero ):
- Para que se pueda incrementar mediante pulsos externos  recibidos hasta 255 la declaré como: int8  Pulsos  y visualizarla con Printf como: Pulsos=%u.
Como necesito contar más de 255 pulsos declaro:
long  Pulsos y la visualizo mediante Printf como : Pulsos=%lu
Debería mediante esta configuración contar hasta 65536 porque a la variable la defino como de dos bytes pero el conteo es aproximadamente hasta un orden de 1700.
¿Que podría estar sucediendo?
Título: Re: inicio en lcd
Publicado por: MLO__ en 24 de Julio de 2008, 16:52:18
Hola.

A la hora de definir la variable, si quieres que coja todo el rango debes definirla como unsigned int16 y listo.

Saludos
Título: Re: inicio en lcd
Publicado por: ncoliv en 28 de Julio de 2008, 16:14:02
Solucionado el tema de la variable tal cual lo dijieron uds. Muchas gracias
Estoy realizando un programa que presente el incremento de una variable mediante un lcd cada vez que por uno de los pines del puerto b del pic se presente un  estado alto tensiòn. Cuando lo compilo me arroja una serie de errores que no logro corregir. por favor dejo el programa y podrìan decirme los errores que estoy cometiendo y corregirlos.
#include <16f877a.h>  //PIC utilizado         
#fuses XT,NOWDT,NOPROTECT,PUT  //Configuramos los fuses
#use delay (clock=4000000)     //Oscilador a 4Mhz
#use fast_io(b)   //Optimizamos E/S del PORTB
#include <lcd.c>
long int pulsos=0

//------Programa principal-----
void main(void)
{set_tris_b(0xfe);//Pin RB1 del puerto B como salida, el resto como entrada
 disable_interrupts(global);// Toda las interrupciones desactivadas
do{
   if(input(Pin_b1));
puslos++
lcd_init();
printf(lcd_putc,"pulsos= %lu"
}while(true);
}
Título: Re: inicio en lcd
Publicado por: Cryn en 28 de Julio de 2008, 19:17:23
te corrijo algunos errores que he visto:

#include <16f877a.h>  //PIC utilizado         
#fuses XT,NOWDT,NOPROTECT,PUT  //Configuramos los fuses
#use delay (clock=4000000)            //Oscilador a 4Mhz
#use fast_io(b)                             //Optimizamos E/S del PORTB
#include <lcd.c>
long int pulsos=0;
// acá quizá sea mejor declararlo como int16 o int32, para una mejor comprensión, pero long int tb vale

//------Programa principal-----
void main(void){
   set_tris_b(0xfe);              //Pin RB1 del puerto B como salida, el resto como entrada
   lcd_init();                       // este mejor al principio y despues te olvidas
   disable_interrupts(global);  // Toda las interrupciones desactivadas
   do{
      if(input(Pin_b1)){  //sin punto y coma
      //agrega un retardo antirrebote
         do{
            delay_ms(20);
         }while(input(pin_b1));

         pulsos++;
      printf(lcd_putc,"pulsos= %lu",pulsos);
   }
   }while(true);
}
Título: Re: inicio en lcd
Publicado por: jfh900 en 28 de Julio de 2008, 20:06:22
¿Por qué duplicas los post?:

http://www.todopic.com.ar/foros/index.php?topic=22654.msg180204#msg180204

un saludo
Título: Re: inicio en lcd
Publicado por: Cryn en 29 de Julio de 2008, 13:21:08
ni me había fijado ese otro post, que mal! :D :D

hay que tratar de colocar solamente una vez ncoliv, no podemos meter y meter cosas repetidas en el foro, ten más cuidado la proxima vez.

un saludo.