Autor Tema: Librería LCD.H - puertos B  (Leído 5517 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado diegogui

  • PIC10
  • *
  • Mensajes: 22
Librería LCD.H - puertos B
« en: 27 de Octubre de 2011, 10:26:31 »
Hola gente

Como se hace para que me tome el LCD_DATA los pines del micro RB7,RB6,RB5,RB4 y el RS(RB1) y EN(RB2), porque así como esta en el ejemplo toma 11110000 yo estaría necesitando 00001111, se puede hacer ese cambio ? y que significa el simbolo(^)? el micro que estoy usando es el pic16f874A.

La idea es usar todos los puertos B para el manejo del LCD , pero que los datos pasen por los puertos desde RB4 al RB7.

Saludos

Diego

La librería  que estoy utilizando es la siguiente:

/ My Modified LCD.C file to drive LCD from single PORT on PIC16F877 - USING PORTB

/*
* LCD interface example
* Uses routines from delay.c
* This code will interface to a standard LCD controller
* like the Hitachi HD44780. It uses it in 4 bit mode, with
* the hardware connected as follows (the standard 14 pin
* LCD connector is used):
*
* PORTB bits 0-3 are connected to the LCD data bits 4-7 (high nibble)
* PORTB bit 7 is connected to the LCD RS input (register select)
* PORTA bit 5 is connected to the LCD EN bit (enable)
*
* To use these routines, set up the port I/O TRISB then
* call lcd_init(), then other routines as required.
*
*
*/

#ifndef _XTAL_FREQ
// Unless specified elsewhere, 4MHz system frequency is assumed
#define _XTAL_FREQ 4000000
#endif




#include
#include "lcd.h"


#define LCD_RS PORTB,RB7
#define LCD_RW PORTB,RB2
#define LCD_EN PORTB,RB5


#define LCD_DATA PORTB



#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))

/* write a byte to the LCD in 4 bit mode */


int control_store;


void
lcd_write(unsigned char c)
{
__delay_us(40);
LCD_DATA = ( ( c >> 4 ) & 0x0F )^control_store;
LCD_STROBE();
LCD_DATA = ( c & 0x0F )^control_store;
LCD_STROBE();
}

/*
* Clear and home the LCD
*/

void
lcd_clear(void)
{
LCD_RS = 0;

control_store=PORTB&240; //BITWISE AND CONTROL_STORE WITH B'11110000' to filter out upper nibble

lcd_write(0x1);
__delay_ms(2);
}

/* write a string of chars to the LCD */

void
lcd_puts(const char * s)
{
LCD_RS = 1; // write characters

control_store=PORTB&240; //BITWISE AND CONTROL_STORE WITH B'11110000' to filter out upper nibble

while(*s)
lcd_write(*s++);
}

/* write one character to the LCD */

void
lcd_putch(char c)
{
LCD_RS = 1; // write characters

control_store=PORTB&240; //BITWISE AND CONTROL_STORE WITH B'11110000' to filter out upper nibble

lcd_write( c );
}


/*
* Go to the specified position
*/

void
lcd_goto(unsigned char pos)
{
LCD_RS = 0;

control_store=PORTB&240; //BITWISE AND CONTROL_STORE WITH B'11110000' to filter out upper nibble

lcd_write(0x80+pos);
}

/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
char init_value;

ADCON1 = 0x06; // Disable analog pins on PORTA

init_value = 0x3;


TRISB=0;

LCD_RS = 0;
LCD_EN = 0;
LCD_RW = 0;

control_store=PORTB&240; //BITWISE AND CONTROL_STORE WITH B'11110000' to filter out upper nibble


__delay_ms(15); // wait 15mSec after power applied,
LCD_DATA = init_value^control_store;
LCD_STROBE();
__delay_ms(5);
LCD_STROBE();
__delay_us(200);
LCD_STROBE();
__delay_us(200);
LCD_DATA = 2^control_store; // Four bit mode
LCD_STROBE();

lcd_write(0x28); // Set interface length
lcd_write(0xF); // Display On, Cursor On, Cursor blink
lcd_clear(); // Clear screen
lcd_write(0x6); // Set entry Mode
}


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Librería LCD.H - puertos B
« Respuesta #1 en: 27 de Octubre de 2011, 12:31:01 »


#ifndef _XTAL_FREQ
// Unless specified elsewhere, 4MHz system frequency is assumed
#define _XTAL_FREQ 4000000
#endif




#include
#include "lcd.h"


#define LCD_RS PORTB,RB7
#define LCD_RW PORTB,RB2
#define LCD_EN PORTB,RB5


#define LCD_DATA PORTB

......................

  Probá de definir los pines antes de incluir la librería.
  El símbolo ^ es para realizar una operación XOR
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Librería LCD.H - puertos B
« Respuesta #2 en: 27 de Octubre de 2011, 13:18:38 »
Código: [Seleccionar]
#define    LCD_RS_PIN            PIN_b6
#define    LCD_RW_PIN            PIN_b4
#define    LCD_ENABLE_PIN        PIN_c2
#define    LCD_DATA0             PIN_C1                                   
#define    LCD_DATA1             PIN_C0                                   
#define    LCD_DATA2             PIN_a2                                   
#define    LCD_DATA3             PIN_a1

#include <lcd.c>


asi se hace, solo pones las definiciones antes de incluir tu libreria y escoges los pines que quieras
"Nada es imposible, no si puedes imaginarlo"

Desconectado diegogui

  • PIC10
  • *
  • Mensajes: 22
Re: Librería LCD.H - puertos B
« Respuesta #3 en: 27 de Octubre de 2011, 20:03:45 »
Código: [Seleccionar]
#define    LCD_RS_PIN            PIN_b6
#define    LCD_RW_PIN            PIN_b4
#define    LCD_ENABLE_PIN        PIN_c2
#define    LCD_DATA0             PIN_C1                                   
#define    LCD_DATA1             PIN_C0                                   
#define    LCD_DATA2             PIN_a2                                   
#define    LCD_DATA3             PIN_a1

#include <lcd.c>

asi se hace, solo pones las definiciones antes de incluir tu libreria y escoges los pines que quieras

Modifique el código de la librería ,cadando de la siguiente forma

/*
 *   LCD interface example
 *   Uses routines from delay.c
 *   This code will interface to a standard LCD controller
 *   like the Hitachi HD44780. It uses it in 4 bit mode, with
 *   the hardware connected as follows (the standard 14 pin
 *   LCD connector is used):
 *
 *   PORTD bits 0-3 are connected to the LCD data bits 4-7 (high nibble)
 *   PORTA bit 3 is connected to the LCD RS input (register select)
 *   PORTA bit 1 is connected to the LCD EN bit (enable)
 *
 *   To use these routines, set up the port I/O (TRISA, TRISD) then
 *   call lcd_init(), then other routines as required.
 *
 */

#ifndef _XTAL_FREQ
 // Unless specified elsewhere, 4MHz system frequency is assumed
 #define _XTAL_FREQ 4000000
#endif


#include   <htc.h>
#include   "lcd.h"

#define   LCD_RS RB3
#define   LCD_RW RB2
#define   LCD_EN RB1

//#define LCD_DATA   PORTB


#define    LCD_DATA0             RB7
#define    LCD_DATA1             RB6
#define    LCD_DATA2             RB5
#define    LCD_DATA3             RB4

#define   LCD_STROBE()   ((LCD_EN = 1),(LCD_EN=0))

/* write a byte to the LCD in 4 bit mode */

void
lcd_write(unsigned char c)
{

        if(c & 0x80) LCD_DATA3=1; else LCD_DATA3=0;
   if(c & 0x40) LCD_DATA2=1; else LCD_DATA2=0;
   if(c & 0x20) LCD_DATA1=1; else LCD_DATA1=0;
   if(c & 0x10) LCD_DATA0=1; else LCD_DATA0=0;
   LCD_STROBE();
   if(c & 0x08) LCD_DATA3=1; else LCD_DATA3=0;
   if(c & 0x04) LCD_DATA2=1; else LCD_DATA2=0;
   if(c & 0x02) LCD_DATA1=1; else LCD_DATA1=0;
   if(c & 0x01) LCD_DATA0=1; else LCD_DATA0=0;
   LCD_STROBE();
      __delay_us(40);
}

/*
 *    Clear and home the LCD
 */

void
lcd_clear(void)
{
   LCD_RS = 0;
   lcd_write(0x1);
   __delay_ms(2);
}

/* write a string of chars to the LCD */

void
lcd_puts(const char * s)
{
   LCD_RS = 1;   // write characters
   while(*s)
      lcd_write(*s++);
}

/* write one character to the LCD */

void
lcd_putch(char c)
{
   LCD_RS = 1;   // write characters
   lcd_write( c );
}


/*
 * Go to the specified position
 */

void
lcd_goto(unsigned char pos)
{
   LCD_RS = 0;
   lcd_write(0x80+pos);
}

/* initialise the LCD - put into 4 bit mode */
void
lcd_init()
{
   char init_value;

   ADCON1 = 0x06;   // Disable analog pins on PORTA

   init_value = 0x3;
 
   TRISB=0;
   LCD_RS = 0;
   LCD_EN = 0;
   LCD_RW = 0;

   __delay_ms(15);   // wait 15mSec after power applied,
  LCD_DATA0 = 1;
  LCD_DATA1 = 1;
   LCD_STROBE();
   __delay_ms(5);
   LCD_STROBE();
   __delay_us(200);
   LCD_STROBE();
   LCD_DATA2=0;
   __delay_us(200);

   LCD_STROBE();

   lcd_write(0x28); // Set interface length
   lcd_write(0xF); // Display On, Cursor On, Cursor Blink
   lcd_clear();   // Clear screen
   lcd_write(0x6); // Set entry Mode
}

pero no me funciona , me debe estar faltando algo

Tambien envio una imagen de como esta conecto el lcd con el micro y el proyecto para que lo miren

Saludos,

Gracias

Diego

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Librería LCD.H - puertos B
« Respuesta #4 en: 27 de Octubre de 2011, 20:30:46 »
debes de definir tus pines antes de llamas a tu libreria
"Nada es imposible, no si puedes imaginarlo"

Desconectado diegogui

  • PIC10
  • *
  • Mensajes: 22
Re: Librería LCD.H - puertos B
« Respuesta #5 en: 28 de Octubre de 2011, 17:42:28 »
debes de definir tus pines antes de llamas a tu libreria

Disculpame que te joga , pero me podes enviar un ejemplo que algo seguramente que estoy haciendo mal, estoy usando el MPLABX

este es mi programa principal con las llamadas a todas la librerias
#include <pic168xa.h>
#include <htc.h>
#include "lcd.h"
#include "delay.h"


    void main(void) {


   TRISB=0;
   TRISA=0;

lcd_init();
lcd_goto(0x00);
lcd_puts("Inicializando...");
lcd_goto(0x40); //segunda linea

DelayUs(1300);

lcd_puts("HOLA MUNDO!!!");
     
}

, ahora si uno mira la libreria lcd.c dice


#ifndef _XTAL_FREQ
 // Unless specified elsewhere, 4MHz system frequency is assumed
 #define _XTAL_FREQ 4000000
#endif


#include   <htc.h>
#include   "lcd.h"

#define   LCD_RS  RA3
#define   LCD_RW RA2
#define   LCD_EN  RA1

#define LCD_DATA   PORTB


#define   LCD_STROBE()   ((LCD_EN = 1),(LCD_EN=0))

ahora como sabe que todo tiene que ir por la portb, si pruebo la lcd.c original , es decir , conecto a los RA y RB funciona , pero cuando pongo todo desde la RB no funciona.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Librería LCD.H - puertos B
« Respuesta #6 en: 28 de Octubre de 2011, 19:16:06 »
  ¿Por qué no probás con la librería que subí hace un tiempito? Es para Hitech y si bien yo no la he usado en físico, hay algunos miembros del foro que sí lo hicieron y les ha funcionado bien.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado diegogui

  • PIC10
  • *
  • Mensajes: 22
Re: Librería LCD.H - puertos B
« Respuesta #7 en: 28 de Octubre de 2011, 19:19:50 »
  ¿Por qué no probás con la librería que subí hace un tiempito? Es para Hitech y si bien yo no la he usado en físico, hay algunos miembros del foro que sí lo hicieron y les ha funcionado bien.

Me pasa el link

Gracias

Diego

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Librería LCD.H - puertos B
« Respuesta #8 en: 28 de Octubre de 2011, 23:58:53 »
Este es el link del tema. En el último mensaje está la última versión de la librería. http://www.todopic.com.ar/foros/index.php?topic=31090.0

Te recomiendo que leas todo el topic pues hay algunos ejemplos de uso que tal vez te puedan ser útil.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado diegogui

  • PIC10
  • *
  • Mensajes: 22
Re: Librería LCD.H - puertos B
« Respuesta #9 en: 07 de Noviembre de 2011, 00:14:05 »
Gracias a todos ya pudesolucionar el problema con

#define    LCD_RS_PIN            PIN_b6
#define    LCD_RW_PIN            PIN_b4
#define    LCD_ENABLE_PIN        PIN_c2
#define    LCD_DATA0             PIN_C1                                   
#define    LCD_DATA1             PIN_C0                                   
#define    LCD_DATA2             PIN_a2                                   
#define    LCD_DATA3             PIN_a1

Muchas gracias


 

anything