PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : zweite Zeile bei LCD ansprechen



chrisbenz
23.03.2005, 17:21
Moin Leude!

Ich versuche hier mit einen Display von Reichelt (LCD 162C) in die zweite Zeile zu schreiben, was mir aber leider nicht gelingt.
Das Display hat den Controller KS0070B drauf.

Wenn ich die erste Zeile überlaufen lasse, komme ich irgendwann in der zweiten Zeile raus... das ist aber nicht ganz der Sinn der Sache. Ich will direkt in die 2. Zeile schreiben.

Mit dem Setzen der GC-RAM-Adresse kann ich auch die Position des Cursors festlegen, aber danach zeigt er nix mehr an wenn ich normalen Text schicke. Allerdings bewegt sich der Cursor für jeden (unsichtbaren) Buchstaben eine Position weiter.

Wie kann ich die zweite Zeile direkt adressieren und dort schreiben.

Das Display läuft im 4-Bit-Modus

Chris

Andree-HB
23.03.2005, 19:08
im Bascom und Hitachi-Controllern gibt es dafür z.B. die Befehler "Upperline & Lowerline", vielleicht da mal mit herumspielen...

23.03.2005, 19:18
Ja, danke für den Tipp, aber ich mache das ganze über den I2C-Baustein PCF8574. Hab also kein Bascom.

Ich brauche die Reihenfolge der Bytes / das Byte, dass ich zum Display schicken muss.

IngBo
24.03.2005, 05:32
hallo,

ich denke mal, dein RS-Signal (Pin4) ist nach dem ersten Setzen des Cursors bleibt weiterhin auf LOW. Wenn du danach wieder Daten schreiben willst, dann musst du RS wieder auf HIGH setzen.
RS--> HIGH --> Daten schreiben
RS --> LOW --> Befehle schreiben

IngBo

slm
24.03.2005, 07:53
Hier ein stueck code vielleicht kannst Du damit was Anfangen.
Aber in 8-bit mode!
Mfg stephan


struct display
{
// Display control /////////////////
char display_of; // display :on/off
char cursor_of; // cursor :on/off
char blinking_of; // blinking :on/off
char cursor_dir; // cursor direction:incr/decr
char display_shift; // display shift :on/off
char bus; // bus type :8/4 chars
char row_size; // lines :2/1 line display
char font; // font :5x10/5x7 dots
char enable; // display enable :E/E2
////////////////////////////////////

/*
// SDCC 3
// Display control /////////////////
bit display_of; // display :on/off
bit cursor_of; // cursor :on/off
bit blinking_of; // blinking :on/off
bit cursor_dir; // cursor direction:incr/decr
bit display_shift; // display shift :on/off
bit bus; // bus type :8/4 bits
bit row_size; // lines :2/1 line display
bit font; // font :5x10/5x7 dots
bit enable; // display enable :E/E2
////////////////////////////////////
*/
};
typedef struct display Display;
#define RS P2_4 //
#define RW P2_5 //
#define E P2_6 //
#define E2 P2_7 //
#define DATA P0 // 8 data bits
#define WAITTIME_WRITE 10 // usec time to sleep when writing to lcd
#define WAITTIME_READ 5 // usec time to sleep when reading from lcd
///////////////////////////////
bit WdtLcdIAP=0; // IAP Watchdog
bit ENABLE_NR=0;
/**
* lcdRead()
* read data from LCD and write to dat
**/
char lcdRead(short dat)
{
RS=(dat>>9)&1;
RW=ON;
if (ENABLE_NR==1) E=ON;
else E2=ON;
if(WdtLcdIAP) feedWatchDog();
usleep(WAITTIME_READ);
if(WdtLcdIAP) feedWatchDog();
dat=(short)DATA;
E=OFF; E2=OFF;
RS=OFF;
RW=OFF;
return (char)dat;
}

/**
* lcdWrite()
* write dat direct to LCD bus
* return DD adresse position
**/
void lcdWrite(short dat)
{
while((lcdRead(0)>>7)&1){} // wait until LCD is ready

RS=(dat>>9)&1; // get RS bit
RW=OFF; // set RW bit


if(WdtLcdIAP) feedWatchDog();
usleep(WAITTIME_WRITE);
if(WdtLcdIAP) feedWatchDog();

if (ENABLE_NR==1) E=ON;
else E2=ON;
DATA=(char)dat;

E=OFF; E2=OFF;
RS=OFF;
RW=OFF;
return;
}
/**
* setCursor()
* move cursor to line and row
* line1 = 0 line2 = 1
**/
void setCursor(Display *dis,char line,char col)
{
short dat=0;

ENABLE_NR=dis->enable;

col&=63; // filter
dat|=col; // related adresse
dat|=((line&1)<<6); // line 1 or 2
dat|=(1<<7); // DB7
lcdWrite(dat);
}

chrisbenz
24.03.2005, 15:44
so, erstmal herzlichen Dank.

werde mich mal damit beschäftigen...