Forum: Mikrocontroller und Digitale Elektronik LCD T6963 an ATXMEGA128A1


von Norman256256 (Gast)


Angehängte Dateien:

Lesenswert?

Hi Leute,

ich wollte nicht immer nur schnurren und von anderen den Source und die 
Ideen klauen, somit ein kleiner Beitrag von mir. Ich habe ausgehend von 
den bereits im Netz gefunden Treiber (glcd_xxx)- Funktionen mich ans 
Werk gemacht und ein paar Erweiterungen implementiert. Ich benutze ein 
Display mit 240x128 Pixel.
Vlt. testet ja mal einer die Funktionen mit einem kleineren Display.

Hier nun eine Kurzbeschreibung zum Code.

Displaytreiber auf ATXMEGA128A1 für T(RA)6963
=============================================

Vorwort:
--------
Ich habe mich an den Beiträgen
www.mikrocontroller.net/topic/76399
www.mikrocontroller.net/topic/48456
www.mikrocontroller.net/topic/376018#new
www.mikrocontroller.net/topic/52416
www.mikrocontroller.net/topic/230457#new
orientiert und diese für den ATXMEGA128A1 angepaßt und mit weiteren 
Funktionen erweitert.
Weitere Inspiration habe ich mir von
www.ccsinfo.com/forum/viewtopic.php?t=51413
www.keshikan.net/fonts-e.html
www.ffonts.net/LCD-Display-14-Segment.font
www.fontspace.com/abdulmakesfonts/28-segment-led-display
www.dafont.com/seven-segment.font
www.fontspace.com/category/led%2016%20segment
www.ffonts.net/LED-16-Segment.font
www.mikrocontroller.net/topic/77649
https://s-huehn.de/elektronik/tischuhr/tischuhr.htm
geholt.


Inhalt:
-------
- Ansteuerung des LCD mit Kontroller T(RA)6963
- Zugriffsfunktionen auf den LCD-Speicher (Text und Grafik)
- Steuerung des Cursors
- Schreiben und Lesen (Textspeicher,Pixelspeicher)
- Erzeugen von eigenen Schriftzeichen
- Malen von Linien mit Bresenham-Algorithmus, Linien im Winkel
- Malen von Kreisen, Kreissegmenten
- Malen von Rechtecken, gefüllten Rechtecken
- Fortschritts- oder Prozentanzeige in vertikaler und horizontaler 
Richtung
- Textbox mit Ausrichtung an Pixelkoordinate oder Textposition
- Zeichnen von Bitmap's an Pixelposition
- Zeichnen von gefüllten Rechtecken mit Muster
- Zeichnen einer Uhr mit Zeigern
- Zeichnen einer analog Anzeige mit Zeiger
- Zeichnen einer Balkenanzeige mit/ohne Bildlauf nach links oder rechts 
als
  Textausgabe
- Erzeugen eines 28 Segment Schriftfont mit 2x2 Textzeichen
 (es werden Sonderzeichen, Zahlen und Großbuchstaben unterstützt)
- Schreiben von Zeichen, Strings mit 28-Segment Font

Mitgelieferte Sourcen:
----------------------
LCD_T6963.C
LCD_T6963.H
ARTEFACT.H


Hardware:
---------
Ich benutze ein LCD Display von Anag Vision (AV241282BNBW-WTV#) mit der 
Auflösung 240x128 Pixel. Baugleiche Displays gibt es bei Mouser 
(www.mouser.com) von der Firma Newhaven Display 
(www.newhavendisplay.com). Das verwendete Display bietet zwei Modi's an 
(MD2); 8-Pixel und
6-Pixel breiter Schriftfont. Auswahl/Umschaltung erfolgt mit dem 
Unterprogramm LCD_FONT() und schaltet das PIN MD2 am LCD um.

Dieses LCD betreibe ich mit einem ATXMEGA128A1 auf einem Board von 
Ledato (www.ledato.de).

PORTC - 8 Bit Datenleitungen
PORTB - Steuerleitungen
        PB0 = /RST
        PB1 = /CS
        PB2 = /RD
        PB3 = /WR
        PB4 = C/D
        PB5 = MD2 Fontumschaltung
        PB6 = Display Licht (Ansteuerung eines N-FET)

Anpassen auf anderen Mikrokontroller oder andere Ports:
-------------------------------------------------------
Hierzu müssen die Ports in der Datei LCD_T6963.c in den Funktionen
- LCD_INIT()
- LCD_RST()
- LCD_CS()
- LCD_RD()
- LCD_WR()
- LCD_CMD()
- LCD_FONT()
entsprechend angepasst werden.
Sollte die Taktfrequenz des verwendeten Mikrokontrollers nicht 32MHz 
betragen, so muß in der Headerdatei LCD_T6963.h das "Define" geändert 
werden.
- #define F_CPU
Ich benutze diese Angabe zur Berechnung der Zeitverzögerung, um bei der 
Initialisierung die Wartezeit durch "n" Schleifendurchläufe zu erzeugen.

Anpassen des Displays mit mehr oder weniger Pixel-Auflösung erfolgt in 
der Headerdatei LCD_T6963.h mit den Define's.
- #define LCD_XMAX
- #define LCD_YMAX
Ggf. müssen die Speicheradressen noch angepaßt werden. Bei dem von mir 
verwendeten Display mit der Auflösung 240x128 stehen 8kB Speicher zur 
Verfügung.


Einbinden in eigenen Source:
----------------------------
#include "LCD_T6963.H"

int main(void)
{
   ...
   LCD_INIT();
   LCD_FONT(1);   //Fontauswahl 6-Pixel breiter Textfont
                  //dafuer 40 Zeichen pro Zeile
   LCD_INVERS(0); //keine invertierte Darstellung
   //LCD_CLS();   //Bildschirm loeschen
                  //wird bereits bei LCD_INVERS() durchgefuehrt
   ...

   while(1)
   {
      ...
   }
}


Inhalt der Bibliothek auf das notwendige Maß reduzieren:
--------------------------------------------------------
In der Headerdatei LCD_T6963.h kann über "Defines" bestimmte Komponenten 
hinzu compiliert werden. Wenn die Komponenten nicht benötigt werden, so 
kommentiert man nur das jeweilige "Define" aus.
#define BIGCHARS - große Schrift, benutzt Artefacte als Sonderzeichen 
für
                   28-Segment Font (im Textspeicher)
#define GRAPHIC  - Grafikfunktionen, welche den Grafikspeicher nutzen
#define CLOCK   - Uhr, benötigt Grafik
#define GAUGE   - Analogzeigerinstrument, benötigt Grafik
#define CHART   - Balkendiagramm (im Textspeicher)

Folgende Funktionen benötigen Grafik:
#define GRAPHIC
  LCD_LINE()
  LCD_CIRCLE()
  LCD_CIRCLESEGMENT()
  LCD_PIE()
  LCD_SLICE()
  LCD_RECT()
  LCD_FILLRECT()
  LCD_DEGLINE()
  LCD_PERCENTBOX()
  LCD_PROGRESSBAR()
  LCD_TEXTBOX()
  LCD_TEXTBOX2()
  LCD_TEXTFRAMEBOX()
  LCD_TEXTFRAMEBOX2()
  LCD_BITMAP()
  LCD_PATTERNRECT()
  LCD_HORIZLINE()
Funktionen zur Uhr:
#define CLOCK
  LCD_CLOCK()
  LCD_CLOCKHAND()
  LCD_SETTIME()
Funktionen zum Analogzeigerinstrument:
#define GAUGE
  LCD_GAUGE()
  LCD_GAUGEVALUE()

Folgende Funktionen nutzen den Zeichengenerator mit eigenen Zeichen:
#define BIGCHARS
#include "ARTEFACT.h"
  LCD_CRATEARTEFACT()
  LCD_WRITEARTEFACT()
  LCD_WRITEBIGCHAR()
  LCD_WRITEBIGSTR()

#define CHART
  LCD_CHART()
  LCD_CHARTARTEFACT()
  LCD_CHARTVALUE()
  LCD_CHARTSHIFT()
  LCD_CHARTYWRITE()
  LCD_CHARTXWRITE()
  LCD_CHARTXFIRSTWRITE()


Beschreibung und Aufruf der Funktionen:
---------------------------------------
Die meisten Funktionen erklären sich normalerweise von selbst. Denoch 
möchte ich einige Funktionen etwas näher erläutern.

LCD_INVERS()
------------
0 = Das Display wird in den Normalmode geschalten und der 
Bildschirminhalt gelöscht.
1 = Das Display wird in den Inversmode geschalten und der 
Bildschirminhalt gelöscht.

LCD_FONT()
----------
Auswahl eines der beiden Schriftfonts mit
0 = 8-Pixel Breite
1 = 6-Pixel Breite
Die Anzahl der max. Zeichen pro Zeile wird berechnet und im Display 
angepaßt.

LCD_DISPLAYMODE()
-----------------
Prinzipiell ist das Display für die Ausgabe von Schriftzeichen und 
Grafik
programmiert und der Kontroller auf dem Display ist in diesem Modus.
Zusätzlich kann durch die Einstellung des Grafikmodus die bildliche 
Verknüpfung eingestellt werden.
LCD_MODE_OR   = pixelweise Oder-Verknüpfung
LCD_MODE_EXOR = pixelweise ExklusivOder-Verknüpfung
LCD_MODE_AND  = pixelweise Und-Verknüpfung

unsigned char LCD_GETDISPLAYMODE()
----------------------------------
Gibt den ausgewählten Displaymode zurück.

LCD_GCMODE()
------------
LCD_MODE_GCROM = Textzeichen aus GCROM (interner Zeichengenerator)
LCD_MODE_GCRAM = Textzeichen aus GCRAM

LCD_GETGCMODE()
---------------
Gibt den eingestellten GC-Mode zurück.

LCD_Backlight()
---------------
Falls ein Transistor (N-Fet) an das Mikrokontrollerpin PB.6 
angeschlossen ist, so läßt sich über diese Funktion die 
Hintergrundbeleuchtung an- bzw. ausschalten.
0 - Schaltet die Hintergrundbeleuchtung aus
1 - Schaltet die Hintergrundbeleuchtung an

LCD_CLS()
---------
Löscht den Bildschirm komplett.

LCD_CLS_TEXT()
--------------
Löscht nur den Textbildschirm.

LCD_CLS_GRAPHIC()
-----------------
Löscht nur den Grafikbildschirm.

LCD_LINECHARS()
---------------
Gibt die Anzahl der Textzeichen pro Zeile zurück. Alternativ kann der 
Wert
ui_linechars verwendet werden.

LCD_DELAY()
-----------
Warte die Zeit x 10ms in einer While Schleife ab.

LCD_CURSOR()
------------
Setzt den Cursor-Mode.
LCD_CURSOR_OFF       - schaltet den Cursor aus
LCD_CURSOR_ON        - schaltet den Cursor an
LCD_CURSOR_BLINK_OFF - schaltet den Cursor an, Blinkmodus aus
LCD_CURSOR_BLINK_ON  - schaltet den Cursor im Blinkmodus an

LCD_CURSORMODE()
----------------
Konfiguriert das Erscheinungsbild des Cursors.
Der Cursor wird n-zeilig dargestellt.
0 - Cursor ist einzeilig
..
7 - Cursor ist 8-zeilig

LCD_CURSORPOS()
---------------
P(ui_x,ui_y)
Der Text-Cursor wird auf Spalte (X) und Zeile (Y) gesetzt.
Die linke obere Ecke hat die Position x=1,y=1.
Die rechte obere Ecke hat die Position x= ui_linechars,y=1.
Die rechte untere Ecke hat die Position x= ui_linechars,y= ui_lines.

LCD_WRITESTR()
--------------
P(ui_x,ui_y),String
Der Text-Cursor wird auf Spalte (X) und Zeile (Y) gesetzt. Danach wird 
ein
Textstring in den Textspeicher des Displays geschrieben.

LCD_WRITECHAR()
---------------
P(ui_x,ui_y),Zeichen
Der Text-Cursor wird auf Spalte (X) und Zeile (Y) gesetzt. Danach wird 
ein
Textzeichen in den Textspeicher des Displays geschrieben. Es können 
damit auch selbst erzeugte Sonderzeichen mit Zeichencodes >= 80h 
ausgegeben werden.

LCD_DELETECHAR()
----------------
P(ui_x,ui_y),Zeichen
Der Text-Cursor wird auf Spalte (X) und Zeile (Y) gesetzt.
Es wird ein Leerzeichen geschrieben und anschließend wird der Cursor auf 
die Schreibposition des Leerzeichens gesetzt.

LCD_GETCHAR()
-------------
P(ui_x,ui_y)
Der Text-Cursor wird auf Spalte (X) und Zeile (Y) gesetzt.
Es wird das Zeichen aus dem Textspeicher zurückgelesen.

LCD_CLEARLINE()
---------------
P(ui_y)
Der Text-Cursor wird auf den Anfang der Zeile (Y) gesetzt.
Danach wird die gesamte Zeile gelöscht. (Mit Leerzeichen
aufgefüllt.)

LCD_CLEARLINECHARS()
--------------------
P(ui_x,ui_y),Anzahl
Der Text-Cursor wird auf Spalte (X) und Zeile (Y) gesetzt.
Es werden eine Anzahl Leerzeichen geschrieben.

LCD_CREATECHAR()
----------------
Adresse,Pointer auf ByteArray[8]
Mit dieser Funktion können Sonderzeichen erstellt werden. Dazu gibt man 
den
Speicherplatz 0..127 an und ein Byte-Array mit 8-Bytes. Diese erzeugen 
dann im Zeichengenerator das Zeichen für den Textspeicher. Das Zeichen 
kann dann an beliebiger Position mittels LCD_WRITECHAR() als Zeichen 
0xA0h .. 0xFFh aufgerufen werden.

LCD_PIXEL()
-----------
P(ui_x,ui_y),uc_x
Setzt oder löscht ein Pixel an der Pixelposition im Grafikspeicher.
Die linke obere Position ist x=0,y=0.
Die rechte obere Position ist x= maxX,y=0.
Die rechte untere Position ist x= maxX,y= maxY.
uc_x= 0 löscht das Pixel.
uc_x= 1 setzt das Pixel.

LCD_SETPIXEL()
--------------
P(ui_x,ui_y)
Die Funktion ruft LCD_PIXEL() auf und setzt das adressierte Pixel.

LCD_CLRPIXEL()
--------------
P(ui_x,ui_y),uc_x
Die Funktion ruft LCD_PIXEL() auf und löscht das adressierte Pixel.

LCD_GETPIXEL()
--------------
P(ui_x,ui_y)
Die Funktion liest das adressierte Pixel aus dem Grafikspeicher. Ist das
Pixel gesetzt, so gibt die Funktion eine "1" ansonsten "0" zurück.

LCD_BIGPIXEL()
--------------
P(ui_x,ui_y),uc_x
Diese Funktion setzt oder löscht das/die Pixel. Zusätzlich wird um die 
Pixelposition je nach Wert weitere Pixel gesetzt oder gelöscht, so daß 
ein größere Punkt entsteht.
Pixel setzen:  uc_x={1,3,5,7}
Pixel löschen: uc_x={2,4,6,8}

LCD_LINE()
----------
P1(ui_x1,ui_y1),P2(ui_x2,ui_y2),uc_show
Zeichnet eine Linie von Punkt(X1,Y1) nach Punkt(X2,Y2) mit n-Pixel.
Pixel setzen:  uc_show={1,3,5,7}
Pixel löschen: uc_show={2,4,6,8}

LCD_HORIZ_LINE()
----------------
P1(ui_x1,ui_y1),P2(ui_x2,ui_y2),uc_show
Zeichnet wie die Funktion LCD_LINE() ein Linie in horizontaler Richtung.
Es wird der Punkt(X,Y) und die Anzahl der Pixel angegeben.
uc_show = 1 setzt die Pixel.
uc_show = 0 löscht die Pixel.

LCD_CIRCLE()
------------
P(i_x,i_y),i_radius,uc_show
Zeichnet einen Kreis an der Position P(X,Y) mit dem Radius r.
Pixel setzen:  uc_show={1,3,5,7}
Pixel löschen: uc_show={2,4,6,8}


LCD_CIRCLESEGMENT()
-------------------
P(i_x,i_y),i_radius,uc_cpos,uc_show
Zeichnet Kreisausschnitte an der Position P(X,Y) mit dem Radius r.
Der Kreis ist aufgeteilt in 8 Kreissegmente beginnend rechts oben.
uc_cpos kennzeichnet mit jeweils einem Bit, welche(s) Segment(e) 
gezeichnet
werden sollen.
uc_cpos = 0x01 Segment oben rechts
uc_cpos = 0x02 Segment rechts oben
uc_cpos = 0x04 Segment rechts unten
uc_cpos = 0x08 Segment unten rechts
uc_cpos = 0x10 Segment oben links
uc_cpos = 0x20 Segment links oben
uc_cpos = 0x40 Segment links unten
uc_cpos = 0x80 Segment unten links
uc_cpos = 0xFF entspricht einem Vollkreis

Pixel setzen:  uc_show={1,3,5,7}
Pixel löschen: uc_show={2,4,6,8}

LCD_PIE()
---------
P(i_x,i_y),i_radius,uc_pos,uc_show
Zeichnet ausgefüllte Tortensegmente nach dem Prinzip von 
LCD_CIRCLESEGMENT().
uc_cpos = 0x01 Segment oben rechts
uc_cpos = 0x02 Segment rechts oben
uc_cpos = 0x04 Segment rechts unten
uc_cpos = 0x08 Segment unten rechts
uc_cpos = 0x10 Segment oben links
uc_cpos = 0x20 Segment links oben
uc_cpos = 0x40 Segment links unten
uc_cpos = 0x80 Segment unten links
uc_cpos = 0xFF entspricht einem Vollkreis

Pixel setzen:  uc_show={1,3,5,7}
Pixel löschen: uc_show={2,4,6,8}

LCD_SLICE()
-----------
P(i_x,i_y),i_radius1,i_radius2,uc_cpos,uc_show
Zeichnet ausgefüllte Segmente nach dem Prinzip von LCD_PIE(). Es wird 
ein
innerer und ein äußerer Radius angegeben.
uc_cpos = 0x01 Segment oben rechts
uc_cpos = 0x02 Segment rechts oben
uc_cpos = 0x04 Segment rechts unten
uc_cpos = 0x08 Segment unten rechts
uc_cpos = 0x10 Segment oben links
uc_cpos = 0x20 Segment links oben
uc_cpos = 0x40 Segment links unten
uc_cpos = 0x80 Segment unten links
uc_cpos = 0xFF entspricht einem Vollkreis

Pixel setzen:  uc_show={1,3,5,7}
Pixel löschen: uc_show={2,4,6,8}

LCD_RECT()
----------
P1(ui_x1,ui_y1),P2(ui_x2,ui_y2),uc_show
Zeichnet ein Rechteck mit den beiden Eckpunkten P1(X1,Y1) und P2(X2,Y2).
Pixel setzen:  uc_show={1,3,5,7}
Pixel löschen: uc_show={2,4,6,8}

LCD_FILLRECT()
--------------
P1(ui_x1,ui_y1),P2(ui_x2,ui_y2),uc_show
Zeichnet ein Rechteck mit den beiden Eckpunkten P1(X1,Y1) und P2(X2,Y2).
Pixel setzen:  uc_show={1,3,5,7}
Pixel löschen: uc_show={2,4,6,8}


LCD_DEGLINE()
-------------
P(ui_x,ui_y),i_degree,i_inner_radius,i_outer_radius,uc_show
Zeichnet eine Linie wie ein Vektor. P(X,Y) gibt den Ursprung an, der 
Winkel die Richtung, der Radius r1 und r2 die Linienlänge.
Pixel setzen:  uc_show={1,3,5,7}
Pixel löschen: uc_show={2,4,6,8}

LCD_PERCENTBOX()
----------------
P1(ui_x1,ui_y1),P2(ui_x2,ui_y2),uc_percent
Zeichnet eine Box, die entsprechend der Prozentvorgabe die Box nach oben 
hin füllt.
uc_percent = {0..100}

LCD_PROGRESSBAR()
-----------------
P1(ui_x1,ui_y1),P2(ui_x2,ui_y2),uc_percent
Zeichnet eine Box, die entsprechend der Prozentvorgabe die Box nach 
rechts hin füllt.
uc_percent = {0..100}

LCD_TEXTBOX()
-------------
P1(ui_x1,ui_y1),P2(ui_x2,ui_y2),String
Zeichnet eine Box und gibt in der Mitte den Text aus. Dabei sind die 
Punkte im Grafikbildschirm angegeben. Der Text wird in die gemittelte 
Zeile gesetzt.

LCD_TEXTBOX2()
--------------
P1(ui_x1,ui_y1),P2(ui_x2,ui_y2),String
Zeichnet eine Box und gibt in der Mitte den Text aus. Dabei sind die 
Punkte im Textbildschirm angegeben. Der Text wird in die gemittelte 
Zeile gesetzt. Die Umrandung erfolgt ausgehend von der Textposition.

LCD_TEXTFRAMEBOX()
------------------
P1(ui_x1,ui_y1),P2(ui_x2,ui_y2),String
Ist wie die Funktion LCD_TEXTBOX(), jedoch wird die Fläche innerhalb der 
Box nicht eingefärbt.

LCD_TEXTFRAMEBOX2()
-------------------
P1(ui_x1,ui_y1),P2(ui_x2,ui_y2),String
Ist wie die Funktion LCD_TEXTBOX(), jedoch wird die Fläche innerhalb der 
Box nicht eingefärbt.

LCD_BITMAP()
------------
Pointer auf Bitmap,P(ui_x,ui_y),DIM(ui_DIMx,ui_DIMy),uc_show
Zeichnet ein Bitmap pBMP an die obere linke Position des Punktes P(X,Y) 
mit der Ausdehnung DIM(X,Y). Wenn das Bitmap kleiner ist, werden die 
fehlenden Pixel mit Leerpixeln aufgefüllt. Ist die DIM-Angabe kleiner, 
dann wird das Bild verkleinert. Es kann jedoch zu Darstellungsproblemen 
führen.
Achtung! Das letzte Byte auf jeder Zeile muß mit Nullbits aufgefüllt 
werden.
uc_show = 0 löscht das Bitmap
uc_show = 1 zeichnet das Bitmap
uc_show = 2 zeichnet das Bitmap invertiert

LCD_PATTERNRECT()
-----------------
Pointer auf Bytearray[8],P(ui_x,ui_y),DIM(ui_DIMx,ui_DIMy),uc_show
Zeichnet ein Bitmap mit einem Muster. Diese Muster besteht aus einem 
Bytearray von 8 Byte.
Anstelle externer Bilddaten wird dieses Muster geladen.
uc_show = 0 löscht das Bitmap
uc_show = 1 zeichnet das Bitmap
uc_show = 2 zeichnet das Bitmap invertiert

LCD_WRITELONG()
---------------
P(ui_x,ui_y),ul_x,uc_hex
Schreibt an die Textposition P(X,Y) den übergebenen Zahlenwert.
Der Wert uc_hex = 10 bedeutet dezimale Zahlendarstellung.
Der Wert uc_hex = 16 bedeutet hexadezimale Zahlendarstellung.


Zusätzliche Funktionen
======================

Schriftfont für große Schrift
-----------------------------
Um eine Schrift zwei- oder gar mehrzeilig zu erzeugen, bedarf es enormen 
Speicher, wenn dies über die Grafik realisiert wird. So kann man für 
jedes Zeichen eine Bitmap im Flashspeicher hinterlegen und diese mit der 
entsprechenden Funktion auf das Display schreiben. Das dauert je nach 
Bitmapgröße ein paar Sekunden. Ich habe mich entschieden einen anderen 
Weg zu probieren.
Dazu habe ich mir den 28-Segment Font angeschaut und die notwendigen 
Artefakte als Sonderzeichen programmiert. Die Funktion 
LCD_WRITEARTEFACT() legt diese 32 Sonderzeichen im Zeichengenerator-RAM 
ab. Siehe in der Datei "ARTEFACT.h" im Array "artefact[256]. Diese sind 
von E0..FFh als Zeichen
mit LCD_WRITECHAR() abrufbar. Die gleichen Artefakte werden um ein oder 
zwei Bit je nach Pixelbreite (LCD Schriftfont) nach links verschoben 
nochmals im Zeichengenerator abgelegt. Diese sind von C0..DFh als 
Zeichen verwendbar. Somit kann unabh. vom eingestellten Font des LCD 
alle Schriftzeichen als Segmentfont erzeugt werden.
Ein Schriftzeichen als BIGFONT umfaßt 4 Sonderzeichen. Somit ergibt 
sich, daß die Zeichenanzahl je Zeile und die Zeilenanzahl halbiert sind.
Der neue Zeichensatz bildet gemäß dem ASCII-Zeichensatz folgende 
Schriftzeichen ab:
Zahlen 0..9, Großbuchstaben A..Z, Sonderzeichen
Kleinbuchstaben werden als Großbuchstaben ausgegeben. Nicht vorhandene 
Zeichen im Zeichensatz werden ignoriert. Der Zeichenumfang ist in 
"ARTEFACT.h" im Array ul_char[64] ersichtlich. Dieses Array könnte
erweitert werden, so daß auch Kleinbuchstaben dargestellt werden können. 
Der unsigned long Wert besteht aus 4 Bytes. Jedes Byte wählt ein Zeichen 
aus der Artefact-Tabelle aus. Die höherwertigen Bytes sind beim zu 
erzeugenden BIGFONT in der ersten oberen Zeile von links nach rechts und 
die niederwertigen Bytes in der zweiten unteren Zeile von links nach 
rechts in der Zeichenausgabe.


Implementierung:
----------------
#define BIGCHARS
Damit wird das "Include"
#include "ARTEFACT.h" für den Compiler angewiesen und mit dem Aufruf der 
Funktion LCD_FONT() werden die Artefakte im Zeichengenerator hinterlegt.

Folgende Funktionen werden benötigt:

LCD_CRATEARTEFACT()
-------------------
Erzeugt die Artefakte im Zeichengenerator-RAM. Diese Funktion wird mit 
der Funktion LCD_FONT() aufgerufen.

LCD_WRITEARTEFACT()
-------------------
Schreibt ein Artefakt an die Position im Textspeicher.

LCD_WRITEBIGCHAR()
------------------
P(ui_x,ui_y),Zeichen
Schreibt an den Punkt(X,Y) das Zeichen als BigFont-Zeichen. Die Position 
P(1,1) ist auf das BigFont-Zeichen normiert. Der Cursor steht damit an 
der Position P(1,2) und wird mit jedem Zeichen um 2 Normalfont Zeichen 
nach rechts gerückt.

LCD_WRITEBIGSTR()
-----------------
P(ui_x,ui_y),String
Schreibt ab dem Punkt(X,Y) den String als BigFont-Zeichen. Die Position 
P(1,1) ist auf das BigFont-Zeichen normiert.


AnalogUhr
---------
Die Uhr wird mittels Grafik ohne Zeiger gezeichnet. Eine weitere 
Funktion löscht die alten Zeiger und zeichnet neue Zeiger an die 
notwendige Position.

Implementierung:
----------------
#define GRAPHIC
#define CLOCK

LCD_CLOCK(LCD_XMAX /2,LCD_YMAX /2,LCD_YMAX -1);
LCD_SETTIME(2,30,10);


LCD_CLOCK()
-----------
P(ui_x,ui_y),DIMxy
Zeichnet eine Uhr (Ziffernblatt) ausgehend vom Mittelpunkt mit der 
X/Y-Ausdehnung DIMxy.

LCD_CLOCKHAND()
---------------
uc_x,uc_type,uc_show
Zeichnet die Zeiger der Uhr. Die Funktion LCD_SETTIME() ruft diese 
Funktion auf.
uc_x = {0..59} als Zeitwert, Stundenwert muß mal 5 gerechnet werden

uc_type = 0 - Sekundenzeiger
uc_type = 1 - Minutenzeiger
uc_type = 2 - Stundenzeiger

uc_show = 0 - Zeiger löschen
uc_show = 1 - Zeiger zeichnen

LCD_SETTIME()
-------------
uc_Hour,uc_Minute,uc_Secound
Diese Funktion im Sekundentakt aufrufen und die aktuelle Uhrzeit 
übergeben.


Analoges Zeigerinstrument
-------------------------
Das Zeigerinstrument hat eine Skale, welche mit Grafikfunktionen 
gezeichnet wird. Die Beschriftung der Skale erfolgt mit Schriftzeichen 
aus dem Textspeicher des Displays. Analog wie bei der Uhr wird der alte 
Zeiger
gelöscht und der neue Zeiger gezeichnet.

Implementierung:
----------------
#define GRAPHIC
#define GAUGE

LCD_GAUGE(LCD_XMAX /2,LCD_YMAX /2,LCD_YMAX -1,120,5,"mV");
LCD_GAUGEVALUE(60);


LCD_GAUGE()
-----------
P(ui_x,ui_y),DIM(ui_DIMxy),ui_Scale,ui_Ticks,String
Zeichnet das Meßgerät.
Vom Mittelpunkt P(X,Y) ausgehend wird das Zeigerinstrument mit der 
Breite von 2x DIMxy und der Höhe von 1x DIMxy gezeichnet.
ui_Scale - Fullscale-Wert
ui_Ticks - Die Scale wird unterteilt in Anzahl Teilerstriche. Aller 
ui_Ticks- Striche erfolgt eine nummerische
     Beschriftung

LCD_GAUGEVALUE()
----------------
ui_x
Zeichnet den Zeiger des Meßgeräts.
Der Meßwert ui_x wird auf den Fullscale-Wert umgerechnet und als 
Zeigerposition angezeigt.


Balkendiagramm-Anzeige
----------------------
Es wird ein Balkendiagramm dargestellt. Die Balken selbst werden durch 
erzeugte Artefakte aufgebaut, so daß die Anzeige der Balken und des 
Diagramms nur im Textspeicher erfolgt und damit schneller ist, als wenn 
man
dass alles mit Grafik erzeugt. Hierzu werden 16 Artefakte erzeugt, 
welche sich als Sonderzeichen B0..BFh mit LCD_WRITECHAR() darstellen 
lassen.

Implementierung:
----------------
#define CHART

void main(void)
{
unsigned int ui_cnt,ui_x;

   ... //Controller - INIT
   LCD_INIT();
   LCD_FONT(1);
   LCD_INVERS(0);

   ui_cnt = 0;
   ui_x = 0;

   LCD_CHART(0xCF,"TEST"); //zeichne Balkendiagramm

   while(1)
   {
   LCD_CHARTSHIFT(ui_cnt,1);
  itoa(ui_cnt,c_txt,10);
  LCD_CHARTXFIRSTWRITE(c_txt);

  if ((ui_x & 0x01) == 0)
   {
       ui_cnt++;
      if (ui_cnt > 100)
       {
    ui_cnt = 100;
    ui_x++;
       }
   }
   else {
             if (ui_cnt < 1)
      {
        ui_cnt = 1;
        ui_x++;
      }
     ui_cnt--;
        }

  LCD_DELAY(20);
    }
}


Beschreibung der Funktionen:
----------------------------

LCD_CHART()
-----------
uc_mode,String
Das Balkendiagramm ist als Fullscreen Diagramm designt. Über uc_mode 
kann das Aussehen und die Funktion gewählt werden.

uc_mode
Bit1   = Y %-Skale darstellen
Bit2,3 = Balkenabstand, Balkenbreite auswählen
Bit4   = Leerzeile unten darstellen
Bit5   = frei
Bit6   = frei
Bit7   = % Zahlen am Balken in unterster Zeile darstellen
Bit8   = untere Zeile mit Verschieben bei ShiftValue

Name = Bezeichnung des Balkendiagramms in der ersten Zeile.


LCD_CHARTARTEFACT()
-------------------
Diese Funktion erzeugt die graphischen Symbole als Textzeichen im 
Zeichengenerator-RAM. Der Aufruf der Funktion erfolgt von LCD_CHART().

LCD_CHARTVALUE()
----------------
uc_n,uc_value
Zeichnet die Balken. uc_n = 0 zeichnet den ersten Balken links im 
Diagramm. uc_n kann maximal ui_linechars-1 haben. Balken rechts 
außerhalb des Displays werden nicht gezeichnet.
uc_value = {0..100}

LCD_CHARTSHIFT()
----------------
uc_value,uc_shiftmode
Diese Funktion zeichnet wie LCD_CHARTVALUE() die Balken. In uc_value 
wird der Wert übergeben. Mit jedem weiteren Aufruf dieser Funktion 
werden die Balken nach links oder rechts verschoben. Anschließend wird 
an der freien
Position ein neuer Balken gezeichnet mit dem Wert uc_value.
uc_shiftmode = 0 - Balken werden nach links verschoben
uc_shiftmode = 1 - Balken werden nach rechts verschoben

LCD_CHARTYWRITE()
-----------------
String1..6
Beschriftung der Y-Achse. Dazu sollte beim Erzeugen des Balkendiagramms 
in LCD_CHART() das uc_mode - Konfigurationsbyte 0bxxxxxxx1 sein. Also 
Bit 1 = "1".

String1    = Bezeichnung der Y-Achse
String2..6 = Werte an der Y-Achse

LCD_CHARTXWRITE()
-----------------
uc_n,string
Beschriftung der X-Achse. Dazu sollte beim Erzeugen des Balkendiagramms 
in LCD_CHART() das uc_mode - Konfigurationsbyte 0bxxxx1xxx sein. Also 
Bit 4 = "1".

uc_n - Nummer des Balkens
c_s  = Bezeichnung des Balkens, es werden nur so Breit wie der Balken 
ist Zeichen geschrieben

LCD_CHARTXFIRSTWRITE()
----------------------
String
Beschriftung der Balken entlang der X-Achse. Dazu sollte beim Erzeugen 
des Balkendiagramms in LCD_CHART() das uc_mode - Konfigurationsbyte 
0b11xx1xxx sein. Also Bit 4,7,8 = "1".
Wenn die Balken mit LCD_CHARTSHIFT() erzeugt werden, dann wird mit 
dieser Funktion der gerade neu gezeichnete Balken beschriftet. Dieser 
kann je nach Schieberichtung links oder rechts außen sein.

c_s  = Bezeichnung des Balkens, es werden nur so Breit wie der Balken 
ist Zeichen geschrieben


Viel Spaß beim Testen!

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.