Estoy usando un PCI1602F-B de Powertip como un LCD y un ATmega8 para comunicarme con él.
Conexión :
-PORT D de ATmega8 con bus de datos de LCD
-PORT B0 de ATmega8 con Rs pin
-PORT B1 de ATmega8 con pin R / W
-PORT B2 de ATmega8 con pin Eneble (E)
-El potenciómetro está conectado al pin de ajuste de contraste (Vo) y puedo darle de 0 voltios a 5 voltios.
-El LED de retroiluminación funciona bien.
-También le doy 5 voltios a Vss-Vpp
Mi código es el siguiente:
#define F_CPU 1000000UL // 1 MHz
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
void En(int bit)
{
if (bit==0)
PORTB |= 0b00000100;
else
PORTB &= ~0b0000100;
}
void RS(int bit)
{
if (bit==0)
PORTB |= 0b00000001;
else
PORTB &= ~0b0000001;
}
void RW(int bit)
{
if (bit==0)
PORTB |= 0b00000010;
else
PORTB &= ~0b0000010;
}
void is_busy (void)
{
DDRD = 0b00000000;
RW(1);
RS(0);
En(1);
while (PORTD == 0b10000000)
{
En(0);
_delay_ms(1);
En(1);
}
DDRD = 0b11111111;
}
void send_command(unsigned char command)
{
is_busy();
PORTD = command;
RW(0);
RS(0);
En(1);
_delay_ms(2);
En(0);
PORTD = 0b00000000;
}
void send_char(unsigned char character)
{
is_busy();
PORTD = character;
RW(0);
RS(1);
En(1);
_delay_ms(2);
En(0);
PORTD = 0b00000000;
}
void init(void)
{
En(0);
_delay_ms(100);
send_command(0b00110000);
_delay_ms(30);
send_command(0b00110000);
_delay_ms(10);
send_command(0b00110000);
_delay_ms(10);
send_command(0b00111000); //Function Set - DL=N=1, F=0
is_busy();
send_command(0b00000001); //Clear Display
is_busy();
send_command(0b00010100); //Cursor of Display Shift - S/C=0, R/L=1
is_busy();
send_command(0b00001100); //Display ON/OFF - D=1, C=B=0
is_busy();
send_command(0b00000110); //Entry Mode Set - I/D=1, S=0
}
int main(void)
{
init();
send_char(0x81);
while(1)
{
}
return(0);
}
Como puede ver, solo intento imprimir una letra. La letra estoy intentando imprimirla "Q". Estoy enviando el código Hex ASCII de inmediato al microcontrolador.
La pantalla LCD no muestra nada, ¿he hecho algo mal? ¿Es correcta la inicialización?