MelMan
02.06.2011, 17: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
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