Forum: Mikrocontroller und Digitale Elektronik Eigenes Zeichen auf LCD anzeigen lassen in C


von Anfänger (Gast)


Lesenswert?

Hallo,
wie kann ich ein selbst erstelltes Zeichen  auf meinem LCD anzeigen in 
C?
Das zeichen das ich darstellen will soll ein "U" sein bloß nach rechts 
offen und nicht nach oben.
Hardware: Atmega8, LCD16x2 (HD44780)

Hier mein Versuch:
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
#include <util/delay.h>
4
5
char abc[8]={0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff};
6
 
7
int main(void)
8
{
9
  lcd_init();
10
  
11
  lcd_clear();
12
13
  lcd_setcursor(0,0);
14
15
  lcd_data(abc);
16
17
while(1){}
18
return 0;
19
}

Danke im voraus

von frank (Gast)


Lesenswert?

ich will jetzt nichts falsches schreiben, aber ich bezweifle stark dass 
das möglich ist.
Denn du sprichst den Controller an und sagst ihm welches seiner 
vorprogrammierten Symbole er auf das Display schreiben soll.

das ist eben der unterschied zwischen richtigen displays und diesen 
zeilendisplays.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Anfänger schrieb:
> Hier mein Versuch:
Ähm. Und der Rest?
Sag doch mal, ob du das Display prinzipiell angesteuert bekommst. 
Kannst du einen Text auf dem Display darstellen? Und fehlt jetzt nur 
noch dein Zeichen?

> char abc[8]={0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff};
So sieht aber kein liegendes U in einer 5x7 Matrix aus. Das ist nur ein 
Strich oben und einer unten...

Das da hast du schon gesehen?
http://www.mikrocontroller.net/articles/HD44780#Benutzerdefinierte_Sonderzeichen

von Anfänger (Gast)


Lesenswert?

ja kann normen Text anzeigen lassen mit "lcd_string("Text")...

Achso ja natürlich:

char abc[8]={0xff,0x10,0x10,0x10,0x10,0x10,0x10,0xff};

Bekomme aber immer nur dieses Zeichen " ` " angezeigt.

von Vn N. (wefwef_s)


Lesenswert?

Hast du denn irgendeinen der Artikel auch mal gelesen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Anfänger schrieb:
> Bekomme aber immer nur dieses Zeichen " ` " angezeigt.
Mit dem geposteten Code?

Es ist ganz klar, dass du damit nur (und bestenfalls) Käse angezeigt 
bekommst, denn eines der 8 benutzerdefinierten Zeichen wird
1. im RAM definiert, und dann
2. wie ein Text angezeigt.

Du machst hier zwar bestenfalls 1. (aber mit irgendwie undefinierter 
Adresse), keinesfalls aber 2.

Was meinst du, warum hier noch 2 Bytes vor den eigentlichen Zeichendaten 
kommen:
http://www.darreltaylor.com/files/CustChar.htm

von Anfänger (Gast)


Lesenswert?

Ja hab mir schon beiträge durchgelesen aber versteh sie nicht wirklich 
sonst würd ich ja euch nicht um hilfe bitten.

Ich muss doch zuerst in einme Array meine Pixel festlegen (5x7 Pixel).

-----     0xff
|         0x10
|         0x10
|         0x10
|         0x10
|         0x10
|         0x10
-----     0xff

Danch will ich halt dieses Array anzeigen lassen weiß aber nicht wie.

von Uwe (de0508)


Lesenswert?

Hallo,

zeige uns doch bitte den gesamten Code, insbesondere:

"lcd-routines.h" und "lcd-routines.c"

müssen erweitert werden.

Das benutzerdefinierte Zeichen wird vor der Darstellung "dauerhaft" in 
das Controller-Ram geladen.

Strom weg ==> neue laden.

Diese "spezial" Zeichen liegen im Ram und werden über die Zeichen-Code
'\x00' bis '\x07' angesprochen.

Ich verwende dieses Tool zum definieren eigener Zeichen:

"HD44780 LCD User-Defined Graphics"
http://www.quinapalus.com/hd44780udg.html

Vielleicht hilft Dir dieser Artikel zum Verstehen weiter, ich mag jetzt 
nicht alles noch auf deutsch Schreiben:

http://www.circuitvalley.com/2012/02/lcd-custom-character-hd44780-16x2.html

_

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Anfänger schrieb:
> Ich muss doch zuerst in einme Array meine Pixel festlegen (5x7 Pixel).
Und den Ihnalt dieses Arrays dann an die richtige Adresse ins RAM 
schreiben.

Und dann noch sagen, dass dieses so hübsch neu definierte Zeichen 
engezeigt werden soll.


vn nn schrieb:
> Hast du denn irgendeinen der Artikel auch mal gelesen?
Das frage ich mich auch, denn in diesem Link ist doch alles genau 
beschrieben:
http://www.mugui.de/bin/menu.php?link=hd44780_demo


BTW:
> -----     0xff
müsste richtigerweise eigentlich 0x1f heißen.

von Vn N. (wefwef_s)


Lesenswert?

Anfänger schrieb:
> Ja hab mir schon beiträge durchgelesen aber versteh sie nicht wirklich
> sonst würd ich ja euch nicht um hilfe bitten.

Welche Artikel hast du konkret gelesen? Sicher nicht HD44780 und die 
darin verlinkten.

von Karl H. (kbuchegg)


Lesenswert?

Anfänger schrieb:
> Ja hab mir schon beiträge durchgelesen aber versteh sie nicht wirklich

Was daran verstehst du den nicht?


Wenn du Stoff mit Kartoffeldruck bedrucken willst, ist ja wohl völlig 
klar, dass du erst mal das Muster in die Kartoffel schneiden musst, ehe 
du damit einen Abdruck auf dem Stoff machen kannst.

So auch hier:
Erst mal musst du dein gewünschtes Zeichen definieren.
Du hast 8 Zeichen zur Auswahl, in denen du dich austoben kannst und bei 
denen du festlegen kannst welche Pixel weiß und welche schwarz sein 
sollen.

Ist dann die Kartoffel, äh, das Sonderzeichen fertig definiert, kannst 
du es einsetzen um damit an einer Zeichenposition genau mit diesem 
Zeichen das gewünschte Muster zu erzeugen.


Also: Was ist an den Artikeln daran jetzt so unverständlich?

von Anfänger (Gast)


Lesenswert?

Sorry aber ich versteh des trotzdem nicht...
Ich benutze die lcd-routines.c und lcd-routines.h Standartdateinen.

In der lcd-routines.c gibt es am Ende diese Funktion:
1
void lcd_generatechar( uint8_t code, const uint8_t *data )
2
{
3
    // Startposition des Zeichens einstellen
4
    lcd_command( LCD_SET_CGADR | (code<<3) );
5
 
6
    // Bitmuster übertragen
7
    for ( uint8_t i=0; i<8; i++ )
8
    {
9
        lcd_data( data[i] );
10
    }
11
}

Ist die Funktion für das schreiben in den RAM oder muss ich die von 
dieser Seite "http://www.mugui.de/bin/menu.php?link=hd44780_demo"; 
rauskopieren.

Wenn ich nach dieser Anleitung gehe brauche ich ja eine neue Libary 
oder? Hab ja nicht z.B die Funktion lcd_putc();...

Kann mir keiner ganz einfach sagen wie ich meine lcd-routines.c, 
lcd-routines.h und mein Programm.c anpassen muss das z.B ich die 
Sonderzeichen von "HD44780_demo.h" 
(http://www.mugui.de/bin/menu.php?link=hd44780_demo) anzeigen lassen 
kann.

Ich verstehe nicht was ich machen muss.

von Vn N. (wefwef_s)


Lesenswert?

Wenn du die angegebenen Artikel gelesen hast, darfst du nochmal fragen. 
Das Forum ist nicht dafür da, dir das ganze nochmal vorzukauen.

von Anfänger (Gast)


Lesenswert?

Ich hab den Artikel gelesen aber ich versteh des trotzdem nicht...

Ich versteh schon gar nicht was diese Funktion macht.
1
void lcd_save_cg(const unsigned char *cg) { int i= 0; //Byte counter lcd_command(0x40); //CG-RAM Address = 0 for(i= 0; i <64 ; i++) //Write 64 Bytes of 8 characters { lcd_data(pgm_read_byte(&cg[i])); } lcd_command(0x80); // Set DD-RAM Address = 0 }

Die Header Datei HD44780_demo.h schreibt ja bloß die acht sonderzeichen 
in ein Array.

Aber die ganzen Funktionen wie
lcd_save_cg(), lcd_data(),lcd_putc()...
muss ich mir die alle in meine libary kopieren???

von Anfänger (Gast)


Lesenswert?

1
void lcd_save_cg(const unsigned char *cg) 
2
{ int i= 0; //Byte counter 
3
lcd_command(0x40); //CG-RAM Address = 0 
4
for(i= 0; i <64 ; i++) //Write 64 Bytes of 8 characters 
5
{ lcd_data(pgm_read_byte(&cg[i])); 
6
} 
7
lcd_command(0x80); // Set DD-RAM Address = 0 
8
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Anfänger schrieb:
> Wenn ich nach dieser Anleitung gehe brauche ich ja eine neue Libary
> oder?
Nein. Das einzige, was du brauchst, ist ein Zugriff auf den Port, an dem 
das Display angeschlossen ist. So ein LC-Display ist wahnwitzig einfach 
anzusteuern, ehrlich.
Das einfachste ist, anhand des Datenblatts wenigstens verstehen zu 
wollen, wie so ein LCD angesteuert wird. Und nicht irgendwo irgendwie 
irgendwelche Libraries hin&herzukopieren und auf Besserung zu hoffen...

Also:
1. schnitz dir die Kartoffel (CGRAM)
2. druck damit aufs Display  (DDRAM)

Anfänger schrieb:
> Die Header Datei HD44780_demo.h schreibt ja bloß die acht sonderzeichen
> in ein Array.
Da ist dann schon mal der Schritt 1 erledigt, und die 8 möglichen 
Kartoffelstempel geschnitzt.
Jetzt kannst du damit drucken. Nur mußt du da auch die richtige deiner 8 
Kartoffeln auswählen. Die findest du als Zeichen 0..7 ganz am Anfang des 
Character ROMs...
Siehe dort die Seite 17:
http://adafruit.com/datasheets/HD44780.pdf

von Vn N. (wefwef_s)


Lesenswert?

Anfänger schrieb:
> Ich hab den Artikel gelesen

vn nn schrieb:
> Welche Artikel hast du konkret gelesen? Sicher nicht HD44780 und die
> darin verlinkten.

Lothar Miller schrieb:
> Nein. Das einzige, was du brauchst, ist ein Zugriff auf den Port, an dem
> das Display angeschlossen ist. So ein LC-Display ist wahnwitzig einfach
> anzusteuern, ehrlich.

Programme zusammenzukopieren ist eben vermeintlich einfacher.

von Karl H. (kbuchegg)


Lesenswert?

Anfänger schrieb:
> Sorry aber ich versteh des trotzdem nicht...
> Ich benutze die lcd-routines.c und lcd-routines.h Standartdateinen.
>
> In der lcd-routines.c gibt es am Ende diese Funktion:
>
>
1
void lcd_generatechar( uint8_t code, const uint8_t *data )
2
> {
3
>     // Startposition des Zeichens einstellen
4
>     lcd_command( LCD_SET_CGADR | (code<<3) );
5
> 
6
>     // Bitmuster übertragen
7
>     for ( uint8_t i=0; i<8; i++ )
8
>     {
9
>         lcd_data( data[i] );
10
>     }
11
> }
>
> Ist die Funktion für das schreiben

Na ja.
Was MACHT denn die Funktion? Lies sie doch mal! Das ist nicht verboten. 
Genausowenig wie es verboten ist, mal zu eruieren, was es mit dem 
LCD_SET_CGADR auf sich hat.
Und es ist auch nicht verboten in diversen Artikeln auf die Links zu 
klicken. Gerade hier auf mikrocontroller.net finden sich in den Artikeln 
meistens viele, viele Links die wieder auf andere Artikel führen auf 
denen man Dinge lernen kann.
So zb auch auf diesen Link
http://www.mikrocontroller.net/articles/Pseudo-Graphische_LCD-Ansteuerung
welcher sich im Tutorial Artikel über das LCD findet (wo du die 
Funktionen geklaut hast)
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung


> Wenn ich nach dieser Anleitung gehe brauche ich ja eine neue Libary
> oder? Hab ja nicht z.B die Funktion lcd_putc();...

Gewöhn dich daran, dass funktionsgleiche Funktionen manchmal anders 
heissen. Wir in Österreich sagen ja auch 'Fleischlaibchen' und in Bayern 
heißt das ganze 'Fleichpflanzel' und in Berlin sagen sie dazu 
"Buletten". Ändert aber nichts daran, dass es immer dasselbe ist.

> Kann mir keiner ganz einfach sagen wie ich meine lcd-routines.c,
> lcd-routines.h und mein Programm.c anpassen muss das z.B ich die
> Sonderzeichen von "HD44780_demo.h"
> (http://www.mugui.de/bin/menu.php?link=hd44780_demo) anzeigen lassen
> kann.

in lcd-routines.c (zumindest in dem von microkontroller.net) sind doch 
die Funktionen schon vorhanden. Du musst sie nur benutzen.

von Umpa Lumpa (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Gewöhn dich daran, dass funktionsgleiche Funktionen manchmal anders
> heissen. Wir in Österreich sagen ja auch 'Fleischlaibchen' und in Bayern
> heißt das ganze 'Fleichpflanzel' und in Berlin sagen sie dazu
> "Buletten". Ändert aber nichts daran, dass es immer dasselbe ist.

Und in Baden sind das Frikadellen oder Fleischküchle.

http://www.google.de/search?q=frikadellen&hl=de&client=firefox-a&hs=wf0&rls=org.mozilla:de:official&prmd=imvnse&tbm=isch&tbo=u&source=univ&sa=X&ei=_2YNUM2_HKrP4QTCyKTYCg&ved=0CGYQsAQ

Gruß aus Heidelberg

von Anfänger (Gast)


Lesenswert?

Verstehe ich das jetzt Richtig?
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
4
#define LCD_SET_CGADR           0x40
5
6
#define LCD_GC_CHAR0            0
7
#define LCD_GC_CHAR1            1
8
#define LCD_GC_CHAR2            2
9
#define LCD_GC_CHAR3            3
10
#define LCD_GC_CHAR4            4
11
#define LCD_GC_CHAR5            5
12
#define LCD_GC_CHAR6            6
13
#define LCD_GC_CHAR7            7
14
15
int main(void)
16
{
17
    lcd_init();
18
    uint8_t chrdata0[8] = {
19
        0b00011111,     //XXXXX
20
        0b00010000,     //X
21
        0b00010000,     //X  
22
        0b00010000,     //X 
23
        0b00010000,     //X 
24
        0b00010000,     //X
25
        0b00011111      //XXXXX
26
        };
27
    lcd_generatechar(LCD_GC_CHAR0, chrdata0);
28
    lcd_setcursor(0,0);
29
    lcd_data(LCD_GC_CHAR0);
30
 
31
    while(1)
32
    {
33
    }
34
    return 0;
35
}

1.Zuerst fülle ich ein Arry mit meinem Bitmuster.
2.Lade ich mein Array mit der Funktion lcd_generatechar in den RAM auf 
Speicherplatz 0
3.Gebe ich mit lcd_data(LCD_GC_CHAR0); mein Zeichen aus.

Aber es funktioniert immer noch nicht... :-(
Ich glaub ich such mir ein anderes Hobby.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Was passiert, wenn du als letzten Befehl vor der Endlosschleife so 
schreibst:
lcd_data('x');

von Thomas (Gast)


Lesenswert?

Dein Fehler liegt hier:

lcd_setcursor(0,0);

Mach da mal

lcd_setcursor(0,1);  raus. dann müsste es gehen.

0,0 ist gar nicht definiert, es geht mit 1 los.

Gruß

von Anfänger (Gast)


Lesenswert?

Danke jetzt funtionierts.

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.