Forum: Mikrocontroller und Digitale Elektronik 8051 und KS0108 Display


von dago (Gast)


Angehängte Dateien:

Lesenswert?

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...

von Matthias (Gast)


Lesenswert?

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.

von dago (Gast)


Angehängte Dateien:

Lesenswert?

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...

von dago (Gast)


Angehängte Dateien:

Lesenswert?

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
void lcd_cmd(unsigned char cmd, unsigned char chip) {
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
void busywait() {
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.

von Stephan H. (stephan-)


Lesenswert?

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 ?

von dago (Gast)


Lesenswert?

P2 ist der Datenport. Also D0...D7 vom Display sind an P2.0...P2.7 
angeschlossen. Der C-Compiler lässt auch direkt Zugriffe darauf zu, 
z.B.:
1
P2 = 0x3F;
2
if(P2 == a) {.....

von Pieter (Gast)


Lesenswert?

moin moin,

wo bitte wird P2 auf Input gesetzt (P2=0xFF)?

mfg
Pieter

von dago (Gast)


Lesenswert?

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.

von Stephan H. (stephan-)


Lesenswert?

laß Dir doch mal P2 ausgeben. Dann sollte sich was finden lassen.

von dago (Gast)


Lesenswert?

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

von dago (Gast)


Angehängte Dateien:

Lesenswert?

Irgendwas ging da wohl schief beim Anhängen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.