LCD eigene Zeichen ins LCD-RAM schreiben in C

DerSchatten

Neues Mitglied
01. Mai 2009
19
0
0
Sprachen
Kann mir jemand erklären wie das mit den eigenen Zeichen in C funktioniert?
Man muß sich zuerst eine Tabelle anlegen:

Code:
static const PROGMEM unsigned char cHddChar[] =   //  Acht selbstdefinierte Symbole
{
	0x00, 0x0A, 0x1B, 0x1B, 0x18, 0x1F, 0x0E, 0x00,   // Uhrensymbol 3 Uhr
	0x00, 0x0A, 0x1B, 0x1B, 0x03, 0x1F, 0x0E, 0x00,   // Uhrensymbol 9 Uhr
	0x1F, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1F,   // Ein/Aus Symbol
	0x00, 0x0A, 0x1F, 0x1F, 0x1F, 0x0E, 0x04, 0x00,   // Herz
	0x0E, 0x1F, 0x0E, 0x11, 0x0E, 0x11, 0x0E, 0x00,   // Festplattensymbol
	0x04, 0x0E, 0x1F, 0x11, 0x11, 0x11, 0x1F, 0x00,   // Haus
	0x04, 0x0E, 0x1F, 0x04, 0x04, 0x04, 0x04, 0x00,   // Pfeil nach oben
	0x04, 0x04, 0x04, 0x04, 0x1F, 0x0E, 0x04, 0x00   // Pfeil nach unten
};

Aber wie gehts dann weiter?
Wie bekommt man die Zeichen ins LCD-RAM?
 
Hi,

das ist natürlich immer auch vom Displayprozessor abhängig. Für den KS0070 gibt's eine kurze Beschreibung in diesem PDF (S.2 unten) :

http://www.reichelt.de/?;ACTION=7;L...wQARwAAFX5Y3Qe9b057c46002e7359dc2633375d5b857

Im Prinzip läuft das wie beim Anzeigen von Zeichen im Display :
1. CG RAM Adresse setzen (analog dem Setzen einer DD RAM Adresse)
2. das gewünschte Zeichen schreiben (analog der Anzeige im Display)

Bei letzterem müssen für ein Zeichen 8 Bytes hintereinander übertragen werden. Jedes Byte entspricht einer horizontalen Pixelzeile, wobei die Bits 0-4 den 5 Pixeln im Display entsprechen und die Bits 5-7 ohne Belang sind.

Tip:
Stell' beim Display vorher "Cursor Move" auf "Increase". Anschließend brauchst du nur noch die CG RAM Adresse 0 zu setzen und kannst danach alle 64 Pixelzeilen (8 Zeichen) hintereinanderweg übertragen.

Gruß
Pirx
 
Hallo,

ich verwende eines mit einem ST7036 Controller. Ds ist HD44780U Kompatibel.

Ich hab mir eine kleine Funktion gebastelt:

Code:
void dogm_putc_cgram_p(const char *progmem_s)
{
   register char c;
   register char x1;
   for (x1=0;x1<=7;x1++)
   { 
      (c = pgm_read_byte(progmem_s++));  
      dogm_putc(c);
   }
   dogm_clear();
}

Aufruf:

Code:
dogm_putc_cgram_p(cHddChar)

Nur wie sag ich ihm jetzt an welche Speicherstelle das Zeichen hin soll?
 
Hi,

ein Display mit HD44780 ist z.B. dieses hier :
http://www.lcd-module.de/deu/pdf/doma/2_16.pdf

Hier findest du möglicherweise auch eine deutsche Beschreibung für dein Display :
http://www.lcd-module.de/datenblaetter.html

Augenscheinlich läuft das genau wie bei meinem Display. Die CG RAM Adressen 0-7 können benutzerspezifische Zeichen aufnehmen und die Programmierung läuft wie schon in meinem ersten Beitrag beschrieben.

Fertig in C kann ich dir das allerdings nicht anbieten (ich mache nur in Assembler). Vielleicht reicht es dir so (siehe auch PDF S.2 unten) :

0.) Display initialisieren (4Bit oder 8Bit, ganz wie es beliebt)

1.) RS auf Low und dann 0x40 ins Display schreiben - setzt auf die CG-RAM Adresse 0 (0x41 würde sie auf 1 setzen usw.)

2.) RS auf High und dann für ein Zeichen die acht Datenbytes hintereinanderweg ins Display schreiben (als würdest du ASCII-Zeichen anzeigen wollen)

2.1) RS auf Low und dann 0x80 ins Display schreiben - setzt auf die DD-RAM Adresse 0 (damit du wieder ASCII-Zeichen schreiben kannst)

3. Das neue Zeichen kann analog der fest im Display gespeicherten mit dem ASCII-Code 0 auf dem Display angezeigt werden.


Ich hoffe, das hilft dir weiter und wünsche viel Erfolg.

Gruß
Pirx
 
Hi,

ich habe ein Beispiel eingefügt, wie man benutzerspezifische Zeichen des HD44780 nutzen kann:

Code:
#include <avr/pgmspace.h> 
//This example needs the Peter Fleury lcdlibrary.zip from http://jump.to/fleury 
//Goto AVR Software, Libraries and configure the lcd.h to your personal needs 
#include "lcd.h" 
 
//And we need the exported header file from the Font and Bitmap Generator 
#include "HD44780_demo.h" 

//Save 8 user defined characters to LCD 
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 
} 

//Example main 
void main(void) 
{  
  lcd_init(LCD_DISP_ON); // Init LCD  
  lcd_save_cg(Cursor);    // Save user definde chars to CG-RAM
  lcd_putc(0); // Print user definde chars  
  lcd_putc(1);  
  lcd_putc(2);  
  lcd_putc(3);  
  lcd_putc(4);  
  lcd_putc(5);  
  lcd_putc(6);  
  lcd_putc(7);  
  while(1)  
  {  
  } 
}

Wichtig zu wissen ist: Man stellt beim Schreiben einmal die CG-Ram Adresse ein (hier mit lcd_command(0x40) ). Der Programm Zähler inkrementiert dann automatisch nach dem Schreiben eines Bytes.

Ausserdem: lcd_command(0x80) zum Setzen der DD-Ram Adresse = 0 am Ende nicht vergessen.

Wie das ganze auf dem LCD aussieht ist hier zu sehen.

Viele Grüße
muGUI
 

Ü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)