term_colpos.h / term_colpos.c    


term_colpos beinhaltet Funktionen und Deklarationen, um die Zeichenausgabe in einem seriellen Terminal hinsichtlich Farben und Ausgabeposition steuern zu können.

Für die Ausgabe in einem seriellen Terminal wird zusätzlich die Software aus my_printf.h / my_printf.c und natürlich uart.h / uart.c benötigt.

Bild links wurde mit dem Beispiel 2 am Ende dieser Seite erzeugt.
Die Nummerierung der darstellbaren 16 Farben erfolgt nach dem Schema der (ur)alten EGA-Grafikkarte:
          #define black 0
          #define blue 1
          #define green 2
          #define cyan 3
          #define red 4
          #define magenta 5
          #define brown 6
          #define grey 7
          #define darkgrey 8
          #define lightblue 9
          #define lightgreen 10
          #define lightcyan 11
          #define lightred 12
          #define lightmagenta 13
          #define yellow 14
          #define white 15
Innerhalb von term_colpos werden Farbattribute verwendet. Ein Farbattribut bedeutet hier, dass in einem Byte (uint8_t) die Farben für Hintergrund und Vordergrund gespeichert ist.

Hierbei gilt: die oberen 4 Bits (oberes Nibble) repräsentieren die Farbnummer für den Hintergrund, wobei keine Darstellung von intensiven Farben möglich ist.

Die unteren 4 Bits (unteres Nibble) repräsentieren die Textfarbe.

Beispiel:
  
         settextattr(0x1e);     // setzt für den Hintergrund die Farbe 1
                                // (blau) mit Textfarbe 15 (0x0e=15=gelb)    
  
    Die Funktionen im einzelnen    


    void clrscr(void);    


löscht den Bildschirminhalt des seriellen Terminals



    void gotoxy(uint8_t x, uint8_t y);    


Positioniert den Textcursor auf die Position der nächsten Textausgabe im seriellen Terminal.

Übergabe:
      x,y : Textkoordinate auf die der Cursor positioniert wird. Die Koordinate 1,1 repräsentiert hierbei die linke obere Ecke


    void settextattr(uint8_t attr);    


setzt die Farben für Hintergrund und Text. Hierbei repräsentieren die oberen 4 Bit die Hintergrund-, die unteren 4 Bit die Textfarbe. Die Farbnummerierung erfolgt nach dem EGA-Farbschema

Übergabe:
      attr : Farbattribut für Hinter- und Vordergrundfarbe
    Makros    


    textcolor(col)    


legt die Textfarbe nach dem EGA-Farbschema fest



    bkcolor(col)    


legt die Hintergrundfarbe nach dem EGA-Farbschema fest

Beispiel 1:
  
        #include <stdio.h>
        #include <stdlib.h>
          
        #include "ch32fun.h"
        #include "ch32v003_gpio.h"
        
        #include "uart.h"
        #include "my_printf.h"
        #include "term_colpos.h"
        
        #define printf my_printf
        
        /* ----------------------------------------------------------
              my_putchar
              
              wird von my_printf aufgerufen. Hierauf gibt my_printf
              den Datenstream aus
             ---------------------------------------------------------- */
        void my_putchar(char ch)
        {
          uart_putchar(ch);
        }
        
        int main(void)
        {
          SystemInit();
          
          uart_init(115200);
          
          clrscr();
          textcolor(yellow);
          bkcolor(blue);
          printf("\n\r Hallo Welt \n\r ");
          textcolor(white);
          bkcolor(black);
          while(1);
        }
               
Beispiel 2 (umfangreicher):
  
          #include <stdio.h>
          #include <stdlib.h>
  
          #include "ch32fun.h"
          #include "ch32v003_gpio.h"
          
          #include "uart.h"
          #include "my_printf.h"
          #include "term_colpos.h"
          
          #define printf       my_printf
          
          #define cnt_speed    1000
          #define prog_speed   100
          
          #define baud         115200
          
          #define xofs         4
          #define yofs         8

          /* ----------------------------------------------------------
             Variablenstruktur fuer den Progressbar-Fortschrittsbalken
             ---------------------------------------------------------- */
          struct progbarstruct
          {
            uint8_t  x, y;
            uint16_t anz, percentage;
            uint8_t  progcol, bkcol, txattr;
            uint8_t  bkdraw;
          };
          
          typedef struct progbarstruct pbar;          
                    
          /* ----------------------------------------------------------
                                  my_putchar
          
               wird von my_printf aufgerufen. Hierauf gibt my_printf
               den Datenstream aus
             ---------------------------------------------------------- */
          void my_putchar(char ch)
          {
            uart_putchar(ch);
          }
                    
          /* ----------------------------------------------------------
                                  progressbar
             ---------------------------------------------------------- */
          void progressbar(pbar *pb)
          {
            int16_t i;
            uint8_t tmp;
            uint8_t steps;
          
            tmp= textattr;
            if (pb->bkdraw)
            {
              gotoxy(pb->x, pb->y);
              settextattr(pb->txattr);
              uart_putchar('[');
              bkcolor(pb->bkcol);
              for (i= 0; i< pb->anz; i++)
              {
                uart_putchar(' ');
              }
              settextattr(pb->txattr);
              uart_putchar(']');
            }
            steps= (pb->anz*pb->percentage) / 100;
            bkcolor(pb->progcol);
            gotoxy(pb->x + 1, pb->>);
            for (i= 0; i< steps; i++)
            {
              uart_putchar(' ');
            }
            settextattr(tmp);
          }
          
          /* ----------------------------------------------------------
                                        main
             ---------------------------------------------------------- */
          int main(void)
          {
            int      y, i;
            uint16_t counter;
            pbar     progbar;
          
            SystemInit();                 // 48 MHz intern, Clock fuer PORTA, PORTC, PORTD eingeschaltet
          
            uart_init(baud);
          
            settextattr(0x07);
            clrscr();
          
            settextattr(0x2e);
            printf("\n\r --------------------------------------\n\r");
            printf(" CH32V003: TermCol-Demo                \n\r");
            printf("                                       \n\r");
            printf(" 29.05.2025  R. Seelig                 \n\r");
            printf(" --------------------------------------\n\n\r");
          
            textcolor(yellow);
            bkcolor(brown);
          
            counter= 0,
            gotoxy(xofs-1, yofs); printf(" Farbkombinationen ");
            for (y= 0; y< 8; y++)
            {
              gotoxy(xofs, y+yofs+2);
              for (i= 0; i< 16; i++)
              {
                settextattr((y << 4) | i);
                uart_putchar('#');
              }
            }
          
            counter= 0;
            textcolor(grey);
            bkcolor(black);
          
            progbar.x= xofs+13;
            progbar.y= yofs+11;
            progbar.anz= 26;
            progbar.percentage= 0;
            progbar.progcol= blue;
            progbar.bkcol= grey;
            progbar.txattr= 0x0f;
            progbar.bkdraw= 1;
          
            gotoxy(xofs, yofs+11); printf("Progressbar: ");
            progressbar(&progbar);
            progbar.bkdraw= 0;
            for (i= 0; i< 101; i++)
            {
              progbar.percentage= i;
              progressbar(&progbar);
              gotoxy(1, yofs);
              delay(prog_speed);
            }
          
            counter= 0;
            gotoxy(xofs, yofs+13); printf("Counter    : ");
            while(1)
            {
              textcolor(blue);
              bkcolor(cyan);
              gotoxy(xofs+13, yofs+13); printf("       ");
              gotoxy(xofs+14, yofs+13); printf("%d", counter);
              settextattr(0);
              gotoxy(1, yofs);
              counter++;
              delay(cnt_speed);
            }
          }