Forum: Projekte & Code GLCD Routinen ( KS0108, HD61202 )


von master.andre (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
habe mal angefangen meine eigenen Routinen für die Ansteuerung eines 
grafischen Displays zu schreiben  nachdem ich mit den vorhandenen immer 
wieder Fehldarstellungen hatte  (wahrscheinlich weil ich das ganze mit 
16 MHz betreibe).

Habe dann bei der „Fehlersuche“ festgestellt das das ganze ja doch 
relativ einfach ist, und das man hier und da was verbessern könnte, naja 
geendet hat das ganze mit einer komplett eigenen Bibliothek.

Das ganze benutzt Fonts die mithilfe des GLCD FontCreators 2 von ape 
(auch hier im Forum zu finden) erstellt wurden, an dieser Stelle ein 
großes Lob an dieses sehr gelungene Programm.  Die Texte können beliebig 
groß sein und an beliebiger Stelle stehen.

Über ein define im Header kann angegeben werden ob die Texte die auf den 
Modulo 8 Grenzen liegen über „Pages“ geschrieben werden, also ohne die 
Zeitaufwendige Funktion set_pixel zu nutzen. Dabei sollte man auf jeden 
Fall darauf achten das die Schriftart genau 8/16/24/... Pixel hoch ist, 
sonst überschreibt man sich ggf. anderen Text, denn bei einer Schriftart 
die 9 Pixel hoch ist werden im FASTTEXT Modus 2 komplette Pages gefüllt 
ohne Rücksicht auf Verluste.

Habe keine besonderen Grafik Funktionen eingebaut (nur Linien und 
Rechtecke), da ich Sie selber nicht brauche und man sie einfach über 
set_pixel selbst realisieren kann (vielleicht anderen Bibliotheken 
entnehmen).

Im Header kann man dann auch noch gnadenlos Funktionen rausschmeißen die 
man nicht braucht. Z.B. kann man den „Bresenham“ Kram für die schiefen 
Linien rausschmeißen wenn man eh nur vertikale/horizontale braucht.

Die wichtigen Funktionen mal kurz zusammengefasst:
--------------------------------------------------
Allgemeines:
- init()
- clear()
- invert()

Text-Funktionen:
- set_cursor
- putc , puts , puts_p

Grafik-Funktionen:
- set_pixel
- draw_line , draw_rect, fill_rect
- draw_fullscreen_bitmap

Hoffe jemand freut sich drüber.

Ps:
Würde mich mal interessieren was ihr von den Routinen haltet und wie ihr 
meinen Programmierstil bewertet.

Gruss Andre

von Robotnik (Gast)


Lesenswert?

Servus,

Danke für die Library, ich brauchte gerade ein LCD um was auszutesten, 
da kam mir Deine gerade recht. So musste ich da nicht selber was auf die 
schnelle Programmieren ;-)

von master.andre (Gast)


Lesenswert?

Moin,
lass mich bitte wissen wenn es irgendwelche Probleme oder Fragen gibt.

Gruss
Andre

von Philipp Karbach (Gast)


Lesenswert?

alle achtung, kann deine routinen gut gebrauchen, die von ape 
funktionieren zwar aber mehr auch nicht, bei dir funktioniert sogar das 
scrolling flüssig, cool :)

von Mike (Gast)


Angehängte Dateien:

Lesenswert?

Sehr gute Arbeit, hat bei fast gleich gefunzt ;-)

Verbesserungsvorschlag für mylcd.h die Pin-Namen verwenden (siehe 
Anhang)

von master.andre (Gast)


Lesenswert?

Moin,
werde das mit den Pin-Namen übernehmen, ist ein bisschen 
übersichtlicher. Wenn ein paar Änderungen zusammengekommen sind werde 
ich das hochladen.

Gruss
Andre

von Alex (Gast)


Lesenswert?

Ich habe für meine Zwecke noch ne routine gebraucht die mir kleinere 
bmp's darstellt. Das is jetzt vielleicht nicht sauber geschrieben aber 
es funktioniert ...
1
void lcd_draw_bmp_symbol(uint8_t* bitmap, uint8_t x, uint8_t y){
2
  uint16_t byte=0;
3
  uint8_t y_start,y_end,y_offset,y_height;
4
  uint8_t right;
5
  uint8_t temp;
6
  uint8_t bmp_lenght, bmp_height;
7
  
8
  bmp_lenght = pgm_read_byte(bitmap);                          // aus flash in sram wie breit
9
  bmp_height = pgm_read_byte(bitmap+1);                        // aus flash in sram wie hoch
10
  y_start = y / 8;                                  // in welcher page muss angefangen werden
11
  y_end = ((y + bmp_height-1) / 8);                          // und in welcher muss aufgehört werden
12
  y_offset = y - (y_start * 8);                             // wie oft muss geschoben werden?
13
  y_height = ((bmp_height - 1) / 8);                          // wie viele zeilen (page) würde das bild an sich brauchen
14
  
15
  for (y=y_start;y<(y_end+1);y++)                          // schleife von y_start bis y_end
16
  {
17
    if(y > 7) break;                                // nichts ans lcd schicken wenn keine zeile (page) übrig ist
18
    lcd_write_cmd(LCD_SET_PAGE|y,CHIP1|CHIP2);                    // start a new page
19
    for (right=x;right<(x+bmp_lenght);right++)                    // starte von x bis x + bildbreite
20
    {
21
      temp = 0;                                  // löschen des datenregisters
22
      if(y != y_end || (y_start + y_height) == y_end){              // nur wenn nicht letzte zeile oder nochdaten übrig sind
23
        temp = (pgm_read_byte(bitmap+(byte)+2)<<y_offset);           // holen der daten und nach unten schieben
24
      }                        
25
      if(y != y_start){                              // nur wenn nicht erste zeile
26
        temp |= (pgm_read_byte(bitmap+(byte-bmp_lenght-1)+2)>>(8-y_offset));   // holen der daten und nach oben schieben
27
      }
28
      if (right<64){                                // auf welchen controller?
29
        lcd_write_cmd(LCD_SET_ADD|right,CHIP1);                  // auf x setzen ...
30
        lcd_write_data(temp,CHIP1);                        // ... und schreiben
31
      } else {
32
        lcd_write_cmd(LCD_SET_ADD|right,CHIP2);                  // auf x setzen ...      
33
        lcd_write_data(temp,CHIP2);                        // ... und schreiben
34
      }
35
      byte++;                                    // zeiger auf nächsten datensatz
36
    }
37
  }
38
}
Im array muss man dann noch was anpassen höhe und länge reinschreiben.
1
uint8_t bmp_warning[56] PROGMEM= {
2
18, // 18 px lang
3
19, // 19 px hoch
4
5
0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x78, 0x1E, 0x87, 0x87, 0x1E, 0x78, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00,
6
0x80, 0xE0, 0x78, 0x1E, 0x07, 0x01, 0x00, 0x07, 0xDF, 0xDF, 0x07, 0x00, 0x01, 0x07, 0x1E, 0x78, 0xE0, 0x80,
7
0x01, 0x03, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x03, 0x01
8
};

von Bernd K. (viper)


Lesenswert?

Hallo.

Kann ich das ganze auch aufn Mega8 flashen, weil irgendwie funkt das 
nicht ?

Das Display zeigt nichts an, obwohl alle Anschlüsse korrekt sind.
Compilieren und proggen ging problemlos.

CU
Bernd

von Bernd K. (viper)


Lesenswert?

Fehler gefunden, hatte ne Brücke beim Quarz, jetzt gehts.
Aber leider unleserlich, wahrscheinlich ist mein Display im Popo.

CU
Bernd

von Björn B. (elmo)


Lesenswert?

Hallo Andre,

vielen Danke für deinen Code! Leider funktionierte es bei mir nicht auf 
anhieb. Ich musste erst wait_while_chip_is_busy() durch ein Delay 
ersetzen. Warum dem so ist habe ich noch nicht herausfinden können.

Gruß
Björn

von master.andre (Gast)


Lesenswert?

Hallo Leute,
hatte die letzten Tage sehr viel zu tun. Musste mich da um nen paar 
wichtige Sachen kümmern.

Fangen wir mal an:
zu Alex:
-------------------------------
habe auch schon angefangen sowas zu implementieren, dazu hab ich nen 
kleines Programm in C# geschrieben um die Bilder (bzw. Arrays) zu 
erstellen, das Programm binarisiert das Bild direkt. Man kann zwischen 
drei Bildern wählen, eines ist mit ner einstellbaren Grenze, eines mit 
ner automatischen Grenze und das dritte wurd über nen Halbtonverfahren 
erstellt. Bis das ganze fertig ist kann aber noch ne Weile dauern, da 
ich momentan überhaupt keine Zeit dazu finde.

dein code sieht auf den ersten blick doch garnicht so wild aus, bissle 
aufräumen (zeilenumbrüche etc.),
dann schreibst du temp =0 und fünf zeilen drunter temp |= ...... das 
kommt mir ein wenig komisch vor, hängt es mit der IF-Abfrage darüber 
zusammen? ich hab den code aber nur überflogen.

zu Bernd:
------------------------------
also ja wie du festgestellt hast sollte es auf jedem avr mit genügend 
pins und speicher laufen (jetzt mal so salopp gesagt ohne lange 
nachzudenken).

da das display was anzeigt würde ich nicht davon ausgehen das es defekt 
ist (gib ihm noch ne chance). lade doch mal nen bild von deiner anzeige 
hoch.

Ggf. sind die Leitungen zu lang oder deine Spannungsversorgung unsauber 
vielleicht hast du auch die flasche Frequenz für deinen Quarz definiert 
(Stichwort F_CPU), mir fallen da ne ganze menge Gründe ein.
Habe mein Display mal irrtümlich falschrum angesteckt (alle pins 
vertauscht 20 auf 1,19 auf 2 ...) das Ding geht immer noch bestens,
nur die leds leuchten jetzt nen bissle blau anstatt weiß :).

zu Björn:
------------------------------
was genau ist bei dir im Header (mylcd.h) bei:

#define LCD_DATA_PIN .... eingestellt ?

hast du in deinem Projekt die Taktrate richtig eingestellt ?
#define F_CPU xxxxx
und ggf. Fusebits checken -> ckdiv8

ich habe das ganze bei 16 MHz am laufen
------------------------------

mfg
Andre

von Björn B. (elmo)


Lesenswert?

Hallo Andre,

LCD_DATA_PIN ist PINC, F_CPU via makefile auf 16MHz, Fuses auf externer 
Takt vom Quarz. Reset hängt bei mir an Pull-Up. Möglicherweise hat das 
was damit zu tun? Bisher kann ich mir keinen Reim darauf machen.

Gruß
Björn

von master.andre (Gast)


Lesenswert?

Hallo Björn,
also Reset ist unkritisch, wenn du einen Pullup dran hast sollte es 
funktionieren. Wie lang sind denn die Leitungen zu deinem Display? bei 
mir sehen die Signale mit 20cm IDE Kabel schon ein wenig verhuntzt aus. 
kann mir vorstellen das es vielleicht daran liegt. durch dein delay wird 
ja alles ausgebremst, dann siehts auch mit den signalen besser aus...

gruss
Andre

von Daniel (Gast)


Lesenswert?

Super ;-)

Hab das Ding ohne Probleme zum laufen gekriegt, nur sind wohl die Fonts 
bischen zu klein für mein 128x64 Display, werd später noch nen Foto hier 
einfügen ;)

von Daniel S. (sany)


Angehängte Dateien:

Lesenswert?

Bild 1

von Daniel S. (sany)


Angehängte Dateien:

Lesenswert?

Bild 2

von Daniel S. (sany)


Angehängte Dateien:

Lesenswert?

Bild 3

von Daniel S. (sany)


Angehängte Dateien:

Lesenswert?

Bild 4

Ist das bei der Schrift so gewollt das es so unscharf aussieht oder 
läuft da was schief? ;)

von Peter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo und vielen Dank Andre,
die Lib funktioniert wunderbar!

Das austauschen der Fonts funktioniert auch 1A, ich habe mir den großen 
kleiner gemacht und den kleinen größer, aber nicht auf dem Bild zu 
sehen.
Es handelt sich um das KS0108 LCD von Pollin für ~17 Euro.

Mfg,
Peter

von Tobias (Gast)


Lesenswert?

Hi

Habt ihr auch eine Anschlussbelegung für mich? Wäre sehr nett.

von moehrlin (Gast)


Angehängte Dateien:

Lesenswert?

Benutze einen ATmega32 @ 8.00MHz
habe in der main.c F_CPU auf 8MHz gesetzt.
Doch ich habe folgendes Problem siehe Bild!

von ecslowhand (Gast)


Lesenswert?

Jau, Chipseletct für die beiden Displayhälften vertauscht !

von Zwirbeljupp (Gast)


Lesenswert?

Du musst ChipSelect 1 und 2 vertauschen, dann sollte es passen!

von Zwirbeljupp (Gast)


Lesenswert?

Mist...zu langsam...

von Adam B. (Gast)


Lesenswert?

Hallo Freunde.
Ich interessiere mich auch für ein glcd und möchte Euch fragen, welche
LCD´s ihr mir empfehlen könntet.

Ich habe mir schon paar herausgesucht, kann mich jedoch nicht wirklich 
entscheiden.

1. 64128C von Displaytech ( 25,49 € )
http://docs-europe.electrocomponents.com/webdocs/06dd/0900766b806dda2b.pdf

2. 64128A von Displaytech ( 34,85 € )
http://docs-europe.electrocomponents.com/webdocs/06dd/0900766b806dda2a.pdf
(Braucht das LCD eine negative Spannung ??? s. Datenblatt Pin 18 VOUT 
-5V )
3. LCD-Modul TG12864B-03 ( erhältlich bei Pollin für 19,95 EUR)

Hat jemand Erfahrungen mit diesen Displays ?
Laufen sie mit den Bibliotheken von master.andre ???
Welche Displays habt Ihr benutzt ????

Für einige Antworten würde ich mich sehr freuen .

Liebe Grüße
Adam B.

von Ramon E. (pedalizer)


Lesenswert?

Hallo Andre,

vielen Dank für die tolle BIB! Ich werde sie an meine Bedürfnisse 
anpassen.

Gruss,
Pedalizer

von Gast (Gast)


Lesenswert?

Hallo Andre,
gibt es das von Dir angesprochene C# Programm zum Umwandeln der Bilder 
schon
irgendwo zum runterladen?
Sonst super Programm!

Gruss

von samuel (Gast)


Lesenswert?

Hallo zusammen,

ich habe zu der Bibliothek eine Anfänger-C Frage.
Wie kann ich einen integer Wert oder unsigned char direkt auf dem 
display schreiben lassen.
Beispiel:
lcd_puts_p(small_font,PSTR("1")); schreibt eine 1 auf dem Display.
Wie mache ich das, wenn ich jetzt eine unsigned char Variable habe, die 
den Wert 0x01 -0xff hat um das dynamisch auszugeben?

vielen Dank für eure Hilfe,
Sammy

von Andreas P. (madmax2006)


Lesenswert?

@samuel

hier kannst Du nach schauen.

Beitrag "Re: KS0108 GLCD Routinen"

Gruß

von Ulrich (Gast)


Lesenswert?

Hallo,
ich habe die lib mit einem mega32 bei 16MHz getestet. Auf PORTA 
funktioniert das auch wunderbar. Allerdings wollte ich den Datenport 
gerne auf PORTC haben und dort kommen nur noch Balken im Display (ist 
das ks0108 vom Pollin). Weis jemand woran das liegen könnte?
Gruss Ulrich

von Pete K. (pete77)


Lesenswert?

JTAG Fuse ?

von Ulrich (Gast)


Lesenswert?

Danke!!!
Da hab ich nicht dran gedacht. Jetz gehts!
Das einzige was ich mir noch icht ganz erklären kann ist warum ich an 
meinen Enable-Pin 1nF gegen Masse löten musste damit beide 
Displayhälften und nicht nur die rechte beschrieben werden. Am timing 
liegts meiner meinung nach nicht, den "Enable-impuls" hab ich schon von 
300ns bis 600ns getestet.

von Oliver (Gast)


Lesenswert?

>den "Enable-impuls" hab ich schon von 300ns bis 600ns getestet.

Dann nimm noch längere Werte. Die im Datenblatt angegebenen Werte sind 
manchmal sehr optimistisch.

Oliver

von ChrisT (Gast)


Lesenswert?

Guten abend

Kann mir jemand helfen, und mir sagen wie ich eigene bmps einbinden 
kann??
das will alles nicht so wie ich

Ich bedanke mich schonmal vorab für eure hilfe

von Jannik (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

habe mehrfach versucht das Codebeispiel von Andre auf meinem LCD 
(RG12864B von Lynx-dev.com) zum laaufen zu bekommen, aber habe es nicht 
geschafft! Anbei mein Schaltplan mit Mega644 mit 20MHz...diese sind auch 
unter AVRStudio eingestellt! Es erscheint rein gar nichts auf dem 
Display,
Datenleitungen sind mehrfach überprüft worden.
Das einzige was ich geändert habe ist:

//###################################################################

// Ports
#define LCD_CMD_PORT    PORTA    // Command Output Register
#define LCD_CMD_DDR      DDRA    // Data Direction Register for Command 
Port

#define LCD_DATA_PIN    PINB    // Data Input Register
#define LCD_DATA_PORT    PORTB    // Data Output Register
#define LCD_DATA_DDR    DDRB    // Data Direction Register for Data Port

// Command Port Bits
#define CD    0x03    // Data/Control (RS) PinNumber
#define RW    0x04    // R/W PinNumber
#define EN    0x05    // EN  PinNumber
#define CS1    0x01    // CS1 PinNumber
#define CS2    0x02    // CS2 PinNumber
#define LCD_NO_RES      // uncomment this line if you have an pullup on 
reset

#ifndef LCD_NO_RES
  #define RES  0x00    // Reset Pin
  #endif


Habt Ihr einen Tipp? Kann es ein Timingproblem sein? oder hatte jmd das 
schon mal???

von Gast (Gast)


Lesenswert?

Hallo,

kann mir vielleicht einer erklären wo das Bild der Sanduhr im Code 
gespeichert ist, bzw wie ich ein selbst erstelltes Bild mit dem "bmp2c" 
Programm einbinde?

MfG Daniel

von Gast (Gast)


Lesenswert?

Hat denn niemand eine Antwort?

von Daniel (Gast)


Lesenswert?

Kann mir zufälligerweise jemand sagen, weshalb ich bei dieser Bibliothek 
eine Zeile nicht mit Leerzeichen überschrieben kann?

von Daniel (Gast)


Lesenswert?

push

von Peter F. (piet)


Lesenswert?

Daniel schrieb:
> push

Gerade mal 7 Minuten warten und dann schon den Thread hochschieben 
wollen ist schon unverschämt.
Schau im Quellcode nach warum das so ist.

von Daniel (Gast)


Lesenswert?

Sorry!

Ich frage mich gerade, ob das Leerzeichen vom FontCreator überhaupt 
erzeugt wird.

von Daniel (Gast)


Lesenswert?

Erstellt wird das Leerzeichen anscheinend nicht, aber selbst wenn man es 
erstellt, wird es nicht dargestellt.
Wenn die Schriftbreite und die Höhe ermittelt, wird nichts geschrieben 
da beides 0 ist.
Oder sehe ich das falsch?

von Daniel (Gast)


Lesenswert?

Es werden ja anscheinend sowieso nur die gesetzten Pixel geschrieben.
Da sich die Schriften ja überlagern.
Weiss jemand Rat, wie man das Programm dazu bringen könnte auch die 
weissen nicht gesetzten Pixel zu schreiben?

Ich möchte eigentlich erstmal nur eine Uhr auf dem Display darstellen.
Jedoch flackert das ganze ein wenig wenn ich vorher das komplette 
Display lösche.

Vielleicht hat einer eine andere Lösung bzw einen Tip für mich.

von Oliver (Gast)


Lesenswert?

>Ich frage mich gerade, ob das Leerzeichen vom FontCreator überhaupt
>erzeugt wird.

Der Fontcreator 2 hat ein paar Macken. Das Leerzeichen ist immer Null 
Pixel breit. Das lässt sich aber nachträglich in der erzeugten Datei von 
Hand beheben.

Oliver

von Oliver (Gast)


Lesenswert?

Nachtrag:

Ich hatte vor einiger Zeit mal eine Version des Fontcreators gebastelt, 
die u.a. das Leerzeichen richtig ausgibt. Vielleicht hilft das weiter:

http://www.mikrocontroller.net/attachment/29112/GLCDFontCreator2.1_all.zip


>Leerzeichen sind jetzt mit der Breite drin, wie sie vom Windowsfont
>vorgegeben werden. Ausserdem lässt sich per Edit der Fontnamen
>nachträglich ändern, und die Berechnung der Fontgröße stimmt jetzt auch.

>Falls was nicht funktioniert, bitte meckern, oder gleich verbessern.
>Alle sourcen, auch die Originale von apetech, hab ich dazugepackt.

Oliver

von St. S. (clean-energy)


Lesenswert?

Hallo,

funktioniert die Lib auch mit dem AT89S8253 (8051)

Danke.

Grüße

von J!M! (Gast)


Lesenswert?

Hallo!

Ist mit "Command Output Port" in mylcd.h der Output von CD, RW, EN und 
CS1/2 gemeint?
Und bedeutet dann z.B.

"#define LCD_CMD_PORT  PORTA  // Command Output Register"
"#define LCD_CMD_DDR  DDRA  // Data Direction Register for Command Port"
"#define CD          0x07  // Data/Control (RS) PinNumber",
dass mit dem "Command/Data"-Pin des LCDs der PA07 des Avr's verbunden 
sein muss?

Danke!
J!M!

von Markus _. (markush)


Lesenswert?

Hi,

so ist es. Du könntes auch gleich schreiben:
1
#define CD          PA7  // Data/Control (RS) PinNumber

PORTC wird für die Datenbits genutzt.

Gruß - Markus

von J!M! (Gast)


Lesenswert?

Ok danke,
irgendwie läuft das aber nicht. Hmm, na gut.. werd mich erst mal weiter 
auf Fehlersuche begeben.

MfG J!M!

von Carsten (Gast)


Lesenswert?

Hi,

kann mir mal einer nen Belegungsplan senden?
Ich verstehe es nicht ganz. Oder:

PIN LCD
1         GND
2         +5V
3         Poti Schleifer
4
5         PA4
6         PA5
7         PC0
8         PC1
9         PC2
10        PC3
11        PC4
12        PC5
13        PC6
14        PC7
15
16
17        PA0
18        Poti
19
20

Poti an Masse

von Markus _. (markush)


Lesenswert?

Hi Leutz,

hier eine Erweiterung der lib um die Funktion Round_Rect (geklaut aus 
ape's lib):
1
// ---------------------------------
2
// draw round rectangle on screen
3
// ---------------------------------
4
void lcd_draw_round_rect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t radius, uint8_t color) {
5
    int16_t tSwitch, x1 = 0, y1 = radius;
6
    tSwitch = 3 - 2 * radius;
7
8
  while (x1 <= y1) {
9
    lcd_set_pixel(x+radius - x1, y+radius - y1, color);
10
    lcd_set_pixel(x+radius - y1, y+radius - x1, color);
11
12
    lcd_set_pixel(x+width-radius + x1, y+radius - y1, color);
13
    lcd_set_pixel(x+width-radius + y1, y+radius - x1, color);
14
15
    lcd_set_pixel(x+width-radius + x1, y+height-radius + y1, color);
16
    lcd_set_pixel(x+width-radius + y1, y+height-radius + x1, color);
17
18
    lcd_set_pixel(x+radius - x1, y+height-radius + y1, color);
19
    lcd_set_pixel(x+radius - y1, y+height-radius + x1, color);
20
21
      if (tSwitch < 0) {
22
        tSwitch += (4 * x1 + 6);
23
      } else {
24
        tSwitch += (4 * (x1 - y1) + 10);
25
        y1--;
26
      }
27
      x1++;
28
  }
29
30
  lcd_draw_line(x+radius, y, width-radius,y, color);      // top
31
  lcd_draw_line(x+radius, y+height, width-radius,y+height,color);  // bottom
32
  lcd_draw_line(x, y+radius, x,height-radius,color);      // left
33
  lcd_draw_line(x+width, y+radius, x+width,height-radius,color);  // right
34
}

Natürlich darf die Definition im Header nicht fehlen:
1
void lcd_draw_round_rect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t radius, uint8_t color);

Gruß - Markus

von St. S. (clean-energy)


Lesenswert?

Peter schrieb:
> Hallo und vielen Dank Andre,
> die Lib funktioniert wunderbar!
>
> Das austauschen der Fonts funktioniert auch 1A, ich habe mir den großen
> kleiner gemacht und den kleinen größer, aber nicht auf dem Bild zu
> sehen.
> Es handelt sich um das KS0108 LCD von Pollin für ~17 Euro.
>
> Mfg,
> Peter

Hallo Peter,

hättest du für das Pollin Display evtl. noch einen Anschlußschaltplan?

Danke

Stefan

von Christoph (Gast)


Lesenswert?

Servus leute,

großes Danke an den Autor der Lib hier. geflashed, display richtig 
angeschlossen und es lief auf anhieb :-) ihr habt mir viel viel arbeit 
erspart! danke dafür.

mfg Christoph

von Christoph (Gast)


Lesenswert?

servus leute,

ich bins nochmal. kann mir jemand von euch sagen wie die bilder für die 
bild-ladefunktion aufgebaut sein müssen.

mfg christoph

von Tester (Gast)


Angehängte Dateien:

Lesenswert?

Mit diesem Programm von Holger Klabunde ist es möglich.
Ich habs einfach mal hochgeladen, ich hoffe in seinem Sinne...
Schwirrt hier auch irgendwo anders noch herum.
Funzt super..

von Micha (Gast)


Lesenswert?

Kann mir jemand sagen ob entweder das Display von Farnell mit der 
Bestellnummer:

Bestellnummer: 1220443
Display: MG1206B-SYL
Controller: S6B0108A

bzw:

Bestellnummer: 9449469
Display: MG12064E3-SBLW
Controller: S6B0107B

mit der Library compatibel sind...?

Ich denke mal ja, nachdem der Samsung controller KS0107/KS0108 heißt und 
die controller auf diesen Displays S6B 0107 bzw S6B 0108 heißen...

Im inet ist ja zu lesen dass der KS0107/KS0108 ein weit verbreiteter LCD 
Controller sein soll, ich habe aber bisher noch kein Display gefunden wo 
dieser dezidiert dabei steht...

lg

von Micha (Gast)


Lesenswert?

Weiß das wirklich niemand von euch..?

von Christoph (Gast)


Lesenswert?

danke @Tester

hab endlich mal wieder zeit gefunden mich in den foren umzukucken :-)

mfg Christoph

von Christoph (Gast)


Lesenswert?

@ Micha ich hab mal ganz kurz bei onkel google gestöbert und bin auf die 
seite hier gestossen http://www.ramtex.dk/products/lcdd0108.htm da wird 
dein display als KS0108 family "member" geführt (die 08) und von samsung 
kommt der chip auch. http://www.chipcatalog.com/Samsung/S6B0108A.htm 
(siehe datenblatt) könnte also denk ich kompatibel sein. ich kenn mich 
auf dem gebiet aber nicht wirklich gut aus. sind nur die erträge meiner 
(ca 5min) recherche.

mfg Christoph

p.s. grad nochmal weitergeklickt :-) und siehe da

"Seems that S6B0108A is replace for KS0108." Quelle: 
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=42214&start=0

von strikeforce (Gast)


Lesenswert?

Ich hoffe mir kann einer von euch helfen.

ich versuche seit geraumer zeit bitmaps auzugeben.

mit dem Bitmap von der Sanduhr klappt auch alles

nur leider nicht mit eigenen habe schon Image2glcd, bmp2glcd und bmp2ks
versucht

hat es einer von euch schon hinbekommen

von Frank B. (frankman)


Lesenswert?

Servus liebe Leute,
ich hätte mal eine Frage an Euch, werte KS0108-Display-Benutzer:

Ich verwende das tolle Display von Mikroelektronika mit Touch in 
Verbindung mit einem Microchip PIC24FJ128.... So weit so gut, Bilder 
lassen sich damit schon malen....

ABER:
Kann es sein, dass das Timing im Datenblatt von hinten bis vorne nicht 
stimmt?
Besonders das Busy-Flag scheint manchmal ewig zu dauern.
Das Display wird mit richtig "Dampf" angefahren, nur das Busy-Flag 
dauert manchmal ewig.

Hat jemand Erfahrungen mit 3V3-Pegeln auf den Datenleitungen anstatt 5V?

Es scheint auch so zu sein, das die Reset-Leitung des Displays extrem 
"kräzig" reagiert. Nur ein (zugegebenermaßen auf den ersten Blick völlig 
sinnloser) Kondensator von 47nF zwichen Reset und GND (oder Vee) macht, 
dass Display einigermaßen stabil läuft.

von Alexander P. (tollerteppich)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Ich hab ein kleines Problem und zwar kriege ich das Programm nicht auf 
dem mega16 zum laufen...

Also Prozessor Typ und FCPU (8 MHz) habe ich angepasst in AVR-Studio...

Jetzt muss ich noch die MCU spezifischen Pins anpassen und ggf. weitere 
Einstellungen.

Ich habe aber nicht so viel Routine mit solchen Einstellungen und wollte 
hier mal um eure Hilfe diesbezüglich bitten.

Also die einstellungen habe ich gefunden in der mylcd.h nur was muss ich 
jetzt genau verändern ?

GLCD  MCU   Pin
-------------------
D0-7  D0-7  14-21
CD     A3   37
RW     A4   36
EN     A5   35
CS1    A2   38
CS2    A1   39
Rst.  VCC   --

Der Reset Pin war in der vorherigen Beschaltung am parallel Port vom PC 
auf VCC gelegt muss der für den MCU auf einen Pin gelegt werden ?
1
  
2
3
  // Ports
4
  #define LCD_CMD_PORT    PORTA    // Command Output Register
5
  #define LCD_CMD_DDR      DDRA    // Data Direction Register for Command Port
6
7
  #define LCD_DATA_PIN    PINC    // Data Input Register
8
  #define LCD_DATA_PORT    PORTC    // Data Output Register
9
  #define LCD_DATA_DDR    DDRC    // Data Direction Register for Data Port
10
11
  // Command Port Bits
12
  #define CD          0x07    // Data/Control (RS) PinNumber
13
  #define RW          0x06    // R/W PinNumber
14
  #define EN          0x02    // EN  PinNumber
15
  #define CS1          0x05    // CS1 PinNumber
16
  #define CS2          0x04    // CS2 PinNumber  
17
  //#define LCD_NO_RES          // uncomment this line if you have an pullup on reset
18
  
19
  #ifndef LCD_NO_RES
20
    #define RES        0x03    // Reset Pin
21
  #endif

Sind das alle Einstellungen die ich ändern muss oder muss ich wo anders 
noch was ändern ?

Das wäre klasse wenn ihr mir ein bischen unter die Arme greifen könntet.

Gruß Alex

von holger (Gast)


Lesenswert?

>  #define LCD_DATA_PORT    PORTC    // Data Output Register
>Sind das alle Einstellungen die ich ändern muss oder muss ich wo anders
>noch was ändern ?

Schalte die JTAG Fuse aus.

von Alexander P. (tollerteppich)


Lesenswert?

Hey danke für die Antwort

Wie mache ich das genau ? hab schon im tut nach JTAG gesucht und im 
AVR-Studio nichts finden können.

Muss ich die Bits für die Ausgänge anpassen und wenn wie ?
Ich hab schon ins Datenblatt vom Atmega16 geschaut aber nichts 
hilfreiches finden können bzw. wo muss ich nach schauen um die richtigen 
werte für die Bits zu finden ?

Das mit dem Reset Pin hat sich erledigt den kann man ja abschalten in 
der Config.

Gruß Alex

von Alexander P. (tollerteppich)


Lesenswert?

Also !

JTAG ist aus

Low fuse  0x3F
High fuse 0xC9

Habe die Pis mit PA0 - PA5 zugewiesen
an Port C sind die datenleitungen

Frequenz ist auf 8 MHz eingestellt am ext. Oszilator

Prozessor ist Richtig eingestellt ATmega16

Keine Fehler Warnungen beim Compilen

Brennen Klappt wunderbar

Trotzdem ist mein Display Leer

Hab ich noch etwas vergessen ?

Gruß Alex

von Alexander P. (tollerteppich)


Lesenswert?

wer mag mir antworten ?

Gruß Alex

von Alexander P. (tollerteppich)


Lesenswert?

So es läuft :D simpler schaltungsfehler aufem steckbrett hatte sich ne 
brücke 5V -> D7 versteckt brücke raus und siehe da es funktioniert

Danke Für die software und dieses tolle Forum

Gruß Alex

von Roman R. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo ihr

Ich spiele schon seit einiger Zeit mit der Lib von ape rum. An sich 
funktioniert auch alles und ich habe die Funktionen, die ich brauche.
Doch jetzt habe ich eine andere Schriftart mit dem FontCreator2 
gebastelst, aber komischerweise funktioniert die nicht...ebensowenig wie 
die mega-Schriftart aus dem Beispiel.

Im Anhang ist ein CharTable, den ich sehr gerne 3-fach vergroessert 
haben moechte.
Die Ausgabe als txt ist auch angehaengt.
Koennte vielleicht jemand mal testen, obs nur bei mir nicht geht?
Oder vielleicht seht ihr ja einen groben Fehler meinerseits.

MfG stgtroman

von Roman R. (Gast)


Lesenswert?

Ich muss mich verbessern.
Natuerlich nehme ich die lib von master.andre und nur den FontCreator 
von ape

von Roman R. (Gast)


Lesenswert?

Ok nochmal ich.

Ich hab inzwischen herausgefunden was los ist/war. Der FontCreator2 
macht einen Vorzeichenfehler bei der Hoehe (zumindest unter Win7 x64).
Und die mega-Schriftart hat natuerlich auch funktioniert. Hatte wohl 
etwas geaendert.

von GierigeSau (Gast)


Lesenswert?

Hallo, nutze gerade die "mylcd" routine...
Leider zeigt das Display nichts an. (Ein mal zufällig linke seite stück 
vom "Ladebalken")

Hardware fehler schließe ich aus, da ich noch eine Bascom erzeugte HEX 
liegen hab, die Funktioniert einwandfrei.
Pinbelegung kenne ich mitlerweile nach dem ganzen Kontrollieren 
auswendig :(

Kontroller KS0108 Display 128x64


Evtl jemand eine Idee? Bin für jede Hilfe dankbar...


MFG

von Timo S. (gierigesau)


Lesenswert?

Ich nochmal...
Was merkwürdig ist, wenn ich nach dem flashen kurz warte, dann im Source 
CD & RW Pin tausche und neu flashe, wird mir ein teil von Daniel 
Steiner´s "Bild 3" (siehe oben) angezeigt. Aber auch nur so lang ich die 
Spannungsversorgung nicht trenne, denke also es wird aus dem Display-Ram 
angezeigt. Aber der Enable-Pin bleibt dann auf "High" (LED 
angeschlossen).

Echt merkwürdig...

Bitte um Hilfe

von Timo S. (gierigesau)


Lesenswert?

So, ich nochmal.
Fehler hab ich zwar noch nicht gefunden, aber mit einem anderen Display 
läufts nun auch. Kann eig. nur ein timing Problem sein, da beide 
Display´s mit der Bascom HEX funktionieren...


MFG

von m32 (Gast)


Lesenswert?

Nabend

Ich wollte soeben mal auf Grundlage dieser lib mein Display ans Laufen 
bekommen mit AvrStudio.

Bisher habe ich es nur in Bascom laufen gehabt, geht auch soweit bis auf 
die Tatsache das der rechte Teil des Bildes um eine Zeile (Pixel nicht 
Schrift) nach unten verschoben ist was natürlich unschön ist grade in 
einer Menustruktur mit invertierten Einträgen. Falls dazu jemand eine 
Lösung hat, nur her damit. Ich habe schon seit 2 Tagen Google befragt 
aber eine Lösung habe ich nicht gefunden.

Display: RG12846B-BIW-V (KS0108 Controller)
µC: Mega32 @ 16MHz, Verbindungen sind ca 8cm lang und gelötet, nicht 
gesteckt. Der Fehler bleibt auch konstant bei einem Pixel also sollte 
eine Störung der Leitung nicht das Problem sein.

Ich habe gehofft das dieser Fehler an Bascom liegt und ich ihn mit 
Wechsel auf C loswerden kann. Mein Problem, da ich mit AvrStudio vorher 
nicht wirklich was gemacht habe (ausser meine µC zu flashen), ich habe 
die Lib in ein neues Projekt gepackt, die includes geprüft und wollte 
compilieren. Dies gab dann 46 Fehler. Er findet die Includes, aber er 
kennt nicht eine der darin enthaltenen Funktionen, finde ich merkwürdig. 
Ich habe schon mit dem alten Borland C Compiler gearbeitet, da musste 
man eine Reihenfolge einhalten damit der Compiler Funktionen erkennt, 
aber hier stehen diese doch auch ganz oben in den Includes, warum also 
bei jedem Aufruf ein "undefined reference to XXXXX"? In diesem Punkt 
weis ich nicht weiter, die Funktion ist in den Includes deklariert, also 
sollte er sie kennen.

von Oliver (Gast)


Lesenswert?

m32 schrieb:
> aber hier stehen diese doch auch ganz oben in den Includes, warum also
> bei jedem Aufruf ein "undefined reference to XXXXX"? In diesem Punkt
> weis ich nicht weiter, die Funktion ist in den Includes deklariert, also
> sollte er sie kennen.

Nö. Er kennt genau das, was in den include-Dateien drinnsteht. Das sind 
nur die Funktionsdeklarationen. Die eigentlichen Funktionen dazu stecken 
in den anderen Dateien, und die muss der linker dazulinken, was er 
offensichtlich nicht tut.

Du musst schon alle .c-Dateien aus mylcd.zip in den Source-Ordner des 
Studios (oben links) hinzufügen.

Oliver

von m32 (Gast)


Angehängte Dateien:

Lesenswert?

Oliver schrieb:
> Du musst schon alle .c-Dateien aus mylcd.zip in den Source-Ordner des
> Studios (oben links) hinzufügen.

Habe ich, er findet sie auch alle (zumindest kommt keine Fehler er würde 
die Datei nicht finden) aber kann mit den Funktionsnamen nichts 
anfangen. Darum bin ich mal auf CodeBlocks umgestiegen das kenne ich vom 
C Programmieren aus der FH, dort funktioniert das Compilieren gleich auf 
Anhieb, nur leider gibt das Display keine Mucken von sich. Und ja, ich 
habe die Pins richtig eingestellt und auch andere Dinge wie 
Controllertyp, Quarz etc.

Woran könnte es denn liegen das die rechte Seite des Display bei 
Bascomnutzung um einen Pixel nach unten verschoben ist? Das sieht echt 
nicht schön aus (siehe Anhang). Wie schon gesagt, die Zuleitungen sind 
ca 8cm lang und bestehen aus altem Festplattenflachbandkabel.

Datenport ist B, ISP abgezogen
Controllerport ist D2-D7
Display, RG12864B-BIW-V (KS0108 Controller)

Ich habe Google schon befragt, aber wirklich was hilfreiches habe ich 
nicht gefunden. Ich habe hier im Forum einen Beitrag gefunden wo dieses 
Problem schonmal auftrat und durch höhere Delayzeiten beseitigt wurde, 
aber da ich die in den libs enthaltene Sprache bisher nie benutzt habe 
wollte ich da nicht drin herumpfuschen.

von Oliver (Gast)


Lesenswert?

Nach einem timing-Problem sieht das zar eher nicht aus, aber man soll 
nie nie sagen.

Im Code findest du einige Aufrufe der Funktion _delay_us.

Das steht dann
1
delay_us(1);
oder
1
delay_us(2);

Änder die mal alle in
1
 delay_us(20);

und schau, was dann passiert. Wenn es damit geht, kannst du dich 
schrittweise an einen kleineren Wert herantasten.

Oliver

von m32 (Gast)


Lesenswert?

Ich dachte die libs von Bascom seien in Assembler geschrieben. Das was 
du da schreibst sieht eher aus wie C.

von m32 (Gast)


Lesenswert?

Sehr komisch... Ich habe eine neue Oberfläche gemacht die das Display 
ausserhalb des Menüs anzeigen soll, und nun ist da nichts mehr 
verschoben. Ich kann Text und Linien reinpacken wie ich will, alles 
passt.

Durch schrittweises verkleinern meines Programms konnte ich das Problem 
eingrenzen und auch finden. Ich habe den Befehl Lcdat falsch benutzt. 
Ich bin auf diesen Befehl in einem Beispielprogramm gestoßen und wusste 
nichts von dieser Einschränkung.

Lcdat y,x, string,inv
Gibt eine Variable an der Stelle aus, ich hatte bei X = 0 angefangen, 
aber es musste X = 1 sein, und nun ist auch nichts mehr verschoben. 
Interessante Auswirkung eines vom Compiler geschluckten Fehlers..

von Andy (Gast)


Lesenswert?

Hi,
vielleicht kann mir hier jemand helfen.
Wenn ich mit der LIB Zahlen oder auch text ausgebe der sich ändert 
löscht es die alten Pixel nicht. Hat vielleicht schon jemand eine Lösung 
dafür oder einen Lösungsvorschlag.

von Markus _. (markush)


Lesenswert?

Hi,

du musst den betroffenen Bereich vorher löschen, z. B. mit 
lcd_fill_rect.

--- Markus ---

von Andy (Gast)


Lesenswert?

Das Hab ich versucht bekomms aber irgendwie nicht richtig hin hier mal 
die Funktion vielleicht hast du einen Vorschlag wie man es am besten 
macht:

void lcd_putc(uint8_t* font,uint8_t chr)
{
  uint8_t x,page,bit,data,cnt=0;

  if (font_char_present(font,chr)==1)  // print only if letter is 
present in font
  {
    if ( ( (cursor_x + font_char_width(font,chr)) <128)  && 
((cursor_y+font_char_height(font))<=64))  // only print leeter if it 
fits in screen
    {
      uint16_t offset= font_start_offset(font,chr);  // get the position 
of the first byte in font-array

      for(page=0;page<=(font_char_height(font)-1)/8;page++)  // write 
all pages(rows)
      {
        lcd_write_cmd(LCD_SET_PAGE|((cursor_y/8)+page),CHIP1|CHIP2);  // 
calc the current page

        if (cursor_x<64)  // set cursor to its poition (0 on the 
inactive controller so it can start directly on chip change)
        {
          lcd_write_cmd(LCD_SET_ADD|cursor_x,CHIP1);
          lcd_write_cmd(LCD_SET_ADD|0,CHIP2);
        }
        else
        {
          lcd_write_cmd(LCD_SET_ADD|(cursor_x-64),CHIP2);
        }

        for (x=cursor_x;x<cursor_x + font_char_width(font,chr);x++) 
//fill "pages"
        {
          data= pgm_read_byte(font+offset+cnt++);

          if ( page==font_char_height(font)/8)
            data>>=8-(font_char_height(font)%8);  // if char height is 
bigger than 8 we have to remove some leading zeros

          #ifdef FASTTEXT                // this is much much faster 
than using set_pixel (see discription in header file)

          if (cursor_y%8==0 )
          {
            if (x<64)
              lcd_write_data(data,CHIP1);
            else
              lcd_write_data(data,CHIP2);
          }
          else
          #endif
          {

            for(bit=0;bit<8;bit++)
          {

            if ((data&(1<<bit))!=0)
             lcd_set_pixel(x,cursor_y+page*8+bit,BLACK);
            }

          }
        }

        #ifdef FASTTEXT
        if(cursor_y%8==0)
        {
          if (x<64)
            lcd_write_data(0,CHIP1);
          else
            lcd_write_data(0,CHIP2);
        }
        #endif
      }
      cursor_x += font_char_width(font,chr)+1;


    }
  }
}

ich hab es mal so versucht

  if ((data&(1<<bit))==0)
   lcd_set_pixel(x,cursor_y+page*8+bit,WHITE);
  else
          lcd_set_pixel(x,cursor_y+page*8+bit,BLACK);
hat aber das Problem wenn die 1 nach einer anderen Zahl kommt bleiben 
wieder Pixel stehen auch bei verschiedenen Buchstaben.

von Andreas P. (Gast)


Lesenswert?

Hallo Master Andre,

ich habe ein 128x64 Display und bekomme da auch Zeichen ausgegeben mit 
der LIB von Ape.
Ich möchte jedoch deine Lib verwenden, da ich diese Strukturierter finde 
und auch BMP ausgeben kann. ... probiere da jetzt schon paar Std. dran 
aber bekomme kein Zeichen auf dem Display ausgegeben.... woran kann das 
liegen ?
Ports & DDR ist wie bei der LIB von Ape eigestellt, kann also nicht 
daran liegen.
Ich habe soweit nichts an der Lib verändert außer die Porteinstellungen.
Hast du noch eine Idee was ich ausprobieren kann ?

Habe einen Beitrag gefunden wo das selbe Problem aufgetreten ist, leider 
ohne Ergebnisse bei der Fehlersuche 
Beitrag "KS0108 GLCD lib von master.andre funzt nicht"

P.S verwende einen Atmel AT90CAN128

von Andreas P. (Gast)


Lesenswert?

Soo, habe jetzt wahrscheinlich das Problem gefunden..... ich verstehe 
aber diese Schreibweise nicht ganz.
Was macht diese Zeile ?
1
lcd_write_cmd(LCD_DISP_START|0,CHIP1|CHIP2);

Kann mir die mal jemand als ausführlichen Code schreiben !?

Thx, Andreas

von Andreas P. (Gast)


Lesenswert?

Hallo @ all,
ich benutze den oben genannten GLCD Treiber für ein Display mit dem 
Treiberbaustein PT6608. Ich habe mir das gleiche Display nochmal 
bestellt, auf diesem befindet sich jedoch der Treiberbaustein SBN0064G.
Diese sind soweit auch baugleich, am Telefon wurde mir jedoch gesagt das 
der SBN0064G "schneller" reagiert.
Beide Display sollten eigentlich mit dem gleichen Quellcod laufen, 
jedoch ist beim SBN0064G (währende des Start vorgangs) die rechte/linke 
Seite verschoben und 2 sek. später verschwindet der Text auf der Rechten 
Seite komplett.
Weiterhin wurde mir am Telefon gesagt, das ich etwas an den Timings 
ändern soll, jedoch weiß ich nicht wo und wie!

Hat jemand eine Idee wo man da auf Fehlersuche gehen könnte?

P.S Ein defekt bei dem SBN0064G Display ist auszuschließen, da ich drei 
Stück von denen hier habe und alle gleich reagieren... nur das mit dem 
Treiber PT6608 läuft problemlos, dieses wird aber nicht mehr produziert, 
da der Hersteller pleite ist :-(

von Peee. T. (da-phil)


Angehängte Dateien:

Lesenswert?

Hallo Allerseits,

jetzt noch mal ein zweiter Versuch. Irgendwie ist beim ersten Beitrag 
was schief gelaufen und ich hab ihn wieder gelöscht...

Ich benutze die eingangs angebotene Bibliothek für dieses Display:
http://www.sure-electronics.net/mcu,display/DE-LM106.pdf

Controller ist ein ATMEGA32 (mit 8 MHz intern). Beides habe ich im 
Projekt (AVR-Studio) eingestellt und die Pins habe ich auch angepasst.

Die Ausgabe ist prinzipiell zu erkennen, aber es ist nicht i.O. (siehe 
angehängtes Bild) Die "clearscreen"-Funktion löscht irgendwie nicht das 
gesamte Display. Die vier einzelnen Striche und die zwei großen Bereiche 
werden danach immer noch dargestellt.

Hat jemand einen Tipp für mich woran es liegen kann? Timingproblem?

Grüße

von Peee. T. (da-phil)


Lesenswert?

OK, ich glaube ich hab das Problem gelöst. Der Controller hatte einen 
weg. Durch den Austausch konnte ich das Problem beheben....

von Infain I. (infain_i)


Lesenswert?

Hallo,

bei mir sieht das ganze ähnlich aus wie bei Phil.
Hab schon 4 verschiedene Atmegas probiert.
Hat jemand ne Idee?



InFaIN

von Peee. T. (da-phil)


Lesenswert?

Vielleicht ein Schaltungsfehler oder ein Kurzschluss?

von Infain I. (infain_i)


Angehängte Dateien:

Lesenswert?

Ich denke mein Schaltplan dürfte soweit stimmen....

Auf der suche nach Kurzschlüssen konnte ich sobald JP3 und JP4 
eingesteckt sind zwischen Reset und GND einen ständig zunehmenden 
Widerstand messen. Auch ohne Strom und eingebautem Atmega...

1
// Ports
2
  #define LCD_CMD_PORT    PORTA    // Command Output Register
3
  #define LCD_CMD_DDR      DDRA    // Data Direction Register for Command Port
4
5
  #define LCD_DATA_PIN    PINC    // Data Input Register
6
  #define LCD_DATA_PORT    PORTC    // Data Output Register
7
  #define LCD_DATA_DDR    DDRC    // Data Direction Register for Data Port
8
9
  // Command Port Bits
10
  #define CD          PA0    // Data/Control (RS) PinNumber
11
  #define RW          PA1    // R/W PinNumber
12
  #define EN          PA2    // EN  PinNumber
13
  #define CS1          PA3    // CS1 PinNumber
14
  #define CS2          PA4    // CS2 PinNumber  
15
  #define LCD_NO_RES          // uncomment this line if you have an pullup on reset
16
  
17
  #ifndef LCD_NO_RES
18
    #define RES        PA5    // Reset Pin
19
  #endif

von Owen S. (senmeis)


Lesenswert?

Vielen Dank für die gute Arbeit.

Man möchte eine Portierung auf den C166 machen. Welche Teile sollen 
angepasst werden? Nur mylcd.h?

Cu
Senmeis

von Blonkel (Gast)


Lesenswert?

Für alle bei denen es nicht klappt: JTAG fuse überprüfen wie bereits in 
einem Beitrag erwähnt hat mich bestimmt nun 2 Stunden gekostet. Vielen 
Dank für die Library !

von InFaIN (Gast)


Lesenswert?

Ein verdammter Hacken und Tage der Verzweiflung...

Vielen Dank für den Tipp mit JTAG das wars...

von Owen S. (senmeis)


Lesenswert?

Hat jemand die Methoden lcd_draw_circle() und lcd_fill_circle() 
erstellt? Unten wird ein Code vom Pascal Stang angezeigt, aber sieht 
anders aus.
1
// draw circle
2
void glcdCircle(u08 xcenter, u08 ycenter, u08 radius)
3
{
4
  int tswitch, y, x = 0;
5
  unsigned char d;
6
7
  d = ycenter - xcenter;
8
  y = radius;
9
  tswitch = 3 - 2 * radius;
10
  while (x <= y) {
11
    glcdSetDot(xcenter + x, ycenter + y);     glcdSetDot(xcenter + x, ycenter - y);
12
    glcdSetDot(xcenter - x, ycenter + y);     glcdSetDot(xcenter - x, ycenter - y);
13
    glcdSetDot(ycenter + y - d, ycenter + x); glcdSetDot(ycenter + y - d, ycenter - x);
14
    glcdSetDot(ycenter - y - d, ycenter + x); glcdSetDot(ycenter - y - d, ycenter - x);
15
16
    if (tswitch < 0) tswitch += (4 * x + 6);
17
    else {
18
      tswitch += (4 * (x - y) + 10);
19
      y--;
20
    }
21
    x++;
22
  }
23
}
Ciao
Owen

von Markus O. (maxmaxmax82)


Lesenswert?

Hallo,

Danke erstmal für diese Routine. Habe bis jetzt mit der von ape 
gearbeitet aber bei dieser sind manche Funktionen einfacher.

Zu meinem Problem:

Wenn ich mit einer großen Font auf das Display schreibe dann beginnt das 
Display zu flackern.

Die erste Zeile flackert weniger als z.b: die dritte Zeile.

An was kann das liegen?

Habe ein Arduino Board mit mega2560 (16MHz)

Bester Dank im Voraus für eure Antworten.

mfg max

von Markus O. (maxmaxmax82)


Lesenswert?

Markus O. schrieb:

> Wenn ich mit einer großen Font auf das Display schreibe dann beginnt das
> Display zu flackern.

Edit: Es ist nicht nur bei einer großen Font sondern auch bei einer 
kleinen.
Hatte das selbe Problem schon bei der Routine von ape aber auch dort 
leider noch keine Lösung gefunden.

Danke

von Jonas (Gast)


Lesenswert?

Owen Senmeis schrieb:
> Hat jemand die Methoden lcd_draw_circle() und lcd_fill_circle()
> erstellt? Unten wird ein Code vom Pascal Stang angezeigt, aber sieht
> anders aus.// draw circle
> void glcdCircle(u08 xcenter, u08 ycenter, u08 radius)
> {
>   int tswitch, y, x = 0;
>   unsigned char d;
>
>   d = ycenter - xcenter;
>   y = radius;
>   tswitch = 3 - 2 * radius;
>   while (x <= y) {
>     glcdSetDot(xcenter + x, ycenter + y);     glcdSetDot(xcenter + x, ycenter - 
y);
>     glcdSetDot(xcenter - x, ycenter + y);     glcdSetDot(xcenter - x, ycenter - 
y);
>     glcdSetDot(ycenter + y - d, ycenter + x); glcdSetDot(ycenter + y - d, 
ycenter - x);
>     glcdSetDot(ycenter - y - d, ycenter + x); glcdSetDot(ycenter - y - d, 
ycenter - x);
>
>     if (tswitch < 0) tswitch += (4 * x + 6);
>     else {
>       tswitch += (4 * (x - y) + 10);
>       y--;
>     }
>     x++;
>   }
> }
> Ciao
> Owen

Hi Owen,

wenn auch spät hier der Code getestet mit der hier gefunden lib:
1
// draw circle
2
void lcd_draw_circle(uint8_t xcenter, uint8_t ycenter, uint8_t radius, uint8_t color)
3
{
4
  int16_t tswitch, y, x = 0;
5
  uint8_t d;
6
7
  d = ycenter - xcenter;
8
  y = radius;
9
  tswitch = 3 - 2 * radius;
10
  while (x <= y) {
11
    
12
    lcd_set_pixel(xcenter + x, ycenter + y, color);     
13
    lcd_set_pixel(xcenter + x, ycenter - y, color);
14
    lcd_set_pixel(xcenter - x, ycenter + y,color);     
15
    lcd_set_pixel(xcenter - x, ycenter - y,color);
16
    lcd_set_pixel(ycenter + y - d, ycenter + x,color); 
17
    lcd_set_pixel(ycenter + y - d, ycenter - x,color);
18
    lcd_set_pixel(ycenter - y - d, ycenter + x,color); 
19
    lcd_set_pixel(ycenter - y - d, ycenter - x,color);
20
21
    if (tswitch < 0) tswitch += (4 * x + 6);
22
    else {
23
      tswitch += (4 * (x - y) + 10);
24
      y--;
25
    }
26
    x++;
27
  }
28
}

weitere ergänzungen meinerseits:
1
A// ---------------------------------
2
// draw round rectangle on screen
3
// ---------------------------------
4
void lcd_draw_round_rect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t radius, uint8_t color) {
5
  int16_t tSwitch, x1 = 0, y1 = radius;
6
  tSwitch = 3 - 2 * radius;
7
8
  while (x1 <= y1) {
9
    lcd_set_pixel(x+radius - x1, y+radius - y1, color);
10
    lcd_set_pixel(x+radius - y1, y+radius - x1, color);
11
12
    lcd_set_pixel(x+width-radius + x1, y+radius - y1, color);
13
    lcd_set_pixel(x+width-radius + y1, y+radius - x1, color);
14
15
    lcd_set_pixel(x+width-radius + x1, y+height-radius + y1, color);
16
    lcd_set_pixel(x+width-radius + y1, y+height-radius + x1, color);
17
18
    lcd_set_pixel(x+radius - x1, y+height-radius + y1, color);
19
    lcd_set_pixel(x+radius - y1, y+height-radius + x1, color);
20
21
    if (tSwitch < 0) {
22
      tSwitch += (4 * x1 + 6);
23
    } else {
24
      tSwitch += (4 * (x1 - y1) + 10);
25
      y1--;
26
    }
27
    x1++;
28
  }
29
30
  lcd_draw_line(x+radius, y, width-radius,y, color);      // top
31
  lcd_draw_line(x+radius, y+height, width-radius,y+height,color);  // bottom
32
  lcd_draw_line(x, y+radius, x,height-radius,color);      // left
33
  lcd_draw_line(x+width, y+radius, x+width,height-radius,color);  // right
34
}

Desweiteren habe ich die Funktion invertieren noch erweitert.
Nun kann ein bestimmter Bereich angegeben werden.
Allerdings werden immer 8 Bits gelesen und geschrieben worüber mir 
hierbei ein "Zeilenweises" Lesen und Schreiben lieber wäre da man damit 
nicht nur 8 Zeilen zur Verfügung hätte, sondern in dieser Hinsicht auch 
noch flexibler wäre. Wenn also jemand weiß wies besser geht bitte 
bescheid sagen.
1
// ---------------------------------------------
2
// inverts the screen and sets mode to inverted
3
// ---------------------------------------------
4
void lcd_invert(uint8_t begin_y, uint8_t end_y, uint8_t begin_x, uint8_t end_x)
5
{
6
7
  uint8_t x,y,data;
8
9
  for (y=begin_y;y<end_y;y++)
10
  {
11
    lcd_write_cmd(LCD_SET_PAGE|y,CHIP1|CHIP2);  //set page on both controllers
12
    
13
    for (x=begin_x;x<=end_x;x++)
14
    {
15
      if (x<64)
16
      {
17
      lcd_write_cmd(LCD_SET_ADD|x,CHIP1);
18
      data=lcd_read_data(CHIP1);
19
      lcd_write_cmd(LCD_SET_ADD|x,CHIP1);  //read two times (dont know why, but else i get buggy outpur)
20
      data=lcd_read_data(CHIP1);
21
22
      lcd_write_cmd(LCD_SET_ADD|x,CHIP1);
23
      lcd_write_data(~data,CHIP1);    //set inverter data        
24
      }
25
26
      else
27
      {
28
      lcd_write_cmd(LCD_SET_ADD|x,CHIP2);  // do the same on the second controller
29
      data=lcd_read_data(CHIP2);
30
      lcd_write_cmd(LCD_SET_ADD|x,CHIP2);  
31
      data=lcd_read_data(CHIP2);
32
33
      lcd_write_cmd(LCD_SET_ADD|x,CHIP2);  
34
      lcd_write_data(~data,CHIP2);  
35
      }        
36
    }
37
  }
38
39
  lcd_write_cmd(LCD_SET_ADD|0,CHIP1|CHIP2);    //set hom home pos
40
  lcd_write_cmd(LCD_SET_PAGE|0,CHIP1|CHIP2);
41
42
  invert++;
43
  invert %=2;
44
}

von Mario E. (marioe)


Lesenswert?

Hallo,

ich habe mich jetzt nur angemeldet, weil ich mithilfe dieser Bibliothek
das Pollin Display zum laufen gebracht habe und mich eingfach beim 
Urheber bedanken möchte.

Ich bin noch recht neu in dem Bereich und der Fakt das ich ein 
Grafisches LCD Display ansteuern kann haut mich richtig um.

Ich freue mich einfach sehr darüber.

Dankeschön :D

-------------------------------

Ich habe aber eine Anmerkung. Ich nutze das AVR Studio 4 und beim 
compilieren (oder wie man das nennt) der Dateien im ersten Post, gibt 
mir mein AVR Studio fehermeldungen und ich musste einige "static" in 
"const" umschreiben.
Das wird hier aber von niemanden angesprochen.

Desweiteren bekomme ich unzählige warnungen: "../glcd.c:29:2: warning: 
passing argument 1 of 'lcd_puts_p' discards 'const' qualifier from 
pointer target type [enabled by default]
"
Liegt das eventuell an dem alten AVR Studio? Das Display funktioniert 
aber trotz der Warnungen einwandfrei.

mfg mario

von CJ (Gast)


Lesenswert?

Hallo zusammen. Ich suche auch nach einer neuen lib und finde diese vom 
code und vom Aufbau sehr interessant.
aber wie umgehe ich diese fehlermeldung.?
variable 'img' must be const in order to be put into read-only section 
by means of '__attribute__((progmem))'


Danke euch. schönen Sonntag noch

von Lutz (Gast)


Lesenswert?

Hallo,

habe die Funktionen + Font-Generator verwendet und es läuft alles wie 
gewollten.
Nun stehe ich vor der Frage, wie kann ich Werte, welche ich auf dem 
Display anzeigen möchte und die sich während der Laufzeit ändert so 
aktuallisieren, dass nicht einzelne Pixel/Fragmente  von dem vorrigen 
Wert/Zeichen noch übrig bleiben.

- vor jeden neuer Darstellung immer clear_lcd(); aufrufen
- immer einen "weißen" Kasten über den Bereich legen, der erneuert 
werden soll?
- vor dem erneuert der Werte, die alten mit "weißer" chrift 
überschreiben?

Alle Varianten habe ich ausprobiert, doch immer ist der Aufbau des 
Displays sehr sichbar und damit störend.

Noch eine Idee, eine Schriftart zu verwenden, bei der alle 
Zeichen+Zahlen immer die gleiche Größe haben. Habe ich versucht zu 
verwenden, jedoch zerschießt der Font-Generator diese Eigenschaft. Hat 
jemand so eine Font für die LCD Funktionen mit diese Eigenschaften?

Hat noch jemand eine Idee, oder wird das dann mit höherer Taktrate 
(Quarz) besser?

Ich verwende eine ATmege324pa mit internen 8MHz (will aber auch 
14,7456MHz) umsteigen.

Danke für eine Antowrt

von Henning (Gast)


Lesenswert?

dito push

von Henning (Gast)


Lesenswert?

Moin,
hab jetzt doch noch eine Möglichkeit gefunden, Text einfach mit neuem 
Text zu überschreiben, ohne ihn vorher löschen zu müssen.
Hierzu muss lediglich 2 Zeile in der mylcd.c ergänzt werden:


//Zeile 513
for (bit=0;bit<8;bit++)
{
if ((data&(1<<bit))!=0) 
lcd_set_pixel(x,cursor_y+page*8+bit,BLACK);
else                  lcd_set_pixel(x,cursor_y+page*8+bit,WHITE);

}


Grüße Henning

von Kilo (Gast)


Lesenswert?

Moin zusammen,

kann mir mal einer sagen wie man eine Variable anzeigen lässt????
sprintf funzt nicht richtig, itoa auch nicht. Nur das Beispiel mit den 
4stelligen Zahlen aus dem anderen Beitrag funktioniert.
Da habe ich aber vorangestellte Nullen und auch keine Kommazahlen!

ich verzweifel hier :(

von Kilo (Gast)


Lesenswert?

Schon gut...
habs hinbekommen!
ich Depp musste erstmal die Funktionen unter AVR aktivieren! :-S

von tom (Gast)


Lesenswert?

Hallo Zusammen
Also erstmal herzlichen dank für diese Bibliothek, habe heute mein 
erstes glcd in betrieb genommen und hat auf anhieb funktioniert. 
Wirklich eine tolle sache.

Da ich mich auch etwas tiefer für dieses thema interessiere habe ich 
noch ein paar fragen dazu:
1. Sehe ich das richtig, dass man in dieser bibliothek zwischen 2 fonts 
wählen kann, nämlich small_font und mega?
Was sind das genau für daten welche in den entsprechenden files 
small_font.h und mega.h stehen? Da gibts jede menge hex zahlen und ich 
verstehe nicht was für information da drin steckt.

2. Generell ist für mich die small_font zu klein und die mega font zu 
gross. Gibt es eine einfache möglichkeit die grösse zu ändern oder muss 
ich irgendwie eine eigene font "designen"? Wenn ja, wie mach ich das und 
auf was muss ich achten? Kenne mich damit überhaupt nicht aus. Hab in 
diesem thread auch schon vom fontgenerator von ape gelesen, aber seine 
seite ist irgendwie down?

das wärs erstmal, kommt aber sicher noch die einte oder andere frage ;)

besten dank nochmal
tom

von tom (Gast)


Lesenswert?

niemand?

von Dominik (Gast)



Lesenswert?

Moin,
So, nachdem das ganze Projekt, welches auf einem USB Stick war, 
geschrottet wurde, musste ich alles nochmal neu machen :(

Vorab gibt es ein paar neue Fotos und ein paar Routinen für das Display.
Das weiß/blaue GLCD habe ich mit einer Polarisitionfolie neu gestaltet.

Zu den Displayroutinen:
Funktionen sind als Kommentar hinterlegt. Für die Spieleprogrammierung 
habe ich hier unter anderen Sprite Funktionen mit hinzugefügt.

von Pete K. (pete77)


Lesenswert?

Dominik schrieb:
> So, nachdem das ganze Projekt, welches auf einem USB Stick war,
> geschrottet wurde, musste ich alles nochmal neu machen :(

Schon mal über einen SVN-Server auf einem eigenen Webspace nachgedacht?

von Dominik (Gast)


Lesenswert?

Jein,
es gibt ja zahlreiche Backup- und Speichermöglichkeiten. Die Frage ist 
ob man sowas auch konsequent nutzt! :)
Ich bin da eher aus der C64 Fraktion: 2000 zeilen Code abgetippt und 
dann fällt der Strom aus! 2 tage geflucht und sich vorgenommen öfter zu 
speichern und zu archivieren. Dennoch nicht daraus gelernt! :)

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.