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); }
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!
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"
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.