TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: nordestenica en 19 de Mayo de 2004, 09:19:00
-
les dejo una driver para controlar casi todo tipo de lcd alfanumerico la e probado con varias e funciono en todas elhas perfectamente he tenido algunas que con una configuracion funciona perfectamente pero quando conectaba otra de marca diferente esta ya no funcionaba de manera que e ido retocando el driver e con solo aumentar o diminuir los delays consegui acer que todas elhas funcionen
si alguien le interesa lo puede simular en el proteus e ir aciendo canbios con varias lcds e canbiando la configuracion del driver para que assi se aga una idea de las diferencias que ay entre elhas
este es el driver se puede canbiar facilmente el puerto que queramos usar
//GUARDAR CON ESTE NOME LCDTESTE.C
#use delay(clock=20000000)
//PARA USAR A PORTA D CONVENIENTE PARA 16F877A
#define LCD_D0 PIN_D2
#define LCD_D1 PIN_D3
#define LCD_D2 PIN_D4
#define LCD_D3 PIN_D5
#define LCD_EN PIN_D1
#define LCD_RS PIN_D0
//O PIN R/W LIGADO A GND SENAO NAO FUNCIONA
// EXPECIAL PARA LCD 4x20 //
//#define LINHA_1 0x00
//#define LINHA_2 0x40
//#define LINHA_3 0x14
//#define LINHA_4 0x54
// EXPECIAL PARA LCD 4X16 //
//#define LINHA_1 0x00
//#define LINHA_2 0x40
//#define LINHA_3 0x10
//#define LINHA_4 0x50
// EXPECIAL PARA LCD 2x20 //
#define LINHA_1 0x00
#define LINHA_2 0x40
// EXPECIAL PARA LCD 1X16 //
//#define LINHA_1 0x00
// EXPECIAL PARA LCD 2X16 //
//#define LINHA_1 0x00
//#define LINHA_2 0x40
#define CLEAR 0x01
void LCD_Init ( void );
void LCD_SetPosition ( unsigned int cX );
void LCD_PutChar ( unsigned int cX );
void LCD_PutCmd ( unsigned int cX );
void LCD_PulseEnable ( void );
void LCD_SetData ( unsigned int cX );
void LCD_Init ( void )
{
LCD_SetData ( 0x00 );
delay_ms ( 50 ); /* COLOCAR O TEMPO PARA DIFERENTES LCD REALIZAR EXPERIENCIAS*/
output_low ( LCD_RS );
LCD_SetData ( 0x03 );
LCD_PulseEnable();
LCD_PulseEnable();
LCD_PulseEnable();
LCD_SetData ( 0x02 );
LCD_PulseEnable();
LCD_PutCmd ( 0x2C );
LCD_PutCmd ( 0x0C );
LCD_PutCmd ( 0x01 );
LCD_PutCmd ( 0x06 );
}
void LCD_SetPosition ( unsigned int cX )
{
LCD_SetData ( swap ( cX ) | 0x08 );
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();
}
void LCD_PutChar ( unsigned int cX )
{
output_high ( LCD_RS );
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();
output_low ( LCD_RS );
}
void LCD_PutCmd ( unsigned int cX )
{
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();
}
void LCD_PulseEnable ( void )
{
output_high ( LCD_EN );
delay_us ( 20 ); //IR MODIFICANDO O VALOR ATE CONSEGUIR O MAIS ADEQUADO
output_low ( LCD_EN );
delay_ms ( 20 ); //IR MODIFICANDO O VALOR ATE CONSEGUIR O MAIS ADEQUADO
}
void LCD_SetData ( unsigned int cX )
{
output_bit ( LCD_D0, cX & 0x01 );
output_bit ( LCD_D1, cX & 0x02 );
output_bit ( LCD_D2, cX & 0x04 );
output_bit ( LCD_D3, cX & 0x08 );
}
esto es un teste para usar este driver con el 16f877a
#include <16F877A.h>
#include <LCDTESTE.C>
#use delay(clock=20000000)
#fuses NOWDT,RC, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, LVP, NOCPD, NOWRT
void main ( void )
{
LCD_Init();
LCD_PutCmd ( CLEAR );
LCD_SetPosition ( LINHA_1 );
printf ( LCD_PutChar, " LINHA1 " );
delay_ms (500);
LCD_SetPosition ( LINHA_2 );
printf ( LCD_PutChar, " LINHA2 " );
delay_ms ( 1000);
LCD_PutCmd ( CLEAR );
LCD_SetPosition ( LINHA_1 );
printf ( LCD_PutChar, "TESTE LCD 2 LINHAS POR 40 CARACTERES"
;
delay_ms (500);
LCD_SetPosition ( LINHA_2 );
printf ( LCD_PutChar, " PREPARADO POR XASTRE NORDESTECNICA "
;
delay_ms ( 1000);
}
-
una consulta........
No tienes rutinas para LCD de 8 bit??. La de CCS es tb para LCD de 4 bit. La de microsystem es de 8 bit pero no me funciona con el 16F877 con un 18F452 tampoco funciona
Salud2
kruskal@hotmail.com
-
ola kruskal pues la verdade es que para 8bits nada de nada yo tengo 4 lcd una de sansung dos de epson e una de hitachi e e probado con las varias con las drivers de ccs e otras que e encontrado por la web e la unica que me funciono fue la de hitachi las demas nada de nada ni con 4bits ni con 8bits el unico modo de ponerlas en funcionamiento fue con este driver e ajustando los delays para cada una aver si por todos acemos algo que funcione a 8 bits que creo que no seria dificil pero
-
Hola nordestenica:
Tengo ciertas nociones de C y mi idea es poder sacar por la LCD 2x16 (controlador Samsung) la información seleccionada por el usuario. Concretamente quiero poner en la línea superior una letra (la que seleccione en ese momento el usuario) y en la línea inferior la frase completa (acumulación de letras que haya seleccionado el usuario). El tema del control y asignación de carácteres lo tengo solucionado (o al menos eso creo) pero tengo serios problemas con el control de la lcd.
He mirado el código que propones y hay cosas que no entiendo:
1. Haces referencia a cX, variable que no declaras en ningún momento (que significa?)
Ejemplo: LCD_SetData ( swap ( cX ) );
En mi caso la variable que quiero enseñar por pantalla es un array de carácteres (char FRASE[100];)
2. Si quisiera hacer que esta frase se mueva por la línea inferior de la pantalla, como podría hacerlo (estoy intentando descifrar las funciones que utilizas para llevar a cabo mi propósito, pero de momento no me salgo con la mía).
Saludos y muchas grácias de antemano.
PD: Lo estoy programando en "CCS C Compiler" en un PIC 16F876
-
Hola a todos...
Amigo Kuskal, no sé si te entiendo bien (y me corriges si estoy equivocado) quieres manejar tu LCD paralela con 8 bits y no con 4 como se maneja habitualmente para no copar todos los pines de un solo puerto del pic. Yo he manejado mi LCD con 8 bits gracias a un programa generado por Application Maestro de MicroChip (totalmente gratis) que te permite generar el código de 4 u 8 bits, con modo delay o busy flag, con o sin R/W, etc. Si requieres te puedo enviar el código pero es para ser compilado con MPLab C18, pero creo que haciendo pequeños ajustes se puede compilar con CCS. Ahora, si descargas el App Maestro, puedes generarla para la familia 18F en C y asm al igual que para la familia 16F sólo en asm.
Ahora, para el amigo rage78, la variable cX no se declara de manera global, sino que en cada void se está declarando (por ejemplo void LCD_SetPosition ( unsigned int cX ); ) que por defecto es un int8, pero sin signo como lo especifica nordestenica al declarar la variable, se usa para enviar datos a la lcd, aunque no necesariamente los caracteres que se desean visualizar, así que para mostrar tu frase, "creo" que deberías recorrer ese vector y enviar dichos caracteres a la LCD. Creo que para el segundo punto, lo que puedes hacer es tratar de entender el código del LCD.C que se encuentra en la carpeta PICC/Drivers.
Espero haber sido de alguna utilidad.
Saludos desde Colombia.
Optimvs