GPS Tracker with a TFT display, GPLV3
Dependencies: MAX17055 MAX32620FTHR MAX77650 SerialGPS
LCD_GUI.cpp@0:48d0ba737b93, 2018-08-18 (annotated)
- 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?
User | Revision | Line number | New 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 |