PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit LCD Ansteuerung (2. Zeile)



oderlachs
27.05.2014, 19:12
Ich habe ein LCD 16x2 in Verwendung, doch kann ich nicht in der 2. Zeile schreiben...der Controller auf dem LCD ist ein EU KS70066 Chip

Ich initialisiere es so:

/* ================================================== ======================== */
void lcd_init(void)
{
// DDR Setzen
LCD_DDR = 0xFF; // Datenport 0..7 Output

CONTROL_DDR |= (1 << EN) | (1 << RS); // Controllport EN + RS Output
_delay_ms(450);

LCD_PORT = 0x00; // Datenleitungen,alles auf LOW setzen
send_cmd(0x01); // LCD clear
_delay_ms(5);

send_cmd(0x38); // 8-Bit u. 2 Zeilen
_delay_ms(5);

send_cmd(0x0E); // Display On , Cursor ON
_delay_ms(5);

//send_cmd(0x0F); // Cursor blink ON
_delay_ms(5);

//send_cmd(0x10); // Cursor shift re
_delay_ms(5);
}

/* ================================================== ======================== */

Kommandos werden so geschrieben:

/* ================================================== ======================== */
/* */
/* Sende Kommandodaten */
/* */
/* */
/* ================================================== ======================== */
void send_cmd(uint8_t cmd)
{
CONTROL_PORT &= ~(1<< RS); //RS=0 command
_delay_ms(1);
LCD_PORT = cmd;
CONTROL_PORT |= (1 << EN); //EN=1
_delay_ms(1);
CONTROL_PORT &= ~(1 << EN); //EN=0
_delay_ms(4);
}



einzelne Zeichen schreibe ich so:

/* ================================================== ======================== */
/* */
/* Sende Char */
/* */
/* */
/* ================================================== ======================== */
void send_chr(char chr)
{
int ch = chr;
CONTROL_PORT |= (1<< RS); //RS=1 daten
_delay_ms(1);
LCD_PORT =ch;
CONTROL_PORT |= (1 << EN); //EN=1
_delay_ms(1);
CONTROL_PORT &= ~(1 << EN); //EN=0
_delay_ms(1);


}

Im Test (main) geht es so von statten:

/* ================================================== ======================== */
/* */
/* */
/* Main-Routine LCD Test */
/* */
/* ================================================== ======================== */
int main(void)

{
lcd_init();
_delay_ms(200);
send_cmd(0x82); // sende Command: Pos.3 1.Zeile(0x80)
send_chr('A');
send_chr('B');
send_chr('C');
send_cmd(0x42); // sende Command: Pos 3 2. Zeile(0x40)
send_chr('D');
send_chr('E');
send_chr('F');
return 0;
}

Ausgegeben werden nur in der ersten Zeile "ABC" an richtiger Stelle..."DEF" auf eigendlich der 2. Zeile erscheint gar nicht, ich kann auch nur den Cursor nicht in diese Zeile bringen.
Lt Datenblatt soll 0x80... Zeile 1 und 0x40 ... Zeile 2 sein.
Zeil1 kann ich nutzen wie ich möchte, nur die Zeile 2 eben GAR NICHT ???
Weiss wer einen Rat ?
Ich bin dankbar für jeden Hinweis !

Gruss Gerhard

Hubert.G
28.05.2014, 14:28
Ich verwende immer die LCD-Lib von Peter Fleury, da ich mich nie damit geplagt habe etwas eigenes zu schreiben.
Deine Startadressen kommen mit etwas eigenartig vor. Schreib mal in die erste Zeile laufend Zeichen hinein. Nach 40 Zeichne solltest du in der zweiten Zeile sein.

oderlachs
28.05.2014, 16:17
Danke Hubert !
ich habe auch funktionierende "Fremd-Libs" , nur wollte ich mal versuchen zu Begreifen wie das von statten geht, mit der LCD Ansteuerung. Ja mit den Startadressen habe ich mich auch schon gewundert, aber es ist halt so angegeben ...?
Heute habe ich erst mal die LCD_Module mit nem Arduino getestet, sind alle ok, hätte ja sein können das ein falscher Befehl an die falsche Adresse die Dinger taub gemacht hätte. Schon komisch das in manchem Datenbölatt nicht mal die Adressen angegeben sind, die muss man sich dann woanders aus den tiefen des Webs rauswuseln.. ;)
Vielleicht auch ein wenig Dumm augedrückt die Hex 40 der 2.Zeile muss zu der Adresse 0 der 1. Zeile hinzuaddiert werden..habe verschieden Werte gefunden...schon alles probiert...

Morgen ist Herrentag da mach ich erst mal ne AVR-Pause... also allen hier nen guten Feiertag mit schönem Ausflugswetter...hier regnets zur Zeit aus Eimern..

Gruss und Dank

Gerhard

joar50
28.05.2014, 16:29
Hallo,
ich denke mal die2. Zeile beginnt bei 0xC0 und nicht bei 0x40.
Ich kann damit falsch liegen, aber einen Versuch ist es wert.

oderlachs
28.05.2014, 16:50
Du hast Recht, wie schon geschrieben habe ich mich ein wenig dumm ausgedrückt 0x80 + 0x40 = 0xC0....usw... geht trotzdem nicht.
Aber danke, Ich hatte das vorher genau so falsch gesehen, darum wohl auch so falsch dann beschrieben..

lg
Gerhard

Nachtrag : Wie ich soeben bemerkt habe hatte ich nach der Initialisierung nur auf der ersten Zeile leicht schattierte Zeichenfelder , am Arduino sind es aber dann beide Zeilen. Hatte mir aber das Initkommando für Mehrzeilige LCDs mehrmals angesehen und auch ausgerechnet, ich muss dafür 0x38 übertragen bei einer Zele nur 0x30..(andere Zuordnungen wie Cursor usw. ) sind da mit einberechnet...

Na vielleicht steige ich da noch dahinter wo es hängt.. ;)