Forum: Mikrocontroller und Digitale Elektronik LCD mit Atmega8 in C initialisieren


von Hans (Gast)


Lesenswert?

Hi Leute,
ich verzweifel! Bin Neuling im Umgang mit Microcontrollern. Will über 
einen Atmega8 in C ein LCD im 4-Bit-Modus ansteuern und krigs einfach 
nicht hin. LCD zeigt nur die erste Zeile mit schwarzen Feldern an und 
die zweite ist komplet leer. Hab folgenden Code zusammengebastelt:

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

#define F_CPU 8000000

//Displayinitialisierung
void lcd_init(void)
{
  //PORT D als Ausgang definieren
  DDRD = 0xff;

  //Power on
  _delay_ms(40);

  //Interface auf 8 Bit setzen
  PORTD = 0b00110000;

  _delay_ms(5);
  //Interface auf 8 Bit setzen
  PORTD = 0b00110000;

  _delay_ms(0.1);
  //Interface auf 8 Bit setzen
  PORTD = 0b00110000;

  //Interface auf 4 Bit setzen
  PORTD = 0b00100000;

  //2-zeilig, 5x8-Punkt-Matrix
  PORTD = 0b00100000;
  PORTD = 0b01000000;

  //Display aus
  PORTD = 0x00;
  PORTD = 0b10000000;

  //Display loeschen
  PORTD = 0x00;
  PORTD = 0b00010000;

  //Kursor nach rechts wandernd, kein shift
  PORTD = 0x00;
  PORTD = 0b01100000;

  //Display ein
  PORTD = 0x00;
  PORTD = 0b11000000;
}

//erzeugt den Enable-Puls
void lcd_enable(void)
{
    // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers 
einfügen
    // Beitrag "Re: Bitte helft mir. Schon wieder AtMega16"
  PORTD |= (1<<PD3);
  _delay_us(1);                   // kurze Pause
    // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers 
verlängern
    // Beitrag "LCD -> Probleme mit Optimierungsgrad"
    PORTD &= ~(1<<PD3);
}

//Ausgabe eines Zeichens auf dem Display
void lcd_data (unsigned char temp1)
{
  unsigned char temp2 = temp1;

  PORTD |= (1<<PD2);        // RS auf 1 setzen

  temp1 = temp1 >> 4;
  temp1 = temp1 & 0x0F;
  PORTD &= 0xF0;
  PORTD |= temp1;               // setzen
  lcd_enable();

  temp2 = temp2 & 0x0F;
  PORTD &= 0xF0;
  PORTD |= temp2;               // setzen
  lcd_enable();

  _delay_us(42);
}

int main (void)
{

  lcd_init();
  lcd_data('T');

  while(1)
  {
  }

  return 0;
}

Kann mir jemand sagen, was ich tun muss, damit das T auf meinem Display 
angezeigt wird? Vielen Dank schon mal im Vorraus!
Hans

von holger (Gast)


Lesenswert?

>  //Interface auf 8 Bit setzen
>  PORTD = 0b00110000;

Wo wird hier die Enable Leitung benutzt?

>  _delay_ms(5);
>  //Interface auf 8 Bit setzen
>  PORTD = 0b00110000;

Einfach nur Bytes auf PORTD schreiben geht eben nicht.

von g457 (Gast)


Lesenswert?

Hans schrieb:
> void lcd_init(void)
> {
>   //PORT D als Ausgang definieren
>   DDRD = 0xff;
>
>   //Power on
>   _delay_ms(40);
>
>   //Interface auf 8 Bit setzen
>   PORTD = 0b00110000;
>
>   _delay_ms(5);
>   //Interface auf 8 Bit setzen
>   PORTD = 0b00110000;
>
>   _delay_ms(0.1);
>   //Interface auf 8 Bit setzen
>   PORTD = 0b00110000;
[..]

..fehlt da nicht was?.. sowas wie RS? R/W? E? Und wo sind die 
angeschlossen und wer toggelt die passend? Abgesehen davon: Was für ein 
Display(controller) ist das überhaupt? HD44780? Das Datenblatt ist - was 
die Initialisierung des HD44780 angeht - übrigens ★ziemlich★ 
aufschlussreich. Die Datenblätter anderer Controllertypen i.d.R. ebenso 
:-)

HTH </winkmitdemganzenzaun>

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.