07-LCD_Graphic-Library (STM32F4)

Diese Library dient zum zeichnen von Punkten, Linien und Kreisen auf dem LC-Display.
Es können auch im Flash gespeicherte Bilder auf das Display gezeichnet werden.

Sie benötigt dazu die LCD-Library “STM32_UB_LCD_ST7783

Im Moment werden 3 Bildformate unterstützt :
1. = 16Bit (RGB565) – Image-Files
2. = Bitmap Files (BMP, 24bpp, unkompremiert)
3. = JPG Files

Für das Format Nr. 1 habe ich das PC-Programm “ImageGenerator” geschrieben. Das wandelt beliebige BMP-Files in das RGB565-Format um und erzeugt ein C-File, das in der CooCox-IDE eingebunden werden kann.

Für die beiden anderen Formate (2 und 3) habe ich das PC-Programm “FileConverter” geschrieben. Dieses ließt ein beliebiges Hex-File (z.B. ein JPG-File) und erzeugt daraus ein C-File,  das in der CooCox-IDE eingebunden werden kann.

Hinweis zur Transparenz-Funktion :
es kann eine Farbe angegeben werden, die dann nicht auf dem Display gezeichnet wird. Damit erscheinen diese Bereiche dann Transparent. Das Bild muss zuvor so bearbeitet sein, das die stellen die Transparent sein sollen auch wirklich GENAU diese Farbe haben.

Geschwindigkeit :
Ein Image-Bild mit 240×320 Pixel (16bpp) wird in ca. 18ms gezeichnet
Ein BMP-Bild mit 240×320 Pixel (24pbb) wird in ca. 42ms gezeichnet
Ein JPG-Bild mit 240×320 Pixel wird in ca. 566ms gezeichnet

Speicherverbrauch :
Ein Image-Bild mit 240×320 Pixel braucht 153.600 Bytes
Ein BMP-Bild mit 240×320 Pixel braucht 230.454 Bytes
Ein JPG-Bild mit 240×320 Pixel braucht ca. 15.323 Bytes

Beispielbild :

lcd

Voraussetzungen :

1
2
Benutzte Module der CooCox-IDE : keine
Benutzte Librarys : STM32_UB_LCD_ST7783

Enumerationen :

1
2
3
4
5
6
7
8
9
10
11
typedef enum {
  GRAPHIC_OK =0,
  GRAPHIC_FILE_ERR,
  GRAPHIC_SIZE_ERR,
  GRAPHIC_ID_ERR,
  GRAPHIC_HEAD_ERR,
  GRAPHIC_WIDTH_ERR,
  GRAPHIC_HEIGHT_ERR,
  GRAPHIC_BPP_ERR,
  GRAPHIC_COMPR_ERR
}GRAPHIC_ERR_t;

Funktionen :

1
2
3
4
5
6
7
8
9
10
11
void UB_Graphic_DrawPixel(int16_t xpos, int16_t ypos, uint16_t color);                       // zeichnet einen Pixel
void UB_Graphic_DrawLine(int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color);    // zeichnet eine Linie zwischen zwei Punkten
void UB_Graphic_DrawCircle(int16_t x0, int16_t y0, int16_t radius, uint16_t color);          // zeichnet einen Kreis an Punkt x,y mit Radius r
void UB_Graphic_DrawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
void UB_Graphic_DrawFullRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
void UB_Graphic_DrawFullCircle(int16_t xp, int16_t yp, int16_t r, uint16_t c);
void UB_Graphic_DrawStraight(int16_t x, int16_t y, uint16_t l, LCD_DIR_t d, uint16_t color);
GRAPHIC_ERR_t UB_Graphic_DrawImage(UB_Image *img, int16_t xpos, int16_t ypos);               // zeichnet ein Image aus dem Flash
GRAPHIC_ERR_t UB_Graphic_DrawImageTransparent(UB_Image *img, int16_t xpos, int16_t ypos, uint16_t color); // zeichnet ein Image mit Transparenz
GRAPHIC_ERR_t UB_Graphic_DrawBmp(UB_Picture *bmp, uint16_t xpos, uint16_t ypos);             // zeichnet ein BMP-File aus dem Flash
GRAPHIC_ERR_t UB_Graphic_DrawJpg(UB_Picture *jpg, uint16_t xpos, uint16_t ypos);             // zeichnet ein JPG-File aus dem Flash

Beispiel :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//--------------------------------------------------------------
// File     : main.c
// Datum    : 18.03.2013
// Version  : 1.3
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.0
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der LCD-Graphic-Library
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_graphic.h"
 
int main(void)
{
  SystemInit(); // Quarz Einstellungen aktivieren
 
  UB_LCD_Init(); // Init vom LCD
 
  // LCD mit blau löschen
  UB_LCD_FillScreen(RGB_COL_BLUE);
 
  // Ein Image (aus dem Flash) Zeichnen
  UB_Graphic_DrawImage(&Emo1_Image,0,0);
 
  // Ein BMP-File (aus dem Flash) Zeichnen
  UB_Graphic_DrawBmp(&Emo2_Bmp,25,80);
 
  // rote Linie zeichnen
  UB_Graphic_DrawLine(10,20,100,150,RGB_COL_RED);
 
  // schwarzen kreis zeichnen
  UB_Graphic_DrawCircle(70,75,50,RGB_COL_BLACK);
 
  while(1)
  {
 
  }
}

Hier die Library zum Download :

ub_stm32f4_lcd_graphic_v106

Hier der komplette CooCox-Projektordner zum Download :

Demo_07_LCD2

Hier der Link zu meinen PC-Programmen :

PC-Programme

5 Antworten auf 07-LCD_Graphic-Library (STM32F4)

  1. Cortex-Einsteiger sagt:

    funktioniert wunderbar! Demo entpacken, Display Dateien für SSD1289 Controller hinzufügen, kompilieren, freuen. Ein einfacheres Beispiel mit Erkärung zur Lib Nutzung gibts nicht.

  2. Anton sagt:

    Hallo,
    Danke für deine Bibliotheken,
    Leider bekomme ich beim Übersetzen einen Fehler:
    Die Funktion UB_Graphic_DrawFullRect() kann nicht gefunden werden. Wo ist die Implementierung dieser Funktion?
    Mein Ziel ist es ADC-Werte als BarGraph (Peekmeter) darzustellen. Gibt es evtl. eine Funktion die ich hierfür gut nutzen kann?
    Ich benutzte Coocox als IDE.
    Danke für deine Hilfe..

    • admin_ub sagt:

      Von welchem Projekt hast du diese Zeile denn ?
      (von dem hier geposteten auf jeden Fall nicht)
      Lass doch einfach alle C-Files nach dem Funktionsnamen durchsuchen.

      • Anton sagt:

        Der Funktionsaufruf ist innerhalb der Lib ub_sgui in der Funktion SGUI_ScreenDrawFullRect().

        Zu meiner zweiten Frage zum Bargraph: Mein Ziel ist es einen Bargraph zu Programmieren, ähnlich dem auf dem Youtubevideo. Gibt es da eine Möglichkeit mit deinen Bibliotheken? Da ich ein Änfanger im Programmieren bin, wäre ich für eine kleine Hilfe dankbar.
        https://www.youtube.com/watch?v=qNokC07R-mo
        Danke für die Hilfe!

        • admin_ub sagt:

          es war noch eine alte Version online. Benutze die neue Version 1.6 dann sollte es funktionieren.

          hier eine Beispiel für einen “einfachen” Bargraph

          void drawBargraph(uint8_t percent)
          {
          uint16_t xstart=10, ystart=20;
          uint16_t width=200, height=15;
          
          if(percent>100) percent=100;
          
          // zuerst den Hintergrund zeichnen
          UB_Graphic_DrawFullRect(xstart,ystart,width,height,RGB_COL_GREY);
          
          // balken zeichen (0 bis 100%)
          width=(width/100)*percent;
          UB_Graphic_DrawFullRect(xstart,ystart,width,height,RGB_COL_RED);
          }
          


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert