www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C-Code für LCD-Display (Displaytech 162B)


Autor: H. G. (ledi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte ein LCD-Display 162B von Displaytech (16x2 Characters) zum 
Laufen bringen. Hat jemand eine funktionierende Init-Routine? Ich 
verwende einen ATMega8!

Vielen Dank!

Ledi

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch die LCD-LIB von Peter Fleury[1].
Damit bin ich immer ganz gut gefahren.

Gruß Skriptkiddy


[1] http://homepage.hispeed.ch/peterfleury/avr-software.html

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm, ich meine, so etwas schon mal hier im Forum gesehen zu haben.
Man sollte vielleicht mal endlich eine Suchfunktion einbauen,
oder ein Tutorial erstellen?

Autor: heinzhorst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: H. G. (ledi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Nach eingehender Prüfung konnte ich bis jetzt keinen Fehler feststellen.
Anbei mein Schaltplan, das Datenblatt und der verwendete 
Initialisierungscode.

Der Kontrast des Displays lässt sich regeln, wird aber nur in der 1. 
Zeile angezeigt.

/*
  LCD Ausgabe für Hitachi HD44780 kompatible LCD Controller

  ATMEGA8/16/32 und kompatibel

  Dieses Beispiel sollte mit allen HD44780 kompatiblen LCD
   Displays funktionieren. 
*/

#define F_CPU    3686400

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

/*
*  BITTE HIER IHRE VERWENDETEN PINS KONFIGURIEREN!
*
*  Standardkonfiguration:
*   PORTD7 = LCD D7
*   PORTD6 = LCD D6
*   PORTD5 = LCD D5
*   PORTD4 = LCD D4
*
*/
#define  LCDPORT      PORTD
#define  LCDDDR      DDRD
#define LCD_PIN_RS    2
#define LCD_PIN_E    3
#define LCD_PIN_D4    4
#define LCD_PIN_D5    5
#define LCD_PIN_D6    6
#define LCD_PIN_D7    7


/* LCD STEUERBEFEHLE **********  */

#define LCD_CLEAR    0x01
#define LCD_HOME    0x02
#define LCD_ON      0x0C  /* 0x0C = Cursor unsichtbar */
#define LCD_ON      0x0E    /* 0x0E = Cursor sichtbar */
#define LCD_OFF      0x08

/* HILFSDEFINITIONEN **********  */

#define  BEFEHL      0
#define DATEN      1
#define sbi(sfr, bit)   (sfr|=(1<<bit))
#define cbi(sfr, bit)   (sfr&=~(1<<bit)) 


/****** Schickt ein Byte an den LCD Controller */
void lcd_send(unsigned char type, unsigned char c)
{
  if (type==BEFEHL)
    cbi(LCDPORT, LCD_PIN_RS); /* RS=0: Befehl folgt ... */
  else
    sbi(LCDPORT, LCD_PIN_RS); /* RS=1: Daten folgen ... */


  /* (1) ==== HIGH NIBBLE wird gesendet */
  if (bit_is_set(c, 7)) sbi(LCDPORT, LCD_PIN_D7); else cbi(LCDPORT, LCD_PIN_D7);
  if (bit_is_set(c, 6)) sbi(LCDPORT, LCD_PIN_D6); else cbi(LCDPORT, LCD_PIN_D6);
  if (bit_is_set(c, 5)) sbi(LCDPORT, LCD_PIN_D5); else cbi(LCDPORT, LCD_PIN_D5);
  if (bit_is_set(c, 4)) sbi(LCDPORT, LCD_PIN_D4); else cbi(LCDPORT, LCD_PIN_D4);

  /* Flanke zur Übernahme der Daten schicken ... */
  sbi(LCDPORT, LCD_PIN_E);
  cbi(LCDPORT, LCD_PIN_E);

  
  /* (2) ==== LOW NIBBLE wird gesendet */
  if (bit_is_set(c, 3)) sbi(LCDPORT, LCD_PIN_D7); else cbi(LCDPORT, LCD_PIN_D7);
  if (bit_is_set(c, 2)) sbi(LCDPORT, LCD_PIN_D6); else cbi(LCDPORT, LCD_PIN_D6);
  if (bit_is_set(c, 1)) sbi(LCDPORT, LCD_PIN_D5); else cbi(LCDPORT, LCD_PIN_D5);
  if (bit_is_set(c, 0)) sbi(LCDPORT, LCD_PIN_D4); else cbi(LCDPORT, LCD_PIN_D4);

  /* Flanke zur Übernahme der Daten schicken ... */
  sbi(LCDPORT, LCD_PIN_E);
  cbi(LCDPORT, LCD_PIN_E);

  
  /* (3) Auf den LCD Controller warten ...*/
  _delay_ms(5);
}


/****** Stellt eine Zeichenkette am LCD dar */
void lcd_write(char *t)
{
  unsigned char i;
  for (i=0;i<255;i++)
  {
    if (t[i]==0) // String-Ende? Dann raus hier ...
      return;
    else 
      lcd_send(DATEN, t[i]);
  }
}


/****** Initialisierung des LCD Controllers */
void lcd_init()
{
  /* Port auf Ausgang schalten */
  LCDPORT = 0x00;
  LCDDDR  = 0xFF;

  _delay_ms(50); // Warten bis LCD bereit ...

  /* 4-bit Modus konfigurieren */
  sbi(LCDPORT, LCD_PIN_D5);
  cbi(LCDPORT, LCD_PIN_D4);

  /* 4-Bit Modus starten ... */ 
  sbi(PORTD, LCD_PIN_E);
  cbi(PORTD, LCD_PIN_E);
  _delay_ms(5); 

  /* 2 Zeilen, 4-Bit Modus */
  lcd_send(BEFEHL, 0x28);

  lcd_send(BEFEHL, LCD_OFF);
  lcd_send(BEFEHL, LCD_CLEAR);

  lcd_send(BEFEHL, 0x06);
  lcd_send(BEFEHL, LCD_ON);
}


/****** Hilfsfunktion: Warte i Sekunden */
void sekunde(char i)
{
  unsigned char k;
  for (;i>0;i--)
  {
    for (k=0;k<10;k++)
      _delay_ms(100);
  }
}


/****** HAUPTPROGRAMM *****/

int main(void)
{
  lcd_init();
  lcd_write("Starting...");

  while (1)
  {

    sekunde(2);
    lcd_send(BEFEHL, LCD_CLEAR);
    lcd_write(" Test");

    sekunde(2);
    lcd_send(BEFEHL, LCD_CLEAR);
    lcd_write(" ---LCD DEMO---");
  }
}


Autor: Antwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest die unbenutzten Datenpins (DB0-DB3) auf GND legen. Offene 
Eingänge können jedes beliebige Potential annehmen. So kann es dann 
seind as die initialisierung mal klappt, und mal nicht.

Autor: H. G. (ledi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Du solltest die unbenutzten Datenpins (DB0-DB3) auf GND legen.

Hab ich gemacht! Hilft aber leider nicht.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Du solltest die unbenutzten Datenpins (DB0-DB3) auf GND legen. Offene
>Eingänge können jedes beliebige Potential annehmen. So kann es dann
>seind as die initialisierung mal klappt, und mal nicht.

Vor solchen Vorschlägen sollte man das Datenblatt lesen. 
Displaycontroller haben im allgemeinen einen integrierten 
Pull-Up-widerstand. Eine Verbindung nach GND ist da eher 
kontraproduktiv.

Datenblatt vom KS0070:

DB0~DB3  'During 4-bit bus mode open these pins'

MfG Spess

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Init-Routine sendet am Anfang anscheinend nur einmal das Function 
Set ans Display. Im Datenblatt steht aber, dass das dreimal nacheinander 
geschehen muss.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heimo G. schrieb:

> Ich möchte ein LCD-Display 162B von Displaytech (16x2 Characters) zum
> Laufen bringen. Hat jemand eine funktionierende Init-Routine? Ich
> verwende einen ATMega8!

Hast du schon die beiden (ASM bzw. C) aus der Artikelsammlung getestet?

Autor: H. G. (ledi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Displayanzeige funktioniert grundsätzlich. Allerdings erhalte ich in 
der 1. Zeile nur wirres Zeug (000/0000////<<<).

Kann mir wer beim Function-Set helfen? Ich komme damit nicht so ganz 
klar!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heimo G. schrieb:
> Die Displayanzeige funktioniert grundsätzlich. Allerdings erhalte ich in
> der 1. Zeile nur wirres Zeug (000/0000////<<<).

Wenn du prinzipiell eine Anzeige hast, dann liegt das Problem nicht mehr 
in der Init oder im Function Set.

* Anzeigefunktion untersuchen
* Nochmal die Verdrahtung kontrollieren, ob da nicht 2 Datenleitungen 
vertauscht wurden.

Autor: H. G. (ledi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs schon!!!

Ich habe die Init-Routine wie folgt geändert:
/****** Initialisierung des LCD Controllers */
void lcd_init()
{
  /* Port auf Ausgang schalten */
  LCDPORT = 0x00;
  LCDDDR  = 0xFF;

  _delay_ms(50); // Warten bis LCD bereit ...

  /* 4-bit Modus konfigurieren ------Function-Set 1*/    
  sbi(LCDPORT, LCD_PIN_D5);
  cbi(LCDPORT, LCD_PIN_D4);

  _delay_ms(50);
  /* 4-bit Modus konfigurieren ------Function-Set 2*/
  sbi(LCDPORT, LCD_PIN_D5);
  cbi(LCDPORT, LCD_PIN_D4);
  
  _delay_ms(1);
  /* 4-bit Modus konfigurieren ------Function-Set 3*/
  sbi(LCDPORT, LCD_PIN_D5);
  cbi(LCDPORT, LCD_PIN_D4);

  /* 4-Bit Modus starten ... */ 
  sbi(PORTD, LCD_PIN_E);
  cbi(PORTD, LCD_PIN_E);
  _delay_ms(5); 

  /* 2 Zeilen, 4-Bit Modus */
  lcd_send(BEFEHL, 0x28);

  lcd_send(BEFEHL, LCD_OFF);
  lcd_send(BEFEHL, LCD_CLEAR);

  lcd_send(BEFEHL, 0x06);
  lcd_send(BEFEHL, LCD_ON);
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.