El siguiente programa está escrito en el estudio AVR. Conexiones: los pines PORTD 0 a 7 están conectados a líneas de datos de LCD, es decir, DB0 a DB7 respectivamente, PORTB.1 conectado a RS, PORTB.2 conectado a R / W y PORTB.3 conectado a EN de 16x2 LCD JHD 162A.
En el programa PORTD.7 se comprueba si está ocupado o no.
Los caracteres no se muestran. Cualquier sugerencia o ayuda sería muy apreciada.
#include<avr\io.h>
void lcdcmd(unsigned char value);
void lcddata(unsigned char value);
void lcdready();
void MSDelay(unsigned int time);
int main()
{
DDRD=0xFF;
DDRB=0xFF;
PORTB = 0x00;
lcdcmd(0x38);
lcdcmd(0x0E);
lcdcmd(0x01);
lcdcmd(0x06);
lcdcmd(0x86);
lcddata('M');
lcddata('D');
lcddata('E');
while(1);
return 0;
}
void lcdcmd(unsigned char value)
{
lcdready();
PORTD=value;
PORTB=PORTB & ~(0b00000010); // rs
PORTB=PORTB & ~(0b00000100); // rw
PORTB=PORTB & ~(0b00001000); // en
MSDelay(1);
PORTB=PORTB | 0b00001000;
return;
}
void lcddata(unsigned char value)
{
lcdready();
PORTD=value;
PORTB=PORTB & ~(0b00000010); // rs
PORTB=PORTB & ~(0b00000100); // rw
PORTB=PORTB & ~(0b00001000); // en
MSDelay(1);
PORTB=PORTB | 0b00001000;
return;
}
void lcdready()
{
unsigned char temp;
PORTD = 0x00;
temp= PORTD | (1<<7);
PORTD= temp;
PORTB=PORTB & ~(0b00000010); // rs
PORTB=PORTB | 0b00000100; // rw
while(temp==1)
{
PORTB=PORTB & ~(0b00001000); // en
MSDelay(1);
PORTB=PORTB | 0b00001000;
temp= PORTD & (1<<7);
}
return;
}
void MSDelay(unsigned int time)
{
unsigned int i,j;
for(i=0;i<time;i++)
for(j=0;j<1275;j++);
}