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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.