Forum: Compiler & IDEs LCD: Probleme mit Cursor


von funker (Gast)


Lesenswert?

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));
  }

von funker (Gast)


Lesenswert?

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;

von funker (Gast)


Lesenswert?

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.

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.