Forum: Mikrocontroller und Digitale Elektronik LCD 2X16 zweite Zeile nicht beschreibbar


von Alex (Gast)


Lesenswert?

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

von Micha (Gast)


Lesenswert?

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!

von Micha (Gast)


Lesenswert?

habe grade mal im Datenblatt gestöbert 
(http://www.displaytech-us.com/pdf/application/Character_Module/Samsung/S6A0070_v00_KS0070B.pdf) 
Danach wird bei einem Power-On eventuell standard-mäßig ein 1-Zeilen 
Display eingestellt (s. 28). Die initialisierung für 4-Bit & 2-Zeilen 
ist auf Seite 32.  Schau mal im ersten Block "Function Set"

von Alex (Gast)


Lesenswert?

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

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.