TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: AKENAFAB 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
(http://img199.imageshack.us/img199/8060/conexionlcd3pines.jpg)
- Aquí la libreria -
// 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 -
/* 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
-
muy buen aporte!!!!! espectacular!!... muchas gracias por compartirlo!!
saludos
-
que bien me va a venir este aporte... muy bueno si señor.... muxas gracias.....
-
uuuu que aportón!
buenísimo AKENA! :-/ :-/ :-/
thxs
-
: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:
-
excelente señores, simplemente excelente
:-/
-
Genial!!! Muchas gracias!!!
Sigo sin entender por q no empiezan a venir modulos LCD i2c jeje.
-
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.
-
Jeje Me equivoque pero aun asi gracias por el Aporte
-
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???
-
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!
-
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" :-/
-
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
-
Disculpe alguien no ah intentado modificar la de 24x4 para trabajarla tambien con 3 o 4 pines?
-
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"
/* 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
////////////////////////////////////////////////////////////////////////////////
/// 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!!
-
hola compañero monte el circuito con una lcd yb1604a http://www.yab-lcm.com/eproducts.asp?classid=24&id=14 pero no me funciona, lo monte tal y como indican pero no sale nada en la pantalla que me recomiendan
-
hola compañero monte el circuito con una lcd yb1604a http://www.yab-lcm.com/eproducts.asp?classid=24&id=14 pero no me funciona, lo monte tal y como indican pero no sale nada en la pantalla que me recomiendan
posiblemente algo estas conectando mal, podrias subir una foto de tu cableado
-
hola compañero monte el circuito con una lcd yb1604a http://www.yab-lcm.com/eproducts.asp?classid=24&id=14 pero no me funciona, lo monte tal y como indican pero no sale nada en la pantalla que me recomiendan
posiblemente algo estas conectando mal, podrias subir una foto de tu cableado
Hola Compañero
estoy trancado en el proyecto he intentado poner a trabajar la pantalla YB1604A con el 74ls164 tal como lo indica en la pagina http://www.todopic.com.ar/foros/index.php?topic=27011.msg354232#msg354232 para la pantalla de 4x16 y nada que me funciona en físico en la simulación funciona excelente, he revisado el cableado mas de 20 veces y todo esta bien, incluso le coloque led a los datos que llegan a la pantalla y si llegan os datos como indican en el datasheet de la pantalla. si me sugieren algún cambio se lo agradezco muchas gracias.
El driver de la lcd lo he modificado para ponerlo mas lento a ver si eren los tiempos, pero igual nada, le coloque un led de prueba que si funciona bien en físico, en la simulación le coloque una compuertas or para simular los datos para comparar las señales de entrada de la pantalla
-
hola compañero monte el circuito con una lcd yb1604a http://www.yab-lcm.com/eproducts.asp?classid=24&id=14 pero no me funciona, lo monte tal y como indican pero no sale nada en la pantalla que me recomiendan
posiblemente algo estas conectando mal, podrias subir una foto de tu cableado
Hola Compañero
estoy trancado en el proyecto he intentado poner a trabajar la pantalla YB1604A con el 74ls164 tal como lo indica en la pagina http://www.todopic.com.ar/foros/index.php?topic=27011.msg354232#msg354232 para la pantalla de 4x16 y nada que me funciona en físico en la simulación funciona excelente, he revisado el cableado mas de 20 veces y todo esta bien, incluso le coloque led a los datos que llegan a la pantalla y si llegan os datos como indican en el datasheet de la pantalla. si me sugieren algún cambio se lo agradezco muchas gracias.
El driver de la lcd lo he modificado para ponerlo mas lento a ver si eren los tiempos, pero igual nada, le coloque un led de prueba que si funciona bien en físico, en la simulación le coloque una compuertas or para simular los datos para comparar las señales de entrada de la pantalla