8051 und KS0108 Display

Gast #1350441
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...
Angehängte Dateien:
Gast #1350463
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.
Gast #1351037
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...
Angehängte Dateien:
Gast #1352273
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.
Angehängte Dateien:
Gast #1352331
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.
Gast #1352603
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren