teste

Dependencies:   BurstSPI Fonts

Committer:
sergionatan
Date:
Tue Oct 24 20:12:54 2017 +0000
Revision:
0:cf17b1f16335
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sergionatan 0:cf17b1f16335 1 // ST7735 8 Bit SPI Library
sergionatan 0:cf17b1f16335 2
sergionatan 0:cf17b1f16335 3
sergionatan 0:cf17b1f16335 4 #include "ST7735_TFT.h"
sergionatan 0:cf17b1f16335 5 #include "mbed.h"
sergionatan 0:cf17b1f16335 6
sergionatan 0:cf17b1f16335 7 #define BPP 16 // Bits per pixel
sergionatan 0:cf17b1f16335 8
sergionatan 0:cf17b1f16335 9 ST7735_TFT::ST7735_TFT(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName rs, PinName reset, const char *name)
sergionatan 0:cf17b1f16335 10 : GraphicsDisplay(name),_spi(mosi, miso, sclk), _cs(cs), _rs(rs), _reset(reset)
sergionatan 0:cf17b1f16335 11 {
sergionatan 0:cf17b1f16335 12 tft_reset();
sergionatan 0:cf17b1f16335 13 orientation = 2;
sergionatan 0:cf17b1f16335 14 char_x = 0;
sergionatan 0:cf17b1f16335 15 }
sergionatan 0:cf17b1f16335 16 int ST7735_TFT::width() {
sergionatan 0:cf17b1f16335 17 if (orientation == 0 || orientation == 2) return 128;
sergionatan 0:cf17b1f16335 18 else return 160;
sergionatan 0:cf17b1f16335 19 }
sergionatan 0:cf17b1f16335 20 int ST7735_TFT::height() {
sergionatan 0:cf17b1f16335 21 if (orientation == 0 || orientation == 2) return 160;
sergionatan 0:cf17b1f16335 22 else return 128;
sergionatan 0:cf17b1f16335 23 }
sergionatan 0:cf17b1f16335 24 void ST7735_TFT::set_orientation(unsigned int o) {
sergionatan 0:cf17b1f16335 25 orientation = o;
sergionatan 0:cf17b1f16335 26 switch (orientation) {
sergionatan 0:cf17b1f16335 27 case 0:
sergionatan 0:cf17b1f16335 28 wr_reg(ST7735_MADCTL, 0x0008);
sergionatan 0:cf17b1f16335 29 break;
sergionatan 0:cf17b1f16335 30 case 1:
sergionatan 0:cf17b1f16335 31 wr_reg(ST7735_MADCTL, 0x0068);
sergionatan 0:cf17b1f16335 32 break;
sergionatan 0:cf17b1f16335 33 case 2:
sergionatan 0:cf17b1f16335 34 wr_reg(ST7735_MADCTL, 0x00C8);
sergionatan 0:cf17b1f16335 35 break;
sergionatan 0:cf17b1f16335 36 case 3:
sergionatan 0:cf17b1f16335 37 wr_reg(ST7735_MADCTL, 0x00A8);
sergionatan 0:cf17b1f16335 38 break;
sergionatan 0:cf17b1f16335 39 }
sergionatan 0:cf17b1f16335 40 }
sergionatan 0:cf17b1f16335 41 void ST7735_TFT::wr_cmd(int cmd) {
sergionatan 0:cf17b1f16335 42 _rs = 0; // rs low, cs low for transmitting command
sergionatan 0:cf17b1f16335 43 _cs = 0;
sergionatan 0:cf17b1f16335 44 _spi.write(cmd);
sergionatan 0:cf17b1f16335 45 _cs = 1;
sergionatan 0:cf17b1f16335 46 }
sergionatan 0:cf17b1f16335 47 void ST7735_TFT::wr_dat(int dat) {
sergionatan 0:cf17b1f16335 48 _rs = 1; // rs high, cs low for transmitting data
sergionatan 0:cf17b1f16335 49 _cs = 0;
sergionatan 0:cf17b1f16335 50 _spi.write(dat);
sergionatan 0:cf17b1f16335 51 _cs = 1;
sergionatan 0:cf17b1f16335 52 }
sergionatan 0:cf17b1f16335 53 void ST7735_TFT::wr_dat_start(void) {
sergionatan 0:cf17b1f16335 54 _rs = 1; // rs high, cs low for transmitting data
sergionatan 0:cf17b1f16335 55 _cs = 0;
sergionatan 0:cf17b1f16335 56 }
sergionatan 0:cf17b1f16335 57 void ST7735_TFT::wr_dat_stop (void) {
sergionatan 0:cf17b1f16335 58 _cs = 1;
sergionatan 0:cf17b1f16335 59 }
sergionatan 0:cf17b1f16335 60 void ST7735_TFT::wr_dat_only (unsigned short dat) {
sergionatan 0:cf17b1f16335 61 _spi.write(dat);
sergionatan 0:cf17b1f16335 62 }
sergionatan 0:cf17b1f16335 63 unsigned short ST7735_TFT::rd_dat (void) {
sergionatan 0:cf17b1f16335 64 unsigned short val = 0;
sergionatan 0:cf17b1f16335 65 _cs = 0;
sergionatan 0:cf17b1f16335 66 _spi.write(0); /* Dummy read 1 */
sergionatan 0:cf17b1f16335 67 val = _spi.write(0); /* Read D8..D15 */
sergionatan 0:cf17b1f16335 68 val <<= 8;
sergionatan 0:cf17b1f16335 69 val |= _spi.write(0); /* Read D0..D7 */
sergionatan 0:cf17b1f16335 70 _cs = 1;
sergionatan 0:cf17b1f16335 71 return (val);
sergionatan 0:cf17b1f16335 72 }
sergionatan 0:cf17b1f16335 73 void ST7735_TFT::wr_reg (unsigned char reg, unsigned short val) {
sergionatan 0:cf17b1f16335 74
sergionatan 0:cf17b1f16335 75 wr_cmd(reg);
sergionatan 0:cf17b1f16335 76 wr_dat(val);
sergionatan 0:cf17b1f16335 77 }
sergionatan 0:cf17b1f16335 78 unsigned short ST7735_TFT::rd_reg (unsigned char reg) {
sergionatan 0:cf17b1f16335 79
sergionatan 0:cf17b1f16335 80 wr_cmd(reg);
sergionatan 0:cf17b1f16335 81 return(rd_dat());
sergionatan 0:cf17b1f16335 82 }
sergionatan 0:cf17b1f16335 83 void ST7735_TFT::read_area(unsigned int x, unsigned int y, unsigned int w, unsigned int h,unsigned char *buffer) {
sergionatan 0:cf17b1f16335 84 // BEWARE !
sergionatan 0:cf17b1f16335 85 // DOES NOT WORK CORRECTLY YET !!!
sergionatan 0:cf17b1f16335 86 int val;
sergionatan 0:cf17b1f16335 87 window(x,y,w,h);
sergionatan 0:cf17b1f16335 88 wr_cmd(ST7735_RAMRD); // write to RAM
sergionatan 0:cf17b1f16335 89 _cs = 0;
sergionatan 0:cf17b1f16335 90 _rs = 1;
sergionatan 0:cf17b1f16335 91 _spi.write(0); /* Dummy read 1 */
sergionatan 0:cf17b1f16335 92
sergionatan 0:cf17b1f16335 93 val = _spi.write(0); /* Read D8..D15 */
sergionatan 0:cf17b1f16335 94 val <<= 8;
sergionatan 0:cf17b1f16335 95 val |= _spi.write(0); /* Read D0..D7 */
sergionatan 0:cf17b1f16335 96 _cs = 1;
sergionatan 0:cf17b1f16335 97 }
sergionatan 0:cf17b1f16335 98 int ST7735_TFT::getpixel(unsigned int x, unsigned int y) {
sergionatan 0:cf17b1f16335 99 // BEWARE !
sergionatan 0:cf17b1f16335 100 // DOES NOT WORK CORRECTLY YET !!!
sergionatan 0:cf17b1f16335 101 int val;
sergionatan 0:cf17b1f16335 102 // _spi.format(8,3);
sergionatan 0:cf17b1f16335 103 wr_cmd(ST7735_CASET); // column addr set
sergionatan 0:cf17b1f16335 104 wr_dat(0x00);
sergionatan 0:cf17b1f16335 105 wr_dat(x+2); // XSTART
sergionatan 0:cf17b1f16335 106 wr_dat(0x00);
sergionatan 0:cf17b1f16335 107 wr_dat(x+2+2); // XEND
sergionatan 0:cf17b1f16335 108
sergionatan 0:cf17b1f16335 109 wr_cmd(ST7735_RASET); // row addr set
sergionatan 0:cf17b1f16335 110 wr_dat(0x00);
sergionatan 0:cf17b1f16335 111 wr_dat(y+1); // YSTART
sergionatan 0:cf17b1f16335 112 wr_dat(0x00);
sergionatan 0:cf17b1f16335 113 wr_dat(y+1+1); // YEND
sergionatan 0:cf17b1f16335 114
sergionatan 0:cf17b1f16335 115 _rs = 0; // rs low, cs low for transmitting command
sergionatan 0:cf17b1f16335 116 _cs = 0;
sergionatan 0:cf17b1f16335 117 _spi.write(0x2E);
sergionatan 0:cf17b1f16335 118 _rs = 1;
sergionatan 0:cf17b1f16335 119 _spi.write(0x00); /* Dummy read 1 */
sergionatan 0:cf17b1f16335 120
sergionatan 0:cf17b1f16335 121 val = _spi.write(0x00); /* Read D8..D15 */
sergionatan 0:cf17b1f16335 122 val <<= 8;
sergionatan 0:cf17b1f16335 123 val |= _spi.write(0x00); /* Read D0..D7 */
sergionatan 0:cf17b1f16335 124
sergionatan 0:cf17b1f16335 125 _cs = 1;
sergionatan 0:cf17b1f16335 126 return val;
sergionatan 0:cf17b1f16335 127 }
sergionatan 0:cf17b1f16335 128 void ST7735_TFT::tft_reset() {
sergionatan 0:cf17b1f16335 129 // init SPI
sergionatan 0:cf17b1f16335 130 _spi.format(8,3); // 8 bit spi mode 3
sergionatan 0:cf17b1f16335 131 _spi.frequency(15000000); // 16Mhz SPI clock ... 15Mhz is maximum for display, but it seems to work
sergionatan 0:cf17b1f16335 132 _cs = 0;
sergionatan 0:cf17b1f16335 133 _reset = 1; // reset
sergionatan 0:cf17b1f16335 134 wait_ms(10);
sergionatan 0:cf17b1f16335 135 _reset = 0; // reset
sergionatan 0:cf17b1f16335 136 wait_ms(10);
sergionatan 0:cf17b1f16335 137 _reset = 1; // reset
sergionatan 0:cf17b1f16335 138 wait_ms(10);
sergionatan 0:cf17b1f16335 139
sergionatan 0:cf17b1f16335 140 /* Start Initial Sequence ----------------------------------------------------*/
sergionatan 0:cf17b1f16335 141 wr_cmd(ST7735_SWRESET); /* SW Reset */
sergionatan 0:cf17b1f16335 142 wait_ms(150);
sergionatan 0:cf17b1f16335 143 wr_cmd(ST7735_SLPOUT); /* Out of sleepmode */
sergionatan 0:cf17b1f16335 144 wait_ms(500);
sergionatan 0:cf17b1f16335 145
sergionatan 0:cf17b1f16335 146 wr_cmd(ST7735_FRMCTR1); /* Frame rate in normal mode */
sergionatan 0:cf17b1f16335 147 wr_dat(0x01);
sergionatan 0:cf17b1f16335 148 wr_dat(0x2C);
sergionatan 0:cf17b1f16335 149 wr_dat(0x2D);
sergionatan 0:cf17b1f16335 150
sergionatan 0:cf17b1f16335 151 wr_cmd(ST7735_FRMCTR2); /* Frame rate in idle mode */
sergionatan 0:cf17b1f16335 152 wr_dat(0x01);
sergionatan 0:cf17b1f16335 153 wr_dat(0x2C);
sergionatan 0:cf17b1f16335 154 wr_dat(0x2D);
sergionatan 0:cf17b1f16335 155
sergionatan 0:cf17b1f16335 156 wr_cmd(ST7735_FRMCTR3); /* Frame rate in partial mode */
sergionatan 0:cf17b1f16335 157 wr_dat(0x01);
sergionatan 0:cf17b1f16335 158 wr_dat(0x2C);
sergionatan 0:cf17b1f16335 159 wr_dat(0x2D);
sergionatan 0:cf17b1f16335 160 wr_dat(0x01); // inversion mode settings
sergionatan 0:cf17b1f16335 161 wr_dat(0x2C);
sergionatan 0:cf17b1f16335 162 wr_dat(0x2D);
sergionatan 0:cf17b1f16335 163
sergionatan 0:cf17b1f16335 164 wr_cmd(ST7735_INVCTR); // Inverted mode off
sergionatan 0:cf17b1f16335 165 wr_dat(0x07);
sergionatan 0:cf17b1f16335 166
sergionatan 0:cf17b1f16335 167 wr_cmd(ST7735_PWCTR1); // POWER CONTROL 1
sergionatan 0:cf17b1f16335 168 wr_dat(0xA2);
sergionatan 0:cf17b1f16335 169 wr_dat(0x02); // -4.6V
sergionatan 0:cf17b1f16335 170 wr_dat(0x84); // AUTO mode
sergionatan 0:cf17b1f16335 171
sergionatan 0:cf17b1f16335 172 wr_cmd(ST7735_PWCTR2); // POWER CONTROL 2
sergionatan 0:cf17b1f16335 173 wr_dat(0xC5); // VGH25 = 2.4C VGSEL =-10 VGH = 3*AVDD
sergionatan 0:cf17b1f16335 174
sergionatan 0:cf17b1f16335 175 wr_cmd(ST7735_PWCTR3); // POWER CONTROL 3
sergionatan 0:cf17b1f16335 176 wr_dat(0x0A); // Opamp current small
sergionatan 0:cf17b1f16335 177 wr_dat(0x00); // Boost freq
sergionatan 0:cf17b1f16335 178
sergionatan 0:cf17b1f16335 179 wr_cmd(ST7735_PWCTR4); // POWER CONTROL 4
sergionatan 0:cf17b1f16335 180 wr_dat(0x8A); // BCLK/2, Opamp current small / medium low
sergionatan 0:cf17b1f16335 181 wr_dat(0x2A); //
sergionatan 0:cf17b1f16335 182
sergionatan 0:cf17b1f16335 183 wr_cmd(ST7735_PWCTR5); // POWER CONTROL 5
sergionatan 0:cf17b1f16335 184 wr_dat(0x8A); // BCLK/2, Opamp current small / medium low
sergionatan 0:cf17b1f16335 185 wr_dat(0xEE); //
sergionatan 0:cf17b1f16335 186
sergionatan 0:cf17b1f16335 187 wr_cmd(ST7735_VMCTR1); // POWER CONTROL 6
sergionatan 0:cf17b1f16335 188 wr_dat(0x0E); //
sergionatan 0:cf17b1f16335 189
sergionatan 0:cf17b1f16335 190 wr_cmd(ST7735_INVOFF); // INVOFF
sergionatan 0:cf17b1f16335 191
sergionatan 0:cf17b1f16335 192 wr_cmd(ST7735_MADCTL); // ORIENTATION
sergionatan 0:cf17b1f16335 193 wr_dat(0xC8); //
sergionatan 0:cf17b1f16335 194
sergionatan 0:cf17b1f16335 195 wr_cmd(ST7735_COLMOD); // COLOR MODE
sergionatan 0:cf17b1f16335 196 wr_dat(0x05); //
sergionatan 0:cf17b1f16335 197
sergionatan 0:cf17b1f16335 198 wr_cmd(ST7735_CASET); // COLUMN ADDR SET
sergionatan 0:cf17b1f16335 199 wr_dat(0x00); //
sergionatan 0:cf17b1f16335 200 wr_dat(0x00); // xstart = 0
sergionatan 0:cf17b1f16335 201 wr_dat(0x00); //
sergionatan 0:cf17b1f16335 202 wr_dat(0x7F); // xend = 127
sergionatan 0:cf17b1f16335 203
sergionatan 0:cf17b1f16335 204 wr_cmd(ST7735_RASET); // ROW ADDR SET
sergionatan 0:cf17b1f16335 205 wr_dat(0x00); //
sergionatan 0:cf17b1f16335 206 wr_dat(0x00); // ystart = 0
sergionatan 0:cf17b1f16335 207 wr_dat(0x00); //
sergionatan 0:cf17b1f16335 208 wr_dat(0x9F); // yend = 159
sergionatan 0:cf17b1f16335 209
sergionatan 0:cf17b1f16335 210 /* Gamma settings -----------------------------------------------------------*/
sergionatan 0:cf17b1f16335 211
sergionatan 0:cf17b1f16335 212 wr_cmd(0xE0); // GMCTRP1
sergionatan 0:cf17b1f16335 213 wr_dat(0x02);
sergionatan 0:cf17b1f16335 214 wr_dat(0x1c);
sergionatan 0:cf17b1f16335 215 wr_dat(0x07);
sergionatan 0:cf17b1f16335 216 wr_dat(0x12);
sergionatan 0:cf17b1f16335 217 wr_dat(0x37);
sergionatan 0:cf17b1f16335 218 wr_dat(0x32);
sergionatan 0:cf17b1f16335 219 wr_dat(0x29);
sergionatan 0:cf17b1f16335 220 wr_dat(0x2d);
sergionatan 0:cf17b1f16335 221 wr_dat(0x29);
sergionatan 0:cf17b1f16335 222 wr_dat(0x25);
sergionatan 0:cf17b1f16335 223 wr_dat(0x2B);
sergionatan 0:cf17b1f16335 224 wr_dat(0x39);
sergionatan 0:cf17b1f16335 225 wr_dat(0x00);
sergionatan 0:cf17b1f16335 226 wr_dat(0x01);
sergionatan 0:cf17b1f16335 227 wr_dat(0x03);
sergionatan 0:cf17b1f16335 228 wr_dat(0x10);
sergionatan 0:cf17b1f16335 229 wr_cmd(0xE1); // GMCTRN1
sergionatan 0:cf17b1f16335 230 wr_dat(0x03);
sergionatan 0:cf17b1f16335 231 wr_dat(0x1d);
sergionatan 0:cf17b1f16335 232 wr_dat(0x07);
sergionatan 0:cf17b1f16335 233 wr_dat(0x06);
sergionatan 0:cf17b1f16335 234 wr_dat(0x2E);
sergionatan 0:cf17b1f16335 235 wr_dat(0x2C);
sergionatan 0:cf17b1f16335 236 wr_dat(0x29);
sergionatan 0:cf17b1f16335 237 wr_dat(0x2D);
sergionatan 0:cf17b1f16335 238 wr_dat(0x2E);
sergionatan 0:cf17b1f16335 239 wr_dat(0x2E);
sergionatan 0:cf17b1f16335 240 wr_dat(0x37);
sergionatan 0:cf17b1f16335 241 wr_dat(0x3F);
sergionatan 0:cf17b1f16335 242 wr_dat(0x00);
sergionatan 0:cf17b1f16335 243 wr_dat(0x00);
sergionatan 0:cf17b1f16335 244 wr_dat(0x02);
sergionatan 0:cf17b1f16335 245 wr_dat(0x10);
sergionatan 0:cf17b1f16335 246
sergionatan 0:cf17b1f16335 247 wr_cmd(ST7735_DISPON); // display ON
sergionatan 0:cf17b1f16335 248 wait_ms(100);
sergionatan 0:cf17b1f16335 249
sergionatan 0:cf17b1f16335 250 wr_cmd(ST7735_NORON); // normal display on
sergionatan 0:cf17b1f16335 251 wait_ms(10);
sergionatan 0:cf17b1f16335 252
sergionatan 0:cf17b1f16335 253 switch (orientation) {
sergionatan 0:cf17b1f16335 254 case 0:
sergionatan 0:cf17b1f16335 255 wr_reg(0xC8, 0x0008);
sergionatan 0:cf17b1f16335 256 break;
sergionatan 0:cf17b1f16335 257 case 1:
sergionatan 0:cf17b1f16335 258 wr_reg(0xC8, 0x0068);
sergionatan 0:cf17b1f16335 259 break;
sergionatan 0:cf17b1f16335 260 case 2:
sergionatan 0:cf17b1f16335 261 wr_reg(0xC8, 0x00C8);
sergionatan 0:cf17b1f16335 262 break;
sergionatan 0:cf17b1f16335 263 case 3:
sergionatan 0:cf17b1f16335 264 wr_reg(0xC8, 0x00A8);
sergionatan 0:cf17b1f16335 265 break;
sergionatan 0:cf17b1f16335 266 }
sergionatan 0:cf17b1f16335 267 WindowMax ();
sergionatan 0:cf17b1f16335 268 }
sergionatan 0:cf17b1f16335 269 void ST7735_TFT::pixel(int x, int y, int color) {
sergionatan 0:cf17b1f16335 270 if ((x >= width()) || (y >= height())) return;
sergionatan 0:cf17b1f16335 271 window(x,y,x+1,y+1);
sergionatan 0:cf17b1f16335 272 _rs = 1;
sergionatan 0:cf17b1f16335 273 _cs = 0;
sergionatan 0:cf17b1f16335 274 _spi.write(color);
sergionatan 0:cf17b1f16335 275 _spi.write(color>>8);
sergionatan 0:cf17b1f16335 276 _cs = 1;
sergionatan 0:cf17b1f16335 277 }
sergionatan 0:cf17b1f16335 278 void ST7735_TFT::window (unsigned int x, unsigned int y, unsigned int w, unsigned int h) {
sergionatan 0:cf17b1f16335 279 wr_cmd(ST7735_CASET); // column addr set
sergionatan 0:cf17b1f16335 280 wr_dat(0x00);
sergionatan 0:cf17b1f16335 281 wr_dat(x); // XSTART
sergionatan 0:cf17b1f16335 282 wr_dat(0x00);
sergionatan 0:cf17b1f16335 283 wr_dat(x+w-1); // XEND
sergionatan 0:cf17b1f16335 284 wr_cmd(ST7735_RASET); // row addr set
sergionatan 0:cf17b1f16335 285 wr_dat(0x00);
sergionatan 0:cf17b1f16335 286 wr_dat(y); // YSTART
sergionatan 0:cf17b1f16335 287 wr_dat(0x00);
sergionatan 0:cf17b1f16335 288 wr_dat(y+h-1); // YEND
sergionatan 0:cf17b1f16335 289 wr_cmd(ST7735_RAMWR); // write to RAM
sergionatan 0:cf17b1f16335 290 }
sergionatan 0:cf17b1f16335 291 void ST7735_TFT::WindowMax (void) {
sergionatan 0:cf17b1f16335 292 window (0, 0, width(), height());
sergionatan 0:cf17b1f16335 293 }
sergionatan 0:cf17b1f16335 294
sergionatan 0:cf17b1f16335 295 void ST7735_TFT::cls (void) {
sergionatan 0:cf17b1f16335 296 unsigned int i;
sergionatan 0:cf17b1f16335 297 WindowMax();
sergionatan 0:cf17b1f16335 298 wr_dat_start();
sergionatan 0:cf17b1f16335 299 for (i = 0; i < ( (width()) * (height())); i++) {
sergionatan 0:cf17b1f16335 300
sergionatan 0:cf17b1f16335 301 //_spi.write(_background>>8);
sergionatan 0:cf17b1f16335 302 //_spi.write(_background);
sergionatan 0:cf17b1f16335 303
sergionatan 0:cf17b1f16335 304 _spi.fastWrite(_background>>8);
sergionatan 0:cf17b1f16335 305 _spi.fastWrite(_background);
sergionatan 0:cf17b1f16335 306
sergionatan 0:cf17b1f16335 307 }
sergionatan 0:cf17b1f16335 308 _spi.clearRX();
sergionatan 0:cf17b1f16335 309 wr_dat_stop();
sergionatan 0:cf17b1f16335 310 }
sergionatan 0:cf17b1f16335 311 void ST7735_TFT::circle(int x0, int y0, int r, int color) {
sergionatan 0:cf17b1f16335 312 int draw_x0, draw_y0;
sergionatan 0:cf17b1f16335 313 int draw_x1, draw_y1;
sergionatan 0:cf17b1f16335 314 int draw_x2, draw_y2;
sergionatan 0:cf17b1f16335 315 int draw_x3, draw_y3;
sergionatan 0:cf17b1f16335 316 int draw_x4, draw_y4;
sergionatan 0:cf17b1f16335 317 int draw_x5, draw_y5;
sergionatan 0:cf17b1f16335 318 int draw_x6, draw_y6;
sergionatan 0:cf17b1f16335 319 int draw_x7, draw_y7;
sergionatan 0:cf17b1f16335 320 int xx, yy;
sergionatan 0:cf17b1f16335 321 int di;
sergionatan 0:cf17b1f16335 322 WindowMax();
sergionatan 0:cf17b1f16335 323 if (r == 0) { /* no radius */
sergionatan 0:cf17b1f16335 324 return;
sergionatan 0:cf17b1f16335 325 }
sergionatan 0:cf17b1f16335 326 draw_x0 = draw_x1 = x0;
sergionatan 0:cf17b1f16335 327 draw_y0 = draw_y1 = y0 + r;
sergionatan 0:cf17b1f16335 328 if (draw_y0 < height()) {
sergionatan 0:cf17b1f16335 329 pixel(draw_x0, draw_y0, color); /* 90 degree */
sergionatan 0:cf17b1f16335 330 }
sergionatan 0:cf17b1f16335 331 draw_x2 = draw_x3 = x0;
sergionatan 0:cf17b1f16335 332 draw_y2 = draw_y3 = y0 - r;
sergionatan 0:cf17b1f16335 333 if (draw_y2 >= 0) {
sergionatan 0:cf17b1f16335 334 pixel(draw_x2, draw_y2, color); /* 270 degree */
sergionatan 0:cf17b1f16335 335 }
sergionatan 0:cf17b1f16335 336 draw_x4 = draw_x6 = x0 + r;
sergionatan 0:cf17b1f16335 337 draw_y4 = draw_y6 = y0;
sergionatan 0:cf17b1f16335 338 if (draw_x4 < width()) {
sergionatan 0:cf17b1f16335 339 pixel(draw_x4, draw_y4, color); /* 0 degree */
sergionatan 0:cf17b1f16335 340 }
sergionatan 0:cf17b1f16335 341 draw_x5 = draw_x7 = x0 - r;
sergionatan 0:cf17b1f16335 342 draw_y5 = draw_y7 = y0;
sergionatan 0:cf17b1f16335 343 if (draw_x5>=0) {
sergionatan 0:cf17b1f16335 344 pixel(draw_x5, draw_y5, color); /* 180 degree */
sergionatan 0:cf17b1f16335 345 }
sergionatan 0:cf17b1f16335 346 if (r == 1) {
sergionatan 0:cf17b1f16335 347 return;
sergionatan 0:cf17b1f16335 348 }
sergionatan 0:cf17b1f16335 349 di = 3 - 2*r;
sergionatan 0:cf17b1f16335 350 xx = 0;
sergionatan 0:cf17b1f16335 351 yy = r;
sergionatan 0:cf17b1f16335 352 while (xx < yy) {
sergionatan 0:cf17b1f16335 353
sergionatan 0:cf17b1f16335 354 if (di < 0) {
sergionatan 0:cf17b1f16335 355 di += 4*xx + 6;
sergionatan 0:cf17b1f16335 356 } else {
sergionatan 0:cf17b1f16335 357 di += 4*(xx - yy) + 10;
sergionatan 0:cf17b1f16335 358 yy--;
sergionatan 0:cf17b1f16335 359 draw_y0--;
sergionatan 0:cf17b1f16335 360 draw_y1--;
sergionatan 0:cf17b1f16335 361 draw_y2++;
sergionatan 0:cf17b1f16335 362 draw_y3++;
sergionatan 0:cf17b1f16335 363 draw_x4--;
sergionatan 0:cf17b1f16335 364 draw_x5++;
sergionatan 0:cf17b1f16335 365 draw_x6--;
sergionatan 0:cf17b1f16335 366 draw_x7++;
sergionatan 0:cf17b1f16335 367 }
sergionatan 0:cf17b1f16335 368 xx++;
sergionatan 0:cf17b1f16335 369 draw_x0++;
sergionatan 0:cf17b1f16335 370 draw_x1--;
sergionatan 0:cf17b1f16335 371 draw_x2++;
sergionatan 0:cf17b1f16335 372 draw_x3--;
sergionatan 0:cf17b1f16335 373 draw_y4++;
sergionatan 0:cf17b1f16335 374 draw_y5++;
sergionatan 0:cf17b1f16335 375 draw_y6--;
sergionatan 0:cf17b1f16335 376 draw_y7--;
sergionatan 0:cf17b1f16335 377
sergionatan 0:cf17b1f16335 378 if ( (draw_x0 <= width()) && (draw_y0>=0) ) {
sergionatan 0:cf17b1f16335 379 pixel(draw_x0, draw_y0, color);
sergionatan 0:cf17b1f16335 380 }
sergionatan 0:cf17b1f16335 381 if ( (draw_x1 >= 0) && (draw_y1 >= 0) ) {
sergionatan 0:cf17b1f16335 382 pixel(draw_x1, draw_y1, color);
sergionatan 0:cf17b1f16335 383 }
sergionatan 0:cf17b1f16335 384 if ( (draw_x2 <= width()) && (draw_y2 <= height()) ) {
sergionatan 0:cf17b1f16335 385 pixel(draw_x2, draw_y2, color);
sergionatan 0:cf17b1f16335 386 }
sergionatan 0:cf17b1f16335 387 if ( (draw_x3 >=0 ) && (draw_y3 <= height()) ) {
sergionatan 0:cf17b1f16335 388 pixel(draw_x3, draw_y3, color);
sergionatan 0:cf17b1f16335 389 }
sergionatan 0:cf17b1f16335 390 if ( (draw_x4 <= width()) && (draw_y4 >= 0) ) {
sergionatan 0:cf17b1f16335 391 pixel(draw_x4, draw_y4, color);
sergionatan 0:cf17b1f16335 392 }
sergionatan 0:cf17b1f16335 393 if ( (draw_x5 >= 0) && (draw_y5 >= 0) ) {
sergionatan 0:cf17b1f16335 394 pixel(draw_x5, draw_y5, color);
sergionatan 0:cf17b1f16335 395 }
sergionatan 0:cf17b1f16335 396 if ( (draw_x6 <=width()) && (draw_y6 <= height()) ) {
sergionatan 0:cf17b1f16335 397 pixel(draw_x6, draw_y6, color);
sergionatan 0:cf17b1f16335 398 }
sergionatan 0:cf17b1f16335 399 if ( (draw_x7 >= 0) && (draw_y7 <= height()) ) {
sergionatan 0:cf17b1f16335 400 pixel(draw_x7, draw_y7, color);
sergionatan 0:cf17b1f16335 401 }
sergionatan 0:cf17b1f16335 402 }
sergionatan 0:cf17b1f16335 403 return;
sergionatan 0:cf17b1f16335 404 }
sergionatan 0:cf17b1f16335 405 void ST7735_TFT::fillcircle(int x, int y, int r, int color) {
sergionatan 0:cf17b1f16335 406 int i;
sergionatan 0:cf17b1f16335 407 for (i = 0; i <= r; i++)
sergionatan 0:cf17b1f16335 408 circle(x,y,i,color);
sergionatan 0:cf17b1f16335 409 }
sergionatan 0:cf17b1f16335 410 void ST7735_TFT::hline(int x0, int x1, int y, int color) {
sergionatan 0:cf17b1f16335 411 int w;
sergionatan 0:cf17b1f16335 412 w = x1 - x0 + 1;
sergionatan 0:cf17b1f16335 413 window(x0,y,w,1);
sergionatan 0:cf17b1f16335 414 wr_cmd(0x2C);
sergionatan 0:cf17b1f16335 415 wr_dat_start();
sergionatan 0:cf17b1f16335 416 for (int x=0; x<w; x++) {
sergionatan 0:cf17b1f16335 417 //_spi.write(color);
sergionatan 0:cf17b1f16335 418 //_spi.write(color >> 8);
sergionatan 0:cf17b1f16335 419 _spi.fastWrite(color>>8);
sergionatan 0:cf17b1f16335 420 _spi.fastWrite(color);
sergionatan 0:cf17b1f16335 421 }
sergionatan 0:cf17b1f16335 422 _spi.clearRX();
sergionatan 0:cf17b1f16335 423 wr_dat_stop();
sergionatan 0:cf17b1f16335 424 return;
sergionatan 0:cf17b1f16335 425 }
sergionatan 0:cf17b1f16335 426 void ST7735_TFT::vline(int x, int y0, int y1, int color) {
sergionatan 0:cf17b1f16335 427 int h;
sergionatan 0:cf17b1f16335 428 h = y1 - y0 + 1;
sergionatan 0:cf17b1f16335 429 window(x,y0,1,h);
sergionatan 0:cf17b1f16335 430 wr_cmd(0x2C);
sergionatan 0:cf17b1f16335 431 wr_dat_start();
sergionatan 0:cf17b1f16335 432 for (int y=0; y<h; y++) {
sergionatan 0:cf17b1f16335 433 //_spi.write(color);
sergionatan 0:cf17b1f16335 434 //_spi.write(color >> 8);
sergionatan 0:cf17b1f16335 435 _spi.fastWrite(color>>8);
sergionatan 0:cf17b1f16335 436 _spi.fastWrite(color);
sergionatan 0:cf17b1f16335 437 }
sergionatan 0:cf17b1f16335 438 _spi.clearRX();
sergionatan 0:cf17b1f16335 439 wr_dat_stop();
sergionatan 0:cf17b1f16335 440 return;
sergionatan 0:cf17b1f16335 441 }
sergionatan 0:cf17b1f16335 442 void ST7735_TFT::line(int x0, int y0, int x1, int y1, int color) {
sergionatan 0:cf17b1f16335 443 WindowMax();
sergionatan 0:cf17b1f16335 444 int dx = 0, dy = 0;
sergionatan 0:cf17b1f16335 445 int dx_sym = 0, dy_sym = 0;
sergionatan 0:cf17b1f16335 446 int dx_x2 = 0, dy_x2 = 0;
sergionatan 0:cf17b1f16335 447 int di = 0;
sergionatan 0:cf17b1f16335 448 dx = x1-x0;
sergionatan 0:cf17b1f16335 449 dy = y1-y0;
sergionatan 0:cf17b1f16335 450
sergionatan 0:cf17b1f16335 451 if (dx == 0) { /* vertical line */
sergionatan 0:cf17b1f16335 452 if (y1 > y0) vline(x0,y0,y1,color);
sergionatan 0:cf17b1f16335 453 else vline(x0,y1,y0,color);
sergionatan 0:cf17b1f16335 454 return;
sergionatan 0:cf17b1f16335 455 }
sergionatan 0:cf17b1f16335 456 if (dx > 0) {
sergionatan 0:cf17b1f16335 457 dx_sym = 1;
sergionatan 0:cf17b1f16335 458 } else {
sergionatan 0:cf17b1f16335 459 dx_sym = -1;
sergionatan 0:cf17b1f16335 460 }
sergionatan 0:cf17b1f16335 461 if (dy == 0) { /* horizontal line */
sergionatan 0:cf17b1f16335 462 if (x1 > x0) hline(x0,x1,y0,color);
sergionatan 0:cf17b1f16335 463 else hline(x1,x0,y0,color);
sergionatan 0:cf17b1f16335 464 return;
sergionatan 0:cf17b1f16335 465 }
sergionatan 0:cf17b1f16335 466 if (dy > 0) {
sergionatan 0:cf17b1f16335 467 dy_sym = 1;
sergionatan 0:cf17b1f16335 468 } else {
sergionatan 0:cf17b1f16335 469 dy_sym = -1;
sergionatan 0:cf17b1f16335 470 }
sergionatan 0:cf17b1f16335 471 dx = dx_sym*dx;
sergionatan 0:cf17b1f16335 472 dy = dy_sym*dy;
sergionatan 0:cf17b1f16335 473 dx_x2 = dx*2;
sergionatan 0:cf17b1f16335 474 dy_x2 = dy*2;
sergionatan 0:cf17b1f16335 475 if (dx >= dy) {
sergionatan 0:cf17b1f16335 476 di = dy_x2 - dx;
sergionatan 0:cf17b1f16335 477 while (x0 != x1) {
sergionatan 0:cf17b1f16335 478
sergionatan 0:cf17b1f16335 479 pixel(x0, y0, color);
sergionatan 0:cf17b1f16335 480 x0 += dx_sym;
sergionatan 0:cf17b1f16335 481 if (di<0) {
sergionatan 0:cf17b1f16335 482 di += dy_x2;
sergionatan 0:cf17b1f16335 483 } else {
sergionatan 0:cf17b1f16335 484 di += dy_x2 - dx_x2;
sergionatan 0:cf17b1f16335 485 y0 += dy_sym;
sergionatan 0:cf17b1f16335 486 }
sergionatan 0:cf17b1f16335 487 }
sergionatan 0:cf17b1f16335 488 pixel(x0, y0, color);
sergionatan 0:cf17b1f16335 489 } else {
sergionatan 0:cf17b1f16335 490 di = dx_x2 - dy;
sergionatan 0:cf17b1f16335 491 while (y0 != y1) {
sergionatan 0:cf17b1f16335 492 pixel(x0, y0, color);
sergionatan 0:cf17b1f16335 493 y0 += dy_sym;
sergionatan 0:cf17b1f16335 494 if (di < 0) {
sergionatan 0:cf17b1f16335 495 di += dx_x2;
sergionatan 0:cf17b1f16335 496 } else {
sergionatan 0:cf17b1f16335 497 di += dx_x2 - dy_x2;
sergionatan 0:cf17b1f16335 498 x0 += dx_sym;
sergionatan 0:cf17b1f16335 499 }
sergionatan 0:cf17b1f16335 500 }
sergionatan 0:cf17b1f16335 501 pixel(x0, y0, color);
sergionatan 0:cf17b1f16335 502 }
sergionatan 0:cf17b1f16335 503 return;
sergionatan 0:cf17b1f16335 504 }
sergionatan 0:cf17b1f16335 505 void ST7735_TFT::rect(int x0, int y0, int x1, int y1, int color) {
sergionatan 0:cf17b1f16335 506 if (x1 > x0) hline(x0,x1,y0,color);
sergionatan 0:cf17b1f16335 507 else hline(x1,x0,y0,color);
sergionatan 0:cf17b1f16335 508 if (y1 > y0) vline(x0,y0,y1,color);
sergionatan 0:cf17b1f16335 509 else vline(x0,y1,y0,color);
sergionatan 0:cf17b1f16335 510 if (x1 > x0) hline(x0,x1,y1,color);
sergionatan 0:cf17b1f16335 511 else hline(x1,x0,y1,color);
sergionatan 0:cf17b1f16335 512 if (y1 > y0) vline(x1,y0,y1,color);
sergionatan 0:cf17b1f16335 513 else vline(x1,y1,y0,color);
sergionatan 0:cf17b1f16335 514 return;
sergionatan 0:cf17b1f16335 515 }
sergionatan 0:cf17b1f16335 516 void ST7735_TFT::fillrect(int x0, int y0, int x1, int y1, int color) {
sergionatan 0:cf17b1f16335 517 int h = y1 - y0 ;
sergionatan 0:cf17b1f16335 518 int w = x1 - x0 ;
sergionatan 0:cf17b1f16335 519 int pixel = h * w;
sergionatan 0:cf17b1f16335 520 window(x0,y0,w,h);
sergionatan 0:cf17b1f16335 521 wr_cmd(0x2C);
sergionatan 0:cf17b1f16335 522 wr_dat_start();
sergionatan 0:cf17b1f16335 523 for (int p=0; p<pixel; p++) {
sergionatan 0:cf17b1f16335 524 //_spi.write(color);
sergionatan 0:cf17b1f16335 525 //_spi.write(color >> 8);
sergionatan 0:cf17b1f16335 526 _spi.fastWrite(color>>8);
sergionatan 0:cf17b1f16335 527 _spi.fastWrite(color);
sergionatan 0:cf17b1f16335 528
sergionatan 0:cf17b1f16335 529
sergionatan 0:cf17b1f16335 530 }
sergionatan 0:cf17b1f16335 531 _spi.clearRX();
sergionatan 0:cf17b1f16335 532 wr_dat_stop();
sergionatan 0:cf17b1f16335 533 return;
sergionatan 0:cf17b1f16335 534 }
sergionatan 0:cf17b1f16335 535 void ST7735_TFT::locate(int x, int y) {
sergionatan 0:cf17b1f16335 536 char_x = x;
sergionatan 0:cf17b1f16335 537 char_y = y;
sergionatan 0:cf17b1f16335 538 }
sergionatan 0:cf17b1f16335 539 int ST7735_TFT::columns() {
sergionatan 0:cf17b1f16335 540 return width() / font[1];
sergionatan 0:cf17b1f16335 541 }
sergionatan 0:cf17b1f16335 542 int ST7735_TFT::rows() {
sergionatan 0:cf17b1f16335 543 return height() / font[2];
sergionatan 0:cf17b1f16335 544 }
sergionatan 0:cf17b1f16335 545 int ST7735_TFT::_putc(int value) {
sergionatan 0:cf17b1f16335 546 if (value == '\n') { // new line
sergionatan 0:cf17b1f16335 547 char_x = 0;
sergionatan 0:cf17b1f16335 548 char_y = char_y + font[2];
sergionatan 0:cf17b1f16335 549 if (char_y >= height() - font[2]) {
sergionatan 0:cf17b1f16335 550 char_y = 0;
sergionatan 0:cf17b1f16335 551 }
sergionatan 0:cf17b1f16335 552 } else {
sergionatan 0:cf17b1f16335 553 character(char_x, char_y, value);
sergionatan 0:cf17b1f16335 554 }
sergionatan 0:cf17b1f16335 555 return value;
sergionatan 0:cf17b1f16335 556 }
sergionatan 0:cf17b1f16335 557 void ST7735_TFT::character(int x, int y, int c) {
sergionatan 0:cf17b1f16335 558 unsigned int hor,vert,offset,bpl,j,i,b;
sergionatan 0:cf17b1f16335 559 unsigned char* sign;
sergionatan 0:cf17b1f16335 560 unsigned char z,w;
sergionatan 0:cf17b1f16335 561 if ((c < 31) || (c > 127)) return; // test char range
sergionatan 0:cf17b1f16335 562 // read font parameter from start of array
sergionatan 0:cf17b1f16335 563 offset = font[0]; // bytes / char
sergionatan 0:cf17b1f16335 564 hor = font[1]; // get hor size of font
sergionatan 0:cf17b1f16335 565 vert = font[2]; // get vert size of font
sergionatan 0:cf17b1f16335 566 bpl = font[3]; // bytes per line
sergionatan 0:cf17b1f16335 567 if (char_x + hor > width()) {
sergionatan 0:cf17b1f16335 568 char_x = 0;
sergionatan 0:cf17b1f16335 569 char_y = char_y + vert;
sergionatan 0:cf17b1f16335 570 if (char_y >= height() - font[2]) {
sergionatan 0:cf17b1f16335 571 char_y = 0;
sergionatan 0:cf17b1f16335 572 }
sergionatan 0:cf17b1f16335 573 }
sergionatan 0:cf17b1f16335 574 window(char_x, char_y,hor,vert); // char box
sergionatan 0:cf17b1f16335 575 wr_cmd(0x2C);
sergionatan 0:cf17b1f16335 576 wr_dat_start();
sergionatan 0:cf17b1f16335 577 sign = &font[((c -32) * offset) + 4]; // start of char bitmap
sergionatan 0:cf17b1f16335 578 w = sign[0]; // width of actual char
sergionatan 0:cf17b1f16335 579 for (j=0; j<vert; j++) { // vert line
sergionatan 0:cf17b1f16335 580 for (i=0; i<hor; i++) { // horz line
sergionatan 0:cf17b1f16335 581 z = sign[bpl * i + ((j & 0xF8) >> 3)+1];
sergionatan 0:cf17b1f16335 582 b = 1 << (j & 0x07);
sergionatan 0:cf17b1f16335 583 if (( z & b ) == 0x00) {
sergionatan 0:cf17b1f16335 584 //_spi.write(_background>>8);
sergionatan 0:cf17b1f16335 585 //_spi.write(_background);
sergionatan 0:cf17b1f16335 586 _spi.fastWrite(_background>>8);
sergionatan 0:cf17b1f16335 587 _spi.fastWrite(_background);
sergionatan 0:cf17b1f16335 588
sergionatan 0:cf17b1f16335 589 } else {
sergionatan 0:cf17b1f16335 590 // _spi.write(_foreground>>8);
sergionatan 0:cf17b1f16335 591 // _spi.write(_foreground);
sergionatan 0:cf17b1f16335 592 _spi.fastWrite(_foreground>>8);
sergionatan 0:cf17b1f16335 593 _spi.fastWrite(_foreground);
sergionatan 0:cf17b1f16335 594
sergionatan 0:cf17b1f16335 595 }
sergionatan 0:cf17b1f16335 596 }
sergionatan 0:cf17b1f16335 597 }
sergionatan 0:cf17b1f16335 598 _spi.clearRX();
sergionatan 0:cf17b1f16335 599 wr_dat_stop();
sergionatan 0:cf17b1f16335 600 if ((w + 2) < hor) { // x offset to next char
sergionatan 0:cf17b1f16335 601 char_x += w + 2;
sergionatan 0:cf17b1f16335 602 } else char_x += hor;
sergionatan 0:cf17b1f16335 603 }
sergionatan 0:cf17b1f16335 604 void ST7735_TFT::set_font(unsigned char* f) {
sergionatan 0:cf17b1f16335 605 font = f;
sergionatan 0:cf17b1f16335 606 }
sergionatan 0:cf17b1f16335 607 void ST7735_TFT::Bitmap(unsigned int x, unsigned int y, unsigned int w, unsigned int h,unsigned char *bitmap) {
sergionatan 0:cf17b1f16335 608 unsigned int i,j; //value;
sergionatan 0:cf17b1f16335 609 unsigned short *bitmap_ptr = (unsigned short *)bitmap;
sergionatan 0:cf17b1f16335 610 window(x, y, w, h);
sergionatan 0:cf17b1f16335 611 wr_cmd(0x2C);
sergionatan 0:cf17b1f16335 612 wr_dat_start();
sergionatan 0:cf17b1f16335 613 for (j = 0; j < h; j++) { //Lines
sergionatan 0:cf17b1f16335 614 for (i = 0; i < w; i++) { // copy pixel data to TFT
sergionatan 0:cf17b1f16335 615 //_spi.write(*bitmap_ptr); // one line
sergionatan 0:cf17b1f16335 616 //_spi.write(*bitmap_ptr >> 8);
sergionatan 0:cf17b1f16335 617 _spi.fastWrite(*bitmap_ptr);
sergionatan 0:cf17b1f16335 618 _spi.fastWrite(*bitmap_ptr >> 8);
sergionatan 0:cf17b1f16335 619 bitmap_ptr++;
sergionatan 0:cf17b1f16335 620 }
sergionatan 0:cf17b1f16335 621 }
sergionatan 0:cf17b1f16335 622 _spi.clearRX();
sergionatan 0:cf17b1f16335 623 wr_dat_stop();
sergionatan 0:cf17b1f16335 624 }
sergionatan 0:cf17b1f16335 625 int ST7735_TFT::BMP_16(unsigned int x, unsigned int y, const char *Name_BMP) {
sergionatan 0:cf17b1f16335 626 // BEWARE !
sergionatan 0:cf17b1f16335 627 // NOT TESTED
sergionatan 0:cf17b1f16335 628 #define OffsetPixelWidth 18
sergionatan 0:cf17b1f16335 629 #define OffsetPixelHeigh 22
sergionatan 0:cf17b1f16335 630 #define OffsetFileSize 34
sergionatan 0:cf17b1f16335 631 #define OffsetPixData 10
sergionatan 0:cf17b1f16335 632 #define OffsetBPP 28
sergionatan 0:cf17b1f16335 633 char filename[50];
sergionatan 0:cf17b1f16335 634 unsigned char BMP_Header[54];
sergionatan 0:cf17b1f16335 635 unsigned short BPP_t;
sergionatan 0:cf17b1f16335 636 unsigned int PixelWidth,PixelHeigh,start_data;
sergionatan 0:cf17b1f16335 637 unsigned int i,off;
sergionatan 0:cf17b1f16335 638 int padd,j;
sergionatan 0:cf17b1f16335 639 unsigned short *line;
sergionatan 0:cf17b1f16335 640 // get the filename
sergionatan 0:cf17b1f16335 641 //LocalFileSystem local("local"); not working on FRDM-KL25Z
sergionatan 0:cf17b1f16335 642 sprintf(&filename[0],"/local/");
sergionatan 0:cf17b1f16335 643 i=7;
sergionatan 0:cf17b1f16335 644 while (*Name_BMP!='\0') {
sergionatan 0:cf17b1f16335 645 filename[i++]=*Name_BMP++;
sergionatan 0:cf17b1f16335 646 }
sergionatan 0:cf17b1f16335 647 FILE *Image = fopen((const char *)&filename[0], "r"); // open the bmp file
sergionatan 0:cf17b1f16335 648 if (!Image) {
sergionatan 0:cf17b1f16335 649 return(0); // error file not found !
sergionatan 0:cf17b1f16335 650 }
sergionatan 0:cf17b1f16335 651 fread(&BMP_Header[0],1,54,Image); // get the BMP Header
sergionatan 0:cf17b1f16335 652
sergionatan 0:cf17b1f16335 653 if (BMP_Header[0] != 0x42 || BMP_Header[1] != 0x4D) { // check magic byte
sergionatan 0:cf17b1f16335 654 fclose(Image);
sergionatan 0:cf17b1f16335 655 return(-1); // error no BMP file
sergionatan 0:cf17b1f16335 656 }
sergionatan 0:cf17b1f16335 657 BPP_t = BMP_Header[OffsetBPP] + (BMP_Header[OffsetBPP + 1] << 8);
sergionatan 0:cf17b1f16335 658 if (BPP_t != 0x0010) {
sergionatan 0:cf17b1f16335 659 fclose(Image);
sergionatan 0:cf17b1f16335 660 return(-2); // error no 16 bit BMP
sergionatan 0:cf17b1f16335 661 }
sergionatan 0:cf17b1f16335 662 PixelHeigh = BMP_Header[OffsetPixelHeigh] + (BMP_Header[OffsetPixelHeigh + 1] << 8) + (BMP_Header[OffsetPixelHeigh + 2] << 16) + (BMP_Header[OffsetPixelHeigh + 3] << 24);
sergionatan 0:cf17b1f16335 663 PixelWidth = BMP_Header[OffsetPixelWidth] + (BMP_Header[OffsetPixelWidth + 1] << 8) + (BMP_Header[OffsetPixelWidth + 2] << 16) + (BMP_Header[OffsetPixelWidth + 3] << 24);
sergionatan 0:cf17b1f16335 664 if (PixelHeigh > height() + y || PixelWidth > width() + x) {
sergionatan 0:cf17b1f16335 665 fclose(Image);
sergionatan 0:cf17b1f16335 666 return(-3); // to big
sergionatan 0:cf17b1f16335 667 }
sergionatan 0:cf17b1f16335 668 start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24);
sergionatan 0:cf17b1f16335 669
sergionatan 0:cf17b1f16335 670 line = (unsigned short *) malloc (PixelWidth); // we need a buffer for a line
sergionatan 0:cf17b1f16335 671 if (line == NULL) {
sergionatan 0:cf17b1f16335 672 return(-4); // error no memory
sergionatan 0:cf17b1f16335 673 }
sergionatan 0:cf17b1f16335 674 // the lines are padded to multiple of 4 bytes
sergionatan 0:cf17b1f16335 675 padd = -1;
sergionatan 0:cf17b1f16335 676 do {
sergionatan 0:cf17b1f16335 677 padd ++;
sergionatan 0:cf17b1f16335 678 } while ((PixelWidth * 2 + padd)%4 != 0);
sergionatan 0:cf17b1f16335 679 window(x, y,PixelWidth,PixelHeigh);
sergionatan 0:cf17b1f16335 680 wr_cmd(0x2C);
sergionatan 0:cf17b1f16335 681 wr_dat_start();
sergionatan 0:cf17b1f16335 682 for (j = PixelHeigh - 1; j >= 0; j--) { //Lines bottom up
sergionatan 0:cf17b1f16335 683 off = j * (PixelWidth * 2 + padd) + start_data; // start of line
sergionatan 0:cf17b1f16335 684 fseek(Image, off ,SEEK_SET);
sergionatan 0:cf17b1f16335 685 fread(line,1,PixelWidth * 2,Image); // read a line - slow !
sergionatan 0:cf17b1f16335 686 for (i = 0; i < PixelWidth; i++) { // copy pixel data to TFT
sergionatan 0:cf17b1f16335 687 //_spi.write(line[i]); // 2 x 8 bit pixel
sergionatan 0:cf17b1f16335 688 //_spi.write(line[i]>>8);
sergionatan 0:cf17b1f16335 689 _spi.fastWrite(line[i]);
sergionatan 0:cf17b1f16335 690 _spi.fastWrite(line[i]>>8);
sergionatan 0:cf17b1f16335 691 }
sergionatan 0:cf17b1f16335 692 }
sergionatan 0:cf17b1f16335 693 _spi.clearRX();
sergionatan 0:cf17b1f16335 694 wr_dat_stop();
sergionatan 0:cf17b1f16335 695 free (line);
sergionatan 0:cf17b1f16335 696 fclose(Image);
sergionatan 0:cf17b1f16335 697 return(1);
sergionatan 0:cf17b1f16335 698 }