oderlachs
27.05.2014, 20: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
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