Hallo Leute,
ich versuche gerade ein EA DIP128-6 (128x64, KS0108) an einem AT89C51AC3
zum Laufen zu bekommen.
Diese Lib möchte ich verwenden http://en.radzio.dxp.pl/ks0108/ .
Das Display ist so angeschlossen:
P0 => D0...D7
P2.0 RST#
P2.1 D/I
P2.2 R/W
P2.3 E
P2.4 CS1
P2.5 CS2
Da das Display ja zwei Enable hat und Chip Select jeweils H und L, habe
ich, wie im Datenblatt beschrieben, die beiden Enable miteinander
verbunden und CS1L# und CS2L# jeweils auf GND gelegt. CS1H und CS2H
entsprechen dann den Signalen CS1 und CS2.
Nun möchte ich ja die Lib von radzio.dxp.pl verwenden. In der wollte ich
nun die Pins anpassen, doch das ist leichter gesagt als getan.
Die Datei ks0108-8051.c, wie sie von der Seite stammt, ist im Anhang. So
habe ich sie bis jetzt mal angepasst:
1
#include<at89c51ac3.h>
2
3
#define KS0108_DATA_PORT P0
4
#define KS0108_DATA_DIR P0
5
#define KS0108_DATA_PIN P0
6
7
#define KS0108_CTRL_PORT P2
8
#define KS0108_CTR_DIR P2
9
10
#define KS0108_RS (1 << 0) // P2.0
11
#define KS0108_RW (1 << 2) // P2.2
12
#define KS0108_EN (1 << 3) // P2.3
13
14
#define KS0108_CS1 (1 << 4) // P2.4
15
#define KS0108_CS2 (1 << 5) // P2.5
16
#define KS0108_CS3 (1 << 6) // P2.6
Jetzt fehlt mir ja noch ein wenig....
Die lib möchte ich soweit beschneiden, dass nur zwei 64x64 Controller
(eben 128x64) angesteuert werden können und somit fällt dann CS3 raus,
jetzt erstmal habe ich das auf P2.6 gelegt, was nirgends angeschlossen
ist.
Und es fehlt mir noch D/I.
Zuerst dachte ich, das wär wie beim HD44780 ein Pin, welchen man fest
verdrahten kann (ich glaube das war der R/W), aber D/I ist ja
verantwortlich dafür, ob man Daten oder Befehle übertragen möchte.
Was muss ich da noch dran drehen?
Ich habe auch schon in den C-Dateien für die anderen verfügbaren
Controller nachgesehen, aber dort konnte ich auch kein D/I finden.
Ich hoffe mir kann da jemand helfen...
Der 8051 kennt Bitbefehle. Da brauchst Du nicht solche unübersichtlichen
Konstrukte der AVRs zum setzen einzelner Portpins.
#define KS0108_RS (1 << 0) // P2.0
=
#define KS0108_RS P2_0
im Programm dann so verwenden:
KS0108_RS = 1; oder KS0108_RS = 0;
je nach Compiler gibst noch etwas Spezifik zu beachten.
Naja, das war von vornherein schon so. Ich mache das sonst immer mit
sbit.
Ich hab nun mal eine andere lib (siehe Anhang, weiss die Seite leider
nicht mehr) verwendet, aber die funktioniert nicht. Es wird einfach
nichts angezeigt.
Ich werd mal weiter herumprobieren, vielleicht bekomme ich ja noch was
heraus...
Nachdem ich nichts passendes mehr gefunden habe, habe ich mich mal
drangemacht, etwas "eigenes" zu schreiben. Da ich von sowas keine Ahnung
habe, habe ich mir diesen Code (aus dem ersten Beitrag das Archiv)
Beitrag "GLCD Routinen ( KS0108, HD61202 )" als Vorlage genommen. Der
ist recht übersichtlich und einfach gestaltet.
Mein Code ist im Anhang. In der main rufe ich das so auf:
1
lcd_init();
2
cls();
3
lcd_set_pixel(10,10,BLACK);
Nachdem das nichts anzeigt, habe ich mal Debug Ausgaben per UART
eingebaut und sehe, dass er in der lcd_cmd hängen bleibt:
1
voidlcd_cmd(unsignedcharcmd,unsignedcharchip){
2
cs(chip);
3
DI=0;
4
RW=0;
5
lcd_write(cmd,chip);
6
}
In der lcd_write kommt er bis zum busywait und dort hängt er dann in der
while fest:
1
voidbusywait(){
2
LCDDATA=0xFF;
3
DI=0;
4
RW=1;
5
E=1;
6
waitms(1);
7
while((P2&BUSY)!=0){// poll for busyflag
8
E=0;
9
waitms(1);
10
E=1;
11
waitms(1);
12
}
13
14
E=0;
15
RW=0;
16
}
Könnte mal jemand der hiervon ein wenig Ahnung hat, meinen Code
durchsehen? Die Anschlussbelegung steht direkt oben im Code im Abschnitt
Header.
sorry kann kein C aber das kommt mit komisch vor
> while((P2 & BUSY) != 0) { // poll for busyflag
Wer ist hier P2 ?? Der Port ?? Oder reden wir von einem Bit ?
Sollte man den Port einlesen vor der Prüfung ?
Wo wird der Port gelesen ?
Am Anfang der Busywait. Was mir dabei gerade auffällt, leider habe ich
da vergessen das P2 in der While Schleife durch das LCDDATA (#define
LCDDATA P2) zu ersetzen. P2 geht ja genauso, aber für andere vlt. nicht
ganz so übersichtlich.
So, da kam immer D0 bei raus. Als ich dann mal P2 an LCDDATA angepasst
habe, fiel mir auf, dass ich da einen Dreher drin hatte. Nach eiener
Weile basteln bin ich nun etwas durcheinander, weiss nicht mehr genau,
was alles falsch war und habe es nun, glaube ich, soweit richtig.
Er arbeitet lcd_init(), cls() und lcd_set_pixel(10,10,BLACK) komplett
durch, dennoch zeigt er nichts an.
Im Anhang der Code