TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Murdco25 en 28 de Mayo de 2009, 15:11:38

Título: Display LCD con PIC16f877
Publicado por: Murdco25 en 28 de Mayo de 2009, 15:11:38
Este codigo de mi pic  lo trato de simular en proteus pero no muestra nada estoy mal? espero me ayuden gracias solo quiero escribir el mensaje Hola.

Código: C
  1. #include <16f877.h>
  2. #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
  3. #use delay(clock=4000000)
  4.  
  5. #define LCD_DB4   PIN_B4
  6. #define LCD_DB5   PIN_B5
  7. #define LCD_DB6   PIN_B6
  8. #define LCD_DB7   PIN_B7
  9.  
  10. #define LCD_RS    PIN_C0
  11. #define LCD_RW    PIN_C1
  12. #define LCD_E     PIN_C2
  13.  
  14. #include "flex_lcd_2.c"
  15.  
  16.  
  17. void main()
  18. {
  19. lcd_init();
  20. do{
  21.   lcd_setcursor(1,0);
  22.   lcd_put_string_xy('x',1,1);
  23.  }while(TRUE);
  24. }
Título: Re: Display LCD con PIC16f877
Publicado por: Suky en 28 de Mayo de 2009, 15:18:29
Hola Murdco25! Bienvenido al foro. Muéstranos la librería para detectar el problema.
Título: Re: Display LCD con PIC16f877
Publicado por: Murdco25 en 28 de Mayo de 2009, 16:49:08
Hola gracia spor la respuesta tan rapida nuevamente agrego mi programa solo agregue  1 linea pero sigo con el y agrego la libreria gracias.

#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)

#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7

#define LCD_RS    PIN_C0
#define LCD_RW    PIN_C1
#define LCD_E     PIN_C2

#include "flex_lcd_2.c"


void main()
{
lcd_init();
do{
  lcd_setcursor(1,0);
  LCD_PUTC("hola");
  lcd_put_string_xy('x',1,1);
 }while(TRUE);
}



Libreria que  Utilizo.


// flex_lcd_2.c

//#define LCD_DB4   PIN_B4
//#define LCD_DB5   PIN_B5
//#define LCD_DB6   PIN_B6
//#define LCD_DB7   PIN_B7
//
//#define LCD_RS    PIN_C0
//#define LCD_RW    PIN_C1
//#define LCD_E     PIN_C2

// If you only want a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.

// #define USE_LCD_RW   1

//========================================

#define lcd_type 2        // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line

int8 const LCD_INIT_STRING[4] =
{
 0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
 0xc,                    // Display on
 1,                      // Clear display
 6                       // Increment cursor
 };


//-------------------------------------
void lcd_send_nibble(int8 nibble){
// Note:  !! converts an integer expression
// to a boolean (1 or 0).
 output_bit(LCD_DB4, !!(nibble & 1));
 output_bit(LCD_DB5, !!(nibble & 2));
 output_bit(LCD_DB6, !!(nibble & 4));
 output_bit(LCD_DB7, !!(nibble & 8));

 delay_cycles(1);
 output_high(LCD_E);
 delay_us(2);
 output_low(LCD_E);
}

//-----------------------------------
// This sub-routine is only called by lcd_read_byte().
// It's not a stand-alone routine.  For example, the
// R/W signal is set high by lcd_read_byte() before
// this routine is called.

#ifdef USE_LCD_RW
int8 lcd_read_nibble(void){
int8 retval;
// Create bit variables so that we can easily set
// individual bits in the retval variable.
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3

retval = 0;

output_high(LCD_E);
delay_cycles(1);

retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);

output_low(LCD_E);

return(retval);
}
#endif

//---------------------------------------
// Read a byte from the LCD and return it.

#ifdef USE_LCD_RW
int8 lcd_read_byte(void){
int8 low;
int8 high;

output_high(LCD_RW);
delay_cycles(1);

high = lcd_read_nibble();

low = lcd_read_nibble();

return( (high<<4) | low);
}
#endif

//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n){
output_low(LCD_RS);

#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif

if(address)
   output_high(LCD_RS);
else
   output_low(LCD_RS);

 delay_cycles(1);

#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
#endif

output_low(LCD_E);

lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}

//----------------------------
void lcd_init(void){
int8 i;

output_low(LCD_RS);

#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif

output_low(LCD_E);

delay_ms(15);

for(i=0 ;i < 3; i++)
   {
    lcd_send_nibble(0x03);
    delay_ms(5);
   }

lcd_send_nibble(0x02);

for(i=0; i < sizeof(LCD_INIT_STRING); i++)
   {
    lcd_send_byte(0, LCD_INIT_STRING);

    // If the R/W signal is not used, then
    // the busy bit can't be polled.  One of
    // the init commands takes longer than
    // the hard-coded delay of 60 us, so in
    // that case, lets just do a 5 ms delay
    // after all four of them.
    #ifndef USE_LCD_RW
    delay_ms(5);
    #endif
   }
delay_ms(15);
}

//----------------------------
// Posiciones válidas:
// de x=1 a x=16 y
// de y=1 a y=2

void lcd_gotoxy(int8 x, int8 y){

   int8 address;

   if(x > 0 && y > 0){
      if(y > 1)
         address = lcd_line_two;
      else
         address=0;

      address += x-1;

      lcd_send_byte(0, 0x80 | address); // Manda cursor a la posición
   }
}

//-----------------------------
void lcd_putc(char c)
{


/*'   LCD
'   Command     Operation
'   *********** *****************************************
'   $FE, 1      Clear display
'   $FE, 2      Return home
'   $FE, $0C    Cursor off
'   $FE, $0E    Underline cursor on
'   $FE, $0F    Blinking cursor on
'   $FE, $10    Move cursor left one position
'   $FE, $14    Move cursor right one position
'   $FE, $80    Move cursor to beginning of first line
'   $FE, $C0    Move cursor to beginning of second line
'   *********** ***************************************** */

 if(c>'\0'){
   switch(c){

      case '\f':
        lcd_send_byte(0,1);
        lcd_send_byte(0,2);
        delay_ms(2);
        break;

      case '\n':
        lcd_gotoxy(1,2);
        delay_ms(2);
        break;

      case '\b':
        lcd_send_byte(0,0x10);
        delay_ms(2);
        break;

      case '\t':
        lcd_send_byte(0,0x14);
        delay_ms(2);
        break;

      default:
        lcd_send_byte(1,c);
        delay_ms(2);
        break;
   }
 }
}

//------------------------------

void lcd_put_string(char *string){
   //put string, starting  from the curren cursor position
   //assume that string not excides from lcd displayed RAM
   char index=0;

   while(string[index]!=0){
      lcd_putc(string[index++]);
   }
}


//------------------------------
void lcd_put_string_xy(char *string, char x, char y){
   //assume that string not excides from lcd displayed RAM
   lcd_gotoxy(x,y);
   lcd_put_string(string);
}


//------------------------------
#ifdef USE_LCD_RW
char lcd_getc(int8 x, int8 y)
{
char value;

lcd_gotoxy(x,y);

// Wait until busy flag is low.
while(bit_test(lcd_read_byte(),7));

output_high(LCD_RS);
value = lcd_read_byte();
output_low(lcd_RS);

return(value);
}
#endif

//------------------------------
void lcd_setcursor(short visible, short blink) {
  lcd_send_byte(0, 0xC|(visible<<1)|blink);
}
Título: Re: Display LCD con PIC16f877
Publicado por: Suky en 28 de Mayo de 2009, 20:53:21
Proba con la librería que adjunto que funciona correctamente.
Título: Re: Display LCD con PIC16f877
Publicado por: Murdco25 en 29 de Mayo de 2009, 00:43:55
Hola muchas gracias funciona correctamente te agradesco tu ayuda es epor poder hacerte otra sprenta smas adelante ya que soy nuevo en esto de los pics y esoy haciendo un proyecto de unos contadores  bye.
Título: Re: Display LCD con PIC16f877
Publicado por: Murdco25 en 29 de Mayo de 2009, 00:46:49
Hola se me paso les  coloco  el programa por si les sirve a alguien solo borre 1 linea pero funciona bien despliegamuchas veces la palabra Hola.

#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)

#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7

#define LCD_RS    PIN_C0
#define LCD_RW    PIN_C1
#define LCD_E     PIN_C2

#include "flex_lcd.c"


void main()
{
lcd_init();
do{
  lcd_setcursor(1,0);
  LCD_PUTC("hola");
 }while(TRUE);
}
Título: Re: Display LCD con PIC16f877
Publicado por: Murdco25 en 03 de Junio de 2009, 23:06:22
Hola gracia spro la respeusta mira coloco mi programa en el cual   no funcina cada ves que  coloco la interrupcion global "" enable_interrupts(global); " deja de funionar mi programa  ya no me muestar pero si la quito la muestra y cuando lo quiero conectar con otro pic no funciona o puedes orientarme paar  conectar 2 pics. gracias


Código: C
  1. #include <16f877.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
  5. #use delay(clock=4000000)
  6. #use standard_io(b)
  7. #use standard_io(d)
  8. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
  9.  
  10.  
  11. #include "flex_lcd.c"
  12.  
  13. char Keypress=' ';
  14. char Serie[10];
  15. char Serie2;
  16. char temp[3];
  17. int i=0;
  18. int y = 0;
  19.  
  20.  
  21. #int_rda
  22. void serial_isr() {
  23.  
  24.   Keypress=0x00;
  25.  if(kbhit()){//Devuelve verdadero si hay un dato en RS232
  26. y = 1;
  27.  
  28.     Keypress=getc(); //El dato recivido lo coloca en keypress
  29.     if (Keypress !='\x0a')
  30.     {
  31.         sprintf(temp,"%c",Keypress);//copia keypress a temp
  32.         strcat(Serie,temp);//Coloca temp al final de serie
  33.     }
  34.     else
  35.        i = 1;//nos indica que ha recivido una cadena de caracteres completa
  36.   }
  37.  
  38.   }
  39.  
  40.  
  41. void main()
  42. {
  43.  
  44.  
  45. enable_interrupts(global);
  46. enable_interrupts(int_rda);
  47. strcpy(Serie2,"CLAVE_X");
  48.  
  49. lcd_init();
  50. do{
  51.  
  52. if ( y == 1 )
  53. lcd_putc("SI");
  54. else
  55. lcd_putc("NO");
  56.  
  57.              if ( i == 1 )
  58.              {
  59.                lcd_putc(Serie);
  60.                strcpy(Serie,"");//limpia
  61.                strcpy(temp,"");//limpia
  62.                i=0; //reinicia
  63.              }
  64.  
  65.    } while (TRUE);
  66.  
  67. }
Título: Re: Display LCD con PIC16f877
Publicado por: fidodido18 en 06 de Junio de 2009, 23:59:47
Hola gracia spro la respeusta mira coloco mi programa en el cual   no funcina cada ves que  coloco la interrupcion global "" enable_interrupts(global); " deja de funionar mi programa  ya no me muestar pero si la quito la muestra y cuando lo quiero conectar con otro pic no funciona o puedes orientarme paar  conectar 2 pics. gracias


Código: C
  1. #include <16f877.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
  5. #use delay(clock=4000000)
  6. #use standard_io(b)
  7. #use standard_io(d)
  8. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
  9.  
  10.  
  11. #include "flex_lcd.c"
  12.  
  13. char Keypress=' ';
  14. char Serie[10];
  15. char Serie2;
  16. char temp[3];
  17. int i=0;
  18. int y = 0;
  19.  
  20.  
  21. #int_rda
  22. void serial_isr() {
  23.  
  24.   Keypress=0x00;
  25.  if(kbhit()){//Devuelve verdadero si hay un dato en RS232
  26. y = 1;
  27.  
  28.     Keypress=getc(); //El dato recivido lo coloca en keypress
  29.     if (Keypress !='\x0a')
  30.     {
  31.         sprintf(temp,"%c",Keypress);//copia keypress a temp
  32.         strcat(Serie,temp);//Coloca temp al final de serie
  33.     }
  34.     else
  35.        i = 1;//nos indica que ha recivido una cadena de caracteres completa
  36.   }
  37.  
  38.   }
  39.  
  40.  
  41. void main()
  42. {
  43.  
  44.  
  45. enable_interrupts(global);
  46. enable_interrupts(int_rda);
  47. strcpy(Serie2,"CLAVE_X");
  48.  
  49. lcd_init();
  50. do{
  51.  
  52. if ( y == 1 )
  53. lcd_putc("SI");
  54. else
  55. lcd_putc("NO");
  56.  
  57.              if ( i == 1 )
  58.              {
  59.                lcd_putc(Serie);
  60.                strcpy(Serie,"");//limpia
  61.                strcpy(temp,"");//limpia
  62.                i=0; //reinicia
  63.              }
  64.  
  65.    } while (TRUE);
  66.  
  67. }

hola, no estoy seguro ahora mismo pero enable_interrups(global); se coloca despues de enable_interrupts(int_rda); prueba y me dices.
Título: Re: Display LCD con PIC16f877
Publicado por: Vash en 20 de Junio de 2009, 01:29:38
Antes que nada hola a todos los del foro.

Ahora si mi problema.

Acabo de hacer un termometro usando el pic 16f877A, un lm35 y un lcd JHD-162A y el problema al que me enfrento es que el lcd no imprime nada la simulacion me funciona de maravilla pero ya en el proto nada de nada, ya estuve buscando por todos lados y no, ya revise el codigo y las coneccion de los pines y al parecer todo esta bien, asi que es por ello que les pido ayuda para que alguien que ya haya esto fisicamente me oriente ya que simulado trabaja de maravilla, pero ya armado no muestra nada, a continuacion, el codigo, la simulacion y la foto de mi proto.

Código: [Seleccionar]
//Device/Fuses/Etc.-----------------------------
#include <16F877A.h>
#device adc=10
#include <math.h>
#fuses nowdt //No Watch Dog Timer
#fuses xt
#fuses noput //No Power Up Timer
#fuses noprotect //Code not protected from reading
#fuses nobrownout //No brownout reset
#fuses nolvp //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#fuses nocpd //No EE protection
#use delay(clock=4000000)
#include "lcd.c"
#use standard_io (D)

VOID MAIN(VOID){
   float TEMPE,VALUE;

   lcd_init();
   lcd_gotoxy(3,1);
   lcd_putc("Bienvenido");
   delay_ms(1000);
   lcd_putc("\f");
   
   lcd_gotoxy(1,1);
   lcd_putc("Termometro\nDigital");
   delay_ms(1000);
   lcd_putc("\f");
   
   lcd_gotoxy(1,1);
   lcd_putc("Temperatura");
   delay_us(1500);
   
   setup_port_a( ALL_ANALOG );
   while(true){
      setup_adc(ADC_CLOCK_DIV_32);
      set_adc_channel(0);//se elige el RA0
      delay_us(20);
      VALUE = read_adc();
      setup_adc( ADC_OFF );
      TEMPE=(VALUE*(0.48875));
      lcd_gotoxy(1,2);
      printf(lcd_putc,"Actual: %02.1F  C",TEMPE); //XXX.X C
      delay_us(100);
   }
}

(http://img195.imageshack.us/img195/8320/dibujokwd.jpg)

(http://img199.imageshack.us/img199/1748/dsc03353g.jpg)

el pic y el lcd, no son el problema, ya los probe con un contador que hic en ensamblador y funcionan.

Nos vemos y espero su ayuda
Título: Re: Display LCD con PIC16f877
Publicado por: Suky en 20 de Junio de 2009, 02:21:18
Prueba cambiando a la librería flex_lcd, unos mensajes mas arriba esta adjuntada. Y también debes agregar un potenciometro para controlar el contraste, que no lo estoy viendo.
Título: Re: Display LCD con PIC16f877
Publicado por: jhozate en 20 de Junio de 2009, 16:41:26
cual es la diferencia en usar la libreria flex y la que trae el ccs?...en la libreria flex puedo cambiar los pines de control y los del bus de datos?...es decir cambiar estas lineas

#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7

#define LCD_RS     PIN_C0
#define LCD_RW    PIN_C1
#define LCD_E       PIN_C2
Título: Re: Display LCD con PIC16f877
Publicado por: Suky en 20 de Junio de 2009, 16:57:24
Es mas "maleable" ya que se pueden elegir los pines a gusto, de distintos puertos, que en la de CCS no.
Título: Re: Display LCD con PIC16f877
Publicado por: jhozate en 20 de Junio de 2009, 17:05:14
pero es q cuando uno hace el proyecto a traves del pic wizard hay una pestaña "lcd" donde se pueden configurar los pines de control y hay q especificar la direccion del puerto a usar
Título: Re: Display LCD con PIC16f877
Publicado por: Suky en 20 de Junio de 2009, 18:28:45
pero es q cuando uno hace el proyecto a traves del pic wizard hay una pestaña "lcd" donde se pueden configurar los pines de control y hay q especificar la direccion del puerto a usar
:? Mirando la librería de CCS se ve que eso no es posible. Utiliza un puerto para los bits de control y data.
Título: Re: Display LCD con PIC16f877
Publicado por: jhozate en 20 de Junio de 2009, 19:25:28
mira la imagen q adjunto, esas opciones no son para configurar el lcd con la libreria de ccs? hay se puede escoger el puerto a utilizar y los bit de control
Título: Re: Display LCD con PIC16f877
Publicado por: Suky en 20 de Junio de 2009, 19:44:53
mira la imagen q adjunto, esas opciones no son para configurar el lcd con la libreria de ccs? hay se puede escoger el puerto a utilizar y los bit de control
Recién lo he probado, pero las definiciones que realiza no corresponden con la librería  :shock: Así que no tendrán ningún efecto en la misma. Otra chanchada de los amigos de CCS  :?
Título: Re: Display LCD con PIC16f877
Publicado por: fidodido18 en 20 de Junio de 2009, 20:52:03
mira la imagen q adjunto, esas opciones no son para configurar el lcd con la libreria de ccs? hay se puede escoger el puerto a utilizar y los bit de control
Recién lo he probado, pero las definiciones que realiza no corresponden con la librería  :shock: Así que no tendrán ningún efecto en la misma. Otra chanchada de los amigos de CCS  :?

HOla a todos, yo alguna vez presente ese problema... y si no estoy mal debes estar trabajando con un cristal de 20 Mhz, cambialo a uno de 4 Mhz y utiliza la libreria que te pasaron...
mira bien la configuracion de los pines del 16f877a que veo algo sospechoso en la protoboar...
y no mandes ninguno de los pines a tierra conectalos todos... estoy seguro que cuando conectes todos se te arregla el problema...
Título: Re: Display LCD con PIC16f877
Publicado por: jhozate en 20 de Junio de 2009, 21:21:17
mira la imagen q adjunto, esas opciones no son para configurar el lcd con la libreria de ccs? hay se puede escoger el puerto a utilizar y los bit de control
Recién lo he probado, pero las definiciones que realiza no corresponden con la librería  :shock: Así que no tendrán ningún efecto en la misma. Otra chanchada de los amigos de CCS  :?

 :shock: :? pero que mal ...entonces para qué!! esta esa opcion ahi??
Título: Re: Display LCD con PIC16f877
Publicado por: MLO__ en 20 de Junio de 2009, 21:55:00
En la v4.088 la lcd si se deja configurar a gusto ...
Título: Re: Display LCD con PIC16f877
Publicado por: gera en 20 de Junio de 2009, 22:17:27
Una pregunta, la linea:
  LCD_PUTC("hola");
es valida? acaso esa funcion no es para colocar solo un caracter? porq con la libreria lcd q trae CCS si queremos mostrar un string hay q hacer un
  printf(lcd_putc, "hola");
Es todo un tema el LCD, a mi siempre me da problemas jeje.
saludos!!!
Título: Re: Display LCD con PIC16f877
Publicado por: Vash en 21 de Junio de 2009, 03:57:56
Hola gracias por responder tan rapido  :) me alegra mucho la participacion del foro, voy a probar esta nueva libreria, en cuanto al pin 3 del lcd no hay problema si se conecta a tierra en lugar de un potenciometro ya que no es un pin de control, y al conectarlo a tierra simplemente estamos dando resistencia 0 es decir el mayor contraste, bueno asi debe de ser pero ya ven que en esto asi es a veces jala con algo y luego jalo sin eso  :lol: aun asi tambien voy a probar lo del potenciometro, voy a darme prisa con la nueva libreria, les comento y si surgen problemas espero me ayuden, solo una pregunta los comando del lcd con esta nueva libreria son los mismos?

solo les dejo una foto de lo que les comento con el potenciometro para que vean que efectivamente no afecta, solo que este lo hice en ensamblador  :), y estoy aprendiendo a programar el pic en CCS me parece muy interesante y me interesa mucho, de hecho estaba muy animado con esto del CCS ya que programaba en 15 min lo que antes me llevaba horas, aunque ahora que lo intente en el proto no salio :( saludos y nos vemos.

(http://img190.imageshack.us/img190/755/dsc03365w.jpg)


Ah lo olvidaba tambien estoy usando un XT de 4Mhz.

Nos vemos
Título: Re: Display LCD con PIC16f877
Publicado por: Suky en 21 de Junio de 2009, 12:42:20
Sip, los comandos son los mismos!
Título: Re: Display LCD con PIC16f877
Publicado por: Vash en 22 de Junio de 2009, 16:35:29
Muchas gracias por la yuda, ya quedo  :) . El unico cambio que hice fue la libreria, nos vemos
Título: Re: Display LCD con PIC16f877
Publicado por: Vash en 20 de Julio de 2009, 13:43:43
Hola.

Ya arme el termometro y ya funciona, solo hay un unico detalle y es que a la hora de simular me salen unos mensajes referente al lcd y al puerto, ya probe cambiando de puerto y siguen saliendo, cabe aclarar que funciona bien fisicamente sin importar eso, les dejo la imagen de la simulacion en proteus con los mensajes que les digo, a que se deben?

(http://img29.imageshack.us/img29/391/termometro.jpg) (http://img29.imageshack.us/i/termometro.jpg/)

Logic contention(s) detected on net------> es lo que dice el mensaje.

y aqui el codigo.

//Device/Fuses/Etc.-----------------------------
#include <16F877A.h>
#device adc=10
#include <math.h>
#fuses nowdt //No Watch Dog Timer
#fuses xt
#fuses put //No Power Up Timer
#fuses noprotect //Code not protected from reading
#fuses nobrownout //No brownout reset
#fuses nolvp //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#fuses nocpd //No EE protection
#use delay(clock=4000000)
#include <flex_lcd.c>
#use standard_io(A)
#use standard_io(B)

VOID MAIN(VOID){
   float TEMPE,VALUE;

   lcd_init();
   lcd_gotoxy(3,1);
   lcd_putc("Bienvenido");
   delay_ms(1000);
   lcd_putc("\f");
   
   lcd_gotoxy(1,1);
   lcd_putc("Termometro\nDigital");
   delay_ms(1000);
   lcd_putc("\f");
   
   lcd_gotoxy(1,1);
   lcd_putc("Temperatura");
   delay_us(1500);
   
   while(true){
      setup_port_a( ALL_ANALOG );
      setup_adc(ADC_CLOCK_DIV_32);
      set_adc_channel(0);//se elige el RA0
      delay_us(20);
      VALUE = read_adc();
      setup_adc( ADC_OFF );
      TEMPE=(VALUE*(0.48875));
      lcd_gotoxy(1,2);
      printf(lcd_putc,"Actual: %02.1F  C",TEMPE); //XXX.X C
      delay_ms(100);
   }
}
 

Nos vemos y gracias.

Título: Re: Display LCD con PIC16f877
Publicado por: jhozate en 20 de Julio de 2009, 13:46:38
si a pesar de que funciona perfectamente a mi tambien me aparecen esos mensajes, es como si no se detectara la conexion entre los pines q se especifican
Título: Re: Display LCD con PIC16f877
Publicado por: pajaro en 27 de Julio de 2009, 18:37:34
Muchas gracias por la yuda, ya quedo  :) . El unico cambio que hice fue la libreria, nos vemos

Hola amigo,
podrías verificarme que es lo que cambiaste, antes no te funcionaba, pero ahora si,
que le cambiaste, solo la libreria del lcd puedes lincarme las dos librerias quiero echarles un ojo, igales iguales, pero que una no funciona,

Te importaria cargarlas en tu proximo post.

Un saludo.
Título: Re: Display LCD con PIC16f877
Publicado por: gabimelgar en 02 de Noviembre de 2009, 19:01:08
Hola gracia spro la respeusta mira coloco mi programa en el cual   no funcina cada ves que  coloco la interrupcion global "" enable_interrupts(global); " deja de funionar mi programa  ya no me muestar pero si la quito la muestra y cuando lo quiero conectar con otro pic no funciona o puedes orientarme paar  conectar 2 pics. gracias


Hola Murdco, como estas?
Pudiste solucionar el problema de las interrupciones? me pasa lo mismo q a vos, cuando coloco la sentencia:

enable_interrupts(int_rda);    //activo interrupcion serial rs-232
enable_interrupts(global);    //habilito la interrupcion

me deja de funcionar el lcd, ya probe cambiandola de orden, pero nada.
Alguien tiene idea de q puede estar pasando?
lo raro es q en la simulación del isis anda perfecto.
les dejo mi codigo para ver si me pueden dar una mano:

Código: [Seleccionar]
#include <16F877A.h>                         /* PIC16F877A */
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //manejo del RS232


#include <flex_lcd.c>
//#include <kbd.c>
#include <stdlib.h>
#include <math.h>


#define SUBE_IP  input(pin_d5)
#define BAJA_IP  input(pin_d4)
#define RED  pin_C0
#define GREEN  pin_C1
#define BLUE  pin_C2


int IP=1;
char flag=0,var=11; //variables globales
char * str[] = "0123456789";

///LLAMADA FUNCION INTERRUPCION
#int_rda
void rs232()
{
   BYTE i=0,j=0,address,value; //definicion...
   char digito; //...variables
   char string[30];
   int len=0;
   char dirIp[4];

   disable_interrupts(global); //apago interrupcion
   gets(string);

   len=strlen(string);
   //quito los caracteres \n y \r
   string[len-1]=0;
   string[len-2]=0;
   strncpy (dirIp, string, 3);
   lcd_gotoxy(1,1);
   if (atoi(dirIp) == IP){ //si es para mi
      printf(lcd_putc,"Mio");
      lcd_gotoxy(1,2);
      printf(lcd_putc,string);
   }else{ //si no es para mi
      printf("%s \n\r",string);
      printf(lcd_putc,"\fNo Mio");
   }

   enable_interrupts(global); //activamos de nuevo la interrupcion serial rs-232
}


///PROGRAMA
void main(void)
{
   int p1=1,p2=1,s=0,b=0,color=0;
//   char tmp[3]="aa";
//   ext_int_edge(H_TO_L); // Habilita interrupcion por flanco H_to_L
   enable_interrupts(int_rda); //activo interrupcion serial rs-232
   enable_interrupts(global); //habilito la interrupcion
   lcd_init();
   lcd_putc("Espera");

   do{ //bucle...
      if(SUBE_IP){
         output_high(RED);
         output_low(GREEN);
         if (s){
            lcd_gotoxy(1,2);
            IP++;
            printf(lcd_putc,"IP: %d ",IP);
            s=0;
         }
      }else{
         s=1;
      }
      if(BAJA_IP){
         output_high(GREEN);
         output_low(RED);
         if (b){
            lcd_gotoxy(1,2);
            IP--;
            printf(lcd_putc,"IP: %d ",IP);
            b=0;
         }
      }else{
         b=1;
      }
   }while(TRUE); //...infinito
}



Muchas Gracias
Título: Re: Display LCD con PIC16f877
Publicado por: Estorki en 14 de Febrero de 2012, 23:03:13
Suky, muchísimas gracias por la librería.

Llevo casi tres días tratando de escribir sin éxito mi propia librería para el LCD y con este flex_lcd.c me ha funcionado todo a la primera. Buscando información por google he llegado a este foro en múltiples ocasiones, asi que me complace ser nuevo miembro de lo que parece una fantástica comunidad.
Bueno, me he percatado que el hilo es del 2009, si hay alguna librería por el estilo más avanzada y quereis compartirla, pues encantado de la vida.

Muchas gracias a todos  :)