16x4 LCD zeigt nichts an

Ich versuche, ein 16x4-LCD mit einem Atmega32-Chip zu verbinden. Ich habe den folgenden Code geschrieben, der früher für 16x2 LCD funktionierte

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

#define dataport PORTC // LCD data port
#define commport PORTD
#define en PD6 // enable signal
#define wr PD5 // read/write signal
#define rs PD4 // register select signal


int wrcomm(unsigned int data)
{
  dataport=data;
  _delay_ms(10);
  commport &= ~(1 << rs);
  commport &= ~(1 << wr);
  commport |= (1 << en);
  commport &= ~(1 << en);
  _delay_ms(10);
  return 1;
}

int wrdata(unsigned int data)
{
  dataport=data;
  _delay_ms(10);
  commport |= (1 << rs);
  commport &= ~(1 << wr);
  commport |= (1 << en);
  commport &= ~(1 << en);
  _delay_ms(10);

  return 1;
}

int lcd_putchar(unsigned char x)
{
  wrdata(x);
  return 1;
}

void lcd_init(void)
{
  DDRC=0xff;
  DDRD=0x70;
  wrcomm(0x38);
  wrcomm(0x01); //turn on display and cursor
  wrcomm(0x0E);//cursor line 1 postn 1
  wrcomm(0x80);
}

int main(void)
{
    lcd_init();
    lcd_putchar('a');
    return 0;
}

Ich vermute, dass es auch für 16x4 LCD funktionieren sollte. Aber das tut es nicht. Das LCD ist ein JHD539 164b .

Die einzige Sache, bei der ich Fortschritte gemacht habe, ist, dass, wenn ich keinen Befehl sende, die 2. und 4. Zeile schwarz bleiben, aber wenn ich einen Befehl sende, sind sie alle ausgeschaltet. Der Topf hilft überhaupt nicht.

Ich kann kein Datenblatt für Ihr spezifisches Display finden – haben Sie einen Link? Manchmal verwendet ein Anzeigehersteller eine "ungerade" Zuordnung von Speicherstellen zu Bildschirmstellen. Sie können versuchen, an jede Stelle im Speicher des Controllers einen anderen Datenwert zu schreiben, um zu sehen, ob etwas auf dem Bildschirm angezeigt wird, und daraus die Zuordnung ermitteln.
Warum beschäftigst du dich mit den Rückgabewerten? Für solche Dinge ist es hauptsächlich Verschwendung, da Sie keine Möglichkeit haben, einen Fehler zu erkennen.

Antworten (2)

Das JHD539-164b ist ein standardmäßiges KS0066-kompatibles Zeichen-LCD. Nahezu identisch mit den von HD44780 gesteuerten LCDs, und der Benutzerendcode wäre vollständig kompatibel.

Der Unterschied zwischen einem 16x2-LCD und einem 16x4-LCD besteht nur darin, dass ein 16x4-LCD wirklich ein logisches 32x2-LCD ist, was die Adresse betrifft.

Wenn Sie es nicht zum Laufen bringen, überprüfen Sie die Verkabelung und prüfen Sie, ob das LCD nicht beschädigt ist.

Es sieht so aus, als ob Sie Ihr LCD-Display im 8-Bit-Modus verwenden. Stellen Sie sicher, dass Sie in Ihrer lcd_init-Funktion diesen Modus ausgewählt haben, da LCD-Controller normalerweise den 4-Bit-Modus standardmäßig eingestellt haben.