#include <reg51.h>
//--------------------------------------
sbit EN=P3 ^ 7;
sbit RW=P3 ^ 6;
sbit RS=P3 ^ 5;
sbit P2_7=P2 ^ 7;
//---------------------------------------
unsigned char Lcdwait() // Espera a q el display este disponible y devuelve la direccion actual de la memoria
{
unsigned char aux;
RS=0;RW=1;
while(P2_7==1); // Espero
aux=P2;
EN=0;RW=0;
P2=0x00;//Funciona como salida
return aux;
}
void Lcddata(unsigned char dato,unsigned char flag) // Con Flag=0 Datos
{
// Con Flag=1:
if (!flag) // Dato + 0x80 => direccion
RS=1; // Dato=1 borro pantalla (DB0=1)
else // Dato=2 o 3 => Cursor a Home
{RS=0;} // Db2=1 => Configuro cursor: Db1=1 => derecha, con Db0 => el display cambia
// Db3=1 => Db2=1 Lcd on, Db1=1 cursor on, Db0=1 el cursor parpadea
P2=dato; // Db4=1 => Db3=1 display shift, Db3=0 cursor move; Db2=1 shift right
EN=1;EN=0; // Db5=1 => Db4=1 datos de 8 bits, Db4=0 datos de 4 bits; Db3=1 2 filas; Db2=1 letras de 5x10, Db2=0 letras de 5x8
Lcdwait();
}
void Lcdinit() // Inicia el display
{
Lcddata(0x38,1); // Modo de 8 bits y caracteres de 5x8
Lcddata(0x38,1); // Habilito 2da linea
Lcddata(0x0C,1); // Display on, cursor off, cursor blinking off
Lcddata(0x06,1); // Cursor hacia la derecha
Lcddata(0x01,1); // Borrar pantalla
}
void print(char texto[],unsigned char clear) // Escribe texto en pantalla
{
unsigned char cont=0,aux,dir;
aux=strlen(texto)-1;
if (clear)
Lcddata(0x01,1); // Borrar pantalla
while (cont<=aux)
{
Lcddata(texto[cont],0);
dir=Lcdwait();
if (dir==0x10)
Lcddata(0xC0,1);
if (dir>=0x50)
Lcddata(0x80,1);
cont++;
}
}
void main ()
{
P3&=0x1B;// Pongo en 0 b7,b6,b5,b2
Lcdinit();
print("Texto a mostrar...",0)
while(1);
}