GPS Tracker with a TFT display, GPLV3

Dependencies:   MAX17055 MAX32620FTHR MAX77650 SerialGPS

Committer:
DimiterK
Date:
Sat Aug 18 22:34:58 2018 +0000
Revision:
0:48d0ba737b93
GPS tracker , Hackster Contest, August 2018; Release under GPLv3,

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DimiterK 0:48d0ba737b93 1 #include "LCD_GUI.h"
DimiterK 0:48d0ba737b93 2 #include <stdio.h>
DimiterK 0:48d0ba737b93 3 #include "fonts.h"
DimiterK 0:48d0ba737b93 4 #include "font8.h"
DimiterK 0:48d0ba737b93 5 #include "font12.h"
DimiterK 0:48d0ba737b93 6 #include "font16.h"
DimiterK 0:48d0ba737b93 7 #include "font20.h"
DimiterK 0:48d0ba737b93 8 #include "font24.h"
DimiterK 0:48d0ba737b93 9
DimiterK 0:48d0ba737b93 10 extern LCD_DIS sLCD_DIS;
DimiterK 0:48d0ba737b93 11
DimiterK 0:48d0ba737b93 12 void GUI_Swop(POINT Point1, POINT Point2)
DimiterK 0:48d0ba737b93 13 {
DimiterK 0:48d0ba737b93 14 POINT Temp;
DimiterK 0:48d0ba737b93 15 Temp = Point1;
DimiterK 0:48d0ba737b93 16 Point1 = Point2;
DimiterK 0:48d0ba737b93 17 Point2 = Temp;
DimiterK 0:48d0ba737b93 18 }
DimiterK 0:48d0ba737b93 19
DimiterK 0:48d0ba737b93 20 /********************************************************************************
DimiterK 0:48d0ba737b93 21 function: Draw Point(Xpoint, Ypoint) Fill the color
DimiterK 0:48d0ba737b93 22 parameter:
DimiterK 0:48d0ba737b93 23 Xpoint : The x coordinate of the point
DimiterK 0:48d0ba737b93 24 Ypoint : The y coordinate of the point
DimiterK 0:48d0ba737b93 25 Color : Set color
DimiterK 0:48d0ba737b93 26 Dot_Pixel : point size
DimiterK 0:48d0ba737b93 27 ********************************************************************************/
DimiterK 0:48d0ba737b93 28 void GUI_DrawPoint(POINT Xpoint, POINT Ypoint, COLOR Color,
DimiterK 0:48d0ba737b93 29 DOT_PIXEL Dot_Pixel, DOT_STYLE DOT_STYLE)
DimiterK 0:48d0ba737b93 30 {
DimiterK 0:48d0ba737b93 31 if(Xpoint > sLCD_DIS.LCD_Dis_Column || Ypoint > sLCD_DIS.LCD_Dis_Page) {
DimiterK 0:48d0ba737b93 32 return;
DimiterK 0:48d0ba737b93 33 }
DimiterK 0:48d0ba737b93 34
DimiterK 0:48d0ba737b93 35 uint16_t XDir_Num ,YDir_Num;
DimiterK 0:48d0ba737b93 36 if(DOT_STYLE == DOT_STYLE_DFT) {
DimiterK 0:48d0ba737b93 37 for(XDir_Num = 0; XDir_Num < 2 * Dot_Pixel - 1; XDir_Num++) {
DimiterK 0:48d0ba737b93 38 for(YDir_Num = 0; YDir_Num < 2 * Dot_Pixel - 1; YDir_Num++) {
DimiterK 0:48d0ba737b93 39 LCD_SetPointlColor(Xpoint + XDir_Num - Dot_Pixel, Ypoint + YDir_Num - Dot_Pixel, Color);
DimiterK 0:48d0ba737b93 40 }
DimiterK 0:48d0ba737b93 41 }
DimiterK 0:48d0ba737b93 42 } else {
DimiterK 0:48d0ba737b93 43 for(XDir_Num = 0; XDir_Num < Dot_Pixel; XDir_Num++) {
DimiterK 0:48d0ba737b93 44 for(YDir_Num = 0; YDir_Num < Dot_Pixel; YDir_Num++) {
DimiterK 0:48d0ba737b93 45 LCD_SetPointlColor(Xpoint + XDir_Num - 1 , Ypoint + YDir_Num -1 , Color);
DimiterK 0:48d0ba737b93 46 }
DimiterK 0:48d0ba737b93 47 }
DimiterK 0:48d0ba737b93 48 }
DimiterK 0:48d0ba737b93 49 }
DimiterK 0:48d0ba737b93 50
DimiterK 0:48d0ba737b93 51 /********************************************************************************
DimiterK 0:48d0ba737b93 52 function: Draw a line of arbitrary slope
DimiterK 0:48d0ba737b93 53 parameter:
DimiterK 0:48d0ba737b93 54 Xstart :Starting x point coordinates
DimiterK 0:48d0ba737b93 55 Ystart :Starting x point coordinates
DimiterK 0:48d0ba737b93 56 Xend :End point x coordinate
DimiterK 0:48d0ba737b93 57 Yend :End point y coordinate
DimiterK 0:48d0ba737b93 58 Color :The color of the line segment
DimiterK 0:48d0ba737b93 59 ********************************************************************************/
DimiterK 0:48d0ba737b93 60 void GUI_DrawLine(POINT Xstart, POINT Ystart, POINT Xend, POINT Yend,
DimiterK 0:48d0ba737b93 61 COLOR Color, LINE_STYLE Line_Style, DOT_PIXEL Dot_Pixel)
DimiterK 0:48d0ba737b93 62 {
DimiterK 0:48d0ba737b93 63
DimiterK 0:48d0ba737b93 64 if(Xstart > sLCD_DIS.LCD_Dis_Column || Ystart > sLCD_DIS.LCD_Dis_Page ||
DimiterK 0:48d0ba737b93 65 Xend > sLCD_DIS.LCD_Dis_Column || Yend > sLCD_DIS.LCD_Dis_Page) {
DimiterK 0:48d0ba737b93 66 return;
DimiterK 0:48d0ba737b93 67 }
DimiterK 0:48d0ba737b93 68
DimiterK 0:48d0ba737b93 69 if(Xstart > Xend)
DimiterK 0:48d0ba737b93 70 GUI_Swop(Xstart,Xend);
DimiterK 0:48d0ba737b93 71 if(Ystart > Yend)
DimiterK 0:48d0ba737b93 72 GUI_Swop(Ystart,Yend);
DimiterK 0:48d0ba737b93 73
DimiterK 0:48d0ba737b93 74 POINT Xpoint = Xstart;
DimiterK 0:48d0ba737b93 75 POINT Ypoint = Ystart;
DimiterK 0:48d0ba737b93 76 int32_t dx =(int32_t)Xend -(int32_t)Xstart >= 0 ? Xend - Xstart : Xstart - Xend;
DimiterK 0:48d0ba737b93 77 int32_t dy =(int32_t)Yend -(int32_t)Ystart <= 0 ? Yend - Ystart : Ystart - Yend;
DimiterK 0:48d0ba737b93 78
DimiterK 0:48d0ba737b93 79 // Increment direction, 1 is positive, -1 is counter;
DimiterK 0:48d0ba737b93 80 int32_t XAddway = Xstart < Xend ? 1 : -1;
DimiterK 0:48d0ba737b93 81 int32_t YAddway = Ystart < Yend ? 1 : -1;
DimiterK 0:48d0ba737b93 82
DimiterK 0:48d0ba737b93 83 //Cumulative error
DimiterK 0:48d0ba737b93 84 int32_t Esp = dx + dy;
DimiterK 0:48d0ba737b93 85 int8_t Line_Style_Temp = 0;
DimiterK 0:48d0ba737b93 86
DimiterK 0:48d0ba737b93 87 for(;;) {
DimiterK 0:48d0ba737b93 88 Line_Style_Temp++;
DimiterK 0:48d0ba737b93 89 //Painted dotted line, 2 point is really virtual
DimiterK 0:48d0ba737b93 90 if(Line_Style == LINE_DOTTED && Line_Style_Temp %3 == 0) {
DimiterK 0:48d0ba737b93 91 //printf("LINE_DOTTED\r\n");
DimiterK 0:48d0ba737b93 92 GUI_DrawPoint(Xpoint, Ypoint, GUI_BACKGROUND, Dot_Pixel, DOT_STYLE_DFT);
DimiterK 0:48d0ba737b93 93 Line_Style_Temp = 0;
DimiterK 0:48d0ba737b93 94 } else {
DimiterK 0:48d0ba737b93 95 GUI_DrawPoint(Xpoint, Ypoint, Color, Dot_Pixel, DOT_STYLE_DFT);
DimiterK 0:48d0ba737b93 96 }
DimiterK 0:48d0ba737b93 97 if(2 * Esp >= dy) {
DimiterK 0:48d0ba737b93 98 if(Xpoint == Xend) break;
DimiterK 0:48d0ba737b93 99 Esp += dy;
DimiterK 0:48d0ba737b93 100 Xpoint += XAddway;
DimiterK 0:48d0ba737b93 101 }
DimiterK 0:48d0ba737b93 102 if(2 * Esp <= dx) {
DimiterK 0:48d0ba737b93 103 if(Ypoint == Yend) break;
DimiterK 0:48d0ba737b93 104 Esp += dx;
DimiterK 0:48d0ba737b93 105 Ypoint += YAddway;
DimiterK 0:48d0ba737b93 106 }
DimiterK 0:48d0ba737b93 107 }
DimiterK 0:48d0ba737b93 108 }
DimiterK 0:48d0ba737b93 109
DimiterK 0:48d0ba737b93 110 /********************************************************************************
DimiterK 0:48d0ba737b93 111 function: Draw a rectangle
DimiterK 0:48d0ba737b93 112 parameter:
DimiterK 0:48d0ba737b93 113 Xstart :Rectangular Starting x point coordinates
DimiterK 0:48d0ba737b93 114 Ystart :Rectangular Starting x point coordinates
DimiterK 0:48d0ba737b93 115 Xend :Rectangular End point x coordinate
DimiterK 0:48d0ba737b93 116 Yend :Rectangular End point y coordinate
DimiterK 0:48d0ba737b93 117 Color :The color of the Rectangular segment
DimiterK 0:48d0ba737b93 118 Filled : Whether it is filled--- 1 solid 0:empty
DimiterK 0:48d0ba737b93 119 ********************************************************************************/
DimiterK 0:48d0ba737b93 120 void GUI_DrawRectangle(POINT Xstart, POINT Ystart, POINT Xend, POINT Yend,
DimiterK 0:48d0ba737b93 121 COLOR Color, DRAW_FILL Filled, DOT_PIXEL Dot_Pixel )
DimiterK 0:48d0ba737b93 122 {
DimiterK 0:48d0ba737b93 123 if(Xstart > sLCD_DIS.LCD_Dis_Column || Ystart > sLCD_DIS.LCD_Dis_Page ||
DimiterK 0:48d0ba737b93 124 Xend > sLCD_DIS.LCD_Dis_Column || Yend > sLCD_DIS.LCD_Dis_Page) {
DimiterK 0:48d0ba737b93 125 return;
DimiterK 0:48d0ba737b93 126 }
DimiterK 0:48d0ba737b93 127
DimiterK 0:48d0ba737b93 128 if(Xstart > Xend)
DimiterK 0:48d0ba737b93 129 GUI_Swop(Xstart,Xend);
DimiterK 0:48d0ba737b93 130 if(Ystart > Yend)
DimiterK 0:48d0ba737b93 131 GUI_Swop(Ystart,Yend);
DimiterK 0:48d0ba737b93 132
DimiterK 0:48d0ba737b93 133 POINT Ypoint;
DimiterK 0:48d0ba737b93 134 if(Filled ) {
DimiterK 0:48d0ba737b93 135 for(Ypoint = Ystart; Ypoint < Yend; Ypoint++) {
DimiterK 0:48d0ba737b93 136 GUI_DrawLine(Xstart, Ypoint, Xend, Ypoint, Color , LINE_SOLID, Dot_Pixel);
DimiterK 0:48d0ba737b93 137 }
DimiterK 0:48d0ba737b93 138 } else {
DimiterK 0:48d0ba737b93 139 GUI_DrawLine(Xstart, Ystart, Xend, Ystart, Color , LINE_SOLID, Dot_Pixel);
DimiterK 0:48d0ba737b93 140 GUI_DrawLine(Xstart, Ystart, Xstart, Yend, Color , LINE_SOLID, Dot_Pixel);
DimiterK 0:48d0ba737b93 141 GUI_DrawLine(Xend, Yend, Xend, Ystart, Color , LINE_SOLID, Dot_Pixel);
DimiterK 0:48d0ba737b93 142 GUI_DrawLine(Xend, Yend, Xstart, Yend, Color , LINE_SOLID, Dot_Pixel);
DimiterK 0:48d0ba737b93 143 }
DimiterK 0:48d0ba737b93 144 }
DimiterK 0:48d0ba737b93 145
DimiterK 0:48d0ba737b93 146 /********************************************************************************
DimiterK 0:48d0ba737b93 147 function: Use the 8-point method to draw a circle of the
DimiterK 0:48d0ba737b93 148 specified size at the specified position.
DimiterK 0:48d0ba737b93 149 parameter:
DimiterK 0:48d0ba737b93 150 X_Center :Center X coordinate
DimiterK 0:48d0ba737b93 151 Y_Center :Center Y coordinate
DimiterK 0:48d0ba737b93 152 Radius :circle Radius
DimiterK 0:48d0ba737b93 153 Color :The color of the :circle segment
DimiterK 0:48d0ba737b93 154 Filled : Whether it is filled: 1 filling 0:Do not
DimiterK 0:48d0ba737b93 155 ********************************************************************************/
DimiterK 0:48d0ba737b93 156 void GUI_DrawCircle(POINT X_Center, POINT Y_Center, LENGTH Radius,
DimiterK 0:48d0ba737b93 157 COLOR Color, DRAW_FILL Draw_Fill , DOT_PIXEL Dot_Pixel)
DimiterK 0:48d0ba737b93 158 {
DimiterK 0:48d0ba737b93 159 if(X_Center > sLCD_DIS.LCD_Dis_Column || Y_Center >= sLCD_DIS.LCD_Dis_Page) {
DimiterK 0:48d0ba737b93 160 return;
DimiterK 0:48d0ba737b93 161 }
DimiterK 0:48d0ba737b93 162
DimiterK 0:48d0ba737b93 163 //Draw a circle from(0, R) as a starting point
DimiterK 0:48d0ba737b93 164 int16_t XCurrent, YCurrent;
DimiterK 0:48d0ba737b93 165 XCurrent = 0;
DimiterK 0:48d0ba737b93 166 YCurrent = Radius;
DimiterK 0:48d0ba737b93 167
DimiterK 0:48d0ba737b93 168 //Cumulative error,judge the next point of the logo
DimiterK 0:48d0ba737b93 169 int16_t Esp = 3 -(Radius << 1 );
DimiterK 0:48d0ba737b93 170
DimiterK 0:48d0ba737b93 171 int16_t sCountY;
DimiterK 0:48d0ba737b93 172 if(Draw_Fill == DRAW_FULL) {
DimiterK 0:48d0ba737b93 173 while(XCurrent <= YCurrent ) { //Realistic circles
DimiterK 0:48d0ba737b93 174 for(sCountY = XCurrent; sCountY <= YCurrent; sCountY ++ ) {
DimiterK 0:48d0ba737b93 175 GUI_DrawPoint(X_Center + XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT ); //1
DimiterK 0:48d0ba737b93 176 GUI_DrawPoint(X_Center - XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT ); //2
DimiterK 0:48d0ba737b93 177 GUI_DrawPoint(X_Center - sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT ); //3
DimiterK 0:48d0ba737b93 178 GUI_DrawPoint(X_Center - sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT ); //4
DimiterK 0:48d0ba737b93 179 GUI_DrawPoint(X_Center - XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT ); //5
DimiterK 0:48d0ba737b93 180 GUI_DrawPoint(X_Center + XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT ); //6
DimiterK 0:48d0ba737b93 181 GUI_DrawPoint(X_Center + sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT ); //7
DimiterK 0:48d0ba737b93 182 GUI_DrawPoint(X_Center + sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT );
DimiterK 0:48d0ba737b93 183 }
DimiterK 0:48d0ba737b93 184 if(Esp < 0 )
DimiterK 0:48d0ba737b93 185 Esp += 4 * XCurrent + 6;
DimiterK 0:48d0ba737b93 186 else {
DimiterK 0:48d0ba737b93 187 Esp += 10 + 4 *(XCurrent - YCurrent );
DimiterK 0:48d0ba737b93 188 YCurrent --;
DimiterK 0:48d0ba737b93 189 }
DimiterK 0:48d0ba737b93 190 XCurrent ++;
DimiterK 0:48d0ba737b93 191 }
DimiterK 0:48d0ba737b93 192 } else { //Draw a hollow circle
DimiterK 0:48d0ba737b93 193 while(XCurrent <= YCurrent ) {
DimiterK 0:48d0ba737b93 194 GUI_DrawPoint(X_Center + XCurrent, Y_Center + YCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //1
DimiterK 0:48d0ba737b93 195 GUI_DrawPoint(X_Center - XCurrent, Y_Center + YCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //2
DimiterK 0:48d0ba737b93 196 GUI_DrawPoint(X_Center - YCurrent, Y_Center + XCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //3
DimiterK 0:48d0ba737b93 197 GUI_DrawPoint(X_Center - YCurrent, Y_Center - XCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //4
DimiterK 0:48d0ba737b93 198 GUI_DrawPoint(X_Center - XCurrent, Y_Center - YCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //5
DimiterK 0:48d0ba737b93 199 GUI_DrawPoint(X_Center + XCurrent, Y_Center - YCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //6
DimiterK 0:48d0ba737b93 200 GUI_DrawPoint(X_Center + YCurrent, Y_Center - XCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //7
DimiterK 0:48d0ba737b93 201 GUI_DrawPoint(X_Center + YCurrent, Y_Center + XCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //0
DimiterK 0:48d0ba737b93 202
DimiterK 0:48d0ba737b93 203 if(Esp < 0 )
DimiterK 0:48d0ba737b93 204 Esp += 4 * XCurrent + 6;
DimiterK 0:48d0ba737b93 205 else {
DimiterK 0:48d0ba737b93 206 Esp += 10 + 4 *(XCurrent - YCurrent );
DimiterK 0:48d0ba737b93 207 YCurrent --;
DimiterK 0:48d0ba737b93 208 }
DimiterK 0:48d0ba737b93 209 XCurrent ++;
DimiterK 0:48d0ba737b93 210 }
DimiterK 0:48d0ba737b93 211 }
DimiterK 0:48d0ba737b93 212 }
DimiterK 0:48d0ba737b93 213
DimiterK 0:48d0ba737b93 214 /********************************************************************************
DimiterK 0:48d0ba737b93 215 function: Show English characters
DimiterK 0:48d0ba737b93 216 parameter:
DimiterK 0:48d0ba737b93 217 Xpoint :X coordinate
DimiterK 0:48d0ba737b93 218 Ypoint :Y coordinate
DimiterK 0:48d0ba737b93 219 Acsii_Char :To display the English characters
DimiterK 0:48d0ba737b93 220 Font :A structure pointer that displays a character size
DimiterK 0:48d0ba737b93 221 Color_Background : Select the background color of the English character
DimiterK 0:48d0ba737b93 222 Color_Foreground : Select the foreground color of the English character
DimiterK 0:48d0ba737b93 223 ********************************************************************************/
DimiterK 0:48d0ba737b93 224 void GUI_DisChar(POINT Xpoint, POINT Ypoint, const char Acsii_Char,
DimiterK 0:48d0ba737b93 225 sFONT* Font, COLOR Color_Background, COLOR Color_Foreground)
DimiterK 0:48d0ba737b93 226 {
DimiterK 0:48d0ba737b93 227 POINT Page, Column;
DimiterK 0:48d0ba737b93 228
DimiterK 0:48d0ba737b93 229 if(Xpoint >= sLCD_DIS.LCD_Dis_Column || Ypoint >= sLCD_DIS.LCD_Dis_Page) {
DimiterK 0:48d0ba737b93 230 return;
DimiterK 0:48d0ba737b93 231 }
DimiterK 0:48d0ba737b93 232
DimiterK 0:48d0ba737b93 233 uint32_t Char_Offset =(Acsii_Char - ' ') * Font->Height *(Font->Width / 8 +(Font->Width % 8 ? 1 : 0));
DimiterK 0:48d0ba737b93 234 const unsigned char *ptr = &Font->table[Char_Offset];
DimiterK 0:48d0ba737b93 235
DimiterK 0:48d0ba737b93 236 for(Page = 0; Page < Font->Height; Page ++ ) {
DimiterK 0:48d0ba737b93 237 for(Column = 0; Column < Font->Width; Column ++ ) {
DimiterK 0:48d0ba737b93 238
DimiterK 0:48d0ba737b93 239 //To determine whether the font background color and screen background color is consistent
DimiterK 0:48d0ba737b93 240 if(FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan
DimiterK 0:48d0ba737b93 241 if(*ptr &(0x80 >>(Column % 8)))
DimiterK 0:48d0ba737b93 242 GUI_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT);
DimiterK 0:48d0ba737b93 243 } else {
DimiterK 0:48d0ba737b93 244 if(*ptr &(0x80 >>(Column % 8))) {
DimiterK 0:48d0ba737b93 245 GUI_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT);
DimiterK 0:48d0ba737b93 246 } else {
DimiterK 0:48d0ba737b93 247 GUI_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT);
DimiterK 0:48d0ba737b93 248 }
DimiterK 0:48d0ba737b93 249 }
DimiterK 0:48d0ba737b93 250 //One pixel is 8 bits
DimiterK 0:48d0ba737b93 251 if(Column % 8 == 7)
DimiterK 0:48d0ba737b93 252 ptr++;
DimiterK 0:48d0ba737b93 253 }/* Write a line */
DimiterK 0:48d0ba737b93 254 if(Font->Width % 8 != 0)
DimiterK 0:48d0ba737b93 255 ptr++;
DimiterK 0:48d0ba737b93 256 }/* Write all */
DimiterK 0:48d0ba737b93 257 }
DimiterK 0:48d0ba737b93 258
DimiterK 0:48d0ba737b93 259 /********************************************************************************
DimiterK 0:48d0ba737b93 260 function: Display the string
DimiterK 0:48d0ba737b93 261 parameter:
DimiterK 0:48d0ba737b93 262 Xstart :X coordinate
DimiterK 0:48d0ba737b93 263 Ystart :Y coordinate
DimiterK 0:48d0ba737b93 264 pString :The first address of the English string to be displayed
DimiterK 0:48d0ba737b93 265 Font :A structure pointer that displays a character size
DimiterK 0:48d0ba737b93 266 Color_Background : Select the background color of the English character
DimiterK 0:48d0ba737b93 267 Color_Foreground : Select the foreground color of the English character
DimiterK 0:48d0ba737b93 268 ********************************************************************************/
DimiterK 0:48d0ba737b93 269 void GUI_DisString_EN(POINT Xstart, POINT Ystart, const char * pString,
DimiterK 0:48d0ba737b93 270 sFONT* Font,COLOR Color_Background, COLOR Color_Foreground )
DimiterK 0:48d0ba737b93 271 {
DimiterK 0:48d0ba737b93 272 POINT Xpoint = Xstart;
DimiterK 0:48d0ba737b93 273 POINT Ypoint = Ystart;
DimiterK 0:48d0ba737b93 274
DimiterK 0:48d0ba737b93 275 if(Xstart >= sLCD_DIS.LCD_Dis_Column || Ystart >= sLCD_DIS.LCD_Dis_Page) {
DimiterK 0:48d0ba737b93 276 return;
DimiterK 0:48d0ba737b93 277 }
DimiterK 0:48d0ba737b93 278
DimiterK 0:48d0ba737b93 279 while(* pString != '\0') {
DimiterK 0:48d0ba737b93 280 //if X direction filled , reposition to(Xstart,Ypoint),Ypoint is Y direction plus the height of the character
DimiterK 0:48d0ba737b93 281 if((Xpoint + Font->Width ) > sLCD_DIS.LCD_Dis_Column ) {
DimiterK 0:48d0ba737b93 282 Xpoint = Xstart;
DimiterK 0:48d0ba737b93 283 Ypoint += Font->Height;
DimiterK 0:48d0ba737b93 284 }
DimiterK 0:48d0ba737b93 285
DimiterK 0:48d0ba737b93 286 // If the Y direction is full, reposition to(Xstart, Ystart)
DimiterK 0:48d0ba737b93 287 if((Ypoint + Font->Height ) > sLCD_DIS.LCD_Dis_Page ) {
DimiterK 0:48d0ba737b93 288 Xpoint = Xstart;
DimiterK 0:48d0ba737b93 289 Ypoint = Ystart;
DimiterK 0:48d0ba737b93 290 }
DimiterK 0:48d0ba737b93 291 GUI_DisChar(Xpoint, Ypoint, * pString, Font, Color_Background, Color_Foreground);
DimiterK 0:48d0ba737b93 292
DimiterK 0:48d0ba737b93 293 //The next character of the address
DimiterK 0:48d0ba737b93 294 pString ++;
DimiterK 0:48d0ba737b93 295
DimiterK 0:48d0ba737b93 296 //The next word of the abscissa increases the font of the broadband
DimiterK 0:48d0ba737b93 297 Xpoint += Font->Width + 1;
DimiterK 0:48d0ba737b93 298 }
DimiterK 0:48d0ba737b93 299 }
DimiterK 0:48d0ba737b93 300
DimiterK 0:48d0ba737b93 301 /****************************************WHITE****************************************
DimiterK 0:48d0ba737b93 302 function: Display the string
DimiterK 0:48d0ba737b93 303 parameter:
DimiterK 0:48d0ba737b93 304 Xstart :X coordinate
DimiterK 0:48d0ba737b93 305 Ystart : Y coordinate
DimiterK 0:48d0ba737b93 306 Nummber: The number displayed
DimiterK 0:48d0ba737b93 307 Font :A structure pointer that displays a character size
DimiterK 0:48d0ba737b93 308 Color_Background : Select the background color of the English character
DimiterK 0:48d0ba737b93 309 Color_Foreground : Select the foreground color of the English character
DimiterK 0:48d0ba737b93 310 ********************************************************************************/
DimiterK 0:48d0ba737b93 311 #define ARRAY_LEN 255
DimiterK 0:48d0ba737b93 312 void GUI_DisNum(POINT Xpoint, POINT Ypoint, int32_t Nummber,
DimiterK 0:48d0ba737b93 313 sFONT* Font,COLOR Color_Background, COLOR Color_Foreground )
DimiterK 0:48d0ba737b93 314 {
DimiterK 0:48d0ba737b93 315
DimiterK 0:48d0ba737b93 316 int16_t Num_Bit = 0, Str_Bit = 0;
DimiterK 0:48d0ba737b93 317 uint8_t Str_Array[ARRAY_LEN] = {0},Num_Array[ARRAY_LEN] = {0};
DimiterK 0:48d0ba737b93 318 uint8_t *pStr = Str_Array;
DimiterK 0:48d0ba737b93 319
DimiterK 0:48d0ba737b93 320 if(Xpoint >= sLCD_DIS.LCD_Dis_Column || Ypoint >= sLCD_DIS.LCD_Dis_Page) {
DimiterK 0:48d0ba737b93 321 return;
DimiterK 0:48d0ba737b93 322 }
DimiterK 0:48d0ba737b93 323
DimiterK 0:48d0ba737b93 324 //Converts a number to a string
DimiterK 0:48d0ba737b93 325 while(Nummber) {
DimiterK 0:48d0ba737b93 326 Num_Array[Num_Bit] = Nummber % 10 + '0';
DimiterK 0:48d0ba737b93 327 Num_Bit++;
DimiterK 0:48d0ba737b93 328 Nummber /= 10;
DimiterK 0:48d0ba737b93 329 }
DimiterK 0:48d0ba737b93 330
DimiterK 0:48d0ba737b93 331 //The string is inverted
DimiterK 0:48d0ba737b93 332 while(Num_Bit > 0) {
DimiterK 0:48d0ba737b93 333 Str_Array[Str_Bit] = Num_Array[Num_Bit -1];
DimiterK 0:48d0ba737b93 334 Str_Bit ++;
DimiterK 0:48d0ba737b93 335 Num_Bit --;
DimiterK 0:48d0ba737b93 336 }
DimiterK 0:48d0ba737b93 337
DimiterK 0:48d0ba737b93 338 //show
DimiterK 0:48d0ba737b93 339 GUI_DisString_EN(Xpoint, Ypoint, (const char*)pStr, Font, Color_Background, Color_Foreground );
DimiterK 0:48d0ba737b93 340 }
DimiterK 0:48d0ba737b93 341
DimiterK 0:48d0ba737b93 342 void GUI_Disbitmap(POINT Xpoint, POINT Ypoint, const unsigned char *pBmp,
DimiterK 0:48d0ba737b93 343 POINT Width, POINT Height)
DimiterK 0:48d0ba737b93 344 {
DimiterK 0:48d0ba737b93 345 POINT i, j, byteWidth = (Width + 7)/8;
DimiterK 0:48d0ba737b93 346 for(j = 0; j < Height; j++) {
DimiterK 0:48d0ba737b93 347 for(i = 0; i <Width; i ++) {
DimiterK 0:48d0ba737b93 348 if(*(pBmp + j*byteWidth + i/8) & (128 >> (i & 7))) {
DimiterK 0:48d0ba737b93 349 GUI_DrawPoint(Xpoint+i, Ypoint+j, WHITE, DOT_PIXEL_DFT, DOT_STYLE_DFT);
DimiterK 0:48d0ba737b93 350 }
DimiterK 0:48d0ba737b93 351 }
DimiterK 0:48d0ba737b93 352 }
DimiterK 0:48d0ba737b93 353 }
DimiterK 0:48d0ba737b93 354
DimiterK 0:48d0ba737b93 355 /**
DimiterK 0:48d0ba737b93 356 * @brief This function paints an image with a specific heigh and width on the display at a specific coordinate.
DimiterK 0:48d0ba737b93 357 * @param picture[] Integer array containg picture image in rgb565 format
DimiterK 0:48d0ba737b93 358 * @param width Image width
DimiterK 0:48d0ba737b93 359 * @param height Image height
DimiterK 0:48d0ba737b93 360 * @param x X coordinates of image
DimiterK 0:48d0ba737b93 361 * @param y Y coordinates of image
DimiterK 0:48d0ba737b93 362 * @return none
DimiterK 0:48d0ba737b93 363 */
DimiterK 0:48d0ba737b93 364 void GUI_DisplayImage(POINT Xpoint, POINT Ypoint,COLOR picture[],POINT Width, POINT Height)
DimiterK 0:48d0ba737b93 365 {
DimiterK 0:48d0ba737b93 366 unsigned int i,j,k;
DimiterK 0:48d0ba737b93 367 k=0;
DimiterK 0:48d0ba737b93 368 for(i=0;i<Width;i++)
DimiterK 0:48d0ba737b93 369 {
DimiterK 0:48d0ba737b93 370 for(j=0;j<Height;j++)
DimiterK 0:48d0ba737b93 371 {
DimiterK 0:48d0ba737b93 372 GUI_DrawPoint(Xpoint+i, Ypoint+j, picture[k], DOT_PIXEL_DFT, DOT_STYLE_DFT);
DimiterK 0:48d0ba737b93 373 k++;
DimiterK 0:48d0ba737b93 374 }
DimiterK 0:48d0ba737b93 375 }
DimiterK 0:48d0ba737b93 376 }
DimiterK 0:48d0ba737b93 377
DimiterK 0:48d0ba737b93 378 /********************************************************************************
DimiterK 0:48d0ba737b93 379 function: LCD_Show
DimiterK 0:48d0ba737b93 380 parameter:
DimiterK 0:48d0ba737b93 381 ********************************************************************************/
DimiterK 0:48d0ba737b93 382 void GUI_Show(void)
DimiterK 0:48d0ba737b93 383 {
DimiterK 0:48d0ba737b93 384 LCD_Clear(GUI_BACKGROUND);
DimiterK 0:48d0ba737b93 385
DimiterK 0:48d0ba737b93 386 printf("GUI Draw Line \r\n");
DimiterK 0:48d0ba737b93 387 GUI_DrawLine(0, 10, sLCD_DIS.LCD_Dis_Column, 10, RED,LINE_SOLID, DOT_PIXEL_2X2);
DimiterK 0:48d0ba737b93 388 //GUI_DrawLine(0, sLCD_DIS.LCD_Dis_Page - 10, sLCD_DIS.LCD_Dis_Column, sLCD_DIS.LCD_Dis_Page - 10, RED,LINE_SOLID, DOT_PIXEL_2X2);
DimiterK 0:48d0ba737b93 389 GUI_DrawLine(0, 20, sLCD_DIS.LCD_Dis_Column, 20, RED,LINE_DOTTED, DOT_PIXEL_DFT);
DimiterK 0:48d0ba737b93 390 //GUI_DrawLine(0, sLCD_DIS.LCD_Dis_Page - 20, sLCD_DIS.LCD_Dis_Column, sLCD_DIS.LCD_Dis_Page - 20, RED,LINE_DOTTED, DOT_PIXEL_DFT);
DimiterK 0:48d0ba737b93 391
DimiterK 0:48d0ba737b93 392 printf("GUI Draw Rectangle \r\n");
DimiterK 0:48d0ba737b93 393 GUI_DrawRectangle(0,0,160,9,BLUE, DRAW_FULL, DOT_PIXEL_1X1);
DimiterK 0:48d0ba737b93 394 //GUI_DrawRectangle(1,1,128,128,RED,DRAW_EMPTY,DOT_PIXEL_2X2);
DimiterK 0:48d0ba737b93 395
DimiterK 0:48d0ba737b93 396 printf("GUI Draw Olympic Rings\r\n");
DimiterK 0:48d0ba737b93 397 uint16_t Cx1 = 40, Cy1 = 85, Cr = 12;
DimiterK 0:48d0ba737b93 398 uint16_t Cx2 = Cx1 + (2.5 * Cr), Cy2 = Cy1;
DimiterK 0:48d0ba737b93 399 uint16_t Cx3 = Cx1 + (5 * Cr), Cy3 = Cy1;
DimiterK 0:48d0ba737b93 400 uint16_t Cx4 = ( Cx1 + Cx2 )/2, Cy4 = Cy1 + Cr;
DimiterK 0:48d0ba737b93 401 uint16_t Cx5 = ( Cx2 + Cx3 )/2, Cy5 = Cy1 + Cr;
DimiterK 0:48d0ba737b93 402
DimiterK 0:48d0ba737b93 403 GUI_DrawCircle( Cx1, Cy1, Cr, BLUE, DRAW_EMPTY, DOT_PIXEL_DFT);
DimiterK 0:48d0ba737b93 404 GUI_DrawCircle( Cx2, Cy2, Cr, BLACK, DRAW_EMPTY, DOT_PIXEL_DFT);
DimiterK 0:48d0ba737b93 405 GUI_DrawCircle( Cx3, Cy3, Cr, RED, DRAW_EMPTY, DOT_PIXEL_DFT);
DimiterK 0:48d0ba737b93 406 GUI_DrawCircle( Cx4, Cy4, Cr, YELLOW, DRAW_EMPTY, DOT_PIXEL_DFT);
DimiterK 0:48d0ba737b93 407 GUI_DrawCircle( Cx5, Cy5, Cr, GREEN, DRAW_EMPTY, DOT_PIXEL_DFT);
DimiterK 0:48d0ba737b93 408
DimiterK 0:48d0ba737b93 409 printf("GUI Draw Realistic circles\r\n");
DimiterK 0:48d0ba737b93 410 GUI_DrawCircle(15, 110, 10, BRRED, DRAW_FULL, DOT_PIXEL_DFT);
DimiterK 0:48d0ba737b93 411 GUI_DrawCircle(sLCD_DIS.LCD_Dis_Column - 15, 110, 10, BRRED, DRAW_FULL, DOT_PIXEL_DFT);
DimiterK 0:48d0ba737b93 412
DimiterK 0:48d0ba737b93 413 printf("GUI Display String \r\n");
DimiterK 0:48d0ba737b93 414 GUI_DisString_EN(35,20,"ZYNQ",&Font12,GUI_BACKGROUND,BLUE);
DimiterK 0:48d0ba737b93 415 GUI_DisString_EN(32,33,"ST7735",&Font12,GUI_BACKGROUND,BLUE);
DimiterK 0:48d0ba737b93 416 GUI_DisString_EN(28,45,"1.44inch TFTLCD",&Font8,RED,GRED);
DimiterK 0:48d0ba737b93 417
DimiterK 0:48d0ba737b93 418 printf("GUI Display Nummber \r\n");
DimiterK 0:48d0ba737b93 419 GUI_DisNum(28,55,1234567890,&Font20,GUI_BACKGROUND,BLUE);
DimiterK 0:48d0ba737b93 420 }
DimiterK 0:48d0ba737b93 421
DimiterK 0:48d0ba737b93 422