www.mikrocontroller.net

Forum: Projekte & Code LCD --> AVR µC


Autor: Uli (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Source Code und Doku zum Anschluss eines Standart LCDs an einen AVR µC.

Mfg Ulrich Radig

Autor: Thorsten (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ulrich,

ich hätte eine Frage zur Doku, Seite 4, ganz unten. Das stimmt doch
nicht, wie du es angegeben hast, oder ? Hat das 4x20 schon zwei
Controller ? Ich kenne das so, wie im Anhang. Hab allerdings auch schon
gehört, das es da wohl Abweichungen geben soll.

Gruß
Thorsten

Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ja das 4 x 20 hat 2 Controller somit 2 Enable Signale, werde ich noch
in der Doku ändern.

Mfg Ulrich

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normalerweise hat ein 4x20 nur einen Controller, jedenfalls reicht er
aus und andere hab ich noch nie gesehen.
Das 4x27, was es bei Pollin gerade gibt, hat es zwei Controller.

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ulrich,

ich habe deinen Quelltext leicht abgeändert (anpassen an den WinAVR
Compiler, der kein sbi und cbi mehr kennt) übernommen und das LCD an
PortD an einem Mega88 angeschlossen. Hier die Quelltextauszüge:

main.h
// LCD 2x16 auf Port D
#define LCD_ZEILEN      2     //Anzahl der Zeilen 1,2 oder 4
#define LCD_DDR        DDRD  //Port an dem das Display angeschlossen wurde
#define LCD_OUT        PORTD
#define LCD_IN        PIND
#define LCD_RS        4     //Pin für RS
#define LCD_RW        5    //Pin für Read/Write
#define LCD_E        6     //Pin für Enable
#define LCD_DATAOUTPUT    0x0f
#define LCD_DATAINPUT    0x00

main.c
void lcd_init ()
{
  char tmp = LCD_ZEILEN;
  //Set Port Direction Register to Output for LCD Databus und LCD
Steuerbus
  LCD_DDR = LCD_DATAOUTPUT+(1<<LCD_RS | 1<<LCD_RW | 1<<LCD_E);
  //Wait a short Time afer Power on
  _delay_ms(500);
  lcd_write (0x22,0);  //Init in 4 Bit Mode
  //Wait a short Time afer Power on
  _delay_ms(50);
  lcd_write (0x22,0);  //Init in 4 Bit Mode (Zur Sicherheit nochmal)  
  if (tmp == 1)
    {
    lcd_write (0x20,0);  //1 Zeilen
    }
    else
    {
    lcd_write (0x28,0);  //mehrere Zeilen
    }
  lcd_write (0x0C,0);  //Display On
  lcd_write (0x80,0);  //Set DD-Ram Adresse = 0
  return;
}

// by Ulrich Radig
// löscht das LCD, den Text im Buffer des LCD-Structs, 
// die Cursor-Eigenschaften (nicht sichtbar, Position 0, etc.)
void lcd_clear ()
{
  lcd_write (1,0); //Clear Display
  lcd_write (0x80,0);  //Set DD-Ram Adresse = 0
  return;
}

void lcd_clear ()
{
  lcd_write (1,0); //Clear Display
  lcd_write (0x80,0);  //Set DD-Ram Adresse = 0
  return;
}

void lcd_write (char data, char type)
{
  //Set Port Direction Register to Output for LCD Databus und LCD
Steuerbus
  LCD_DDR = LCD_DATAOUTPUT+(1<<LCD_RS | 1<<LCD_RW | 1<<LCD_E);
  //Soll ins Seuer oder Datenregister geschrieben werden?
  if (type == 0)
    {
    (LCD_OUT &= ~(1<<LCD_RS));  // cbi(LCD_OUT,LCD_RS); //RS = 0
Steuerregister
    }
    else
    {
    (LCD_OUT |= (1<<LCD_RS));  // sbi(LCD_OUT,LCD_RS); //RS = 1
Dataregister
    }
  //Schreibsignal setzen
  (LCD_OUT &= ~(1<<LCD_RW));  // cbi(LCD_OUT,LCD_RW); //Zum Schreiben
RW-Pin = Low
  //Schreiben der 1. 4Bit an das LCD Display
  LCD_OUT = ((LCD_OUT & 0xF0) + ((data & 0xF0)>>4)); //Write Nibbel MSB
  (LCD_OUT |= (1<<LCD_E));  // sbi(LCD_OUT,LCD_E);
  (LCD_OUT &= ~(1<<LCD_E));  // cbi(LCD_OUT,LCD_E);
  //Schreiben der 2. 4Bit an das LCD Display  
  LCD_OUT = (LCD_OUT&0xF0) + (data&0x0F); //Write Nibbel LSB
  (LCD_OUT |= (1<<LCD_E));  // sbi(LCD_OUT,LCD_E);
  (LCD_OUT &= ~(1<<LCD_E));  // cbi(LCD_OUT,LCD_E);
  
  //loop_until_bit_is_clear(Read_LCD(0),BusyBit);  //Wartet bis LCD
wieder bereit
  return;
}

int main ()
{
        lcd_init();  // LCD initialiseren
  lcd_clear();

  // 2do test
  for(;;)
  lcd_write('a',1);
}

Und jetzt das Problem: Das LCD (Batron BT 2160)initialisert nur eine
Zeile. Wo liegt das Problem? Ich seh keines, müsste eigentlich
funktionieren.

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, hat sich erledigt, ich habe unvorsichtigerweise in der Fkt lcd_write
in Zeile 71 die Abfrage des Busy-Bits rausgenommen. Nun habe ich einfach
eine delay-Fkt eingesetzt und nun geht es.

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.