TO CHECKOUT

Dependencies:   mbed

Committer:
chrish
Date:
Sat Nov 29 17:48:10 2014 +0000
Revision:
0:785c2b62c4d1
TO CHECKOUT;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
chrish 0:785c2b62c4d1 1 #include <stdarg.h>
chrish 0:785c2b62c4d1 2 #include "lcd.h"
chrish 0:785c2b62c4d1 3
chrish 0:785c2b62c4d1 4 void lcd_init(lcd_t * lcd, spi_t * spi, PinName CS, PinName CD) {
chrish 0:785c2b62c4d1 5 //Prepare pins
chrish 0:785c2b62c4d1 6 gpio_init_out(&(lcd->CS), CS );
chrish 0:785c2b62c4d1 7 gpio_init_out(&(lcd->CD), CD);
chrish 0:785c2b62c4d1 8
chrish 0:785c2b62c4d1 9 gpio_write(&(lcd->CS), 1);
chrish 0:785c2b62c4d1 10 gpio_write(&(lcd->CD), 1);
chrish 0:785c2b62c4d1 11 //
chrish 0:785c2b62c4d1 12
chrish 0:785c2b62c4d1 13 lcd->mode = PORTRAIT;
chrish 0:785c2b62c4d1 14 //lcd->mode = LANDSCAPE;
chrish 0:785c2b62c4d1 15 lcd->spi = spi;
chrish 0:785c2b62c4d1 16
chrish 0:785c2b62c4d1 17 wait_ms(500);
chrish 0:785c2b62c4d1 18 lcd_writeCommand(lcd, 0x01);
chrish 0:785c2b62c4d1 19 wait_ms(200);
chrish 0:785c2b62c4d1 20
chrish 0:785c2b62c4d1 21
chrish 0:785c2b62c4d1 22 lcd_writeCommand(lcd, 0xCF);
chrish 0:785c2b62c4d1 23 lcd_writeData(lcd, 0x00);
chrish 0:785c2b62c4d1 24 lcd_writeData(lcd, 0x8B);
chrish 0:785c2b62c4d1 25 lcd_writeData(lcd, 0x30);
chrish 0:785c2b62c4d1 26
chrish 0:785c2b62c4d1 27 lcd_writeCommand(lcd, 0xED);
chrish 0:785c2b62c4d1 28 lcd_writeData(lcd, 0x67);
chrish 0:785c2b62c4d1 29 lcd_writeData(lcd, 0x03);
chrish 0:785c2b62c4d1 30 lcd_writeData(lcd, 0x12);
chrish 0:785c2b62c4d1 31 lcd_writeData(lcd, 0x81);
chrish 0:785c2b62c4d1 32
chrish 0:785c2b62c4d1 33 lcd_writeCommand(lcd, 0xE8);
chrish 0:785c2b62c4d1 34 lcd_writeData(lcd, 0x85);
chrish 0:785c2b62c4d1 35 lcd_writeData(lcd, 0x10);
chrish 0:785c2b62c4d1 36 lcd_writeData(lcd, 0x7A);
chrish 0:785c2b62c4d1 37
chrish 0:785c2b62c4d1 38 lcd_writeCommand(lcd, 0xCB);
chrish 0:785c2b62c4d1 39 lcd_writeData(lcd, 0x39);
chrish 0:785c2b62c4d1 40 lcd_writeData(lcd, 0x2C);
chrish 0:785c2b62c4d1 41 lcd_writeData(lcd, 0x00);
chrish 0:785c2b62c4d1 42 lcd_writeData(lcd, 0x34);
chrish 0:785c2b62c4d1 43 lcd_writeData(lcd, 0x02);
chrish 0:785c2b62c4d1 44
chrish 0:785c2b62c4d1 45 lcd_writeCommand(lcd, 0xF7);
chrish 0:785c2b62c4d1 46 lcd_writeData(lcd, 0x20);
chrish 0:785c2b62c4d1 47
chrish 0:785c2b62c4d1 48 lcd_writeCommand(lcd, 0xEA);
chrish 0:785c2b62c4d1 49 lcd_writeData(lcd, 0x00);
chrish 0:785c2b62c4d1 50 lcd_writeData(lcd, 0x00);
chrish 0:785c2b62c4d1 51
chrish 0:785c2b62c4d1 52 lcd_writeCommand(lcd, 0xC0); /* Power control */
chrish 0:785c2b62c4d1 53 lcd_writeData(lcd, 0x1B); /* VRH[5:0] */
chrish 0:785c2b62c4d1 54
chrish 0:785c2b62c4d1 55 lcd_writeCommand(lcd, 0xC1); /* Power control */
chrish 0:785c2b62c4d1 56 lcd_writeData(lcd, 0x10); /* SAP[2:0];BT[3:0] */
chrish 0:785c2b62c4d1 57
chrish 0:785c2b62c4d1 58 lcd_writeCommand(lcd, 0xC5); /* VCM control */
chrish 0:785c2b62c4d1 59 lcd_writeData(lcd, 0x3F);
chrish 0:785c2b62c4d1 60 lcd_writeData(lcd, 0x3C);
chrish 0:785c2b62c4d1 61
chrish 0:785c2b62c4d1 62 lcd_writeCommand(lcd, 0xC7); /* VCM control2 */
chrish 0:785c2b62c4d1 63 lcd_writeData(lcd, 0xB7);
chrish 0:785c2b62c4d1 64
chrish 0:785c2b62c4d1 65 lcd_writeCommand(lcd, 0x36); /* Memory Access Control */
chrish 0:785c2b62c4d1 66 lcd_writeData(lcd, 0x08);
chrish 0:785c2b62c4d1 67
chrish 0:785c2b62c4d1 68 lcd_writeCommand(lcd, 0x3A);
chrish 0:785c2b62c4d1 69 lcd_writeData(lcd, 0x55);
chrish 0:785c2b62c4d1 70
chrish 0:785c2b62c4d1 71 lcd_writeCommand(lcd, 0xB1);
chrish 0:785c2b62c4d1 72 lcd_writeData(lcd, 0x00);
chrish 0:785c2b62c4d1 73 lcd_writeData(lcd, 0x1B);
chrish 0:785c2b62c4d1 74
chrish 0:785c2b62c4d1 75 lcd_writeCommand(lcd, 0xB6); /* Display Function Control */
chrish 0:785c2b62c4d1 76 lcd_writeData(lcd, 0x0A);
chrish 0:785c2b62c4d1 77 lcd_writeData(lcd, 0xA2);
chrish 0:785c2b62c4d1 78
chrish 0:785c2b62c4d1 79 lcd_writeCommand(lcd, 0xF2); /* 3Gamma Function Disable */
chrish 0:785c2b62c4d1 80 lcd_writeData(lcd, 0x00);
chrish 0:785c2b62c4d1 81
chrish 0:785c2b62c4d1 82 lcd_writeCommand(lcd, 0x26); /* Gamma curve selected */
chrish 0:785c2b62c4d1 83 lcd_writeData(lcd, 0x01);
chrish 0:785c2b62c4d1 84
chrish 0:785c2b62c4d1 85 lcd_writeCommand(lcd, 0xE0); /* Set Gamma */
chrish 0:785c2b62c4d1 86 lcd_writeData(lcd, 0x0F);
chrish 0:785c2b62c4d1 87 lcd_writeData(lcd, 0x2A);
chrish 0:785c2b62c4d1 88 lcd_writeData(lcd, 0x28);
chrish 0:785c2b62c4d1 89 lcd_writeData(lcd, 0x08);
chrish 0:785c2b62c4d1 90 lcd_writeData(lcd, 0x0E);
chrish 0:785c2b62c4d1 91 lcd_writeData(lcd, 0x08);
chrish 0:785c2b62c4d1 92 lcd_writeData(lcd, 0x54);
chrish 0:785c2b62c4d1 93 lcd_writeData(lcd, 0xA9);
chrish 0:785c2b62c4d1 94 lcd_writeData(lcd, 0x43);
chrish 0:785c2b62c4d1 95 lcd_writeData(lcd, 0x0A);
chrish 0:785c2b62c4d1 96 lcd_writeData(lcd, 0x0F);
chrish 0:785c2b62c4d1 97 lcd_writeData(lcd, 0x00);
chrish 0:785c2b62c4d1 98 lcd_writeData(lcd, 0x00);
chrish 0:785c2b62c4d1 99 lcd_writeData(lcd, 0x00);
chrish 0:785c2b62c4d1 100 lcd_writeData(lcd, 0x00);
chrish 0:785c2b62c4d1 101
chrish 0:785c2b62c4d1 102 lcd_writeCommand(lcd, 0xE1); /* Set Gamma */
chrish 0:785c2b62c4d1 103 lcd_writeData(lcd, 0x00);
chrish 0:785c2b62c4d1 104 lcd_writeData(lcd, 0x15);
chrish 0:785c2b62c4d1 105 lcd_writeData(lcd, 0x17);
chrish 0:785c2b62c4d1 106 lcd_writeData(lcd, 0x07);
chrish 0:785c2b62c4d1 107 lcd_writeData(lcd, 0x11);
chrish 0:785c2b62c4d1 108 lcd_writeData(lcd, 0x06);
chrish 0:785c2b62c4d1 109 lcd_writeData(lcd, 0x2B);
chrish 0:785c2b62c4d1 110 lcd_writeData(lcd, 0x56);
chrish 0:785c2b62c4d1 111 lcd_writeData(lcd, 0x3C);
chrish 0:785c2b62c4d1 112 lcd_writeData(lcd, 0x05);
chrish 0:785c2b62c4d1 113 lcd_writeData(lcd, 0x10);
chrish 0:785c2b62c4d1 114 lcd_writeData(lcd, 0x0F);
chrish 0:785c2b62c4d1 115 lcd_writeData(lcd, 0x3F);
chrish 0:785c2b62c4d1 116 lcd_writeData(lcd, 0x3F);
chrish 0:785c2b62c4d1 117 lcd_writeData(lcd, 0x0F);
chrish 0:785c2b62c4d1 118
chrish 0:785c2b62c4d1 119 lcd_writeCommand(lcd, 0x11); /* Exit Sleep */
chrish 0:785c2b62c4d1 120 wait_ms(120);
chrish 0:785c2b62c4d1 121 lcd_writeCommand(lcd, 0x29);
chrish 0:785c2b62c4d1 122 lcd_fillScreen(lcd);
chrish 0:785c2b62c4d1 123 }
chrish 0:785c2b62c4d1 124
chrish 0:785c2b62c4d1 125 void lcd_cs(lcd_t * lcd, int value) {
chrish 0:785c2b62c4d1 126 while(spi_busy(lcd->spi));
chrish 0:785c2b62c4d1 127 gpio_write(&(lcd->CS), value);
chrish 0:785c2b62c4d1 128 }
chrish 0:785c2b62c4d1 129
chrish 0:785c2b62c4d1 130 void lcd_cd(lcd_t * lcd, int value) {
chrish 0:785c2b62c4d1 131 while(spi_busy(lcd->spi));
chrish 0:785c2b62c4d1 132 gpio_write(&(lcd->CD), value);
chrish 0:785c2b62c4d1 133 }
chrish 0:785c2b62c4d1 134
chrish 0:785c2b62c4d1 135 void lcd_setMode(lcd_t * lcd, lcd_mode mode) {
chrish 0:785c2b62c4d1 136 lcd->mode = mode;
chrish 0:785c2b62c4d1 137 }
chrish 0:785c2b62c4d1 138
chrish 0:785c2b62c4d1 139 void lcd_writeCommand(lcd_t * lcd, int value) {
chrish 0:785c2b62c4d1 140 lcd_cd(lcd, 0);
chrish 0:785c2b62c4d1 141 lcd_cs(lcd, 0);
chrish 0:785c2b62c4d1 142
chrish 0:785c2b62c4d1 143 spi_master_write(lcd->spi, value);
chrish 0:785c2b62c4d1 144
chrish 0:785c2b62c4d1 145 lcd_cs(lcd, 1);
chrish 0:785c2b62c4d1 146 }
chrish 0:785c2b62c4d1 147
chrish 0:785c2b62c4d1 148 void lcd_writeData(lcd_t * lcd, int value) {
chrish 0:785c2b62c4d1 149 lcd_cd(lcd, 1);
chrish 0:785c2b62c4d1 150 lcd_cs(lcd, 0);
chrish 0:785c2b62c4d1 151
chrish 0:785c2b62c4d1 152 spi_master_write(lcd->spi, value);
chrish 0:785c2b62c4d1 153
chrish 0:785c2b62c4d1 154 lcd_cs(lcd, 1);
chrish 0:785c2b62c4d1 155 }
chrish 0:785c2b62c4d1 156
chrish 0:785c2b62c4d1 157 void lcd_writeData16(lcd_t * lcd, int value) {
chrish 0:785c2b62c4d1 158 int data1 = value >> 8;
chrish 0:785c2b62c4d1 159 int data2 = value & 0xff;
chrish 0:785c2b62c4d1 160 lcd_cd(lcd, 1);
chrish 0:785c2b62c4d1 161 lcd_cs(lcd, 0);
chrish 0:785c2b62c4d1 162
chrish 0:785c2b62c4d1 163 spi_master_write(lcd->spi, data1);
chrish 0:785c2b62c4d1 164 spi_master_write(lcd->spi, data2);
chrish 0:785c2b62c4d1 165
chrish 0:785c2b62c4d1 166 lcd_cs(lcd, 1);
chrish 0:785c2b62c4d1 167 }
chrish 0:785c2b62c4d1 168
chrish 0:785c2b62c4d1 169 void lcd_setColumn(lcd_t * lcd, int start, int end) {
chrish 0:785c2b62c4d1 170 lcd_writeCommand(lcd, 0x2A); /* column command address */
chrish 0:785c2b62c4d1 171 lcd_writeData16(lcd, start);
chrish 0:785c2b62c4d1 172 lcd_writeData16(lcd, end);
chrish 0:785c2b62c4d1 173 }
chrish 0:785c2b62c4d1 174
chrish 0:785c2b62c4d1 175 void lcd_setPage(lcd_t * lcd, int start, int end) {
chrish 0:785c2b62c4d1 176 lcd_writeCommand(lcd, 0x2B); /* column command address */
chrish 0:785c2b62c4d1 177 lcd_writeData16(lcd, start);
chrish 0:785c2b62c4d1 178 lcd_writeData16(lcd, end);
chrish 0:785c2b62c4d1 179 }
chrish 0:785c2b62c4d1 180
chrish 0:785c2b62c4d1 181 void lcd_setXY(lcd_t * lcd, int x, int y) {
chrish 0:785c2b62c4d1 182 lcd_setColumn(lcd, x, x);
chrish 0:785c2b62c4d1 183 lcd_setPage(lcd, y, y);
chrish 0:785c2b62c4d1 184 lcd_writeCommand(lcd, 0x2c);
chrish 0:785c2b62c4d1 185 }
chrish 0:785c2b62c4d1 186
chrish 0:785c2b62c4d1 187 void lcd_setPixel(lcd_t * lcd, int x, int y, int color) {
chrish 0:785c2b62c4d1 188 lcd_setXY(lcd, x, y);
chrish 0:785c2b62c4d1 189 lcd_writeData16(lcd, color);
chrish 0:785c2b62c4d1 190 }
chrish 0:785c2b62c4d1 191
chrish 0:785c2b62c4d1 192 void lcd_setLandscape(lcd_t * lcd) {
chrish 0:785c2b62c4d1 193 lcd->mode = LANDSCAPE;
chrish 0:785c2b62c4d1 194 }
chrish 0:785c2b62c4d1 195
chrish 0:785c2b62c4d1 196 void lcd_setPortrait(lcd_t * lcd) {
chrish 0:785c2b62c4d1 197 lcd->mode = PORTRAIT;
chrish 0:785c2b62c4d1 198 }
chrish 0:785c2b62c4d1 199
chrish 0:785c2b62c4d1 200 void lcd_fillScreen(lcd_t * lcd) {
chrish 0:785c2b62c4d1 201 lcd_setColumn(lcd, 0, 239);
chrish 0:785c2b62c4d1 202 lcd_setPage(lcd, 0, 319);
chrish 0:785c2b62c4d1 203 lcd_writeCommand(lcd, 0x2c); /* start to write to display ram */
chrish 0:785c2b62c4d1 204
chrish 0:785c2b62c4d1 205 lcd_cd(lcd, 1);
chrish 0:785c2b62c4d1 206 lcd_cs(lcd, 0);
chrish 0:785c2b62c4d1 207 for(int i = 0; i < 76800; i++)
chrish 0:785c2b62c4d1 208 {
chrish 0:785c2b62c4d1 209 spi_master_write(lcd->spi, 0xFF);
chrish 0:785c2b62c4d1 210 spi_master_write(lcd->spi, 0xFF);
chrish 0:785c2b62c4d1 211 }
chrish 0:785c2b62c4d1 212 while(spi_busy(lcd->spi));
chrish 0:785c2b62c4d1 213 lcd_cs(lcd, 1);
chrish 0:785c2b62c4d1 214 }
chrish 0:785c2b62c4d1 215
chrish 0:785c2b62c4d1 216 void lcd_drawLine(lcd_t * lcd, int x0, int y0, int x1, int y1, int color) {
chrish 0:785c2b62c4d1 217 if (x0 == x1) {
chrish 0:785c2b62c4d1 218 lcd_drawVerticalLine(lcd, x0, y0, y1-y0, color);
chrish 0:785c2b62c4d1 219 }else if (y0 == y1) {
chrish 0:785c2b62c4d1 220 lcd_drawHorizontalLine(lcd, x0, y0, x1-x0, color);
chrish 0:785c2b62c4d1 221 }else {
chrish 0:785c2b62c4d1 222 if(lcd->mode == LANDSCAPE) {
chrish 0:785c2b62c4d1 223 y0 = y0^x0;
chrish 0:785c2b62c4d1 224 x0 = y0^x0;
chrish 0:785c2b62c4d1 225 y0 = y0^x0;
chrish 0:785c2b62c4d1 226
chrish 0:785c2b62c4d1 227 y1 = y1^x1;
chrish 0:785c2b62c4d1 228 x1 = y1^x1;
chrish 0:785c2b62c4d1 229 y1 = y1^x1;
chrish 0:785c2b62c4d1 230
chrish 0:785c2b62c4d1 231 x0 = 239-(x0);
chrish 0:785c2b62c4d1 232 x1 = 239-(x1);
chrish 0:785c2b62c4d1 233 }
chrish 0:785c2b62c4d1 234 int x = x1-x0;
chrish 0:785c2b62c4d1 235 int y = y1-y0;
chrish 0:785c2b62c4d1 236 int dx = abs(x), sx = x0 < x1 ? 1 : -1;
chrish 0:785c2b62c4d1 237 int dy = -abs(y), sy = y0 < y1 ? 1 : -1;
chrish 0:785c2b62c4d1 238 int err = dx + dy, e2; /* error value e_xy */
chrish 0:785c2b62c4d1 239
chrish 0:785c2b62c4d1 240 lcd_setPixel(lcd, x0, y0, color);
chrish 0:785c2b62c4d1 241
chrish 0:785c2b62c4d1 242 do
chrish 0:785c2b62c4d1 243 {
chrish 0:785c2b62c4d1 244 e2 = 2*err;
chrish 0:785c2b62c4d1 245
chrish 0:785c2b62c4d1 246 if (e2 >= dy) { /* e_xy+e_x > 0 */
chrish 0:785c2b62c4d1 247 err += dy; x0 += sx;
chrish 0:785c2b62c4d1 248 }
chrish 0:785c2b62c4d1 249
chrish 0:785c2b62c4d1 250 if (e2 <= dx) { /* e_xy+e_y < 0 */
chrish 0:785c2b62c4d1 251 err += dx; y0 += sy;
chrish 0:785c2b62c4d1 252 }
chrish 0:785c2b62c4d1 253
chrish 0:785c2b62c4d1 254 lcd_setPixel(lcd, x0, y0, color);
chrish 0:785c2b62c4d1 255 } while (x0 != x1 || y0 != y1);
chrish 0:785c2b62c4d1 256 }
chrish 0:785c2b62c4d1 257 }
chrish 0:785c2b62c4d1 258
chrish 0:785c2b62c4d1 259 void lcd_drawVerticalLine(lcd_t * lcd, int x, int y, int length, int color) {
chrish 0:785c2b62c4d1 260 if(lcd->mode == LANDSCAPE) {
chrish 0:785c2b62c4d1 261 y = y^x;
chrish 0:785c2b62c4d1 262 x = y^x;
chrish 0:785c2b62c4d1 263 y = y^x;
chrish 0:785c2b62c4d1 264 x = 239-(x);
chrish 0:785c2b62c4d1 265 }
chrish 0:785c2b62c4d1 266
chrish 0:785c2b62c4d1 267 lcd_setColumn(lcd, x, x);
chrish 0:785c2b62c4d1 268 lcd_setPage(lcd, y, y + length);
chrish 0:785c2b62c4d1 269
chrish 0:785c2b62c4d1 270 lcd_writeCommand(lcd, 0x2c);
chrish 0:785c2b62c4d1 271 for(int i=0; i<length; i++)
chrish 0:785c2b62c4d1 272 lcd_writeData16(lcd, color);
chrish 0:785c2b62c4d1 273 }
chrish 0:785c2b62c4d1 274
chrish 0:785c2b62c4d1 275 void lcd_drawHorizontalLine(lcd_t * lcd, int x, int y, int length, int color) {
chrish 0:785c2b62c4d1 276 if(lcd->mode == LANDSCAPE) {
chrish 0:785c2b62c4d1 277 y = y^x;
chrish 0:785c2b62c4d1 278 x = y^x;
chrish 0:785c2b62c4d1 279 y = y^x;
chrish 0:785c2b62c4d1 280 x = 239-x;
chrish 0:785c2b62c4d1 281 lcd_setColumn(lcd, x - length, x);
chrish 0:785c2b62c4d1 282 }else {
chrish 0:785c2b62c4d1 283 lcd_setColumn(lcd, x, x + length);
chrish 0:785c2b62c4d1 284 }
chrish 0:785c2b62c4d1 285
chrish 0:785c2b62c4d1 286 lcd_setPage(lcd, y, y);
chrish 0:785c2b62c4d1 287
chrish 0:785c2b62c4d1 288 lcd_writeCommand(lcd, 0x2c);
chrish 0:785c2b62c4d1 289 for(int i=0; i<length; i++)
chrish 0:785c2b62c4d1 290 lcd_writeData16(lcd, color);
chrish 0:785c2b62c4d1 291 }
chrish 0:785c2b62c4d1 292
chrish 0:785c2b62c4d1 293 void lcd_drawRectangle(lcd_t * lcd , int x0, int y0, int x1, int y1, int color) {
chrish 0:785c2b62c4d1 294 if(x0>x1) {
chrish 0:785c2b62c4d1 295 x0=x0^x1;
chrish 0:785c2b62c4d1 296 x1=x0^x1;
chrish 0:785c2b62c4d1 297 x0=x0^x1;
chrish 0:785c2b62c4d1 298 }
chrish 0:785c2b62c4d1 299
chrish 0:785c2b62c4d1 300 if(y0>y1) {
chrish 0:785c2b62c4d1 301 y0=y0^y1;
chrish 0:785c2b62c4d1 302 y1=y0^y1;
chrish 0:785c2b62c4d1 303 y0=y0^y1;
chrish 0:785c2b62c4d1 304 }
chrish 0:785c2b62c4d1 305
chrish 0:785c2b62c4d1 306 lcd_drawVerticalLine(lcd, x0, y0, y1-y0, color);
chrish 0:785c2b62c4d1 307 lcd_drawVerticalLine(lcd, x0, y1, y1-y0, color);
chrish 0:785c2b62c4d1 308 lcd_drawHorizontalLine(lcd, x0, y0, x1-x0, color);
chrish 0:785c2b62c4d1 309 lcd_drawHorizontalLine(lcd, x1, y0, x1-x0, color);
chrish 0:785c2b62c4d1 310 }
chrish 0:785c2b62c4d1 311
chrish 0:785c2b62c4d1 312 void lcd_fillRectangle(lcd_t * lcd, int x0, int y0, int length, int width, int color) {
chrish 0:785c2b62c4d1 313 int XY=0;
chrish 0:785c2b62c4d1 314
chrish 0:785c2b62c4d1 315 int x1 = x0+length;
chrish 0:785c2b62c4d1 316 int y1 = y0+width;
chrish 0:785c2b62c4d1 317
chrish 0:785c2b62c4d1 318 if(x0 > x1)
chrish 0:785c2b62c4d1 319 {
chrish 0:785c2b62c4d1 320 x0 = x0^x1;
chrish 0:785c2b62c4d1 321 x1 = x0^x1;
chrish 0:785c2b62c4d1 322 x0 = x0^x1;
chrish 0:785c2b62c4d1 323 }
chrish 0:785c2b62c4d1 324
chrish 0:785c2b62c4d1 325 if(y0 > y1)
chrish 0:785c2b62c4d1 326 {
chrish 0:785c2b62c4d1 327 y0 = y0^y1;
chrish 0:785c2b62c4d1 328 y1 = y0^y1;
chrish 0:785c2b62c4d1 329 y0 = y0^y1;
chrish 0:785c2b62c4d1 330 }
chrish 0:785c2b62c4d1 331
chrish 0:785c2b62c4d1 332 if(lcd->mode == LANDSCAPE) {
chrish 0:785c2b62c4d1 333 y0 = y0^x0;
chrish 0:785c2b62c4d1 334 x0 = y0^x0;
chrish 0:785c2b62c4d1 335 y0 = y0^x0;
chrish 0:785c2b62c4d1 336
chrish 0:785c2b62c4d1 337 y1 = y1^x1;
chrish 0:785c2b62c4d1 338 x1 = y1^x1;
chrish 0:785c2b62c4d1 339 y1 = y1^x1;
chrish 0:785c2b62c4d1 340
chrish 0:785c2b62c4d1 341 x0 = x0^x1;
chrish 0:785c2b62c4d1 342 x1 = x0^x1;
chrish 0:785c2b62c4d1 343 x0 = x0^x1;
chrish 0:785c2b62c4d1 344 x0 = 239-x0;
chrish 0:785c2b62c4d1 345 x1 = 239-x1;
chrish 0:785c2b62c4d1 346 }
chrish 0:785c2b62c4d1 347
chrish 0:785c2b62c4d1 348 //XL = constrain(XL, MIN_X, MAX_X);
chrish 0:785c2b62c4d1 349 //x1 = constrain(x1, MIN_X, MAX_X);
chrish 0:785c2b62c4d1 350 //y0 = constrain(y0, MIN_Y, MAX_Y);
chrish 0:785c2b62c4d1 351 //y1 = constrain(y1, MIN_Y, MAX_Y);
chrish 0:785c2b62c4d1 352
chrish 0:785c2b62c4d1 353 XY = (x1-x0+1);
chrish 0:785c2b62c4d1 354 XY = XY*(y1-y0+1);
chrish 0:785c2b62c4d1 355
chrish 0:785c2b62c4d1 356 lcd_setColumn(lcd, x0, x1);
chrish 0:785c2b62c4d1 357 lcd_setPage(lcd, y0, y1);
chrish 0:785c2b62c4d1 358 lcd_writeCommand(lcd, 0x2c); /* start to write to display ram */
chrish 0:785c2b62c4d1 359
chrish 0:785c2b62c4d1 360 for(int i = 0; i < XY; i++)
chrish 0:785c2b62c4d1 361 {
chrish 0:785c2b62c4d1 362 lcd_writeData16(lcd, color);
chrish 0:785c2b62c4d1 363 }
chrish 0:785c2b62c4d1 364 }
chrish 0:785c2b62c4d1 365
chrish 0:785c2b62c4d1 366 void lcd_fillSprite(lcd_t * lcd, int x0, int y0, int length, int width, short int *pColor) {
chrish 0:785c2b62c4d1 367 int XY=0;
chrish 0:785c2b62c4d1 368
chrish 0:785c2b62c4d1 369 int x1 = x0+length;
chrish 0:785c2b62c4d1 370 int y1 = y0+width;
chrish 0:785c2b62c4d1 371 short int color;
chrish 0:785c2b62c4d1 372 if(x0 > x1)
chrish 0:785c2b62c4d1 373 {
chrish 0:785c2b62c4d1 374 x0 = x0^x1;
chrish 0:785c2b62c4d1 375 x1 = x0^x1;
chrish 0:785c2b62c4d1 376 x0 = x0^x1;
chrish 0:785c2b62c4d1 377 }
chrish 0:785c2b62c4d1 378
chrish 0:785c2b62c4d1 379 if(y0 > y1)
chrish 0:785c2b62c4d1 380 {
chrish 0:785c2b62c4d1 381 y0 = y0^y1;
chrish 0:785c2b62c4d1 382 y1 = y0^y1;
chrish 0:785c2b62c4d1 383 y0 = y0^y1;
chrish 0:785c2b62c4d1 384 }
chrish 0:785c2b62c4d1 385
chrish 0:785c2b62c4d1 386 if(lcd->mode == LANDSCAPE) {
chrish 0:785c2b62c4d1 387 y0 = y0^x0;
chrish 0:785c2b62c4d1 388 x0 = y0^x0;
chrish 0:785c2b62c4d1 389 y0 = y0^x0;
chrish 0:785c2b62c4d1 390
chrish 0:785c2b62c4d1 391 y1 = y1^x1;
chrish 0:785c2b62c4d1 392 x1 = y1^x1;
chrish 0:785c2b62c4d1 393 y1 = y1^x1;
chrish 0:785c2b62c4d1 394
chrish 0:785c2b62c4d1 395 x0 = x0^x1;
chrish 0:785c2b62c4d1 396 x1 = x0^x1;
chrish 0:785c2b62c4d1 397 x0 = x0^x1;
chrish 0:785c2b62c4d1 398 x0 = 239-x0;
chrish 0:785c2b62c4d1 399 x1 = 239-x1;
chrish 0:785c2b62c4d1 400 }
chrish 0:785c2b62c4d1 401
chrish 0:785c2b62c4d1 402 //XL = constrain(XL, MIN_X, MAX_X);
chrish 0:785c2b62c4d1 403 //x1 = constrain(x1, MIN_X, MAX_X);
chrish 0:785c2b62c4d1 404 //y0 = constrain(y0, MIN_Y, MAX_Y);
chrish 0:785c2b62c4d1 405 //y1 = constrain(y1, MIN_Y, MAX_Y);
chrish 0:785c2b62c4d1 406
chrish 0:785c2b62c4d1 407 XY = (x1-x0+1);
chrish 0:785c2b62c4d1 408 XY = XY*(y1-y0+1);
chrish 0:785c2b62c4d1 409
chrish 0:785c2b62c4d1 410 lcd_setColumn(lcd, x0, x1);
chrish 0:785c2b62c4d1 411 lcd_setPage(lcd, y0, y1);
chrish 0:785c2b62c4d1 412 lcd_writeCommand(lcd, 0x2c); /* start to write to display ram */
chrish 0:785c2b62c4d1 413
chrish 0:785c2b62c4d1 414 #if 1 /* speed up */
chrish 0:785c2b62c4d1 415 lcd_cd(lcd, 1);
chrish 0:785c2b62c4d1 416 lcd_cs(lcd, 0);
chrish 0:785c2b62c4d1 417 for(int i = 0; i < XY; i++)
chrish 0:785c2b62c4d1 418 {
chrish 0:785c2b62c4d1 419 color = *pColor++;
chrish 0:785c2b62c4d1 420 spi_master_write(lcd->spi, (color >> 8));
chrish 0:785c2b62c4d1 421 spi_master_write(lcd->spi, (color & 0xff));
chrish 0:785c2b62c4d1 422 }
chrish 0:785c2b62c4d1 423 lcd_cs(lcd, 1);
chrish 0:785c2b62c4d1 424 #else
chrish 0:785c2b62c4d1 425 for(int i = 0; i < XY; i++)
chrish 0:785c2b62c4d1 426 {
chrish 0:785c2b62c4d1 427 lcd_writeData16(lcd, *color++);
chrish 0:785c2b62c4d1 428 }
chrish 0:785c2b62c4d1 429 #endif
chrish 0:785c2b62c4d1 430 }
chrish 0:785c2b62c4d1 431
chrish 0:785c2b62c4d1 432
chrish 0:785c2b62c4d1 433 void lcd_drawTraingle(lcd_t * lcd, int x0, int y0, int x1, int y1, int x2, int y2, int color)
chrish 0:785c2b62c4d1 434 {
chrish 0:785c2b62c4d1 435 lcd_drawLine(lcd, x0, y0, x1, y1, color);
chrish 0:785c2b62c4d1 436 lcd_drawLine(lcd, x0, y0, x2, y2, color);
chrish 0:785c2b62c4d1 437 lcd_drawLine(lcd, x1, y1, x2, y2, color);
chrish 0:785c2b62c4d1 438 }
chrish 0:785c2b62c4d1 439
chrish 0:785c2b62c4d1 440 void lcd_fillTraingle(lcd_t * lcd, int x0, int y0, int x1, int y1, int x2, int y2, int color)
chrish 0:785c2b62c4d1 441 {
chrish 0:785c2b62c4d1 442 if(lcd->mode == LANDSCAPE) {
chrish 0:785c2b62c4d1 443 y0 = y0^x0;
chrish 0:785c2b62c4d1 444 x0 = y0^x0;
chrish 0:785c2b62c4d1 445 y0 = y0^x0;
chrish 0:785c2b62c4d1 446
chrish 0:785c2b62c4d1 447 y1 = y1^x1;
chrish 0:785c2b62c4d1 448 x1 = y1^x1;
chrish 0:785c2b62c4d1 449 y1 = y1^x1;
chrish 0:785c2b62c4d1 450
chrish 0:785c2b62c4d1 451 y2 = y2^x2;
chrish 0:785c2b62c4d1 452 x2 = y2^x2;
chrish 0:785c2b62c4d1 453 y2 = y2^x2;
chrish 0:785c2b62c4d1 454
chrish 0:785c2b62c4d1 455 x0 = 239-x0;
chrish 0:785c2b62c4d1 456 x1 = 239-x1;
chrish 0:785c2b62c4d1 457 x2 = 239-x2;
chrish 0:785c2b62c4d1 458 }
chrish 0:785c2b62c4d1 459
chrish 0:785c2b62c4d1 460 if(y0 > y1) {
chrish 0:785c2b62c4d1 461 y0 = y0^y1;
chrish 0:785c2b62c4d1 462 y1 = y0^y1;
chrish 0:785c2b62c4d1 463 y0 = y0^y1;
chrish 0:785c2b62c4d1 464
chrish 0:785c2b62c4d1 465 x0 = x0^x1;
chrish 0:785c2b62c4d1 466 x1 = x0^x1;
chrish 0:785c2b62c4d1 467 x0 = x0^x1;
chrish 0:785c2b62c4d1 468 }
chrish 0:785c2b62c4d1 469
chrish 0:785c2b62c4d1 470 if(y1 > y2) {
chrish 0:785c2b62c4d1 471 y2 = y2^y1;
chrish 0:785c2b62c4d1 472 y1 = y2^y1;
chrish 0:785c2b62c4d1 473 y2 = y2^y1;
chrish 0:785c2b62c4d1 474
chrish 0:785c2b62c4d1 475 x2 = x2^x1;
chrish 0:785c2b62c4d1 476 x1 = x2^x1;
chrish 0:785c2b62c4d1 477 x2 = x2^x1;
chrish 0:785c2b62c4d1 478 }
chrish 0:785c2b62c4d1 479
chrish 0:785c2b62c4d1 480 if(y0 > y1) {
chrish 0:785c2b62c4d1 481 y0 = y0^y1;
chrish 0:785c2b62c4d1 482 y1 = y0^y1;
chrish 0:785c2b62c4d1 483 y0 = y0^y1;
chrish 0:785c2b62c4d1 484
chrish 0:785c2b62c4d1 485 x0 = x0^x1;
chrish 0:785c2b62c4d1 486 x1 = x0^x1;
chrish 0:785c2b62c4d1 487 x0 = x0^x1;
chrish 0:785c2b62c4d1 488 }
chrish 0:785c2b62c4d1 489
chrish 0:785c2b62c4d1 490 if(x1 > x2) {
chrish 0:785c2b62c4d1 491 x1 = x1^x2;
chrish 0:785c2b62c4d1 492 x2 = x1^x2;
chrish 0:785c2b62c4d1 493 x1 = x1^x2;
chrish 0:785c2b62c4d1 494
chrish 0:785c2b62c4d1 495 y1 = y1^y2;
chrish 0:785c2b62c4d1 496 y2 = y1^y2;
chrish 0:785c2b62c4d1 497 y1 = y1^y2;
chrish 0:785c2b62c4d1 498 }
chrish 0:785c2b62c4d1 499
chrish 0:785c2b62c4d1 500 int xl = x0;
chrish 0:785c2b62c4d1 501 int yl = y0;
chrish 0:785c2b62c4d1 502 int xle = x1;
chrish 0:785c2b62c4d1 503 int yle = y1;
chrish 0:785c2b62c4d1 504 int dxl = abs(x1-x0), sxl = x0 < x1 ? 1 : -1;
chrish 0:785c2b62c4d1 505 int dyl = -abs(y1-y0), syl = y0 < y1 ? 1 : -1;
chrish 0:785c2b62c4d1 506 int errl = dxl + dyl, e2l;
chrish 0:785c2b62c4d1 507
chrish 0:785c2b62c4d1 508 int xr = x0;
chrish 0:785c2b62c4d1 509 int yr = y0;
chrish 0:785c2b62c4d1 510 int xre = x2;
chrish 0:785c2b62c4d1 511 int yre = y2;
chrish 0:785c2b62c4d1 512 int dxr = abs(x2-x0), sxr = x0 < x2 ? 1 : -1;
chrish 0:785c2b62c4d1 513 int dyr = -abs(y2-y0), syr = y0 < y2 ? 1 : -1;
chrish 0:785c2b62c4d1 514 int errr = dxr + dyr, e2r;
chrish 0:785c2b62c4d1 515
chrish 0:785c2b62c4d1 516 int xlp = xl;
chrish 0:785c2b62c4d1 517 int xrp = xr;
chrish 0:785c2b62c4d1 518
chrish 0:785c2b62c4d1 519 do {
chrish 0:785c2b62c4d1 520 if(yl <= yr && (xl != xle || yl != yle)) {
chrish 0:785c2b62c4d1 521 e2l = 2*errl;
chrish 0:785c2b62c4d1 522 if (e2l >= dyl && xl != xle) {
chrish 0:785c2b62c4d1 523 errl += dyl; xl += sxl;
chrish 0:785c2b62c4d1 524 }
chrish 0:785c2b62c4d1 525
chrish 0:785c2b62c4d1 526 if (e2l <= dxl && yl != yle) {
chrish 0:785c2b62c4d1 527 errl += dxl; yl += syl;
chrish 0:785c2b62c4d1 528
chrish 0:785c2b62c4d1 529 if(yl == yr) {
chrish 0:785c2b62c4d1 530 //lcd_drawHorizontalLine(lcd, xlp, yl-1, xrp-xlp+1, color);
chrish 0:785c2b62c4d1 531
chrish 0:785c2b62c4d1 532 lcd_setColumn(lcd, xlp, xrp);
chrish 0:785c2b62c4d1 533 lcd_setPage(lcd, yl-1, yl-1);
chrish 0:785c2b62c4d1 534 lcd_writeCommand(lcd, 0x2c);
chrish 0:785c2b62c4d1 535 for(int i=0; i < xrp-xlp; i++)
chrish 0:785c2b62c4d1 536 lcd_writeData16(lcd, color);
chrish 0:785c2b62c4d1 537
chrish 0:785c2b62c4d1 538 xlp = xl;
chrish 0:785c2b62c4d1 539 xrp = xr;
chrish 0:785c2b62c4d1 540 }
chrish 0:785c2b62c4d1 541 }else {
chrish 0:785c2b62c4d1 542 if(sxl < 0) {
chrish 0:785c2b62c4d1 543 xlp = xl;
chrish 0:785c2b62c4d1 544 }
chrish 0:785c2b62c4d1 545 }
chrish 0:785c2b62c4d1 546 }else if (yle < yre) {
chrish 0:785c2b62c4d1 547 dxl = abs(xl-x2);
chrish 0:785c2b62c4d1 548 sxl = xl < x2 ? 1 : -1;
chrish 0:785c2b62c4d1 549 dyl = -abs(yl-y2);
chrish 0:785c2b62c4d1 550 syl = 1;
chrish 0:785c2b62c4d1 551 xle = x2;
chrish 0:785c2b62c4d1 552 yle = y2;
chrish 0:785c2b62c4d1 553 errl = dxl + dyl;
chrish 0:785c2b62c4d1 554 }
chrish 0:785c2b62c4d1 555
chrish 0:785c2b62c4d1 556 if(yr <= yl && (xr != xre || yr != yre)) {
chrish 0:785c2b62c4d1 557 e2r = 2*errr;
chrish 0:785c2b62c4d1 558 if (e2r >= dyr && xr != xre) {
chrish 0:785c2b62c4d1 559 errr += dyr; xr += sxr;
chrish 0:785c2b62c4d1 560 }
chrish 0:785c2b62c4d1 561
chrish 0:785c2b62c4d1 562 if (e2r <= dxr && yr != yre) {
chrish 0:785c2b62c4d1 563 errr += dxr; yr += syr;
chrish 0:785c2b62c4d1 564
chrish 0:785c2b62c4d1 565 if(yl==yr) {
chrish 0:785c2b62c4d1 566 //lcd_drawHorizontalLine(lcd, xlp, yl-1, xrp-xlp+1, color);
chrish 0:785c2b62c4d1 567
chrish 0:785c2b62c4d1 568 lcd_setColumn(lcd, xlp, xrp);
chrish 0:785c2b62c4d1 569 lcd_setPage(lcd, yl-1, yl-1);
chrish 0:785c2b62c4d1 570 lcd_writeCommand(lcd, 0x2c);
chrish 0:785c2b62c4d1 571 for(int i=0; i < xrp-xlp; i++)
chrish 0:785c2b62c4d1 572 lcd_writeData16(lcd, color);
chrish 0:785c2b62c4d1 573
chrish 0:785c2b62c4d1 574 xlp = xl;
chrish 0:785c2b62c4d1 575 xrp = xr;
chrish 0:785c2b62c4d1 576 }
chrish 0:785c2b62c4d1 577 }else {
chrish 0:785c2b62c4d1 578 if(sxr > 0) {
chrish 0:785c2b62c4d1 579 xrp = xr;
chrish 0:785c2b62c4d1 580 }
chrish 0:785c2b62c4d1 581 }
chrish 0:785c2b62c4d1 582
chrish 0:785c2b62c4d1 583 }else if (yre < yle) {
chrish 0:785c2b62c4d1 584 dxr = abs(xr-x1);
chrish 0:785c2b62c4d1 585 dyr = -abs(yr-y1);
chrish 0:785c2b62c4d1 586 sxr = xr < x1 ? 1 : -1;
chrish 0:785c2b62c4d1 587 syr = 1;
chrish 0:785c2b62c4d1 588 xre = x1;
chrish 0:785c2b62c4d1 589 yre = y1;
chrish 0:785c2b62c4d1 590 errr = dxr + dyr;
chrish 0:785c2b62c4d1 591 }
chrish 0:785c2b62c4d1 592 }while ((xl < xle || yl < yle || xr < xre || yr < yre));
chrish 0:785c2b62c4d1 593
chrish 0:785c2b62c4d1 594 lcd_setColumn(lcd, xlp, xrp);
chrish 0:785c2b62c4d1 595 lcd_setPage(lcd, yl, yl);
chrish 0:785c2b62c4d1 596 lcd_writeCommand(lcd, 0x2c);
chrish 0:785c2b62c4d1 597 for(int i=0; i < xrp-xlp; i++)
chrish 0:785c2b62c4d1 598 lcd_writeData16(lcd, color);
chrish 0:785c2b62c4d1 599 }
chrish 0:785c2b62c4d1 600
chrish 0:785c2b62c4d1 601 void lcd_drawCircle(lcd_t * lcd, int x, int y, int radius, int color)
chrish 0:785c2b62c4d1 602 {
chrish 0:785c2b62c4d1 603 if(lcd->mode==LANDSCAPE) {
chrish 0:785c2b62c4d1 604 y=x^y;
chrish 0:785c2b62c4d1 605 x=x^y;
chrish 0:785c2b62c4d1 606 y=x^y;
chrish 0:785c2b62c4d1 607 x=239-x;
chrish 0:785c2b62c4d1 608 }
chrish 0:785c2b62c4d1 609
chrish 0:785c2b62c4d1 610 int dx = -radius, dy = 0, err = 2-2*radius, e2;
chrish 0:785c2b62c4d1 611 do {
chrish 0:785c2b62c4d1 612 lcd_setPixel(lcd, x-dx, y+dy, color);
chrish 0:785c2b62c4d1 613 lcd_setPixel(lcd, x+dx, y+dy, color);
chrish 0:785c2b62c4d1 614 lcd_setPixel(lcd, x+dx, y-dy, color);
chrish 0:785c2b62c4d1 615 lcd_setPixel(lcd, x-dx, y-dy, color);
chrish 0:785c2b62c4d1 616 e2 = err;
chrish 0:785c2b62c4d1 617 if (e2 <= dy) {
chrish 0:785c2b62c4d1 618 err += ++dy*2+1;
chrish 0:785c2b62c4d1 619 if (-dx == dy && e2 <= dx) e2 = 0;
chrish 0:785c2b62c4d1 620 }
chrish 0:785c2b62c4d1 621 if (e2 > dx) err += ++dx*2+1;
chrish 0:785c2b62c4d1 622 } while (dx <= 0);
chrish 0:785c2b62c4d1 623 }
chrish 0:785c2b62c4d1 624
chrish 0:785c2b62c4d1 625 void lcd_drawChar(lcd_t * lcd, char c, int x, int y, uint16_t size, uint16_t color)
chrish 0:785c2b62c4d1 626 {
chrish 0:785c2b62c4d1 627 if(!(c >= 32) && (c <= 127)) {
chrish 0:785c2b62c4d1 628 c = '?'-32;
chrish 0:785c2b62c4d1 629 }
chrish 0:785c2b62c4d1 630
chrish 0:785c2b62c4d1 631 for (int i =0; i < FONT_X; i++ ) {
chrish 0:785c2b62c4d1 632 uint8_t temp = simpleFont[c-32][i];
chrish 0:785c2b62c4d1 633 for(uint8_t f = 0; f < 8; f++) {
chrish 0:785c2b62c4d1 634 if((temp>>f)&0x01) {
chrish 0:785c2b62c4d1 635 lcd_fillRectangle(lcd, x+i*size, y+f*size, size, size, color);
chrish 0:785c2b62c4d1 636 }
chrish 0:785c2b62c4d1 637 #if 1 /* Hintergrund ebenfalls setzen */
chrish 0:785c2b62c4d1 638 else{
chrish 0:785c2b62c4d1 639 lcd_fillRectangle(lcd, x+i*size, y+f*size, size, size, WHITE);
chrish 0:785c2b62c4d1 640 }
chrish 0:785c2b62c4d1 641 #endif
chrish 0:785c2b62c4d1 642 }
chrish 0:785c2b62c4d1 643 }
chrish 0:785c2b62c4d1 644 }
chrish 0:785c2b62c4d1 645
chrish 0:785c2b62c4d1 646 void lcd_drawString(lcd_t * lcd, char * ca, int x, int y, uint16_t size, uint16_t color)
chrish 0:785c2b62c4d1 647 {
chrish 0:785c2b62c4d1 648 while(*ca) {
chrish 0:785c2b62c4d1 649 lcd_drawChar(lcd, *ca, x, y, size, color);
chrish 0:785c2b62c4d1 650 *ca++;
chrish 0:785c2b62c4d1 651
chrish 0:785c2b62c4d1 652 if(x < MAX_X) {
chrish 0:785c2b62c4d1 653 x += FONT_SPACE*size; /* Move cursor right */
chrish 0:785c2b62c4d1 654 }
chrish 0:785c2b62c4d1 655 }
chrish 0:785c2b62c4d1 656 }
chrish 0:785c2b62c4d1 657
chrish 0:785c2b62c4d1 658 uint8_t lcd_drawNumber(lcd_t * lcd, long long_num, int x, int y, uint16_t size, uint16_t color)
chrish 0:785c2b62c4d1 659 {
chrish 0:785c2b62c4d1 660 uint8_t char_buffer[10] = "";
chrish 0:785c2b62c4d1 661 uint8_t i = 0;
chrish 0:785c2b62c4d1 662 uint8_t f = 0;
chrish 0:785c2b62c4d1 663
chrish 0:785c2b62c4d1 664 if(long_num < 0) {
chrish 0:785c2b62c4d1 665 f = 1;
chrish 0:785c2b62c4d1 666 lcd_drawChar(lcd, '-', x, y, size, color);
chrish 0:785c2b62c4d1 667 long_num = -long_num;
chrish 0:785c2b62c4d1 668
chrish 0:785c2b62c4d1 669 if(x < MAX_X) {
chrish 0:785c2b62c4d1 670 x += FONT_SPACE*size; /* Move cursor right */
chrish 0:785c2b62c4d1 671 }
chrish 0:785c2b62c4d1 672 }else if(long_num == 0) {
chrish 0:785c2b62c4d1 673 f = 1;
chrish 0:785c2b62c4d1 674 lcd_drawChar(lcd, '0', x, y, size, color);
chrish 0:785c2b62c4d1 675 return f; //<-- Bullshit -->
chrish 0:785c2b62c4d1 676
chrish 0:785c2b62c4d1 677 //if(x < MAX_X) {
chrish 0:785c2b62c4d1 678 // x += FONT_SPACE*size; /* Move cursor right */
chrish 0:785c2b62c4d1 679 //}
chrish 0:785c2b62c4d1 680 }
chrish 0:785c2b62c4d1 681
chrish 0:785c2b62c4d1 682 while (long_num > 0) {
chrish 0:785c2b62c4d1 683 char_buffer[i++] = long_num % 10;
chrish 0:785c2b62c4d1 684 long_num /= 10;
chrish 0:785c2b62c4d1 685 }
chrish 0:785c2b62c4d1 686
chrish 0:785c2b62c4d1 687 f = f+i;
chrish 0:785c2b62c4d1 688
chrish 0:785c2b62c4d1 689 for(; i > 0; i--) {
chrish 0:785c2b62c4d1 690 lcd_drawChar(lcd, '0' + char_buffer[i - 1], x, y, size, color);
chrish 0:785c2b62c4d1 691
chrish 0:785c2b62c4d1 692 if(x < MAX_X) {
chrish 0:785c2b62c4d1 693 x += FONT_SPACE*size; /* Move cursor right */
chrish 0:785c2b62c4d1 694 }
chrish 0:785c2b62c4d1 695 }
chrish 0:785c2b62c4d1 696
chrish 0:785c2b62c4d1 697 return f;
chrish 0:785c2b62c4d1 698 }
chrish 0:785c2b62c4d1 699
chrish 0:785c2b62c4d1 700 uint8_t lcd_drawFloat(lcd_t * lcd, float floatNumber, uint8_t decimal, int x, int y, uint16_t size, uint16_t color)
chrish 0:785c2b62c4d1 701 {
chrish 0:785c2b62c4d1 702 uint16_t temp = 0;
chrish 0:785c2b62c4d1 703 float decy = 0.0;
chrish 0:785c2b62c4d1 704 float rounding = 0.5;
chrish 0:785c2b62c4d1 705 uint8_t f = 0;
chrish 0:785c2b62c4d1 706
chrish 0:785c2b62c4d1 707 if(floatNumber < 0.0)
chrish 0:785c2b62c4d1 708 {
chrish 0:785c2b62c4d1 709 lcd_drawChar(lcd, '-', x, y, size, color);
chrish 0:785c2b62c4d1 710 floatNumber = -floatNumber;
chrish 0:785c2b62c4d1 711 if(x < MAX_X)
chrish 0:785c2b62c4d1 712 {
chrish 0:785c2b62c4d1 713 x += FONT_SPACE * size; /* Move cursor right */
chrish 0:785c2b62c4d1 714 }
chrish 0:785c2b62c4d1 715 f = 1;
chrish 0:785c2b62c4d1 716 }
chrish 0:785c2b62c4d1 717
chrish 0:785c2b62c4d1 718 for(uint8_t i = 0; i < decimal; ++i)
chrish 0:785c2b62c4d1 719 {
chrish 0:785c2b62c4d1 720 rounding /= 10.0;
chrish 0:785c2b62c4d1 721 }
chrish 0:785c2b62c4d1 722 floatNumber += rounding;
chrish 0:785c2b62c4d1 723
chrish 0:785c2b62c4d1 724 temp = (uint16_t)floatNumber;
chrish 0:785c2b62c4d1 725 uint8_t howlong = lcd_drawNumber(lcd, temp, x, y, size, color);
chrish 0:785c2b62c4d1 726 f += howlong;
chrish 0:785c2b62c4d1 727
chrish 0:785c2b62c4d1 728 if((x+8*size*howlong) < MAX_X)
chrish 0:785c2b62c4d1 729 {
chrish 0:785c2b62c4d1 730 x += FONT_SPACE * size * howlong; /* Move cursor right */
chrish 0:785c2b62c4d1 731 }
chrish 0:785c2b62c4d1 732
chrish 0:785c2b62c4d1 733 if(decimal > 0)
chrish 0:785c2b62c4d1 734 {
chrish 0:785c2b62c4d1 735 lcd_drawChar(lcd, '.', x, y, size, color);
chrish 0:785c2b62c4d1 736 if(x < MAX_X)
chrish 0:785c2b62c4d1 737 {
chrish 0:785c2b62c4d1 738 x += FONT_SPACE * size; /* Move cursor right */
chrish 0:785c2b62c4d1 739 }
chrish 0:785c2b62c4d1 740 f += 1;
chrish 0:785c2b62c4d1 741 }
chrish 0:785c2b62c4d1 742
chrish 0:785c2b62c4d1 743 decy = floatNumber - temp;
chrish 0:785c2b62c4d1 744 /* decimal part, 4 */
chrish 0:785c2b62c4d1 745 for(uint8_t i = 0; i < decimal; i++)
chrish 0:785c2b62c4d1 746 {
chrish 0:785c2b62c4d1 747 decy *= 10; /* for the next decimal */
chrish 0:785c2b62c4d1 748 temp = decy; /* get the decimal */
chrish 0:785c2b62c4d1 749 lcd_drawNumber(lcd, temp, x, y, size, color);
chrish 0:785c2b62c4d1 750 floatNumber = -floatNumber;
chrish 0:785c2b62c4d1 751
chrish 0:785c2b62c4d1 752 if(x < MAX_X)
chrish 0:785c2b62c4d1 753 {
chrish 0:785c2b62c4d1 754 x += FONT_SPACE * size; /* Move cursor right */
chrish 0:785c2b62c4d1 755 }
chrish 0:785c2b62c4d1 756
chrish 0:785c2b62c4d1 757 decy -= temp;
chrish 0:785c2b62c4d1 758 }
chrish 0:785c2b62c4d1 759
chrish 0:785c2b62c4d1 760 f += decimal;
chrish 0:785c2b62c4d1 761 return f;
chrish 0:785c2b62c4d1 762 }