frederic blanc / Mbed 2 deprecated sp5gfx1

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers graphic.c Source File

graphic.c

00001 // Wy�wietlacz graficzny ze sterownikiem S6B0724
00002 // sterowanie w jezyku C od podstaw
00003 // Plik : graphic.c
00004 // Autor : Rados�aw Kwiecie�
00005 
00006 #include "SPLC501C.h"
00007 
00008 void GLCD_Rectangle(unsigned char x, unsigned char y, unsigned char b, unsigned char a , char color) {
00009     unsigned char j; // zmienna pomocnicza
00010     // rysowanie linii pionowych (boki)
00011     for (j = 0; j < a; j++) {
00012         GLCD_SetPixel(x, y + j, color);
00013         GLCD_SetPixel(x + b - 1, y + j, color);
00014     }
00015     // rysowanie linii poziomych (podstawy)
00016     for (j = 0; j < b; j++)    {
00017         GLCD_SetPixel(x + j, y, color);
00018         GLCD_SetPixel(x + j, y + a - 1, color);
00019     }
00020 }
00021 
00022 
00023 void GLCD_Circle(unsigned char cx, unsigned char cy ,unsigned char radius , char color) {
00024     int x, y, xchange, ychange, radiusError;
00025     x = radius;
00026     y = 0;
00027     xchange = 1 - 2 * radius;
00028     ychange = 1;
00029     radiusError = 0;
00030     while (x >= y) {
00031         GLCD_SetPixel(cx+x, cy+y, color);
00032         GLCD_SetPixel(cx-x, cy+y, color);
00033         GLCD_SetPixel(cx-x, cy-y, color);
00034         GLCD_SetPixel(cx+x, cy-y, color);
00035         GLCD_SetPixel(cx+y, cy+x, color);
00036         GLCD_SetPixel(cx-y, cy+x, color);
00037         GLCD_SetPixel(cx-y, cy-x, color);
00038         GLCD_SetPixel(cx+y, cy-x, color);
00039         y++;
00040         radiusError += ychange;
00041         ychange += 2;
00042         if ( 2*radiusError + xchange > 0 ) {
00043             x--;
00044             radiusError += xchange;
00045             xchange += 2;
00046         }
00047     }
00048 }
00049 
00050 
00051 void GLCD_Line(int X1, int Y1,int X2,int Y2 , char color) {
00052     int CurrentX, CurrentY, Xinc, Yinc,
00053     Dx, Dy, TwoDx, TwoDy,
00054     TwoDxAccumulatedError, TwoDyAccumulatedError;
00055 
00056     Dx = (X2-X1); // obliczenie sk&#65533;adowej poziomej
00057     Dy = (Y2-Y1); // obliczenie sk&#65533;adowej pionowej
00058 
00059     TwoDx = Dx + Dx; // podwojona sk&#65533;adowa pozioma
00060     TwoDy = Dy + Dy; // podwojona sk&#65533;adowa pionowa
00061 
00062     CurrentX = X1; // zaczynamy od X1
00063     CurrentY = Y1; // oraz Y1
00064 
00065     Xinc = 1; // ustalamy krok zwi&#65533;kszania pozycji w poziomie
00066     Yinc = 1; // ustalamy krok zwi&#65533;kszania pozycji w pionie
00067 
00068     if (Dx < 0) { // jesli sk&#65533;adowa pozioma jest ujemna
00069         Xinc = -1; // to b&#65533;dziemy si&#65533; "cofa&#65533;" (krok ujemny)
00070         Dx = -Dx;  // zmieniamy znak sk&#65533;adowej na dodatni
00071         TwoDx = -TwoDx; // jak r&#65533;wnie&#65533; podwojonej sk&#65533;adowej
00072     }
00073 
00074     if (Dy < 0) { // je&#65533;li sk&#65533;adowa pionowa jest ujemna
00075         Yinc = -1; // to b&#65533;dziemy si&#65533; "cofa&#65533;" (krok ujemny)
00076         Dy = -Dy; // zmieniamy znak sk&#65533;adowej na dodatki
00077         TwoDy = -TwoDy; // jak r&#65533;wniez podwojonej sk&#65533;adowej
00078     }
00079 
00080     GLCD_SetPixel(X1,Y1, color); // stawiamy pierwszy krok (zapalamy pierwszy piksel)
00081 
00082     if ((Dx != 0) || (Dy != 0)) { // sprawdzamy czy linia sk&#65533;ada si&#65533; z wi&#65533;cej ni&#65533; jednego punktu ;)
00083         // sprawdzamy czy sk&#65533;adowa pionowa jest mniejsza lub r&#65533;wna sk&#65533;adowej poziomej
00084         if (Dy <= Dx) { // je&#65533;li tak, to idziemy "po iksach"
00085             TwoDxAccumulatedError = 0; // zerujemy zmienn&#65533;
00086             do { // ruszamy w drog&#65533;
00087                 CurrentX += Xinc; // do aktualnej pozycji dodajemy krok
00088                 TwoDxAccumulatedError += TwoDy; // a tu dodajemy podwojon&#65533; sk&#65533;adow&#65533; pionow&#65533;
00089                 if (TwoDxAccumulatedError > Dx) { // je&#65533;li TwoDxAccumulatedError jest wi&#65533;kszy od Dx
00090                     CurrentY += Yinc; // zwi&#65533;kszamy aktualn&#65533; pozycj&#65533; w pionie
00091                     TwoDxAccumulatedError -= TwoDx; // i odejmujemy TwoDx
00092                 }
00093                 GLCD_SetPixel(CurrentX,CurrentY, color);// stawiamy nast&#65533;pny krok (zapalamy piksel)
00094             } while (CurrentX != X2); // idziemy tak d&#65533;ugo, a&#65533; osi&#65533;gniemy punkt docelowy
00095         } else { // w przeciwnym razie idziemy "po igrekach"
00096             TwoDyAccumulatedError = 0;
00097             do {
00098                 CurrentY += Yinc;
00099                 TwoDyAccumulatedError += TwoDx;
00100                 if (TwoDyAccumulatedError>Dy) {
00101                     CurrentX += Xinc;
00102                     TwoDyAccumulatedError -= TwoDy;
00103                 }
00104                 GLCD_SetPixel(CurrentX,CurrentY, color);
00105             } while (CurrentY != Y2);
00106         }
00107     }
00108 }