PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleines Problem bei Ansteuerung eines KS0108



MelMan
02.06.2011, 16:21
Hallo zusammen,

Habe mal meine erste eigene Ansteuerung für einen KS0108 Controller geschrieben.
Die tut auch soweit das was sie soll. Das einzige Problem was ich habe ist aber folgendes:

Wenn ich ein Zeichen an der Stelle 0,0 ausgebe wird diese korrenkt ausgegeben und dargestellt, sobald ich dann aber an eine andere Stelle x,y wechsel, wird das Zeichen was
vorher an 0,0 stand an die Stelle x,y übertragen. Es soll aber da bleiben wo es ist und an der Stelle x,y möchte ich gerne was neues ausgeben.

Ich häng mal meinen Code dran, vllt findet ja jemand den Fehler:)?

MAIN:


char a[6] = {0x00, 0x7C, 0x12, 0x12, 0x7C, 0x00};


int main(void)
{

Init_UART();
Init_LCD();

GotoXY(0,0);
Write_data(a[0]);
Write_data(a[1]);
Write_data(a[2]);
Write_data(a[3]);
Write_data(a[4]);
Write_data(a[5]);
_delay_ms(3000);
GotoXY(0,8);

while(1);

return 0;
}
Benötigte Funktionen:


void GotoXY(unsigned char x, unsigned char y) //DONE
{
if(x>123)
x = 0;
if(x>63)
{
x = x -64;
Select_chip(CS2);
Write_cmd((SET_ADD | x), CS2);
Write_cmd((START_LINE | (64-y)), CS2);
}

else if(x<=63)
{
Select_chip(CS1);
Write_cmd((SET_ADD | x), CS1);
Write_cmd((START_LINE | (64-y)), CS1);
}
}




void Write_cmd(unsigned char cmd, unsigned char CHIP) //DONE
{
CMD_PORT &= ~((1<<DI) | (1<<RW) | (1<<EN));
Select_chip(CHIP);

DDR_DATA_PORT = 0xFF;

DATA_PORT = cmd;
Enable();
DATA_PORT = 0x00;
}



void Write_data(unsigned char Data) //DONE
{
CMD_PORT |= (1<<DI);
CMD_PORT &= ~(1<<RW);

DATA_PORT = Data;

Enable();
DATA_PORT = 0x00;

}




void Enable(void) //DONE
{
for(i=0;i<10;i++);
CMD_PORT |= (1<<EN);
for(i=0;i<10;i++);
CMD_PORT &= ~(1<<EN);
for(i=0;i<10;i++);
}

Such schon länger aber find den Fehler nicht, vllt liegt es ja auch dadran dass ich irgendwas im Datenblatt übersehen hab:confused:

Also wenn jemand nen Tip hat immer her damit:)

LG




EDIT: Was mir grad eingefallen ist, hast das vllt. was mit dem SetPage des KS0108 zu tun? Denn das hab ich bis jetzt noch gar nicht verwendet weil ich die y-Werte immer nur über Display Start Line verändert hab.
Was mir nämlich grad aufgefallen ist - das Problem tritt nur auf wenn ich die y-Zeile verändere. Wenn ich also mehrere Zeichen in der gleichen Zeile ausgeben will ist das kein Problem

MelMan
02.06.2011, 17:05
Ok hab folgendes mal probiert:


void GotoXY(unsigned char x, unsigned char y) //DONE
{
if(x>123)
x = 0;
if(x>63)
{
x = x -64;
//Select_chip(CS2);
Write_cmd((SET_ADD | x), CS2);

Write_cmd((SET_PAGE | (y/8)), CS2);
//Write_cmd((START_LINE | (64-y)), CS2);
}

else if(x<=63)
{
//Select_chip(CS1);
Write_cmd((SET_ADD | x), CS1);

Write_cmd((SET_PAGE | (y/8)), CS1);
//Write_cmd((START_LINE | (64-y)), CS1);
}
}


Jetzt kann ich auch mehrere Zeichen anzeigen, unabhängig von der Zeile. Aaaaaaber ich kann ja jetzt nur zwischen 8 Zeilen wählen.
Was mach ich aber wenn ich ein Zeichen auf z.B. die Position x=0, y=5 setzen will? Denn durch das in meiner Funktion verwendete

Write_cmd((SET_PAGE | (y/8)), CS2); kann ich ja nur zwischen 8 Zeilen wählen.

MelMan
04.06.2011, 15:40
Hat keiner ne Idee oder weiß wie man das machen muss:confused:

Hubert.G
04.06.2011, 19:39
Ich habe mich mit dem KS0108 noch nicht beschäftigt.
Wenn du aber im Mikrocontroller.net bei der Suche KS0108 eingibst, erhälts du 335 Threads als Antwort.