Autor Tema: LCD 2x16 serial 3 pines <|:-D  (Leído 21047 veces)

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

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
LCD 2x16 serial 3 pines <|:-D
« en: 29 de Julio de 2009, 05:15:46 »
Aqui esta la libreria que modificamos el amigo Duende_azul y pues yo  :D

BAsados en la bien conocidad flex_lcd para trabajar el lcd2x16 con ayuda de un registro de corrimiento con solo 3 pines del microcontrolador.

Como observan en el diagrama la pantalla se programa en modo 4 bits.

Los pines utilizados son :

LCD_E          Señal de control Enable de la pantalla.

LCD_CK        Señal de reloj del registro de corrimiento.

LCD_DAT     Salida del bit menos significativo hacia el registro de corrimiento.

Adjunto archivo *.ZIP
-Códigi fuente
-Libreria
-Diagrama de electrónico
-Simulación en proteus 7.2 sp2




- Aquí la libreria -
Código: [Seleccionar]
// flex_lcd_3_pins.c

//Modificación de Flex_lcd por Duende_Azul y Akenafab
//Trabaja con 3 pines y 74VHC164
//8-Bit Serial-In, Parallel-Out Shift Register

//La LCD se usa en modo 4bits
//Revisar diagrama de conexion Adjunto
//Se ha utilizado a una velocidad de @40MHz sin ningun problema

//No esta habilitada la lectura del LCD
//RW debe ir a gnd

//Definir pines antes de llamar libreria//
//#define LCD_E     PIN_A0
//#define LCD_CK    PIN_A1  
//#define LCD_DAT   PIN_A2

//========================================
int RS_bit;
#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, int rs_bit)
{

int x;
if(RS_bit==1)
   nibble=nibble|0x10;

for(x=0;x<5;x++){
         output_bit(LCD_DAT,shift_right(&nibble,1,0));
         delay_cycles(1);
         output_low(LCD_CK);
         delay_us(1);
         output_high(LCD_CK);}



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

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


if(address)
   //output_high(LCD_RS);
   RS_bit=1;
else
   //output_low(LCD_RS);
   RS_bit=0;

 delay_cycles(1);


output_low(LCD_E);

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

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

//output_low(LCD_RS);
RS_bit=0;

output_low(LCD_E);

delay_ms(20);

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

lcd_send_nibble(0x02,RS_bit);

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

    delay_ms(5);
    
   }

}

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

void lcd_gotoxy(int8 x, int8 y)
{
int8 address;

if(y != 1)
   address = lcd_line_two;
else
   address=0;

address += x-1;
lcd_send_byte(0, 0x80 | address);
}

//-----------------------------
void lcd_putc(char c)
{
 switch(c)
   {
    case '\f':                //limpia pantalla
      lcd_send_byte(0,1);
      delay_ms(8);
      break;

    case '\n':                //cambio de linea
       lcd_gotoxy(1,2);
       break;

    case '\b':                //retrocede 1 caracter
       lcd_send_byte(0,0x10);
       break;

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

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

void lcd_setcursor_vb(short visible, short blink) {
  lcd_send_byte(0, 0xC|(visible<<1)|blink);
}


- Ejemplo -

Código: [Seleccionar]
/*  http://www.todopic.com.ar/foros/   */
#include <16F88.h>

#FUSES INTRC_IO,NOWDT,PUT,MCLR,NOBROWNOUT,NOLVP,NOPROTECT,NODEBUG,CCPB0,NOFCMEN,NOIESO
#use delay(Internal=8M)


//------------ Pines del LCD ---------------------//
#define LCD_E     PIN_A0
#define LCD_CK    PIN_A1  
#define LCD_DAT   PIN_A2
//--------------------------------------------------//

#include "flex_lcd_3pins.c"            // Cargamos libreria del lcd


void main(){


delay_ms(100);

            output_a(0);
            output_b(0);

            lcd_init();              // inicializamos el LCD
            lcd_setcursor_vb(1,1);  //cursor visible,papadeo

while(1){

         printf(lcd_putc,"\f-LCD 3 pin Mode-\n* !.|.|..|.|.! *");
         delay_ms(1000);
         printf(lcd_putc,"\f* Duende_Azul  *\n *  Akenafab  *");
         delay_ms(1000);
        
         }//end while
            
}//end main

« Última modificación: 29 de Julio de 2009, 05:36:11 por AKENAFAB »

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: LCD 2x16 serial 3 pines <|:-D
« Respuesta #1 en: 29 de Julio de 2009, 06:30:38 »
muy buen aporte!!!!! espectacular!!... muchas gracias por compartirlo!!
saludos
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: LCD 2x16 serial 3 pines <|:-D
« Respuesta #2 en: 29 de Julio de 2009, 07:52:37 »
que bien me va a venir este aporte... muy bueno si señor.... muxas gracias.....
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: LCD 2x16 serial 3 pines <|:-D
« Respuesta #3 en: 30 de Julio de 2009, 00:52:29 »
uuuu que aportón!

buenísimo AKENA! :-/ :-/ :-/

thxs
.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: LCD 2x16 serial 3 pines <|:-D
« Respuesta #4 en: 30 de Julio de 2009, 03:07:58 »
 :mrgreen: gracias!

También crédito al pana Duende_azul  y sus respectivos  :-/ :-/

Estoy a la espera de los shift registers para probar con un pic12F  :laugh:

Desconectado setshomaru

  • PIC12
  • **
  • Mensajes: 66
Re: LCD 2x16 serial 3 pines <|:-D
« Respuesta #5 en: 05 de Agosto de 2009, 21:09:33 »
excelente señores, simplemente excelente
 :-/
entre mas se, me doy cuenta que no se nada

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: LCD 2x16 serial 3 pines <|:-D
« Respuesta #6 en: 05 de Agosto de 2009, 22:11:09 »
Genial!!! Muchas gracias!!!
Sigo sin entender por q no empiezan a venir modulos LCD i2c jeje.

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: LCD 2x16 serial 3 pines <|:-D
« Respuesta #7 en: 05 de Agosto de 2009, 22:14:32 »
casi todas las pantallas graficas OLED son por serial (las otras ya estan mandadas a recoger).

Lastima que las viejitas ya quedaron con toda esa mano de pines ... pero gracias a los amigos AKENA y DUENDE podemos hacer uso de ellas con 3 miseros pines jeje

Muy bueno el aporte muchachos.
El papel lo aguanta todo

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: LCD 2x16 serial 3 pines <|:-D
« Respuesta #8 en: 22 de Noviembre de 2009, 01:21:30 »
Jeje Me equivoque pero aun asi gracias por el Aporte
« Última modificación: 22 de Noviembre de 2009, 01:31:31 por darck_khronos »

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: LCD 2x16 serial 3 pines <|:-D
« Respuesta #9 en: 28 de Noviembre de 2009, 17:42:15 »
Disculpa puedo usar el 74ls165 es que me equivoque y por error compre ese o podria hacer algun arreglo para que funcionara de la misma manera???

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: LCD 2x16 serial 3 pines <|:-D
« Respuesta #10 en: 28 de Noviembre de 2009, 18:04:00 »
Disculpa puedo usar el 74ls165 es que me equivoque y por error compre ese o podria hacer algun arreglo para que funcionara de la misma manera???

No te sirve , el 74ls165 es paralelo-serie(con este pones el datos en los 8 pines y al hacer el clock , va sacando por 1 pin el dato).

y el que usamos es serie-paralelo.

Saludos!

Desconectado leoelectronic

  • PIC10
  • *
  • Mensajes: 29
Re: LCD 2x16 serial 3 pines <|:-D
« Respuesta #11 en: 05 de Marzo de 2012, 01:08:06 »
buenas amigo AKENAFAB he simulado el circuito con el 74LS164 me funciona  :) cuando lo monto en físico nada no funciona  :5] hay algún problema con que use el "74LS164"  y no el "74HC164"  :-/

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: LCD 2x16 serial 3 pines <|:-D
« Respuesta #12 en: 05 de Marzo de 2012, 01:09:15 »
buenas amigo AKENAFAB he simulado el circuito con el 74LS164 me funciona  :) cuando lo monto en físico nada no funciona  :5] hay algún problema con que use el "74LS164"  y no el "74HC164"  :-/

realmente no hay mucho solo es la velocidad de conmutacion, pero con la Ls es mas que suficiente

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: LCD 2x16 serial 3 pines <|:-D
« Respuesta #13 en: 27 de Julio de 2012, 01:31:58 »
Disculpe alguien no ah intentado modificar la de 24x4 para trabajarla tambien con 3 o 4 pines?

Desconectado PicTrance

  • PIC10
  • *
  • Mensajes: 6
Re: LCD 2x16 serial 3 pines <|:-D
« Respuesta #14 en: 29 de Diciembre de 2012, 15:19:52 »
Hola, basado en este driver hice uno para lcds de 4 lineas por 20 columnas,con sólo 3 pines.

esta librería la modifique a partir del "Flex_LCD420.c" mostrado aquí:
http://www.ccsinfo.com/forum/viewtopic.php?t=28268

y de la libreria "flex_lcd_3pins.c" mostrada aquimismo:
http://www.todopic.com.ar/foros/index.php?topic=27011.0

dejo link para descargar ejemplo y simulación.
http://www.mediafire.com/download.php?heac5cvq4jb04e6

"Que la disfruten"

Código: [Seleccionar]
/*  http://www.todopic.com.ar/foros/   */

//ejemplo modificado bye PicTrance (I.S.R.)
#include <16F88.h>

#FUSES INTRC_IO,NOWDT,PUT,MCLR,NOBROWNOUT,NOLVP,NOPROTECT,NODEBUG,CCPB0,NOFCMEN,NOIESO
#use delay(Internal=8M)
//#use rs232(baud=9600, xmit=PIN_b6, rcv=PIN_b7)

//------------ Pines del LCD ---------------------//
#define LCD_E     PIN_A0
#define LCD_CK    PIN_A1   
#define LCD_DAT   PIN_A2
//--------------------------------------------------//

#include "flex_lcd4x20_3pines.c"            // Cargamos libreria del lcd

void main(){
   delay_ms(100);
   
   output_a(0);
   output_b(0);
   lcd_init();              // inicializamos el LCD
   lcd_setcursor_vb(1,1);  //cursor visible,papadeo
   while(1){
      printf(lcd_putc,"\f-LCD 3 pin Mode-\n* !.|.|..|.|.! *");
      printf(lcd_putc,"\n* PicTrance  *\n *  I.S.R.  *");
      delay_ms(1000);
      printf(lcd_putc,"\f* PicTrance  *\n *  I.S.R.  *");
      printf(lcd_putc,"\n-LCD 3 pin Mode-\n* !.|.|..|.|.! *");
      delay_ms(1000);
   }//end while           
}//end main

libreria

Código: [Seleccionar]
////////////////////////////////////////////////////////////////////////////////
///                        Flex_LCD4x20_3pines.c                             ///
///            Driver for temperature and humidity sensor                    ///
///            Realizado por PicTrance                                       ///
///            junio del 2011, Puebla - México                               ///
///            Compiler: CCS                                                 ///
///                                                                          ///
///            Modificacion del del felx_lcd_3pins.c  y del Flex_LCD420.c    ///
///                                                                          ///
/// lcd_init()  - Iicializa el sensor sht21 -                                ///
///                                                                          ///
/// lcd_putc(c) - para mandar a escribir en el LCD                           ///
///                                                                          ///
/// lcd_gotoxy(x,y) - para mandar el cursor auna posicion especifia en el lcd///
///                                                                          ///
/// lcd_setcursor_vb(visible,blink) - para hacer el cursor visible           ///
///                          u ocultaro y también poder hacer que parpadee   ///
///                                                                          ///
/// Modificación del felx_lcd_3pins.c y del Flex_LCD420.c                    ///
/// por PicTrance (I.S.R.)                                                   ///
/// Trabaja con 3 pines y 74VHC164                                           ///
/// 8-Bit Serial-In, Parallel-Out Shift Register                             ///
/// La LCD se usa en modo 4bits, Revisar diagrama de conexion Adjunto        ///
/// No esta habilitada la lectura del LCD                                    ///
/// RW debe ir a gnd                                                         ///
///                                                                          ///
/// Definir pines antes de llamar libreria                                   ///
/// #define LCD_E     PIN_A0                                                 ///
/// #define LCD_CK    PIN_A1                                                 ///
/// #define LCD_DAT   PIN_A2                                                 ///
////////////////////////////////////////////////////////////////////////////////

//Definir pines antes de llamar libreria//
//#define LCD_E     PIN_A0
//#define LCD_CK    PIN_A1   
//#define LCD_DAT   PIN_A2

// These are the line addresses for most 4x20 LCDs.
#define LCD_LINE_1_ADDRESS 0x00
#define LCD_LINE_2_ADDRESS 0x40
#define LCD_LINE_3_ADDRESS 0x14
#define LCD_LINE_4_ADDRESS 0x54

// These are the line addresses for LCD's which use
// the Hitachi HD66712U controller chip.
/*
#define LCD_LINE_1_ADDRESS 0x00
#define LCD_LINE_2_ADDRESS 0x20
#define LCD_LINE_3_ADDRESS 0x40
#define LCD_LINE_4_ADDRESS 0x60
*/

//========================================
int RS_bit;
int8 lcd_line; // para ir de linea en linea de las 4 del lcd
#define lcd_type 2   // 0=5x7, 1=5x10, 2=2 lines(or more)
 

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

//-----------------------------------------------
void lcd_send_nibble(int8 nibble, int rs_bit){
   int x;
   if(RS_bit==1)
      nibble=nibble|0x10;

   for(x=0;x<5;x++){
      output_bit(LCD_DAT,shift_right(&nibble,1,0));
      delay_cycles(1);
      output_low(LCD_CK);
      delay_us(1);
      output_high(LCD_CK);}

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

//----------------------------------------
// Send a byte to the LCD.

void lcd_send_byte(int8 address, int8 n){
//output_low(LCD_RS);
   RS_bit=0;
   delay_us(100);


   if(address)
      //output_high(LCD_RS);
      RS_bit=1;
   else
      //output_low(LCD_RS);
      RS_bit=0;

   delay_cycles(1);


   output_low(LCD_E);

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

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

   //output_low(LCD_RS);
   RS_bit=0;

   output_low(LCD_E);

   delay_ms(20);

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

   lcd_send_nibble(0x02,RS_bit);

   for(i=0; i < sizeof(LCD_INIT_STRING); i++){
      lcd_send_byte(0, LCD_INIT_STRING[i]);
      delay_ms(5);
   }
}

//----------------------------
void lcd_gotoxy(int8 x, int8 y){
   int8 address;

   switch(y){
      case 1:
         address = LCD_LINE_1_ADDRESS;
         break;
      case 2:
         address = LCD_LINE_2_ADDRESS;
         break;
      case 3:
         address = LCD_LINE_3_ADDRESS;
         break;
      case 4:
         address = LCD_LINE_4_ADDRESS;
         break;
      default:
         address = LCD_LINE_1_ADDRESS;
         break;
      }

   address += x-1;
   lcd_send_byte(0, 0x80 | address);
}

//-----------------------------
void lcd_putc(char c){
   switch(c){
      case '\f':
         lcd_send_byte(0,1);
         lcd_line = 1;
         delay_ms(8);
         break;
      case '\n':
         lcd_gotoxy(1, ++lcd_line);
         break;
      case '\b':
         lcd_send_byte(0,0x10);
         break;
      default:
         lcd_send_byte(1,c);
         break;
   }
}

//------------------------------
void lcd_setcursor_vb(short visible, short blink){
   lcd_send_byte(0, 0xC|(visible<<1)|blink);
}

Saludos!!


 

anything