<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Flash2over</id>
		<title>RN-Wissen.de - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Flash2over"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Flash2over"/>
		<updated>2026-04-11T21:16:35Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=DG16080_GLCD&amp;diff=17098</id>
		<title>DG16080 GLCD</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=DG16080_GLCD&amp;diff=17098"/>
				<updated>2010-12-21T20:24:23Z</updated>
		
		<summary type="html">&lt;p&gt;Flash2over: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
Das DG16080 GLCD ist ein 160x80 Punkte Schwarz-Weiß Grafik Display von Datavision für ca. 7 Euro. (Bei [http://www.pollin.de/shop/dt/MzU2OTc4OTk-/Bauelemente/Aktive_Bauelemente/Displays/Grafik_Display_DataVision_DG_16080_11.html Pollin Electronics] zur Zeit ausverkauft)&lt;br /&gt;
Das Display besitzt einen LC7981 Controller, der recht einfach mit einem AVR Mikrocontroller angesteuert werden kann.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Anforderungen ===&lt;br /&gt;
'''IO-Pins:''' 11 (Davon 8 an einem Port)&lt;br /&gt;
'''ADC:''' 4 (optional für Touchscreen)&lt;br /&gt;
'''Taktung:''' Frei&lt;br /&gt;
'''Spannung:''' 5V&lt;br /&gt;
&lt;br /&gt;
=== Anschluss des LCDs an den AVR ===&lt;br /&gt;
Die Betriebsspannung des LCDs ist 5V - entspricht somit der des AVR und kann einfach mit einem 7805 Spannungsregler hergestellt werden.&lt;br /&gt;
Beim Anschluss des LCDs an den AVR gibt es grundsätzlich nicht viel zu beachten. Folgende Dinge sind jedoch notwendig:&lt;br /&gt;
* Pin 7-14 müssen an einen Port und in der richtigen Reihenfolge (Pin 7 --&amp;gt; PX0, Pin 8 --&amp;gt; PX1, ...) verbudnen werden.&lt;br /&gt;
* Pin 4-6 müssen ebenfalls an einen Port verbunden werden, jedoch ist die Reihenfolge und Position egal.&lt;br /&gt;
* Pin 15: Low&lt;br /&gt;
* Pin 16: High&lt;br /&gt;
&lt;br /&gt;
Optional:&lt;br /&gt;
* Pin 15,16 und 18 auf AVR-Pins anstatt auf feste Pegel legen, um das Display später neu starten bzw. Ausschalten zu können.&lt;br /&gt;
[[Bild:DG16080_ATMEGA8.png]]&lt;br /&gt;
&lt;br /&gt;
''Warnung: Der Schaltplan weich von der Standardeinstellung des Treibers ab!''&lt;br /&gt;
&lt;br /&gt;
=== Hintergrundbeleuchtung &amp;amp; Touchscreen ===&lt;br /&gt;
Vom LCD gibt es 3 Ausführungen:&lt;br /&gt;
* Eine mit LED-Hintergrundbeleuchtung. Diese kann einfach mit einen Widerstand an die Stromversorgung des Displays angeschlossen werden oder man dimmt die Helligkeit über einen PWM-Pin am AVR. Bei dieser Ausführung ist das Touchscreen-Kabel nicht lötbar.&lt;br /&gt;
* Zwei mit EL-Hintergrundbeleuchtung. Um diese zu betreiben wird ein EL-Inverter (z.B. INV-TH-202) benötigt. Hier gibt es nun eine Version mit lötbarem und eine mit nicht lötbarem Verbinder am Touchscreen.&lt;br /&gt;
Um die nicht-lötbaren Touchscreens anzuschließen kann man eine Pin-Leiste auf die Platine runter biegen und somit den Verbinder einklemmen.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== Der LCD-Treiber ===&lt;br /&gt;
Die hier verwendete Treiber ist der Treiber von [http://sebastians-site.de/homepage/elektronik/avr-library-for-lc7981.html Sebastian Schumb] und enthält folgende Features:&lt;br /&gt;
* Textmodus mit Scrolling (Fester Zeichensatz)&lt;br /&gt;
* Grafikmodus&lt;br /&gt;
* Bitmaps plotten (Alle Größen)&lt;br /&gt;
* Text mit beliebiger Schriftart (und Größe) plotten&lt;br /&gt;
* Setzen und löschen beliebiger Pixel&lt;br /&gt;
* Direktes schreiben der Bytes in den RAM des LCDs (lcd_write_byte)&lt;br /&gt;
* Direktes senden eines Befehls&lt;br /&gt;
&lt;br /&gt;
==== Verwendung des Treibers ====&lt;br /&gt;
Der Treiber kann unter folgender Adresse heruntergeladen werden: [http://www.sebastians-site.de/hg_repos/glcd/ http://www.sebastians-site.de/hg_repos/glcd/]&lt;br /&gt;
Entweder man bindet nun den Treiber per include (lc7981.h, adc.h, touch.h; optional noch die fonts für schriftarten) ein und fügt die .c-dateien dem Makefile hinzu oder man verwendet den Beispielcode mit dem mitgelieferten Makefile und passt diesen an.&lt;br /&gt;
&lt;br /&gt;
==== Anpassen der lc7981.h (LCD) ====&lt;br /&gt;
Damit der Treiber mit der verwendeten Hardware funktioniert, muss man diesen konfigurieren. Dies geschieht durch bearbeiten der lc7981.h um include-Verzeichnis.&lt;br /&gt;
Hier deshalb der Konfigurationsabschnitt für die oben verwendete Schaltung:&lt;br /&gt;
&lt;br /&gt;
''&lt;br /&gt;
 #define LCD_CTRL 	PORTB		//!&amp;lt; Port used for control signals&lt;br /&gt;
 #define LCD_CRTL_DDR	DDRB 	//!&amp;lt; Data-Direction-Register for the control signals&lt;br /&gt;
 #define LCD_RS			PD0		//!&amp;lt; Register-Select Pin of the Display&lt;br /&gt;
 #define LCD_RW			PD1		//!&amp;lt; Read-Write-select Pin&lt;br /&gt;
 #define LCD_EN			PD2		//!&amp;lt; Strobe Pin&lt;br /&gt;
 #define LCD_DATA		PORTD	//!&amp;lt; Port used for data&lt;br /&gt;
 #define LCD_DATA_PIN 	PIND	//!&amp;lt; Port used for reading the data&lt;br /&gt;
 #define LCD_DATA_DDR	DDRD	//!&amp;lt; Data-Direction-Register for data''&lt;br /&gt;
&lt;br /&gt;
==== Anpassen der touch.h (Touch) ====&lt;br /&gt;
Sollte der Touchscreen eine invertierte Achse haben oder x und y vertauscht sein, so kann dies in der Datei touch.h korrigiert werden. Dazu müssen nur die folgenden Zeilen angepasst werden:&lt;br /&gt;
''&lt;br /&gt;
 #define TOUCH_X1 PA0&lt;br /&gt;
 #define TOUCH_X2 PA1&lt;br /&gt;
 #define TOUCH_Y1 PA2&lt;br /&gt;
 #define TOUCH_Y2 PA3''&lt;br /&gt;
&lt;br /&gt;
=== Eine UI-Bibliothek ===&lt;br /&gt;
C_Classic hat eine Bibliothek aufbauend auf dem Treiber von Sebastian geschrieben, um ein einfaches User-Interface zu erstellen.&lt;br /&gt;
'''Momentan umfasst es folgende Elemente:'''&lt;br /&gt;
Zeichenfunktionen (DrawFunctions) &lt;br /&gt;
  * Gefülltes Rechteck &lt;br /&gt;
  * Rechteck &lt;br /&gt;
  * Horiz. Linie &lt;br /&gt;
  * Vertik. Linie &lt;br /&gt;
  * freie Linie (langsamer) &lt;br /&gt;
  * Kreis&lt;br /&gt;
&lt;br /&gt;
User-Interface(ui) &lt;br /&gt;
  * Buttons &lt;br /&gt;
  * Bild-Buttons &lt;br /&gt;
  * Check-Boxen &lt;br /&gt;
  * Labels &lt;br /&gt;
  * Horiz. Slider &lt;br /&gt;
  * Vertik. Slider &lt;br /&gt;
  * Fortschrittsanzeige (Balken) &lt;br /&gt;
  * Textbox &lt;br /&gt;
  * Tastatur (QWERTZ)&lt;br /&gt;
&lt;br /&gt;
Die UI-Lib ist in C++ geschrieben und verwendet Objekte für die Elemente. Dies ermöglicht einfachen Zugriff auf diese mit Funktionen wie &amp;quot;obj.GetValue&amp;quot; oder &amp;quot;obj.GetPressed&amp;quot;.&lt;br /&gt;
==== Verwendung/Download ====&lt;br /&gt;
Den Treiber könnt ihr euch bei [https://sourceforge.net/projects/avrdg16080drv/ SourceForge] runterladen.&lt;br /&gt;
&lt;br /&gt;
Die Bibliothek enthält eine C++-Version des Treibers von Sebastian Schumb, somit wird dieser nicht mehr benötigt. Für die Bibliothek werden folgende Includes benötigt:&lt;br /&gt;
''&lt;br /&gt;
 #include &amp;quot;include/lcd.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;include/graphic.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;include/touch.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;include/fonts.h&amp;quot;&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
Die lcd.h enthält den portierten LCD-Treiber. Alle LCD-Funktionen sind nun in der Klasse LCD enthalten. Somit ruft man die Befehle mit LCD::befehl() auf.&lt;br /&gt;
Die graphic.h enthält 2 Klassen. Einmal DrawFunctions. in dieser sind die oben genannten Zeichenfunktionen enthalten. Die zweite Klasse ist ui in welcher die Benutzerelemente enthalten sind.&lt;br /&gt;
Touch.h hat weiterhin die gleiche Funktion, nur dass die Funktionen nun im namespace &amp;quot;touchscreen&amp;quot; stehen.&lt;br /&gt;
fonts.h enthält beide Schriftarten, welche nun über fonts::Schriftart zu erreichen sind.&lt;br /&gt;
&lt;br /&gt;
=== Erstellen und verwenden der Elemente ===&lt;br /&gt;
==== Init ====&lt;br /&gt;
 LCD::lcd_init(LCD_GRAPHIC); //LCD in Grafikmodus umschalten&lt;br /&gt;
 LCD::lcd_clear(); //LCD löschen&lt;br /&gt;
==== Buttons ====&lt;br /&gt;
Erstellen des Elements:&lt;br /&gt;
 ui::Button Btn(5,5,140,10,&amp;quot;Hallo Welt!&amp;quot;); //Button mit x0=5, y0=5, Breite=170, Höhe=10 und Text=&amp;quot;Hallo Welt&amp;quot;&lt;br /&gt;
Abfragen, ob der Button gedrückt wurde:&lt;br /&gt;
 if (Btn.pressed()) {&lt;br /&gt;
     Foo();&lt;br /&gt;
 }&lt;br /&gt;
==== Image-Buttons ====&lt;br /&gt;
Erstellen des Elements:&lt;br /&gt;
 ui::PictureButton PicBtn(0,0,20,20,bitmap); //x,y,width,height, bitmap&lt;br /&gt;
Abfragen, ob der Button gedrückt wurde:&lt;br /&gt;
 if (PicBtn.pressed()) {&lt;br /&gt;
     Foo();&lt;br /&gt;
 }&lt;br /&gt;
==== Checkboxen ====&lt;br /&gt;
Erstellen des Elements:&lt;br /&gt;
 ui::CheckBox chk(0,0,&amp;quot;Label&amp;quot;,0); //x,y,Text,CheckState&lt;br /&gt;
Aktualisieren der CheckBox:&lt;br /&gt;
 chk.refresh();&lt;br /&gt;
Abfragen des Status:&lt;br /&gt;
 if (autosave.checked) {&lt;br /&gt;
     Foo();&lt;br /&gt;
 }&lt;br /&gt;
==== Labels ====&lt;br /&gt;
Erstellen des Elements:&lt;br /&gt;
 ui::Label lbl(0,0,&amp;quot;Hallo Welt!&amp;quot;); //x,y,Text&lt;br /&gt;
Aktualisieren des Textes:&lt;br /&gt;
 lbl.setText(&amp;quot;Neuer Text&amp;quot;); //Auf den Text ändern.&lt;br /&gt;
 lbl.setNum(1337); //Den Text auf die angegebene Zahl ändern.&lt;br /&gt;
==== Slider ====&lt;br /&gt;
Erstellen des Elements:&lt;br /&gt;
 hslider ui::HorizontalSlider(0,0,100);x,y,width&lt;br /&gt;
 vslider ui::VerticalSlider(0,0,70);x,y,height&lt;br /&gt;
Aktualisieren der Slider:&lt;br /&gt;
 hslider.refresh();&lt;br /&gt;
 vslider.refresh();&lt;br /&gt;
Abfragen des Werts:&lt;br /&gt;
 hslider.getValue(); //0-&amp;gt;100&lt;br /&gt;
 vslider.getValue(); //0-&amp;gt;100&lt;br /&gt;
==== Fortschrittsanzeige ====&lt;br /&gt;
Erstellen des Elements:&lt;br /&gt;
 ui::Progressbar prg(5,5,140,20); //x,y,width,height&lt;br /&gt;
Setzen des Werts:&lt;br /&gt;
 prg.setValue(50); //0-&amp;gt;100&lt;br /&gt;
Lesen des Werts:&lt;br /&gt;
 prg.getValue(); //0-&amp;gt;100&lt;br /&gt;
==== Textbox ====&lt;br /&gt;
Erstellen des Elements:&lt;br /&gt;
 ui::Textbox txt(0,0,4,&amp;quot;&amp;quot;,1); //x,y,Maximale Zeichen (Breite), Default-Text, ausgewählt&lt;br /&gt;
Setzen des Texts:&lt;br /&gt;
 txt.setText(&amp;quot;Hallo&amp;quot;,1); //Neuer Text, ausgewählt (Unterstrich am Ende)&lt;br /&gt;
Ein Zeichen am Ende entfernen (Backspace)&lt;br /&gt;
 txt.backspace(); //Löscht das letzte Zeichen&lt;br /&gt;
Lesen des Texts:&lt;br /&gt;
 if(strcmp(&amp;quot;Hallo&amp;quot;,txt.text) == 0) {&lt;br /&gt;
     Foo();&lt;br /&gt;
 else {&lt;br /&gt;
     Bar();&lt;br /&gt;
 }&lt;br /&gt;
Prüfen ob darauf geklickt wurde (Fokus):&lt;br /&gt;
 if (txt.pressed()) { //Prüfen ob darauf geklickt wurde&lt;br /&gt;
            focus=0; //Variable setzen dass diese Textbox ausgewählt wurde.&lt;br /&gt;
            txt.refresh(true); //Den Unterstrich am Ende der Textbox aktivieren&lt;br /&gt;
            txt2.refresh(false); //Der zweiten Box den Fokus (Unterstrich) nehmen.&lt;br /&gt;
 }&lt;br /&gt;
 if (txt2.pressed()) { //Prüfen ob auf die zweite Box geklickt wurde&lt;br /&gt;
            focus=1; //Variable setzen dass die zweite Textbox ausgewählt wurde.&lt;br /&gt;
            txt2.refresh(true); //Den Unterstrich am Ende der zweiten Textbox aktivieren&lt;br /&gt;
            txt.refresh(false); //Der Ersten den Fokus nehmen&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Tastatur ====&lt;br /&gt;
Erstellen des Elements (+Aktualisieren):&lt;br /&gt;
 ui::Keyboard kbd(); //Optional noch das x-Offset (Standart=30)&lt;br /&gt;
Empfangen eines Zeichens:&lt;br /&gt;
 if (kbd.getKey() &amp;gt;= 32) { //Größer 32 sind gültige Zeichen&lt;br /&gt;
     strcat(CharArray,kbd.getKey()); //Zeichen zu einem CharArray hinzufügen&lt;br /&gt;
 }&lt;br /&gt;
 else if (kbd.getKey() == 8) { //Backspace&lt;br /&gt;
     kbd[strlen(kbd)-1] = 0; //leztes Zeichen entfernen&lt;br /&gt;
 }&lt;br /&gt;
==== Allgemeine Funktionen ====&lt;br /&gt;
 obj.Draw(); //Zeichnet das Element neu.&lt;br /&gt;
=== Beispiele zur Lib ===&lt;br /&gt;
Die Lib enthält Beispielcode für alle Elemente in der Datei main.c.&lt;br /&gt;
Um die Lib zu testen muss man lediglich die lcd.h wie oben beschrieben anpassen. ([[#Anpassen_der_lc7981.h_.28LCD.29]])&lt;br /&gt;
Danach kann man den Code kompilieren und mit &amp;quot;make program&amp;quot; übertragen. Der Programmer und Port können im Makefile angepasst werden.&lt;br /&gt;
(Die Lib ist standardmäßig für Linux eingerichtet.)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=43741&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;start=220 der Forumsbeitrag mit dem Alles begann] (Deutsch)&lt;br /&gt;
&lt;br /&gt;
[http://www.frozeneskimo.com/electronics/2007/03/30/lc7981hd61830-driver-for-el-backlit-samsung-lcd/ Frozeneskimos Seite zum GLCD] (Englisch)&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/topic/138095 Ein Beitrag auf Mikrocontroller.net] (Deutsch)&lt;br /&gt;
&lt;br /&gt;
[http://sebastians-site.de/homepage/elektronik/avr-library-for-lc7981.html LCD-Lib] (Englisch)&lt;br /&gt;
&lt;br /&gt;
[http://www.roboternetz.de/phpBB2/download.php?id=17948 Alternativer Schaltplan] von RN-User Flash2over&lt;/div&gt;</summary>
		<author><name>Flash2over</name></author>	</entry>

	</feed>