LCD: Probleme mit Cursor

Gast #75564
Hi,

nach der Initialisierung vom LCD wollte ich das Display noch löschen,
aber jedesmal wenn ich den Reset-Taster am Board drücke, spring der
Cursor eine Stelle weiter. Ist das normal, wenn ich den Cursor nicht
sage wo er hin soll?

Auch weiss ich nicht, warum der Cursor an der 2.Position erscheint.

void clear_lcd(void)
  {
  //busywait();            //Warten bis Busy=0
  instruction_write();    //RS und RW =0
  PORTD|=0x00;      //D5=1  <-High-Nibble
  lcd_enable();      //E=1 pause E=0
  PORTD|=0x01;      //N=1 und F=0 <-Low-Nibble
  lcd_enable();
  _delay_loop_2(1000);
}

main(){
lcdinit();
clear_lcd();
}

Kann das daran liegen, dass ich das Busy-Flag noch nicht kontrolliert
habe?
Bin mir mit Busy_wait noch nicht ganz sicher, vielleicht kann mir
jemand sagen, ob die Funktion dafür passt:



void busywait(void)
  {
  outp(0x00,DDRD);      //DDRC löschen
  outp(DDRD|=0x07,DDRD);
  PORTD &= RS;        //RS=0
  PORTD |= RW;        //RW=1
  _delay_loop_2(1000);
        while (bit_is_clear(PIND,PIND3));
  }
Gast #75565
Habe jetzt mehrere Fehler gefunden, habe eine pause in der lcd_init
gelöscht, das Display war deshalb nicht richtig initialisiert und hat
schon geblinkt, als nur lcd_init im main() stand.
DDRD = 0x07 war auch falsch, habe jetzt 0xff reingeschrieben.

Lasse ich den Busy-Flag check weg und schreibe eine pause rein, dann
funktioniert es.

Vielleicht kann mir jemand erklären, was ich beim BF-check falsch
verstehe, bzw. falsch gemacht habe.

Laut Datenblatt muss ich RS=0 und RW=1 setzen, damit ich BF lesen kann.
Dann noch eine kleine Pause, jetzt müsste doch der Befehl
while(bit_is_clear(PIND,PIND3));
dafür sorgen, dass solange keine weiteren Befehle ausgeführt werden bis
BF Null ist.
An PIND3 ist mein DatenBit7 vom LCD, also LCD-Pin14, mir scheint es,
als ob die Schleife endlos läuft. Ohne BF-check erhalte ich den Cursor,
wenn ich eine Pause reinschreibe.

Meine Pinbelegung noch:
#define DB4 0x01;
#define DB5 0x02;
#define DB6 0x04;
#define DB7 0x08;
#define RS  0x10;
#define E   0x20;
#define RW  0x40;
Gast #75566
Muss wohl am Kaffee und der Uhrzeit gelegen haben. Hat sich, wie so
vieles schon, wieder mal erledigt. Eingänge und Ausgänge, da war der
Fehler.

outp(DDRD|=0x07,DDRD);
War schon nahe dran und 0xff zu viel des guten, 0x08 und es
funktioniert. 0x0f müsste auch gehen.

Vielleicht kann jemand die Abfrage brauchen, funktioniert jetzt:


void busywait(void)
  {
  outp(0x00,DDRD);      //kann man sich wohl auch sparen
  outp(DDRD|=0x08,DDRD);//diese zeile macht ja auch das notwendige
  PORTD &= RS;
  PORTD |= RW;
  _delay_loop_2(1000);
  while (bit_is_clear(PIND,PIND3));
  }

PIND3 ist logischer Weise der DB7 Pin vom LCD.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.