LCD 2X16 zweite Zeile nicht beschreibbar

Gast #810549
Hi,

ich habe ein Display mit einem S6A0070 als Treiber. Habe mal ie 
Datenblätter verglichen, eigentlich gleicht er dem HD44780.
Nun habe ich das Problem, dass ich die Zweite Zeile des Displays nicht 
beschreiben kann. Sie ist zwar aktiv (wenn man am Kontrast rumspielt, 
wird sie genau wie die erste Zeile dunkel) aber ich kann weder den 
Cursor hinsetzen (0xC0) noch kann ich über die erte Zeile hinaus auf die 
zweite schreiben.
Ich vermute, dass was mit der Initialisierung faul ist (4-Bit 
Interface).
Ich habe mal die Init aus dem Datenblatt und die aus dem Datenblatt des 
HD44780 probiert und alles lässt sich einstellen (Curser blinken usw. 
auch kann ich Zeichen rübersenden. Ich mal mal die Init angehangen. Mit 
den Zeiten war ich ziemlich großzügig, weil im Datenblat was von 
Mindestzeiten stand und ich mir nicht sicher war, weil's ja nicht läuft, 
wie's soll.
Kann mir einer weiterhelfen?

Danke, Alex

int toggle_LCD_E(void) {

LCD_PORT |= (1<<LCD_E);
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
LCD_PORT &= ~(1<<LCD_E);

return(0);
}

int lcd_putnibble(unsigned char nibble, unsigned char rs) {

 register unsigned char reg;
 reg = nibble << 4;
 if(rs == 1) {
  reg |= (1<<LCD_RS);
 }
 else {
  reg &= ~(1<<LCD_RS);
 }

 LCD_PORT &= ~((1<<LCD_DB7)|(1<<LCD_DB6)|(1<<LCD_DB5)|(1<<LCD_DB4)|
 (1<<LCD_RS));
 LCD_PORT |= reg;

 toggle_LCD_E();

 return(0);
}

int lcd_putc(unsigned char byte, unsigned char rs) {

 register unsigned char reg_high, reg_low;

 reg_high = byte & 0xF0;
 reg_low  = byte << 4;

 if(rs == 1) {

  reg_low  |= (1<<LCD_RS);
  reg_high |= (1<<LCD_RS);
 }
 else {
  reg_low  &= ~(1<<LCD_RS);
  reg_high &= ~(1<<LCD_RS);
 }

 LCD_PORT &= ~((1<<LCD_DB7)|(1<<LCD_DB6)|(1<<LCD_DB5)|(1<<LCD_DB4)|
 (1<<LCD_RS));
 LCD_PORT |= reg_high;

 toggle_LCD_E();

 LCD_PORT &= ~((1<<LCD_DB7)|(1<<LCD_DB6)|(1<<LCD_DB5)|(1<<LCD_DB4)|
 (1<<LCD_RS));
 LCD_PORT |= reg_low;
 toggle_LCD_E();

 return(0);
}

int lcd_init(void) {

int i;

LCD_PORT |= 
(1<<LCD_DB7)|(1<<LCD_DB6)|(1<<LCD_DB5)|(1<<LCD_DB4)|(1<<LCD_DISP)|(1<<LC 
D_RS)|(1<<LCD_E);
LCD_DDR  |= 
(1<<LCD_DB7)|(1<<LCD_DB6)|(1<<LCD_DB5)|(1<<LCD_DB4)|(1<<LCD_DISP)|(1<<LC 
D_RS);
LCD_DDR  |= (1<<LCD_E);

mswait(20);


for (i=0;i<3;i++) {

 lcd_putnibble(0x03,0);
 mswait(10);
}

lcd_putnibble(0x02,0);
mswait(10);
lcd_putc(0x28,0);
mswait(10);
lcd_putc(0x0F,0);
mswait(10);
lcd_putc(0x01,0);
mswait(10);
lcd_putc(0x06,0);

return(0);
}
Gast #810563
Hast du mal versucht den kompletten Speicher des LCDs vollzuschreiben
? Eventuell passen ja sehr viel mehr Zeichen in die 1. Zeile als du 
denkst. Schau Dir noch mal das Memory-Mapping an, ob beide Controller in 
dieser Richtung gleich sind!
Gast #810595
Hi,

genau das mache ich ja in meine lcd_init, nur dass ich nor dreimal 
vorher als 8-bit initialisiere und dann erst als 4-Bit, das steht so 
beim HD44780 im Datenblatt und sollte auch keine Probleme machen. 
Ansonsten ist die Initialisierung gleich. Schau mal in den Quellcode 
oben, da schreibe ich eine 0x28, das heißt 4-Bit, zwei Zeilen.

Gruß, Alex

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 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.