Autor Tema: Otra de lcds  (Leído 4559 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado DoNPNPoN

  • PIC10
  • *
  • Mensajes: 14
Otra de lcds
« en: 14 de Febrero de 2005, 05:22:00 »

Que libreria debo usar en el css par ahacer funcionar un apantalla de 16x2 con el bus a 8 bits?    

Se peude pasar el lcd de 8 a 4 bits como?

es para usarlo con un 16f84a en el puerto b.


Otra cosita los cristales de cuarzo se rompen mucho? esq aveces se me casca mas de uno.

Un saludo.

Desconectado gfp

  • PIC18
  • ****
  • Mensajes: 274
RE: Otra de lcds
« Respuesta #1 en: 14 de Febrero de 2005, 09:16:00 »
La libreria "lcd.c" te sirve, solo que viene paa trabajar a cuatro bits. Si la usas te daras cuenta que para el usuario es transparente pues no se nota ningún error o similar. No olvides que para utilizarla debes incluir la directiva:
#define use_portb_lcd TRUE si desea utilizarla por el puerto B. Revisa la libreria "LCD.C" y aprenderas mas de los comandos y todo eso.
C:Archivos de programaPICCDriversLCD.C

Y con respecto a los cristales de cuarzo no creo que se rompan mucho, a que te refieres?


gfp Sonrisa

Desconectado DoNPNPoN

  • PIC10
  • *
  • Mensajes: 14
RE: Otra de lcds
« Respuesta #2 en: 14 de Febrero de 2005, 09:35:00 »
Gracias por transmitirme tu sabiduria :P probare y os contare.


Segun he leido hay varias modificaciones del fichero lcd.c que no van con el css pero no las he visto.  
Lo de transparente que qieres decir con eso? que uno de 8 bits  se puede hacerse funcionar como uno de 4 bits?

un saludo.


Desconectado jorgeansuini

  • PIC18
  • ****
  • Mensajes: 340
RE: Otra de lcds
« Respuesta #3 en: 14 de Febrero de 2005, 10:45:00 »
Hola:

Esta libreria LCD.C no se de donde la copié ,pero me funciona bien y la ventaja es que uno puede definir cualquier pin del micro para manejar el LCD:


//include LCD para CCS

// La ventaja de este codigo es que puedes trabajar si lo quieres con pines
// dispersos es decir no estas sujeto a la mitad de un puerto


// Registros de Puertos A & B
#define PORTA 0x05 // Puerto A
#define PORTB 0x06 // Registro de direccionamiento Puerto A
#define TRISA 0x85 // Puerto B
#define TRISB 0x86 // Registro de direccionamiento Puerto B
#define PORTC 0x07 // Registro de direccionamiento Puerto C
#define TRISC 0x87 // Puerto C

// Definición de Puertos Pantalla LCD 40x20 Hitachi 44780
#bit lcd_db4 = PORTC.0
#bit tris_lcd_db4 = TRISC.0
#bit lcd_db5 = PORTC.1
#bit tris_lcd_db5 = TRISC.1
#bit lcd_db6 = PORTC.2
#bit tris_lcd_db6 = TRISC.2
#bit lcd_db7 = PORTC.3
#bit tris_lcd_db7 = TRISC.3
#bit lcd_en = PORTC.5
#bit tris_lcd_en = TRISC.5
#bit lcd_rs = PORTC.4
#bit tris_lcd_rs = TRISC.4


// lcd_init() Inicialización del LCD (debe utilizarse al principio,
// antes de trabajar con el LCD).
//
// lcd_putc(c) Imprime un caracter en el LCD.
//
// lcd_gotoxy(x,y) Selecciona la nueva posicion de escritura en el LCD.
// (la esquina superior izquierda es 1,1)
//
// lcd_getc(x,y) Devuelve el caracter de la posicion x,y del LCD.
//
// void lcd_erase_line(x) Borra una cantidad de caracter hacia la derecha

// Conexion a la pantalla LCD 40x4
// RC0 <---> LCD DB4
// RC1 <---> LCD DB5
// RC2 <---> LCD DB6
// RC3 <---> LCD DB7
// RC5 <---> LCD ENABLE
// RC4 <---> LCD RS
//

#define LCD_DATO 1
#define LCD_INST 0

#define LCD_LINEA1 0x80 // Direccion de memoria para la 1 linea
#define LCD_LINEA2 0xc0 // Direccion de memoria para la 2 linea
#define LCD_LINEA3 0x94 // Direccion de memoria para la 3 linea
#define LCD_LINEA4 0xd4 // Direccion de memoria para la 4 linea



// 7 6 5 4 3 2 1 0
// Function Set 0b 0 0 1 B L F 0 0
// Bus size, B:0=4 bits, B:1=8 bits
// Line Number, L:0=1 Line, L:1=2 Lines
// Font size F:0=5x8, F:1=5x10
#define LCD_FUNCTION_SET 0b00101000 // Bus=4bit, Line=2 & Font=5x8

// 7 6 5 4 3 2 1 0
// Display/Cursor 0b 0 0 0 0 1 D U B
// Set Display on/off, D:0=off, D:1=on
// Underline cursor, U:0=off, U:1=on
// Blinking cursor, B:0=off, B:1=on
#define LCD_DISPLAY_CURSOR 0b00001100 // Display=on, Scroll=off, Blinkin=off

// 7 6 5 4 3 2 1 0
// Entry Mode 0b 0 0 0 0 0 1 M S
// Cursor direction, M:0=left, 1=right
// Display Scroll, S:0=no scroll, S:1=scroll
#define LCD_ENTRY_MODE 0b00000110 // Increment cursor, no disp shift

void lcd_set_write() {
tris_lcd_db4 = 0; //
tris_lcd_db5 = 0; //
tris_lcd_db6 = 0; //
tris_lcd_db7 = 0; //---> Set portb RB0-RB3 mode output
}


void lcd_send_nibble(int8 n) {
if (bit_test(n,0)) //
lcd_db4 = 1; //
else //
lcd_db4 = 0; //

if (bit_test(n,1)) //
lcd_db5 = 1; //
else //
lcd_db5 = 0; //

if (bit_test(n,2)) //
lcd_db6 = 1; //
else //
lcd_db6 = 0; //

if (bit_test(n,3)) //
lcd_db7 = 1; //
else //
lcd_db7 = 0; //---> Set data nibble
delay_cycles(5); // nop
lcd_en = 1; // Habilita LCD Eneable __
delay_us(20); // Espera 2 uSeg. | |
lcd_en = 0; // Desabilita LCD Eneable __| |__
}

void lcd_send_byte (int1 select, int8 n) {
lcd_rs = 0; // Modo de instruccion
lcd_rs = select; // Escoje entre RS=0 : Instruccion & RS=1 : Data
delay_cycles(5); // nop
lcd_en = 0; // Desabilita LCD Eneable
lcd_send_nibble(n >> 4); // Envia los datos superiores MSB
lcd_send_nibble(n); // Envia los datos inferiores LSB
}

void lcd_init() {
int8 i, count=0;
lcd_set_write(); // Prepara el puerto DB4-DB7 como salida
tris_lcd_en = 0; //
tris_lcd_rs = 0; //---> Set porta RA0, RA1 & RA2 mode output
lcd_en = 0; //
lcd_rs = 0; //---> Clear LCD_EN, LCD_RW & LCD_RS
delay_ms(100);
retry:
for(i=1; i<=3; ++i) {
lcd_send_nibble(0b0011); // 8 bit mode 3 times
delay_ms(30);
}
lcd_send_nibble(0b0010); // 4 bit mode
lcd_send_byte(LCD_INST, LCD_FUNCTION_SET); // Function Set
lcd_send_byte(LCD_INST, LCD_DISPLAY_CURSOR); // Display Cursor
lcd_send_byte(LCD_INST, LCD_ENTRY_MODE); // Entry Mode
}

void lcd_gotoxy(int8 x, int8 y)
{
int8 const address[4]={LCD_LINEA1,LCD_LINEA2,LCD_LINEA3,LCD_LINEA4};
int8 pos;
pos=address[y-1]+(x-1);
lcd_send_byte (LCD_INST, pos);
}


void lcd_putc(char c) {
lcd_send_byte(LCD_DATO,c);
}

void lcd_clear() {
lcd_send_byte(LCD_INST,0x01);
}

void lcd_home() {
lcd_send_byte(LCD_INST,0x02);
}

void lcd_erase_line(int8 x) {
int8 i;
for(i=1;i<=x;++i) {
lcd_send_byte(LCD_DATO,32);
}
}


Saludos

Jorge

Desconectado DoNPNPoN

  • PIC10
  • *
  • Mensajes: 14
RE: Otra de lcds
« Respuesta #4 en: 14 de Febrero de 2005, 11:27:00 »
Voy a ver q modificaciones hay q hacerle para que sea en el puerto B los datos  y el a1 a2 para los de control del lcd.

Desconectado T0ni0

  • PIC16
  • ***
  • Mensajes: 196
RE: Otra de lcds
« Respuesta #5 en: 15 de Febrero de 2005, 03:46:00 »
Holas esta es la LCD:



Así he modificado el codigo:
Codigo:
//include LCD para CCS
// La ventaja de este codigo es que puedes trabajar si lo quieres con pines
// dispersos es decir no estas sujeto a la mitad de un puerto
// Registros de Puertos A & D

//****************************************************************
//  DEFINICION PARA EL 18F452
#define PORTA 0x80 // Puerto A
#define TRISA 0x92 //
#define PORTD 0x83 //
#define TRISD 0x95 // Registro de direccionamiento Puerto D
//*****************************************************************


// Definición de Puertos Pantalla LCD para PICDEM2 PLUS
#bit lcd_db4 = PORTD.0
#bit tris_lcd_db4 = TRISD.0
#bit lcd_db5 = PORTD.1
#bit tris_lcd_db5 = TRISD.1
#bit lcd_db6 = PORTD.2
#bit tris_lcd_db6 = TRISD.2
#bit lcd_db7 = PORTD.3
#bit tris_lcd_db7 = TRISD.3

#bit lcd_en = PORTA.1
#bit tris_lcd_en = TRISA.1
#bit lcd_rs = PORTA.3
#bit tris_lcd_rs = TRISA.3
#bit lcd_rw = PORTA.2
#bit tris_lcd_rw = TRISA.2


// lcd_init() Inicialización del LCD (debe utilizarse al principio,
// antes de trabajar con el LCD).
//
// lcd_putc(c) Imprime un caracter en el LCD.
//
// lcd_gotoxy(x,y) Selecciona la nueva posicion de escritura en el LCD.
// (la esquina superior izquierda es 1,1)
//
// lcd_getc(x,y) Devuelve el caracter de la posicion x,y del LCD.
//
// void lcd_erase_line(x) Borra una cantidad de caracter hacia la derecha

// Conexion a la pantalla LCD 40x4
//  <---> LCD DB4
//  <---> LCD DB5
//  <---> LCD DB6
//  <---> LCD DB7
//  <---> LCD ENABLE
//  <---> LCD RS
//  <---> LCD RW

#define LCD_DATO 1
#define LCD_INST 0

#define LCD_LINEA1 0x80 // Direccion de memoria para la 1 linea
#define LCD_LINEA2 0xc0 // Direccion de memoria para la 2 linea

// 7 6 5 4 3 2 1 0
// Function Set 0b 0 0 1 B L F 0 0
// Bus size, B:0=4 bits, B:1=8 bits
// Line Number, L:0=1 Line, L:1=2 Lines
// Font size F:0=5x8, F:1=5x10
#define LCD_FUNCTION_SET 0b00101000 // Bus=4bit, Line=2 & Font=5x8

// 7 6 5 4 3 2 1 0
// Display/Cursor 0b 0 0 0 0 1 D U B
// Set Display on/off, D:0=off, D:1=on
// Underline cursor, U:0=off, U:1=on
// Blinking cursor, B:0=off, B:1=on
#define LCD_DISPLAY_CURSOR 0b00001100 // Display=on, Scroll=off, Blinkin=off

// 7 6 5 4 3 2 1 0
// Entry Mode 0b 0 0 0 0 0 1 M S
// Cursor direction, M:0=left, 1=right
// Display Scroll, S:0=no scroll, S:1=scroll
#define LCD_ENTRY_MODE 0b00000110 // Increment cursor, no disp shift

void lcd_set_write() {
tris_lcd_db4 = 0; //
tris_lcd_db5 = 0; //
tris_lcd_db6 = 0; //
tris_lcd_db7 = 0; //---> Set portb RD0-RD3 mode output
}


void lcd_send_nibble(int8 n) {
if (bit_test(n,0)) //
lcd_db4 = 1; //
else //
lcd_db4 = 0; //

if (bit_test(n,1)) //
lcd_db5 = 1; //
else //
lcd_db5 = 0; //

if (bit_test(n,2)) //
lcd_db6 = 1; //
else //
lcd_db6 = 0; //

if (bit_test(n,3)) //
lcd_db7 = 1; //
else //
lcd_db7 = 0; //---> Set data nibble
delay_cycles(5); // nop
lcd_en = 1; // Habilita LCD Eneable __
delay_us(20); // Espera 2 uSeg. | |
lcd_en = 0; // Desabilita LCD Eneable __| |__
}

void lcd_send_byte (int1 select, int8 n) {
lcd_rs = 0; // Modo de instruccion
lcd_rs = select; // Escoje entre RS=0 : Instruccion & RS=1 : Data
delay_cycles(5); // nop
lcd_en = 0; // Desabilita LCD Eneable
lcd_send_nibble(n >> 4); // Envia los datos superiores MSB
lcd_send_nibble(n); // Envia los datos inferiores LSB
}

void lcd_init() {
int8 i, count=0;
lcd_set_write(); // Prepara el puerto DB4-DB7 como salida
tris_lcd_en = 0; //
tris_lcd_rs = 0; //---> Set porta RA0, RA1 & RA2 mode output
lcd_en = 0; //
lcd_rs = 0; //---> Clear LCD_EN, LCD_RW & LCD_RS
delay_ms(100);
retry:
for(i=1; i<=3; ++i) {
lcd_send_nibble(0b0011); // 8 bit mode 3 times
delay_ms(30);
}
lcd_send_nibble(0b0010); // 4 bit mode
lcd_send_byte(LCD_INST, LCD_FUNCTION_SET); // Function Set
lcd_send_byte(LCD_INST, LCD_DISPLAY_CURSOR); // Display Cursor
lcd_send_byte(LCD_INST, LCD_ENTRY_MODE); // Entry Mode
}

void lcd_gotoxy(int8 x, int8 y)
{
int8 const address[2]={LCD_LINEA1,LCD_LINEA2};
int8 pos;
pos=address[y-1]+(x-1);
lcd_send_byte (LCD_INST, pos);
}


void lcd_putc(char c) {
lcd_send_byte(LCD_DATO,c);
}

void lcd_clear() {
lcd_send_byte(LCD_INST,0x01);
}

void lcd_home() {
lcd_send_byte(LCD_INST,0x02);
}

void lcd_erase_line(int8 x) {
int8 i;
for(i=1;i<=x;++i) {
lcd_send_byte(LCD_DATO,32);
}
}



Pero nada de nada, ah!! que pasa con la señal rw? yo la he definido pero no estaba, por otra parte no se utiliza en ningún sitio EnfurruñadoEnfurruñadoEnfurruñado
- T0ni0 -
30RCF112

Desconectado DoNPNPoN

  • PIC10
  • *
  • Mensajes: 14
RE: Otra de lcds
« Respuesta #6 en: 15 de Febrero de 2005, 04:04:00 »
Muchas gracias, visitando el google vi que para conectar una de 8 bit como si fuera 4 bit habia q conectar los 4 primeros de datos a +5v segun http://www.x-robotics.com/rutinas.htm#LCD   ahroa mismo voya  probar esa rutina a ver q tal me va.

otra cosa donde pone


//  DEFINICION PARA EL 18F452

#define PORTA 0x80 // Puerto A

#define TRISA 0x92 //

#define PORTD 0x83 //

#define TRISD 0x95 // Registro de direccionamiento Puerto D



para un 16f84  habria q modifcar esto?


#define PORTA 0x80 // Puerto A

#define TRISA 0x92 //

#define PORTB 0x83 //

#define TRISB 0x95 /

pero no se como, todavia me hago un lio con el direccionamiento de los puertos.
un saludo

Desconectado jorgeansuini

  • PIC18
  • ****
  • Mensajes: 340
RE: Otra de lcds
« Respuesta #7 en: 15 de Febrero de 2005, 04:41:00 »
Hola:

La primera respuesta:
el pin R/W del display directamente lo tengo conectado a tierra, de esa manera el displey esta siempre en modo de escritura ya que yu nunca he tenido necesidad de leerlo.-

segunda respuesta:

para un 16f84 habria q modifcar asi:


#define PORTA 0x80 // Puerto A

#define TRISA 0x92 //

#define PORTB 0x81 //

#define TRISB 0x93 //


Aparte del driver LCD ¿cuál es el programa que estas utilizando para escribir el LCD?.-

Saludos

Jorge

Desconectado DoNPNPoN

  • PIC10
  • *
  • Mensajes: 14
RE: Otra de lcds
« Respuesta #8 en: 15 de Febrero de 2005, 04:47:00 »
en ccs
#include <16F84.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPUT,NOPROTECT
#use fast_io(B)
// #byte PORTB = 0x06
#include <lcdmodificado.c>


// PRINCIPAL ////

void main(void)
{
  lcd_init();
//  set_tris_b(0);           // esta puesto en la libreria del lcd
  printf(lcd_putc,"hola"Giño;
  while(1)
  {
  }
}


el esquema que yo habia sacado el pin rw estaba a tierra por eso me ha desconcertado un poco. todo lo demas es muy parecido

si no es much amolestia explicame las modificaciones que me ha scomentado antes


Desconectado DoNPNPoN

  • PIC10
  • *
  • Mensajes: 14
RE: Otra de lcds
« Respuesta #9 en: 15 de Febrero de 2005, 06:34:00 »
modificacion de la libreria pero nos e si me funciona.  he modificado lo del portc a portb


//****************************************************************

//  DEFINICION PARA EL 18F84

#define PORTA 0x80 // Puerto A

#define TRISA 0x92 //

#define PORTB 0x81 //

#define TRISB 0x93 //


//*****************************************************************





// Definición de Puertos Pantalla LCD para PICDEM2 PLUS

#bit lcd_db4 = PORTB.0

#bit tris_lcd_db4 = TRISB.0

#bit lcd_db5 = PORTB.1

#bit tris_lcd_db5 = TRISB.1

#bit lcd_db6 = PORTB.2

#bit tris_lcd_db6 = TRISB.2

#bit lcd_db7 = PORTB.3

#bit tris_lcd_db7 = TRISB.3



#bit lcd_en = PORTA.1

#bit tris_lcd_en = TRISA.1

#bit lcd_rs = PORTA.3

#bit tris_lcd_rs = TRISA.3

#bit lcd_rw = PORTA.2

#bit tris_lcd_rw = TRISA.2

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


Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: Otra de lcds
« Respuesta #10 en: 15 de Febrero de 2005, 08:48:00 »
Tengo el mismo problema, el LCD parece que hace algo, es un 20x4, y siguen apareciendo las 2 lineas como si no estubiera inicializado, aunq un poco mas claras, y el cursor hace tonterías... creo q lo tengo bien configurado... He introducido en la librería el control de la linea RW, pero sigue haciendo lo mismo que si la pongo a masa (si la pongo a "1" no hace nada klaroVacilando.

Alguna idea??

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: Otra de lcds
« Respuesta #11 en: 15 de Febrero de 2005, 10:17:00 »
ya está resuelto, parece que funciona, el problema lo tenía con el adc, la version q estoy usando en el ccs 3.218 tiene un bug q por defecto aparecen los conversores activos, para deshabilitarlos hay q poner esto:
main(){
setup_adc_ports(NO_ANALOGS);
lcd_init();
}
y a funcionar, por otro lado os pongo la librería modificada, le he ajustado los tiempos de inicialización, haciendolos mas pequeños (ya que los q tenía estaban muy por encima de los del datasheet) y va perfecta

Codigo:

//include LCD para CCS

// La ventaja de este codigo es que puedes trabajar si lo quieres con pines
// dispersos es decir no estas sujeto a la mitad de un puerto

// Registros de Puertos A
#define PORTA 0xf80 // Puerto A
#define TRISA 0xf92 // Tris A

// Definición de Puertos Pantalla LCD 40x20 Hitachi 44780
#bit lcd_db4 = PORTA.0
#bit tris_lcd_db4 = TRISA.0
#bit lcd_db5 = PORTA.1
#bit tris_lcd_db5 = TRISA.1
#bit lcd_db6 = PORTA.2
#bit tris_lcd_db6 = TRISA.2
#bit lcd_db7 = PORTA.3
#bit tris_lcd_db7 = TRISA.3
#bit lcd_en = PORTA.4
#bit tris_lcd_en = TRISA.4
#bit lcd_rs = PORTA.5
#bit tris_lcd_rs = TRISA.5


// lcd_init() Inicialización del LCD (debe utilizarse al principio,
// antes de trabajar con el LCD).
//
// lcd_putc(c) Imprime un caracter en el LCD.
//
// lcd_gotoxy(x,y) Selecciona la nueva posicion de escritura en el LCD.
// (la esquina superior izquierda es 1,1)
//
// lcd_getc(x,y) Devuelve el caracter de la posicion x,y del LCD.
//
// void lcd_erase_line(x) Borra una cantidad de caracter hacia la derecha

// Conexion a la pantalla LCD 40x4
// RA0 <---> LCD DB4
// RA1 <---> LCD DB5
// RA2 <---> LCD DB6
// RA3 <---> LCD DB7
// RA5 <---> LCD ENABLE
// RA4 <---> LCD RS
//

#define LCD_DATO 1
#define LCD_INST 0

#define LCD_LINEA1 0x80 // Direccion de memoria para la 1 linea
#define LCD_LINEA2 0xc0 // Direccion de memoria para la 2 linea
#define LCD_LINEA3 0x94 // Direccion de memoria para la 3 linea
#define LCD_LINEA4 0xd4 // Direccion de memoria para la 4 linea



// 7 6 5 4 3 2 1 0
// Function Set 0b 0 0 1 B L F 0 0
// Bus size, B:0=4 bits, B:1=8 bits
// Line Number, L:0=1 Line, L:1=2 Lines
// Font size F:0=5x8, F:1=5x10
#define LCD_FUNCTION_SET 0b00101000 // Bus=4bit, Line=2 & Font=5x8

// 7 6 5 4 3 2 1 0
// Display/Cursor 0b 0 0 0 0 1 D U B
// Set Display on/off, D:0=off, D:1=on
// Underline cursor, U:0=off, U:1=on
// Blinking cursor, B:0=off, B:1=on
#define LCD_DISPLAY_CURSOR 0b00001100 // Display=on, Scroll=off, Blinkin=off

// 7 6 5 4 3 2 1 0
// Entry Mode 0b 0 0 0 0 0 1 M S
// Cursor direction, M:0=left, 1=right
// Display Scroll, S:0=no scroll, S:1=scroll
#define LCD_ENTRY_MODE 0b00000110 // Increment cursor, no disp shift

#define LCD_CLEAR_DISPLAY 0b00000001 // Clear Display

void lcd_set_write()
{
   tris_lcd_db4 = 0; //
   tris_lcd_db5 = 0; //
   tris_lcd_db6 = 0; //
   tris_lcd_db7 = 0; //---> Set porta RA0-RA3 mode output
}


void lcd_send_nibble(int8 n)
{
   if (bit_test(n,0)) //
      lcd_db4 = 1; //
   else //
      lcd_db4 = 0; //
   if (bit_test(n,1)) //
      lcd_db5 = 1; //
   else //
      lcd_db5 = 0; //
   if (bit_test(n,2)) //
      lcd_db6 = 1; //
   else //
      lcd_db6 = 0; //
   if (bit_test(n,3)) //
      lcd_db7 = 1; //
   else //
      lcd_db7 = 0; //---> Set data nibble
   delay_cycles(1); // nop
   lcd_en = 1; // Habilita LCD Enable __
   delay_us(2); // Espera 2 uSeg. | |
   lcd_en = 0; // Desabilita LCD Enable __| |__
}

void lcd_send_byte (int1 select, int8 n)
{
   lcd_rs = 0; // Modo de instruccion
   lcd_rs = select; // Escoje entre RS=0 : Instruccion & RS=1 : Data
   delay_cycles(5); // nop
   lcd_en = 0; // Desabilita LCD Eneable
   lcd_send_nibble(n >> 4); // Envia los datos superiores MSB
   lcd_send_nibble(n); // Envia los datos inferiores LSB
}

void lcd_init()
{
   int8 i, count=0;
   lcd_set_write(); // Prepara el puerto DB4-DB7 como salida
   tris_lcd_en = 0; //
   tris_lcd_rs = 0; //---> Set porta RA0, RA1 & RA2 mode output
   lcd_en = 0; //
   lcd_rs = 0; //---> Clear LCD_EN, LCD_RW & LCD_RS
   delay_ms(15);
//   retry:
   for(i=1; i<=3; ++i)
   {
      lcd_send_nibble(0b0011); // 8 bit mode 3 times
      delay_ms(5);
   }
   lcd_send_nibble(0b0010); // 4 bit mode
   lcd_send_byte(LCD_INST, LCD_FUNCTION_SET); // Function Set
   lcd_send_byte(LCD_INST, LCD_DISPLAY_CURSOR); // Display Cursor
   lcd_send_byte(LCD_INST, LCD_ENTRY_MODE); // Entry Mode
   lcd_send_byte(LCD_INST, LCD_CLEAR_DISPLAY); // Clear Display
}

void lcd_gotoxy(int8 x, int8 y)
{
   int8 const address[4]={LCD_LINEA1,LCD_LINEA2,LCD_LINEA3,LCD_LINEA4};
   int8 pos;
   pos=address[y-1]+(x-1);
   lcd_send_byte (LCD_INST, pos);
}

void lcd_putc(char c)
{
   lcd_send_byte(LCD_DATO,c);
}

void lcd_clear()
{
   lcd_send_byte(LCD_INST,0x01);
}

void lcd_home()
{
   lcd_send_byte(LCD_INST,0x02);
}

void lcd_erase_line(int8 x)
{
   int8 i;
   for(i=1;i<=x;++i)
   {
      lcd_send_byte(LCD_DATO,32);
   }
}



Salu2!

Desconectado DoNPNPoN

  • PIC10
  • *
  • Mensajes: 14
RE: Otra de lcds
« Respuesta #12 en: 15 de Febrero de 2005, 11:27:00 »
Joder estoy to liao. y m eempieza a desesperarme ami no m eninicializa ni na de na
Veamos explico desde el principio

Hard: 16f84a lcd hitachi 2x16 8bits conectando solo los ultimo s4 bits solamente.
          un cristal de 4 y 2 condensadores de 27
          solamente alimentado a 5 voltios
          Todo montado en una protoboard o como le digais.
           Datos al puerto b desde el rb0 al rb4 a los 4 ultimos bits del lcd
Soft  ide 3.403
        pcb 3.203
        pcm 3.203
        pch 3.203
 en teoria usando la lcd que viene por defecto en el ccs cambiando lo de define portb true tiene que servir pero no va.

Probando la libreria del T0ni0  cambiando lo del puerto c a b tal como hemos comentando en este mismo hilo tampoco

el programa que estoy usando es el siguiente.


#include <16F84.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPUT,NOPROTECT
#use fast_io(B)
#use fast_io(A)
#byte PORTB = 0x06
#byte PORTA = 0x05
#include <lcd16f84.c>

// PRINCIPAL /////////////////////////////////////
 
void main(void)
{

  lcd_init();
 set_tris_b(0);           //// declaramos el puerto B como salidas
  printf(lcd_putc,"hola"Giño;
}



Una limosnaaaaaa ;(

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Otra de lcds
« Respuesta #13 en: 15 de Febrero de 2005, 11:42:00 »
¿Has revisado el contraste?, ponle un potenciómetro entre Vdd y GND con la patilla central al pin 3 del LCD y dale vueltas, a ver si sale algo.

¿Los pines de control del lcd están bien conectados?

Desconectado DoNPNPoN

  • PIC10
  • *
  • Mensajes: 14
RE: Otra de lcds
« Respuesta #14 en: 15 de Febrero de 2005, 11:52:00 »
E--- Al pin de RA1
RS- Al pin de RA0
RW a tierra porq solo quiero grabar no leer
LCD--pic
D4---RB0
D5---RB1
D6---RB2
D7---RB3

el contraste me va desde que esta lapantalla negra hasta q no se ve nada.


 


 

anything