TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: O_R_E en 18 de Marzo de 2006, 14:05:00

Título: LCD 16x2 y PIC16F877
Publicado por: O_R_E en 18 de Marzo de 2006, 14:05:00
Hola muy buenas,

Estoy rezalizando una aplicación en la cual uso un PIC16F877, y un display HITACHI HD44780U. Los uso los 8 bits de datos, que están conectados al puerto D, y los bits de control RS(E0), R/W(E1) y E(E2).

Uso el compilador de C CCS, para realizar la programación. Con lo que uso el programa lcd.c del compilador. Observando durante bastante tiempo el foro al igual que el programa lcd.c, no estoy del todo seguro que instrucciones hay que modificar para asignar los pins de mi pic para que se "entienda" con con el display. Se que hay que desactivar los #define del puerto B y C, pero tengo dudas si este programa me servirá para 8 bits, ya que veo que solamente usa 4 bits.

Gracias de antemano.

Un saludo,
Título: RE: LCD 16x2 y PIC16F877
Publicado por: vszener en 18 de Marzo de 2006, 16:14:00
La libreria lcd.c de CCS  es de 4 bits...


Suerte!!!Giño
Título: RE: LCD 16x2 y PIC16F877
Publicado por: O_R_E en 19 de Marzo de 2006, 07:53:00
Hola,

Gracias por la respuesta, esto quiere decir que se puede modificar este programa (lcd.c), para hacer que funcione como 8 bits de datos en vez de cuatro?, y si es así es necesario realizar modificaciones muy grandes o simplemente las de definición de los registros que se realiza inicialmente.

Un saludo,
Título: RE: LCD 16x2 y PIC16F877
Publicado por: vszener en 19 de Marzo de 2006, 08:25:00
Poderse modificar s epodria, peor vamos que ya hay librerias que trabajan con 8 bits, ejemplo esta:
Codigo:

/*-------------------------------------------*
 |  KBD2.C                                   |
 |  Autor: Pedro Mª Jiménez                  |
 |  (c) Microsystems Engineering (Bilbao)    |
*-------------------------------------------*/

// Funciones para la gestión del teclado de la Trainer PLUS.

// char kbd_getc( )   Devuelve el código ASCII de la tecla pulsada.
//         Si no se pulsó ninguna, devuelve 0.


// Conexiones del teclado.
/*
            RB0 RB1 RB2 RB3
             ^   ^   ^   ^
             |   |   |   |
           |---|---|---|---|
  RB4 ---> | 1 | 2 | 3 | F |
           |---|---|---|---|
  RB5 ---> | 4 | 5 | 6 | E |
           |---|---|---|---|
  RB6 ---> | 7 | 8 | 9 | D |
           |---|---|---|---|
  RB7 ---> | A | 0 | B | C |
           |---|---|---|---|
*/

// Caracteres ASCII asociados a cada tecla:
char const KEYS[4][4] = {{"1","2","3","F"} ,
                         {"4","5","6","E"} ,
                         {"7","8","9","D"} ,
                         {"A","0","B","C"} };

#byte kbd_port_b = 6


char kbd_getc( )
{
  char tecla=0;
  int f,c,t,i,j;

  port_b_pullups(true);
  set_tris_b(0b00001111); // RB7-RB4 salidas, RB3-RB0 entradas

  for(f=0x10, i=0; i<4; f<<=1, i++)
  {
    for(c=0x01, j=0; j<4; c<<=1, j++)
    {
      kbd_port_b = ~f;
      delay_cycles(1);
      t = kbd_port_b & 0x0F;
      t = ~(t | 0xF0 );
      if(t == c)
      {
        delay_ms(20);
        tecla=KEYS[i ][j ];
        while(t==c)
        {
          restart_wdt( );
          t = kbd_port_b & 0x0F;
          t = ~(t | 0xF0) ;
        }
        break;
      }
    }
    if(tecla)
      break;
  }

  port_b_pullups(false);
  return tecla;
}


Te la puedes descargar de este enlace:
http://www.msebilbao.com/tienda/software.php
Donde pone curso practico 1.


Suerte!!!Giño
Título: RE: LCD 16x2 y PIC16F877
Publicado por: O_R_E en 19 de Marzo de 2006, 09:08:00
Hola,

Perdon, pero estoy hablando de modificar el archivo lcd.c de CCS, para poder enviar los caracteres a display de 16x2 con 8 bits, pero no mediante un teclado, posiblemente te haya confundido vszener. Me refiero a que deseo conectar mi PIC16F877 con el display con 8 bits y no con 4 como hace el archivo lcd.c y poder mostrar mensajes como valores procedentes del convesor AD MAX187.

Un saludo y gracias
Título: RE: LCD 16x2 y PIC16F877
Publicado por: vszener en 19 de Marzo de 2006, 09:28:00
Ups perdona!jeje sera la resaca de ayer que he copiado mal el archivo y te he posteado el del teclado!jeje aqui el lcd:
Codigo:

/*-------------------------------------------*
 |  LCD2.C                                   |
 |  Autor: Pedro M. Jimenez                  |
 |  (c) Microsystems Engineering (Bilbao)    |
*-------------------------------------------*/

// Funciones para la gestion del display LCD de la MicroPIC Trainer.

//  lcd_init( )   Debe ser llamada antes que las otras funciones.
//
//  lcd_putc(c)  Visualiza c en la siguiente posición del display.
//               Caracteres especiales de control:
//                      f  Borrar display
//                      
  Saltar a la segunda linea
//                        Retroceder una posición.
//
//  lcd_gotoxy(x,y) Selecciona la nueva posicion de escritura en el display.
//                  (la esquina superior izquierda es 1,1)
//
//  lcd_getc(x,y)   Devuelve el caracter de la posicion x,y del display.


#bit  lcd_enable = 5.2
#bit  lcd_rw     = 5.1
#bit  lcd_rs     = 5.0
#byte lcd_a = 5
#byte lcd_b = 6

#define LCD_LINEA2 0x40    // Direccion de memoria para la segunda linea
#define LCD_DATO    1
#define LCD_COMANDO 0

#define LCD_CLEAR        0x01
#define LCD_HOME    0x02

#define LCD_DISPLAY_OFF  0x08
#define LCD_DISPLAY_ON   0x0C
#define LCD_CURSOR_ON    0x0E
#define LCD_CURSOR_BLINK 0x0F

#define LCD_CURSOR_SHIFT_RIGHT  0x10
#define LCD_CURSOR_SHIFT_LEFT   0x14
#define LCD_DISPLAY_SHIFT_RIGHT 0x18
#define LCD_DISPLAY_SHIFT_LEFT  0x1C


int lcd_leer( )
{
  int valor;

  set_tris_a(0x18);
  set_tris_b(0xFF);

  lcd_rw = 1;
  delay_cycles(1);
  lcd_enable = 1;
  delay_cycles(1);
  valor = lcd_b;
  lcd_enable = 0;
  delay_us(40);

  set_tris_b(0x00);
  return valor;
}


void lcd_enviar(int dir, int valor)
{
  set_tris_a(0x00);
  set_tris_b(0x00);

  lcd_rs = 0;
  while( bit_test(lcd_leer( ),7)  );
  lcd_rs = dir;
  delay_cycles(1);

  lcd_rw = 0;
  delay_cycles(1);
  lcd_enable = 0;
  lcd_b = valor;
  delay_cycles(1);
  lcd_enable = 1;
  delay_us(2);
  lcd_enable = 0;
  delay_us(40);
}


void lcd_init( )
{
  int i;

  set_tris_a(0x18);
  set_tris_b(0x00);

  lcd_enable = 0;
  lcd_rw = 0;
  lcd_rs = 0;
  delay_ms(15);

  for(i=0; i<3; i++)
  {
    lcd_enviar(LCD_COMANDO,0x38);
    delay_ms(5 );
  }
  lcd_enviar(LCD_COMANDO,LCD_DISPLAY_ON);
  lcd_enviar(LCD_COMANDO,0x06);
  lcd_enviar(LCD_COMANDO,LCD_CLEAR);
  lcd_enviar(LCD_COMANDO,LCD_HOME);
}


void lcd_gotoxy( byte x, byte y) {
   byte dir;

   if(y!=1)
     dir=LCD_LINEA2;
   else
     dir=0;
   dir+=x-1;
   lcd_enviar(LCD_COMANDO,0x80|dir);
}


void lcd_putc( char c) {
   switch (c ) {
     case "f "   : lcd_enviar(LCD_COMANDO,0x01);
                   delay_ms(2);
                   break;
     case "
 "   : lcd_gotoxy(1,2);               break;
     case " "   : lcd_enviar(LCD_COMANDO,0x10);  break;
     default     : lcd_enviar(LCD_DATO,c);        break;
   }
}


char lcd_getc( int x, int y) {
   char valor;

    lcd_gotoxy(x,y) ;

    lcd_rs = 1;
    valor = lcd_leer( );
    lcd_rs = 0;

    return valor;
}


El sitio para descargarlo es el mismo del anterior post...


Suerte!!!Giño
Título: RE: LCD 16x2 y PIC16F877
Publicado por: O_R_E en 19 de Marzo de 2006, 10:42:00
Hola vszener,

Gracias por la ayuda, observare con detenimiento los archivos del post que me has enviado. Hay muchas cosas interesantes.

Un saludo,
Título: RE: LCD 16x2 y PIC16F877
Publicado por: O_R_E en 22 de Marzo de 2006, 15:23:00
Hola muy buenas,

He estado analizando con detenimiento todas las instrucciones, y tengo una pequeña duda; cuando insertamos la instrucción set_tris_a(0x18), en el ejemplo que me pasaste es para colocar en el puerto b 00011000, entonces mi pregunta es: ¿Porque no coloco directamente set_tris_a(0x00);?, no entiendo porque debo colocar un 18 en hex, y no un 00.
En mi caso utilizo el puerto E, aunque este consta de un registro de 8 bits para el puerto, ¿Es correcto que coloque set_tris_e(0x00), y no set_tris_e(0x18);?
Título: RE: LCD 16x2 y PIC16F877
Publicado por: vszener en 23 de Marzo de 2006, 06:46:00
Vamos haber se pone un 18H es decir en hexadecimal para declarar pines de entrada y de sañlida, en este caso interesa los de entrada ya que el puerto a, donde s eusa la instruccion set_tris_a();, se debe configurara como ya he dicho de entrada ya que s eencargara del control de la lcd, los pines E,RS Y RW...


Suerte!!!Giño