C ST7565R Init

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Hallo,

leider bekomme ich das Display bzw. den Controller nicht Initalisiert.

Diese Parameter schicke ich dem Display.:



CodeBox C
0x40, // Display Start Line 0


0xA1, // Display Normal


0xC0,

0xA6,

0xA2, // Set Bias


0x2F, // Power Control set


0xF8, // Booster Ratio set


0x00, // ""


0x23, // Contrast set


0x81,

0x08,

0xAC, // Static Indicator set


0x00, // ""


0xAF // Display on/off


Hiermit schreibe ich die Daten.:


CodeBox C
[I]uint8_t[/I] n = 0;



LCD_CTR_RESET_PORT |= LCD_CTR_RESET_PIN; // RST = 1




LCD_CTR_CS_PORT &= ~LCD_CTR_CS_PIN; // CS = 0


LCD_CTR_A0_PORT |= LCD_CTR_A0_PIN; // A0 = 1




for (n = 0 ; n < 8 ; n++)

{

LCD_CTR_SCK_PORT &= ~LCD_CTR_SCK_PIN; // 0


if (byte & 0x80)

{

LCD_CTR_SD_PORT |= LCD_CTR_SD_PIN; // 1


}

else


{

LCD_CTR_SD_PORT &= ~LCD_CTR_SD_PIN; // 0


}

byte <<= 1;


//_delay_ms(2);


LCD_CTR_SCK_PORT |= LCD_CTR_SCK_PIN; // 1


}



LCD_CTR_CS_PORT |= LCD_CTR_CS_PIN; // CS = 1




[I]_delay_ms[/I](2);


Und hiermit die Commands


CodeBox C
[I]uint8_t[/I] n = 0;

LCD_CTR_RESET_PORT |= LCD_CTR_RESET_PIN; // RST = 1


LCD_CTR_CS_PORT &= ~LCD_CTR_CS_PIN; // CS = 0


LCD_CTR_A0_PORT &= ~LCD_CTR_A0_PIN; // A0 = 0




for (n = 0 ; n < 8 ; n++)

{


LCD_CTR_SCK_PORT &= ~LCD_CTR_SCK_PIN; // 0


if (cmd & 0x80)

{

LCD_CTR_SD_PORT |= LCD_CTR_SD_PIN; // 1


}

else


{

LCD_CTR_SD_PORT &= ~LCD_CTR_SD_PIN; // 0


}

cmd <<= 1;


//_delay_ms(2);


LCD_CTR_SCK_PORT |= LCD_CTR_SCK_PIN; // 1


}



LCD_CTR_CS_PORT |= LCD_CTR_CS_PIN; // CS = 1




[I]_delay_ms[/I](2);


Ist irgendwas in der Init falsch?
Benutzen tue ich das "XMEGA-A3BU-XPlained"
 
Habe den Code gerade nicht vor der Nase, habe aber die einzelnen Pins kontrolliert, diese schalten wie sie sollen.
 
... habe aber die einzelnen Pins kontrolliert, diese schalten wie sie sollen.
Gut, die Zuordnung der IO Pins, deren Initialisierungen und die Ansteuerung wird somit stimmen.

Einige Konfigurationen sind ja vom LCD selber abhängig, nicht vom LCD-Controller. Vielleicht passen Einstellungen nicht zum LCD.

Falls du die Funktionen zur seriellen Übertragung selber geschrieben hast, kannst du auch mal eins von meinen Projekten (mit ST7565R Controller) anschauen und deine Funktionen vergleichen.

C-Library für Grafik-Displaymodul 128x64

Wenn du nicht weiter kommst, stellst du eventuell auch mal dein Projekt in das Forum.
 
Danke Dirk!

Was ich noch nicht so ganz verstanden habe, die ganzen Parameter die zum Initalisieren geschrieben werden.
Könnte mir das villeicht einer Erläutern, wie ich da vorgehen muss? Die Parameter die ich aktuell schreibe, habe ich von einem ähnlichen Projekt aus dem Netz genommen

Nach dem Initalisieren, zeigt das Display ein schwarzes Viereck an (nicht das komplette LCD!)... Ist das ein Zeichen das der Kontrast zu hoch ist?
 
Sehe ich das richtig, dass ich mit der Funktion das komplette LCD füllen kann?



CodeBox C
void Display_Update(void)
{   

   for (uint8_t page=0; page<8; page++)
   {
      _Display_SendCommand( page | 0xb0 );
      _Display_SendCommand(0x10);
      _Display_SendCommand(0x00);
      for (uint8_t col=0; col<128; col++)
      _Display_SendData(0xFF);       
   }   
       
}


Die anderen beiden Funktionen "_Display_SendCommand" & "_Display_SendData" habe ich ja weiter oben gepostet, die müssten ja für das Software SPI wie bei dir Identisch sein.
 
Sehe ich das richtig, dass ich mit der Funktion das komplette LCD füllen kann?

Im Prinzip ja, bei einem 128x64 LCD.

Nach dem Initalisieren, zeigt das Display ein schwarzes Viereck an (nicht das komplette LCD!)... Ist das ein Zeichen das der Kontrast zu hoch ist?
Ich denke, dass es nicht etwas mit Kontrast zu tun hat. Bin mir aber auch nicht hundertptozentig sicher. Es sieht eher danach auch, als wenn die Adressierung nicht passt. Entweder ist das habze Display dann schwarz oder "weiß". In meinem Beispielprojekt verwende ich ein 128x64 LCD.

Du müsstest bei dem Datenblatt deines Displays nachschauen, wie du den LCD Controller konfigurieren musst. Die Register sind im Datenblatt des ST7565R beschrieben.
 
Du müsstest bei dem Datenblatt deines Displays nachschauen, wie du den LCD Controller konfigurieren musst. Die Register sind im Datenblatt des ST7565R beschrieben.


Also so:



CodeBox C
void init_LCD()
{
comm_out(0xA0);
comm_out(0xAE);
comm_out(0xC0);
comm_out(0xA2);
comm_out(0x2F);
comm_out(0x21);
comm_out(0x81);
comm_out(0x3F);
}
 
Das habe ich auch schon versucht, danach ist immer noch ein schwarzer Bildschirm zu sehen.
Ist das normal? Bei Display mit externen Kontrast wo man mit einem Poti den Kontrast einstellen konnte, war ein zu dunkler Bildschirm, bzw. die Balken ein Zeichen dafür, dass es der Kontrast zu hoch ist oder es nicht richtig initalisiert wurden ist.

Was mich auch noch bisschen stuzig macht, im Datenblatt bei den Commands, steht das man "A0, WR, RD" bedienen muss. Leider ist aber bei dem Display gar kein "WR" oder "RD" raus geführt?!
 
Was mich auch noch bisschen stuzig macht, im Datenblatt bei den Commands, steht das man "A0, WR, RD" bedienen muss. Leider ist aber bei dem Display gar kein "WR" oder "RD" raus geführt?!
Auf dem Displaymodul ist der LCD Controller hardwaremäßig so konfiguriert, dass er im Serial Mode läuft. Der Registerzugriff ist dann "write only". RW\ und RD\ gibt es dann nicht.
 
Anbei mal mein Projekt.

Vielleicht siehst du ja auf anhieb was faul sein könnte.
 

Anhänge

  • XMEGA-A3BU-XPLAINED - write lcd.zip
    465 KB · Aufrufe: 2
Mehr sehe ich auf dem Display nicht.
 

Anhänge

  • XMEGA-A3BU-XPLAINED - write_lcd.jpg
    XMEGA-A3BU-XPLAINED - write_lcd.jpg
    270 KB · Aufrufe: 6
Also für mich sieht das richtig aus.

Es ist ein LCD mit 128x32 Pixel (4 Zeilen mit 8Bit Höhe), das würde nun vom Vergleich Breite zu Höhe recht genau passen.

Gesamthöhe ist ein viertel der Gesamtbreite.

Wenn im Moment alle Pixel an sind, wäre das ja richtig, da du dies ja so in deiner Software vorgibst. Damit man sieht, ob der Kontrast daneben liegt, übertrage doch einfach mal ein Muster. (Du hast meine Funktion für ein 128x64 Pixel LCD übernommen, dass passt nicht so recht, macht aber im Moment eventuell nichts aus)
 
Wenn ich aber alle Pixel löschen würde, müsste das Display doch weíß bleiben oder nicht?



CodeBox C
for ([I]uint8_t[/I] page=0; page<8; page++)

{

LCD_SendCmd( page | 0xB0 );

LCD_SendCmd(0x10);

LCD_SendCmd(0x00);

for ([I]uint8_t[/I] col=0; col<128; col++)

{

LCD_SendData(0x00);

}

}
 
Na klasse,

Die PWM stört. Wahrscheinlich zu schnell konfiguriert.
 
Ja, klappt prima. Danke!
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)