Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
lcd.c
00001 #include <stdarg.h> 00002 #include "lcd.h" 00003 00004 void lcd_init(lcd_t * lcd, spi_t * spi, PinName CS, PinName CD) { 00005 //Prepare pins 00006 gpio_init_out(&(lcd->CS), CS ); 00007 gpio_init_out(&(lcd->CD), CD); 00008 00009 gpio_write(&(lcd->CS), 1); 00010 gpio_write(&(lcd->CD), 1); 00011 // 00012 00013 lcd->mode = PORTRAIT; 00014 //lcd->mode = LANDSCAPE; 00015 lcd->spi = spi; 00016 00017 wait_ms(500); 00018 lcd_writeCommand(lcd, 0x01); 00019 wait_ms(200); 00020 00021 00022 lcd_writeCommand(lcd, 0xCF); 00023 lcd_writeData(lcd, 0x00); 00024 lcd_writeData(lcd, 0x8B); 00025 lcd_writeData(lcd, 0x30); 00026 00027 lcd_writeCommand(lcd, 0xED); 00028 lcd_writeData(lcd, 0x67); 00029 lcd_writeData(lcd, 0x03); 00030 lcd_writeData(lcd, 0x12); 00031 lcd_writeData(lcd, 0x81); 00032 00033 lcd_writeCommand(lcd, 0xE8); 00034 lcd_writeData(lcd, 0x85); 00035 lcd_writeData(lcd, 0x10); 00036 lcd_writeData(lcd, 0x7A); 00037 00038 lcd_writeCommand(lcd, 0xCB); 00039 lcd_writeData(lcd, 0x39); 00040 lcd_writeData(lcd, 0x2C); 00041 lcd_writeData(lcd, 0x00); 00042 lcd_writeData(lcd, 0x34); 00043 lcd_writeData(lcd, 0x02); 00044 00045 lcd_writeCommand(lcd, 0xF7); 00046 lcd_writeData(lcd, 0x20); 00047 00048 lcd_writeCommand(lcd, 0xEA); 00049 lcd_writeData(lcd, 0x00); 00050 lcd_writeData(lcd, 0x00); 00051 00052 lcd_writeCommand(lcd, 0xC0); /* Power control */ 00053 lcd_writeData(lcd, 0x1B); /* VRH[5:0] */ 00054 00055 lcd_writeCommand(lcd, 0xC1); /* Power control */ 00056 lcd_writeData(lcd, 0x10); /* SAP[2:0];BT[3:0] */ 00057 00058 lcd_writeCommand(lcd, 0xC5); /* VCM control */ 00059 lcd_writeData(lcd, 0x3F); 00060 lcd_writeData(lcd, 0x3C); 00061 00062 lcd_writeCommand(lcd, 0xC7); /* VCM control2 */ 00063 lcd_writeData(lcd, 0xB7); 00064 00065 lcd_writeCommand(lcd, 0x36); /* Memory Access Control */ 00066 lcd_writeData(lcd, 0x08); 00067 00068 lcd_writeCommand(lcd, 0x3A); 00069 lcd_writeData(lcd, 0x55); 00070 00071 lcd_writeCommand(lcd, 0xB1); 00072 lcd_writeData(lcd, 0x00); 00073 lcd_writeData(lcd, 0x1B); 00074 00075 lcd_writeCommand(lcd, 0xB6); /* Display Function Control */ 00076 lcd_writeData(lcd, 0x0A); 00077 lcd_writeData(lcd, 0xA2); 00078 00079 lcd_writeCommand(lcd, 0xF2); /* 3Gamma Function Disable */ 00080 lcd_writeData(lcd, 0x00); 00081 00082 lcd_writeCommand(lcd, 0x26); /* Gamma curve selected */ 00083 lcd_writeData(lcd, 0x01); 00084 00085 lcd_writeCommand(lcd, 0xE0); /* Set Gamma */ 00086 lcd_writeData(lcd, 0x0F); 00087 lcd_writeData(lcd, 0x2A); 00088 lcd_writeData(lcd, 0x28); 00089 lcd_writeData(lcd, 0x08); 00090 lcd_writeData(lcd, 0x0E); 00091 lcd_writeData(lcd, 0x08); 00092 lcd_writeData(lcd, 0x54); 00093 lcd_writeData(lcd, 0xA9); 00094 lcd_writeData(lcd, 0x43); 00095 lcd_writeData(lcd, 0x0A); 00096 lcd_writeData(lcd, 0x0F); 00097 lcd_writeData(lcd, 0x00); 00098 lcd_writeData(lcd, 0x00); 00099 lcd_writeData(lcd, 0x00); 00100 lcd_writeData(lcd, 0x00); 00101 00102 lcd_writeCommand(lcd, 0xE1); /* Set Gamma */ 00103 lcd_writeData(lcd, 0x00); 00104 lcd_writeData(lcd, 0x15); 00105 lcd_writeData(lcd, 0x17); 00106 lcd_writeData(lcd, 0x07); 00107 lcd_writeData(lcd, 0x11); 00108 lcd_writeData(lcd, 0x06); 00109 lcd_writeData(lcd, 0x2B); 00110 lcd_writeData(lcd, 0x56); 00111 lcd_writeData(lcd, 0x3C); 00112 lcd_writeData(lcd, 0x05); 00113 lcd_writeData(lcd, 0x10); 00114 lcd_writeData(lcd, 0x0F); 00115 lcd_writeData(lcd, 0x3F); 00116 lcd_writeData(lcd, 0x3F); 00117 lcd_writeData(lcd, 0x0F); 00118 00119 lcd_writeCommand(lcd, 0x11); /* Exit Sleep */ 00120 wait_ms(120); 00121 lcd_writeCommand(lcd, 0x29); 00122 lcd_fillScreen(lcd); 00123 } 00124 00125 void lcd_cs(lcd_t * lcd, int value) { 00126 while(spi_busy(lcd->spi)); 00127 gpio_write(&(lcd->CS), value); 00128 } 00129 00130 void lcd_cd(lcd_t * lcd, int value) { 00131 while(spi_busy(lcd->spi)); 00132 gpio_write(&(lcd->CD), value); 00133 } 00134 00135 void lcd_setMode(lcd_t * lcd, lcd_mode mode) { 00136 lcd->mode = mode; 00137 } 00138 00139 void lcd_writeCommand(lcd_t * lcd, int value) { 00140 lcd_cd(lcd, 0); 00141 lcd_cs(lcd, 0); 00142 00143 spi_master_write(lcd->spi, value); 00144 00145 lcd_cs(lcd, 1); 00146 } 00147 00148 void lcd_writeData(lcd_t * lcd, int value) { 00149 lcd_cd(lcd, 1); 00150 lcd_cs(lcd, 0); 00151 00152 spi_master_write(lcd->spi, value); 00153 00154 lcd_cs(lcd, 1); 00155 } 00156 00157 void lcd_writeData16(lcd_t * lcd, int value) { 00158 int data1 = value >> 8; 00159 int data2 = value & 0xff; 00160 lcd_cd(lcd, 1); 00161 lcd_cs(lcd, 0); 00162 00163 spi_master_write(lcd->spi, data1); 00164 spi_master_write(lcd->spi, data2); 00165 00166 lcd_cs(lcd, 1); 00167 } 00168 00169 void lcd_setColumn(lcd_t * lcd, int start, int end) { 00170 lcd_writeCommand(lcd, 0x2A); /* column command address */ 00171 lcd_writeData16(lcd, start); 00172 lcd_writeData16(lcd, end); 00173 } 00174 00175 void lcd_setPage(lcd_t * lcd, int start, int end) { 00176 lcd_writeCommand(lcd, 0x2B); /* column command address */ 00177 lcd_writeData16(lcd, start); 00178 lcd_writeData16(lcd, end); 00179 } 00180 00181 void lcd_setXY(lcd_t * lcd, int x, int y) { 00182 lcd_setColumn(lcd, x, x); 00183 lcd_setPage(lcd, y, y); 00184 lcd_writeCommand(lcd, 0x2c); 00185 } 00186 00187 void lcd_setPixel(lcd_t * lcd, int x, int y, int color) { 00188 lcd_setXY(lcd, x, y); 00189 lcd_writeData16(lcd, color); 00190 } 00191 00192 void lcd_setLandscape(lcd_t * lcd) { 00193 lcd->mode = LANDSCAPE; 00194 } 00195 00196 void lcd_setPortrait(lcd_t * lcd) { 00197 lcd->mode = PORTRAIT; 00198 } 00199 00200 void lcd_fillScreen(lcd_t * lcd) { 00201 lcd_setColumn(lcd, 0, 239); 00202 lcd_setPage(lcd, 0, 319); 00203 lcd_writeCommand(lcd, 0x2c); /* start to write to display ram */ 00204 00205 lcd_cd(lcd, 1); 00206 lcd_cs(lcd, 0); 00207 for(int i = 0; i < 76800; i++) 00208 { 00209 spi_master_write(lcd->spi, 0xFF); 00210 spi_master_write(lcd->spi, 0xFF); 00211 } 00212 while(spi_busy(lcd->spi)); 00213 lcd_cs(lcd, 1); 00214 } 00215 00216 void lcd_drawLine(lcd_t * lcd, int x0, int y0, int x1, int y1, int color) { 00217 if (x0 == x1) { 00218 lcd_drawVerticalLine(lcd, x0, y0, y1-y0, color); 00219 }else if (y0 == y1) { 00220 lcd_drawHorizontalLine(lcd, x0, y0, x1-x0, color); 00221 }else { 00222 if(lcd->mode == LANDSCAPE) { 00223 y0 = y0^x0; 00224 x0 = y0^x0; 00225 y0 = y0^x0; 00226 00227 y1 = y1^x1; 00228 x1 = y1^x1; 00229 y1 = y1^x1; 00230 00231 x0 = 239-(x0); 00232 x1 = 239-(x1); 00233 } 00234 int x = x1-x0; 00235 int y = y1-y0; 00236 int dx = abs(x), sx = x0 < x1 ? 1 : -1; 00237 int dy = -abs(y), sy = y0 < y1 ? 1 : -1; 00238 int err = dx + dy, e2; /* error value e_xy */ 00239 00240 lcd_setPixel(lcd, x0, y0, color); 00241 00242 do 00243 { 00244 e2 = 2*err; 00245 00246 if (e2 >= dy) { /* e_xy+e_x > 0 */ 00247 err += dy; x0 += sx; 00248 } 00249 00250 if (e2 <= dx) { /* e_xy+e_y < 0 */ 00251 err += dx; y0 += sy; 00252 } 00253 00254 lcd_setPixel(lcd, x0, y0, color); 00255 } while (x0 != x1 || y0 != y1); 00256 } 00257 } 00258 00259 void lcd_drawVerticalLine(lcd_t * lcd, int x, int y, int length, int color) { 00260 if(lcd->mode == LANDSCAPE) { 00261 y = y^x; 00262 x = y^x; 00263 y = y^x; 00264 x = 239-(x); 00265 } 00266 00267 lcd_setColumn(lcd, x, x); 00268 lcd_setPage(lcd, y, y + length); 00269 00270 lcd_writeCommand(lcd, 0x2c); 00271 for(int i=0; i<length; i++) 00272 lcd_writeData16(lcd, color); 00273 } 00274 00275 void lcd_drawHorizontalLine(lcd_t * lcd, int x, int y, int length, int color) { 00276 if(lcd->mode == LANDSCAPE) { 00277 y = y^x; 00278 x = y^x; 00279 y = y^x; 00280 x = 239-x; 00281 lcd_setColumn(lcd, x - length, x); 00282 }else { 00283 lcd_setColumn(lcd, x, x + length); 00284 } 00285 00286 lcd_setPage(lcd, y, y); 00287 00288 lcd_writeCommand(lcd, 0x2c); 00289 for(int i=0; i<length; i++) 00290 lcd_writeData16(lcd, color); 00291 } 00292 00293 void lcd_drawRectangle(lcd_t * lcd , int x0, int y0, int x1, int y1, int color) { 00294 if(x0>x1) { 00295 x0=x0^x1; 00296 x1=x0^x1; 00297 x0=x0^x1; 00298 } 00299 00300 if(y0>y1) { 00301 y0=y0^y1; 00302 y1=y0^y1; 00303 y0=y0^y1; 00304 } 00305 00306 lcd_drawVerticalLine(lcd, x0, y0, y1-y0, color); 00307 lcd_drawVerticalLine(lcd, x0, y1, y1-y0, color); 00308 lcd_drawHorizontalLine(lcd, x0, y0, x1-x0, color); 00309 lcd_drawHorizontalLine(lcd, x1, y0, x1-x0, color); 00310 } 00311 00312 void lcd_fillRectangle(lcd_t * lcd, int x0, int y0, int length, int width, int color) { 00313 int XY=0; 00314 00315 int x1 = x0+length; 00316 int y1 = y0+width; 00317 00318 if(x0 > x1) 00319 { 00320 x0 = x0^x1; 00321 x1 = x0^x1; 00322 x0 = x0^x1; 00323 } 00324 00325 if(y0 > y1) 00326 { 00327 y0 = y0^y1; 00328 y1 = y0^y1; 00329 y0 = y0^y1; 00330 } 00331 00332 if(lcd->mode == LANDSCAPE) { 00333 y0 = y0^x0; 00334 x0 = y0^x0; 00335 y0 = y0^x0; 00336 00337 y1 = y1^x1; 00338 x1 = y1^x1; 00339 y1 = y1^x1; 00340 00341 x0 = x0^x1; 00342 x1 = x0^x1; 00343 x0 = x0^x1; 00344 x0 = 239-x0; 00345 x1 = 239-x1; 00346 } 00347 00348 //XL = constrain(XL, MIN_X, MAX_X); 00349 //x1 = constrain(x1, MIN_X, MAX_X); 00350 //y0 = constrain(y0, MIN_Y, MAX_Y); 00351 //y1 = constrain(y1, MIN_Y, MAX_Y); 00352 00353 XY = (x1-x0+1); 00354 XY = XY*(y1-y0+1); 00355 00356 lcd_setColumn(lcd, x0, x1); 00357 lcd_setPage(lcd, y0, y1); 00358 lcd_writeCommand(lcd, 0x2c); /* start to write to display ram */ 00359 00360 for(int i = 0; i < XY; i++) 00361 { 00362 lcd_writeData16(lcd, color); 00363 } 00364 } 00365 00366 void lcd_fillSprite(lcd_t * lcd, int x0, int y0, int length, int width, short int *pColor) { 00367 int XY=0; 00368 00369 int x1 = x0+length; 00370 int y1 = y0+width; 00371 short int color; 00372 if(x0 > x1) 00373 { 00374 x0 = x0^x1; 00375 x1 = x0^x1; 00376 x0 = x0^x1; 00377 } 00378 00379 if(y0 > y1) 00380 { 00381 y0 = y0^y1; 00382 y1 = y0^y1; 00383 y0 = y0^y1; 00384 } 00385 00386 if(lcd->mode == LANDSCAPE) { 00387 y0 = y0^x0; 00388 x0 = y0^x0; 00389 y0 = y0^x0; 00390 00391 y1 = y1^x1; 00392 x1 = y1^x1; 00393 y1 = y1^x1; 00394 00395 x0 = x0^x1; 00396 x1 = x0^x1; 00397 x0 = x0^x1; 00398 x0 = 239-x0; 00399 x1 = 239-x1; 00400 } 00401 00402 //XL = constrain(XL, MIN_X, MAX_X); 00403 //x1 = constrain(x1, MIN_X, MAX_X); 00404 //y0 = constrain(y0, MIN_Y, MAX_Y); 00405 //y1 = constrain(y1, MIN_Y, MAX_Y); 00406 00407 XY = (x1-x0+1); 00408 XY = XY*(y1-y0+1); 00409 00410 lcd_setColumn(lcd, x0, x1); 00411 lcd_setPage(lcd, y0, y1); 00412 lcd_writeCommand(lcd, 0x2c); /* start to write to display ram */ 00413 00414 #if 1 /* speed up */ 00415 lcd_cd(lcd, 1); 00416 lcd_cs(lcd, 0); 00417 for(int i = 0; i < XY; i++) 00418 { 00419 color = *pColor++; 00420 spi_master_write(lcd->spi, (color >> 8)); 00421 spi_master_write(lcd->spi, (color & 0xff)); 00422 } 00423 lcd_cs(lcd, 1); 00424 #else 00425 for(int i = 0; i < XY; i++) 00426 { 00427 lcd_writeData16(lcd, *color++); 00428 } 00429 #endif 00430 } 00431 00432 00433 void lcd_drawTraingle(lcd_t * lcd, int x0, int y0, int x1, int y1, int x2, int y2, int color) 00434 { 00435 lcd_drawLine(lcd, x0, y0, x1, y1, color); 00436 lcd_drawLine(lcd, x0, y0, x2, y2, color); 00437 lcd_drawLine(lcd, x1, y1, x2, y2, color); 00438 } 00439 00440 void lcd_fillTraingle(lcd_t * lcd, int x0, int y0, int x1, int y1, int x2, int y2, int color) 00441 { 00442 if(lcd->mode == LANDSCAPE) { 00443 y0 = y0^x0; 00444 x0 = y0^x0; 00445 y0 = y0^x0; 00446 00447 y1 = y1^x1; 00448 x1 = y1^x1; 00449 y1 = y1^x1; 00450 00451 y2 = y2^x2; 00452 x2 = y2^x2; 00453 y2 = y2^x2; 00454 00455 x0 = 239-x0; 00456 x1 = 239-x1; 00457 x2 = 239-x2; 00458 } 00459 00460 if(y0 > y1) { 00461 y0 = y0^y1; 00462 y1 = y0^y1; 00463 y0 = y0^y1; 00464 00465 x0 = x0^x1; 00466 x1 = x0^x1; 00467 x0 = x0^x1; 00468 } 00469 00470 if(y1 > y2) { 00471 y2 = y2^y1; 00472 y1 = y2^y1; 00473 y2 = y2^y1; 00474 00475 x2 = x2^x1; 00476 x1 = x2^x1; 00477 x2 = x2^x1; 00478 } 00479 00480 if(y0 > y1) { 00481 y0 = y0^y1; 00482 y1 = y0^y1; 00483 y0 = y0^y1; 00484 00485 x0 = x0^x1; 00486 x1 = x0^x1; 00487 x0 = x0^x1; 00488 } 00489 00490 if(x1 > x2) { 00491 x1 = x1^x2; 00492 x2 = x1^x2; 00493 x1 = x1^x2; 00494 00495 y1 = y1^y2; 00496 y2 = y1^y2; 00497 y1 = y1^y2; 00498 } 00499 00500 int xl = x0; 00501 int yl = y0; 00502 int xle = x1; 00503 int yle = y1; 00504 int dxl = abs(x1-x0), sxl = x0 < x1 ? 1 : -1; 00505 int dyl = -abs(y1-y0), syl = y0 < y1 ? 1 : -1; 00506 int errl = dxl + dyl, e2l; 00507 00508 int xr = x0; 00509 int yr = y0; 00510 int xre = x2; 00511 int yre = y2; 00512 int dxr = abs(x2-x0), sxr = x0 < x2 ? 1 : -1; 00513 int dyr = -abs(y2-y0), syr = y0 < y2 ? 1 : -1; 00514 int errr = dxr + dyr, e2r; 00515 00516 int xlp = xl; 00517 int xrp = xr; 00518 00519 do { 00520 if(yl <= yr && (xl != xle || yl != yle)) { 00521 e2l = 2*errl; 00522 if (e2l >= dyl && xl != xle) { 00523 errl += dyl; xl += sxl; 00524 } 00525 00526 if (e2l <= dxl && yl != yle) { 00527 errl += dxl; yl += syl; 00528 00529 if(yl == yr) { 00530 //lcd_drawHorizontalLine(lcd, xlp, yl-1, xrp-xlp+1, color); 00531 00532 lcd_setColumn(lcd, xlp, xrp); 00533 lcd_setPage(lcd, yl-1, yl-1); 00534 lcd_writeCommand(lcd, 0x2c); 00535 for(int i=0; i < xrp-xlp; i++) 00536 lcd_writeData16(lcd, color); 00537 00538 xlp = xl; 00539 xrp = xr; 00540 } 00541 }else { 00542 if(sxl < 0) { 00543 xlp = xl; 00544 } 00545 } 00546 }else if (yle < yre) { 00547 dxl = abs(xl-x2); 00548 sxl = xl < x2 ? 1 : -1; 00549 dyl = -abs(yl-y2); 00550 syl = 1; 00551 xle = x2; 00552 yle = y2; 00553 errl = dxl + dyl; 00554 } 00555 00556 if(yr <= yl && (xr != xre || yr != yre)) { 00557 e2r = 2*errr; 00558 if (e2r >= dyr && xr != xre) { 00559 errr += dyr; xr += sxr; 00560 } 00561 00562 if (e2r <= dxr && yr != yre) { 00563 errr += dxr; yr += syr; 00564 00565 if(yl==yr) { 00566 //lcd_drawHorizontalLine(lcd, xlp, yl-1, xrp-xlp+1, color); 00567 00568 lcd_setColumn(lcd, xlp, xrp); 00569 lcd_setPage(lcd, yl-1, yl-1); 00570 lcd_writeCommand(lcd, 0x2c); 00571 for(int i=0; i < xrp-xlp; i++) 00572 lcd_writeData16(lcd, color); 00573 00574 xlp = xl; 00575 xrp = xr; 00576 } 00577 }else { 00578 if(sxr > 0) { 00579 xrp = xr; 00580 } 00581 } 00582 00583 }else if (yre < yle) { 00584 dxr = abs(xr-x1); 00585 dyr = -abs(yr-y1); 00586 sxr = xr < x1 ? 1 : -1; 00587 syr = 1; 00588 xre = x1; 00589 yre = y1; 00590 errr = dxr + dyr; 00591 } 00592 }while ((xl < xle || yl < yle || xr < xre || yr < yre)); 00593 00594 lcd_setColumn(lcd, xlp, xrp); 00595 lcd_setPage(lcd, yl, yl); 00596 lcd_writeCommand(lcd, 0x2c); 00597 for(int i=0; i < xrp-xlp; i++) 00598 lcd_writeData16(lcd, color); 00599 } 00600 00601 void lcd_drawCircle(lcd_t * lcd, int x, int y, int radius, int color) 00602 { 00603 if(lcd->mode==LANDSCAPE) { 00604 y=x^y; 00605 x=x^y; 00606 y=x^y; 00607 x=239-x; 00608 } 00609 00610 int dx = -radius, dy = 0, err = 2-2*radius, e2; 00611 do { 00612 lcd_setPixel(lcd, x-dx, y+dy, color); 00613 lcd_setPixel(lcd, x+dx, y+dy, color); 00614 lcd_setPixel(lcd, x+dx, y-dy, color); 00615 lcd_setPixel(lcd, x-dx, y-dy, color); 00616 e2 = err; 00617 if (e2 <= dy) { 00618 err += ++dy*2+1; 00619 if (-dx == dy && e2 <= dx) e2 = 0; 00620 } 00621 if (e2 > dx) err += ++dx*2+1; 00622 } while (dx <= 0); 00623 } 00624 00625 void lcd_drawChar(lcd_t * lcd, char c, int x, int y, uint16_t size, uint16_t color) 00626 { 00627 if(!(c >= 32) && (c <= 127)) { 00628 c = '?'-32; 00629 } 00630 00631 for (int i =0; i < FONT_X; i++ ) { 00632 uint8_t temp = simpleFont[c-32][i]; 00633 for(uint8_t f = 0; f < 8; f++) { 00634 if((temp>>f)&0x01) { 00635 lcd_fillRectangle(lcd, x+i*size, y+f*size, size, size, color); 00636 } 00637 #if 1 /* Hintergrund ebenfalls setzen */ 00638 else{ 00639 lcd_fillRectangle(lcd, x+i*size, y+f*size, size, size, WHITE); 00640 } 00641 #endif 00642 } 00643 } 00644 } 00645 00646 void lcd_drawString(lcd_t * lcd, char * ca, int x, int y, uint16_t size, uint16_t color) 00647 { 00648 while(*ca) { 00649 lcd_drawChar(lcd, *ca, x, y, size, color); 00650 *ca++; 00651 00652 if(x < MAX_X) { 00653 x += FONT_SPACE*size; /* Move cursor right */ 00654 } 00655 } 00656 } 00657 00658 uint8_t lcd_drawNumber(lcd_t * lcd, long long_num, int x, int y, uint16_t size, uint16_t color) 00659 { 00660 uint8_t char_buffer[10] = ""; 00661 uint8_t i = 0; 00662 uint8_t f = 0; 00663 00664 if(long_num < 0) { 00665 f = 1; 00666 lcd_drawChar(lcd, '-', x, y, size, color); 00667 long_num = -long_num; 00668 00669 if(x < MAX_X) { 00670 x += FONT_SPACE*size; /* Move cursor right */ 00671 } 00672 }else if(long_num == 0) { 00673 f = 1; 00674 lcd_drawChar(lcd, '0', x, y, size, color); 00675 return f; //<-- Bullshit --> 00676 00677 //if(x < MAX_X) { 00678 // x += FONT_SPACE*size; /* Move cursor right */ 00679 //} 00680 } 00681 00682 while (long_num > 0) { 00683 char_buffer[i++] = long_num % 10; 00684 long_num /= 10; 00685 } 00686 00687 f = f+i; 00688 00689 for(; i > 0; i--) { 00690 lcd_drawChar(lcd, '0' + char_buffer[i - 1], x, y, size, color); 00691 00692 if(x < MAX_X) { 00693 x += FONT_SPACE*size; /* Move cursor right */ 00694 } 00695 } 00696 00697 return f; 00698 } 00699 00700 uint8_t lcd_drawFloat(lcd_t * lcd, float floatNumber, uint8_t decimal, int x, int y, uint16_t size, uint16_t color) 00701 { 00702 uint16_t temp = 0; 00703 float decy = 0.0; 00704 float rounding = 0.5; 00705 uint8_t f = 0; 00706 00707 if(floatNumber < 0.0) 00708 { 00709 lcd_drawChar(lcd, '-', x, y, size, color); 00710 floatNumber = -floatNumber; 00711 if(x < MAX_X) 00712 { 00713 x += FONT_SPACE * size; /* Move cursor right */ 00714 } 00715 f = 1; 00716 } 00717 00718 for(uint8_t i = 0; i < decimal; ++i) 00719 { 00720 rounding /= 10.0; 00721 } 00722 floatNumber += rounding; 00723 00724 temp = (uint16_t)floatNumber; 00725 uint8_t howlong = lcd_drawNumber(lcd, temp, x, y, size, color); 00726 f += howlong; 00727 00728 if((x+8*size*howlong) < MAX_X) 00729 { 00730 x += FONT_SPACE * size * howlong; /* Move cursor right */ 00731 } 00732 00733 if(decimal > 0) 00734 { 00735 lcd_drawChar(lcd, '.', x, y, size, color); 00736 if(x < MAX_X) 00737 { 00738 x += FONT_SPACE * size; /* Move cursor right */ 00739 } 00740 f += 1; 00741 } 00742 00743 decy = floatNumber - temp; 00744 /* decimal part, 4 */ 00745 for(uint8_t i = 0; i < decimal; i++) 00746 { 00747 decy *= 10; /* for the next decimal */ 00748 temp = decy; /* get the decimal */ 00749 lcd_drawNumber(lcd, temp, x, y, size, color); 00750 floatNumber = -floatNumber; 00751 00752 if(x < MAX_X) 00753 { 00754 x += FONT_SPACE * size; /* Move cursor right */ 00755 } 00756 00757 decy -= temp; 00758 } 00759 00760 f += decimal; 00761 return f; 00762 }
Generated on Sat Jul 16 2022 01:28:41 by
1.7.2