Forum: Mikrocontroller und Digitale Elektronik LCD-display 2.zeile?


von Azubi (Gast)


Lesenswert?

Hallo

Ich hab ein kleines Programm, welches einen LCD display ansteuert wie 
aber kann ich die 2 Zeile ansteuern?

Ich habe nur herausgefunden, dass ich statt der 0x80 in der 
Commando-Funkrtion die 0x40 verwende soll, mit diesem Befehl aber wird 
zwar in die 2.Zeile gesteurt und der Anzeigebalken verschiebt sich auch 
um die Anzahl der eingegebene Buchstaben mehr auch nicht.


#include <avr/io.h>
#include <util/delay.h>

#define RS PC0        //RS= 1---->Daten, RS=0---->Befehl
#define RW PC1
#define EN PC2          //Enable=1 LCD stellt sich auf Empfang ein







int main(void)
{
    DDRC = 0xFF;
  DDRD = 0xFF;


  LCD_init();
  _delay_ms(50);


  LCD_write_string("Hallo");

}

void LCD_init(void)
{
  LCD_commando(0x38);
  _delay_ms(1);

  LCD_commando(0x0F);
  _delay_ms(1);

  LCD_commando(0x01);
  _delay_ms(1);

  LCD_commando(0x80);
  _delay_ms(1);

}


void LCD_commando(unsigned int befehl)
{
  PORTD= befehl;
  PORTC= (0<<RS)|(0<<RW)|(1<<EN);
  _delay_ms(1);

  PORTC= (0<<RS)|(0<<RW)|(0<<EN);
  _delay_ms(50);
  return;
}

void LCD_write(unsigned char buchstabe)
{
  PORTD = buchstabe;
  PORTC = (1<<RS)|(0<<RW)|(1<<EN);
  _delay_ms(1);

  PORTC = (1<<RS)|(0<<RW)|(0<<EN);
  return;
}


void LCD_write_string(unsigned char str[])
{
  int i=0;

  while (str[i] != 0)

  {
    LCD_write(str[i]);
    i++;
  }
}

von Sesk K. (zeborok)


Lesenswert?

Um welches Display resp. Controller handelt es sich denn hierbei?

von Azubi (Gast)


Lesenswert?

Es ist der Hitachi HD44780

von Mystik (Gast)


Lesenswert?

schau mal bei Sprut vorbei, er hat die Zusammenhänge gut 
dokumentiert.....
http://sprut.de/electronic/lcd/index.htm

von Spess53 (Gast)


Lesenswert?

Hi

>Ich habe nur herausgefunden, dass ich statt der 0x80 in der
>Commando-Funkrtion die 0x40 verwende soll,

Da bringst du etwas durcheinander. Um den Cursor an eine bestimmte 
Stelle des Displays zu setzen benutzt man den Befehl 'Set DDRAM 
Address'. Und der ist 0b1xxxxxxx. Dabei ist 'xxxxxxx' die Adresse im 
DDRAM. Deine 0x80 (0b10000000) heißt also 'gehe zur Adresse 0 im DDRAM'. 
Deine 0x40 (0b01000000) ist aber nur die Anfangsadresse der 2.Zeile. Um 
an den Anfang der 2.Zeile zu kommen mu?t du Befehl und Adresse 
kombinieren:
 0b10000000 + 0b01000000 = 0b11000000 = 0xC0

mfG Spess

von Azubi (Gast)


Lesenswert?

danke :D

von Klaus (Gast)


Lesenswert?

@Azubi
Deine void LCD_init(void) Routine ist, so wie ich es sehe, 
Unvollständig.
Schau ins Datenblatt da steht was alles rein soll.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.