#define E PB0
#define RS PB1
#define CHDLY 100 //delay beim Ausgeben je Zeichen am LCD
void lcd_init(void); //einmalige initialisierung, hier werden die erforderlichen commands für das LCD vorgenommen
void lcd_data(char*); //nimmt die zu sendende Zeichenkette auf
void lcd_send(uint8_t, int rs); //sendet ein byte an das LCD, abhängig von rs handelt es sich um command oder datum: rs=0 command, rs=1 datum
void lcd_enable(void);
int main()
{
lcd_init();
lcd_data("Hallo AVR!");
while(1);
return 0;
}
void lcd_init(void)
{
DDRD |= 0xF0; //4-bit Datenport auf Ausgang (die oberen 4 bits von DDRD)
DDRB |= (1<<E) | (1<<RS); //E und RS auf Ausgang
PORTB &= ~((1<<E) | (1<<RS)); //E=0, RS=0
PORTD &= 0x0F;
PORTD |= 0x20;
lcd_enable(); //Kommunikation ín 4-bit Modus wird aufgebaut (Function set)
lcd_send(0x28,0); //(4-bit Modus), 2 zeilig, 5x8 Matrix (Function set)
lcd_send(0x0E,0); //Anzeige an und Cursor an (Display control)
lcd_send(0x06,0); //Adresse inkrementieren und Cursor nach rechts verschieben (Entry Mode set)
lcd_send(0x01,0); //Anzeige leeren
}
void lcd_data(char *str)
{
while((*str) != '\0')
{
lcd_send(*str,1);
++str;
}
}
void lcd_send(uint8_t ch,int rs)
{
if(rs)
{
PORTB |= (1<<RS); //RS=1
_delay_ms(CHDLY);
}
else
{
PORTB &= ~(1<<RS); //RS=0
}
PORTD &= 0x0F;
PORTD |= ch & 0xF0;
lcd_enable();
ch <<= 4;
PORTD &= 0x0F;
PORTD |= ch & 0xF0;
lcd_enable();
}
void lcd_enable(void)
{
PORTB |= (1<<E); //E=1
//_delay_us(1);
PORTB &= ~(1<<E); //E=0
}