Lib for the new LCD Display with ILI9341 controller

Committer:
dreschpe
Date:
Tue Jun 24 15:37:52 2014 +0000
Revision:
11:59eca2723ec5
Parent:
10:50f88bd5557f
Child:
12:98cc5c193ecd
Add fast Version for NUCLEO L152RE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dreschpe 0:da1bf437cbc1 1 /* mbed library for 240*320 pixel display TFT based on ILI9341 LCD Controller
dreschpe 0:da1bf437cbc1 2 * Copyright (c) 2013 Peter Drescher - DC2PD
dreschpe 0:da1bf437cbc1 3 *
dreschpe 0:da1bf437cbc1 4 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
dreschpe 0:da1bf437cbc1 5 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
dreschpe 0:da1bf437cbc1 6 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
dreschpe 0:da1bf437cbc1 7 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
dreschpe 0:da1bf437cbc1 8 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
dreschpe 0:da1bf437cbc1 9 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
dreschpe 0:da1bf437cbc1 10 * THE SOFTWARE.
dreschpe 0:da1bf437cbc1 11 */
dreschpe 0:da1bf437cbc1 12
dreschpe 0:da1bf437cbc1 13 // 12.06.13 fork from SPI_TFT code because controller is different ...
dreschpe 2:0a16083193a4 14 // 14.07.13 Test with real display and bugfix
dreschpe 4:f018e272220b 15 // 18.10.13 Better Circle function from Michael Ammann
dreschpe 5:55aed13f2630 16 // 22.10.13 Fixes for Kinetis Board - 8 bit spi
dreschpe 6:fe07ae8329f7 17 // 26.01.14 Change interface for BMP_16 to also use SD-cards
dreschpe 9:423e6a952472 18 // 23.06.14 switch back to old Version - fork for L152
dreschpe 11:59eca2723ec5 19 // 24.06.14 Add compiler flag for optimized L152 version
dreschpe 11:59eca2723ec5 20
dreschpe 11:59eca2723ec5 21 // exclude this file for platforms with optimized version
dreschpe 11:59eca2723ec5 22 #ifndef TARGET_NUCLEO_L152RE
dreschpe 0:da1bf437cbc1 23
dreschpe 0:da1bf437cbc1 24 #include "SPI_TFT_ILI9341.h"
dreschpe 0:da1bf437cbc1 25 #include "mbed.h"
dreschpe 0:da1bf437cbc1 26
dreschpe 0:da1bf437cbc1 27 #define BPP 16 // Bits per pixel
dreschpe 6:fe07ae8329f7 28
dreschpe 0:da1bf437cbc1 29 //extern Serial pc;
dreschpe 0:da1bf437cbc1 30 //extern DigitalOut xx; // debug !!
dreschpe 0:da1bf437cbc1 31
dreschpe 0:da1bf437cbc1 32 SPI_TFT_ILI9341::SPI_TFT_ILI9341(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset, PinName dc, const char *name)
dreschpe 11:59eca2723ec5 33 : GraphicsDisplay(name), SPI(mosi, miso, sclk,NC), _cs(cs), _reset(reset), _dc(dc)
dreschpe 0:da1bf437cbc1 34 {
dreschpe 11:59eca2723ec5 35
dreschpe 0:da1bf437cbc1 36 orientation = 0;
dreschpe 0:da1bf437cbc1 37 char_x = 0;
dreschpe 11:59eca2723ec5 38 SPI::format(8,3); // 8 bit spi mode 3
dreschpe 11:59eca2723ec5 39 SPI::frequency(10000000); // 10 Mhz SPI clock
dreschpe 0:da1bf437cbc1 40 tft_reset();
dreschpe 0:da1bf437cbc1 41 }
dreschpe 0:da1bf437cbc1 42
dreschpe 0:da1bf437cbc1 43 int SPI_TFT_ILI9341::width()
dreschpe 0:da1bf437cbc1 44 {
dreschpe 0:da1bf437cbc1 45 if (orientation == 0 || orientation == 2) return 240;
dreschpe 0:da1bf437cbc1 46 else return 320;
dreschpe 0:da1bf437cbc1 47 }
dreschpe 0:da1bf437cbc1 48
dreschpe 0:da1bf437cbc1 49
dreschpe 0:da1bf437cbc1 50 int SPI_TFT_ILI9341::height()
dreschpe 0:da1bf437cbc1 51 {
dreschpe 0:da1bf437cbc1 52 if (orientation == 0 || orientation == 2) return 320;
dreschpe 0:da1bf437cbc1 53 else return 240;
dreschpe 0:da1bf437cbc1 54 }
dreschpe 0:da1bf437cbc1 55
dreschpe 0:da1bf437cbc1 56
dreschpe 2:0a16083193a4 57 void SPI_TFT_ILI9341::set_orientation(unsigned int o)
dreschpe 0:da1bf437cbc1 58 {
dreschpe 0:da1bf437cbc1 59 orientation = o;
dreschpe 2:0a16083193a4 60 wr_cmd(0x36); // MEMORY_ACCESS_CONTROL
dreschpe 0:da1bf437cbc1 61 switch (orientation) {
dreschpe 0:da1bf437cbc1 62 case 0:
dreschpe 11:59eca2723ec5 63 SPI::write(0x48);
dreschpe 0:da1bf437cbc1 64 break;
dreschpe 0:da1bf437cbc1 65 case 1:
dreschpe 11:59eca2723ec5 66 SPI::write(0x28);
dreschpe 0:da1bf437cbc1 67 break;
dreschpe 0:da1bf437cbc1 68 case 2:
dreschpe 11:59eca2723ec5 69 SPI::write(0x88);
dreschpe 0:da1bf437cbc1 70 break;
dreschpe 0:da1bf437cbc1 71 case 3:
dreschpe 11:59eca2723ec5 72 SPI::write(0xE8);
dreschpe 0:da1bf437cbc1 73 break;
dreschpe 0:da1bf437cbc1 74 }
dreschpe 2:0a16083193a4 75 _cs = 1;
dreschpe 0:da1bf437cbc1 76 WindowMax();
dreschpe 2:0a16083193a4 77 }
dreschpe 0:da1bf437cbc1 78
dreschpe 0:da1bf437cbc1 79
dreschpe 0:da1bf437cbc1 80 // write command to tft register
dreschpe 0:da1bf437cbc1 81
dreschpe 0:da1bf437cbc1 82 void SPI_TFT_ILI9341::wr_cmd(unsigned char cmd)
dreschpe 0:da1bf437cbc1 83 {
dreschpe 0:da1bf437cbc1 84 _dc = 0;
dreschpe 0:da1bf437cbc1 85 _cs = 0;
dreschpe 11:59eca2723ec5 86 SPI::write(cmd); // mbed lib
dreschpe 0:da1bf437cbc1 87 _dc = 1;
dreschpe 0:da1bf437cbc1 88 }
dreschpe 0:da1bf437cbc1 89
dreschpe 0:da1bf437cbc1 90
dreschpe 0:da1bf437cbc1 91
dreschpe 0:da1bf437cbc1 92 void SPI_TFT_ILI9341::wr_dat(unsigned char dat)
dreschpe 0:da1bf437cbc1 93 {
dreschpe 11:59eca2723ec5 94 SPI::write(dat); // mbed lib
dreschpe 0:da1bf437cbc1 95 }
dreschpe 0:da1bf437cbc1 96
dreschpe 0:da1bf437cbc1 97
dreschpe 0:da1bf437cbc1 98
dreschpe 6:fe07ae8329f7 99 // the ILI9341 can read
dreschpe 6:fe07ae8329f7 100
dreschpe 6:fe07ae8329f7 101 char SPI_TFT_ILI9341::rd_byte(unsigned char cmd)
dreschpe 6:fe07ae8329f7 102 {
dreschpe 6:fe07ae8329f7 103 char r;
dreschpe 6:fe07ae8329f7 104 _dc = 0;
dreschpe 6:fe07ae8329f7 105 _cs = 0;
dreschpe 11:59eca2723ec5 106 SPI::write(cmd); // mbed lib
dreschpe 6:fe07ae8329f7 107 _cs = 1;
dreschpe 11:59eca2723ec5 108 r = SPI::write(0xff);
dreschpe 6:fe07ae8329f7 109 _cs = 1;
dreschpe 6:fe07ae8329f7 110 return(r);
dreschpe 6:fe07ae8329f7 111 }
dreschpe 0:da1bf437cbc1 112
dreschpe 6:fe07ae8329f7 113 // read 32 bit
dreschpe 6:fe07ae8329f7 114 int SPI_TFT_ILI9341::rd_32(unsigned char cmd)
dreschpe 6:fe07ae8329f7 115 {
dreschpe 6:fe07ae8329f7 116 int d;
dreschpe 6:fe07ae8329f7 117 char r;
dreschpe 6:fe07ae8329f7 118 _dc = 0;
dreschpe 6:fe07ae8329f7 119 _cs = 0;
dreschpe 6:fe07ae8329f7 120 d = cmd;
dreschpe 6:fe07ae8329f7 121 d = d << 1;
dreschpe 11:59eca2723ec5 122 SPI::format(9,3); // we have to add a dummy clock cycle
dreschpe 11:59eca2723ec5 123 SPI::write(d);
dreschpe 11:59eca2723ec5 124 SPI::format(8,3);
dreschpe 6:fe07ae8329f7 125 _dc = 1;
dreschpe 11:59eca2723ec5 126 r = SPI::write(0xff);
dreschpe 6:fe07ae8329f7 127 d = r;
dreschpe 11:59eca2723ec5 128 r = SPI::write(0xff);
dreschpe 6:fe07ae8329f7 129 d = (d << 8) | r;
dreschpe 11:59eca2723ec5 130 r = SPI::write(0xff);
dreschpe 6:fe07ae8329f7 131 d = (d << 8) | r;
dreschpe 11:59eca2723ec5 132 r = SPI::write(0xff);
dreschpe 6:fe07ae8329f7 133 d = (d << 8) | r;
dreschpe 6:fe07ae8329f7 134 _cs = 1;
dreschpe 6:fe07ae8329f7 135 return(d);
dreschpe 6:fe07ae8329f7 136 }
dreschpe 0:da1bf437cbc1 137
dreschpe 6:fe07ae8329f7 138 int SPI_TFT_ILI9341::Read_ID(void){
dreschpe 6:fe07ae8329f7 139 int r;
dreschpe 6:fe07ae8329f7 140 r = rd_byte(0x0A);
dreschpe 6:fe07ae8329f7 141 r = rd_byte(0x0A);
dreschpe 6:fe07ae8329f7 142 r = rd_byte(0x0A);
dreschpe 6:fe07ae8329f7 143 r = rd_byte(0x0A);
dreschpe 6:fe07ae8329f7 144 return(r);
dreschpe 6:fe07ae8329f7 145 }
dreschpe 0:da1bf437cbc1 146
dreschpe 0:da1bf437cbc1 147
dreschpe 1:6d6125e88de7 148 // Init code based on MI0283QT datasheet
dreschpe 1:6d6125e88de7 149
dreschpe 0:da1bf437cbc1 150 void SPI_TFT_ILI9341::tft_reset()
dreschpe 0:da1bf437cbc1 151 {
dreschpe 0:da1bf437cbc1 152 _cs = 1; // cs high
dreschpe 0:da1bf437cbc1 153 _dc = 1; // dc high
dreschpe 0:da1bf437cbc1 154 _reset = 0; // display reset
dreschpe 0:da1bf437cbc1 155
dreschpe 0:da1bf437cbc1 156 wait_us(50);
dreschpe 1:6d6125e88de7 157 _reset = 1; // end hardware reset
dreschpe 0:da1bf437cbc1 158 wait_ms(5);
dreschpe 1:6d6125e88de7 159
dreschpe 1:6d6125e88de7 160 wr_cmd(0x01); // SW reset
dreschpe 1:6d6125e88de7 161 wait_ms(5);
dreschpe 1:6d6125e88de7 162 wr_cmd(0x28); // display off
dreschpe 0:da1bf437cbc1 163
dreschpe 0:da1bf437cbc1 164 /* Start Initial Sequence ----------------------------------------------------*/
dreschpe 1:6d6125e88de7 165 wr_cmd(0xCF);
dreschpe 11:59eca2723ec5 166 SPI::write(0x00);
dreschpe 11:59eca2723ec5 167 SPI::write(0x83);
dreschpe 11:59eca2723ec5 168 SPI::write(0x30);
dreschpe 1:6d6125e88de7 169 _cs = 1;
dreschpe 1:6d6125e88de7 170
dreschpe 1:6d6125e88de7 171 wr_cmd(0xED);
dreschpe 11:59eca2723ec5 172 SPI::write(0x64);
dreschpe 11:59eca2723ec5 173 SPI::write(0x03);
dreschpe 11:59eca2723ec5 174 SPI::write(0x12);
dreschpe 11:59eca2723ec5 175 SPI::write(0x81);
dreschpe 1:6d6125e88de7 176 _cs = 1;
dreschpe 1:6d6125e88de7 177
dreschpe 1:6d6125e88de7 178 wr_cmd(0xE8);
dreschpe 11:59eca2723ec5 179 SPI::write(0x85);
dreschpe 11:59eca2723ec5 180 SPI::write(0x01);
dreschpe 11:59eca2723ec5 181 SPI::write(0x79);
dreschpe 1:6d6125e88de7 182 _cs = 1;
dreschpe 1:6d6125e88de7 183
dreschpe 1:6d6125e88de7 184 wr_cmd(0xCB);
dreschpe 11:59eca2723ec5 185 SPI::write(0x39);
dreschpe 11:59eca2723ec5 186 SPI::write(0x2C);
dreschpe 11:59eca2723ec5 187 SPI::write(0x00);
dreschpe 11:59eca2723ec5 188 SPI::write(0x34);
dreschpe 11:59eca2723ec5 189 SPI::write(0x02);
dreschpe 0:da1bf437cbc1 190 _cs = 1;
dreschpe 1:6d6125e88de7 191
dreschpe 1:6d6125e88de7 192 wr_cmd(0xF7);
dreschpe 11:59eca2723ec5 193 SPI::write(0x20);
dreschpe 0:da1bf437cbc1 194 _cs = 1;
dreschpe 1:6d6125e88de7 195
dreschpe 1:6d6125e88de7 196 wr_cmd(0xEA);
dreschpe 11:59eca2723ec5 197 SPI::write(0x00);
dreschpe 11:59eca2723ec5 198 SPI::write(0x00);
dreschpe 0:da1bf437cbc1 199 _cs = 1;
dreschpe 1:6d6125e88de7 200
dreschpe 0:da1bf437cbc1 201 wr_cmd(0xC0); // POWER_CONTROL_1
dreschpe 11:59eca2723ec5 202 SPI::write(0x26);
dreschpe 0:da1bf437cbc1 203 _cs = 1;
dreschpe 1:6d6125e88de7 204
dreschpe 0:da1bf437cbc1 205 wr_cmd(0xC1); // POWER_CONTROL_2
dreschpe 11:59eca2723ec5 206 SPI::write(0x11);
dreschpe 0:da1bf437cbc1 207 _cs = 1;
dreschpe 1:6d6125e88de7 208
dreschpe 0:da1bf437cbc1 209 wr_cmd(0xC5); // VCOM_CONTROL_1
dreschpe 11:59eca2723ec5 210 SPI::write(0x35);
dreschpe 11:59eca2723ec5 211 SPI::write(0x3E);
dreschpe 0:da1bf437cbc1 212 _cs = 1;
dreschpe 1:6d6125e88de7 213
dreschpe 0:da1bf437cbc1 214 wr_cmd(0xC7); // VCOM_CONTROL_2
dreschpe 11:59eca2723ec5 215 SPI::write(0xBE);
dreschpe 0:da1bf437cbc1 216 _cs = 1;
dreschpe 1:6d6125e88de7 217
dreschpe 0:da1bf437cbc1 218 wr_cmd(0x36); // MEMORY_ACCESS_CONTROL
dreschpe 11:59eca2723ec5 219 SPI::write(0x48);
dreschpe 0:da1bf437cbc1 220 _cs = 1;
dreschpe 1:6d6125e88de7 221
dreschpe 1:6d6125e88de7 222 wr_cmd(0x3A); // COLMOD_PIXEL_FORMAT_SET
dreschpe 11:59eca2723ec5 223 SPI::write(0x55); // 16 bit pixel
dreschpe 1:6d6125e88de7 224 _cs = 1;
dreschpe 1:6d6125e88de7 225
dreschpe 1:6d6125e88de7 226 wr_cmd(0xB1); // Frame Rate
dreschpe 11:59eca2723ec5 227 SPI::write(0x00);
dreschpe 11:59eca2723ec5 228 SPI::write(0x1B);
dreschpe 1:6d6125e88de7 229 _cs = 1;
dreschpe 1:6d6125e88de7 230
dreschpe 1:6d6125e88de7 231 wr_cmd(0xF2); // Gamma Function Disable
dreschpe 11:59eca2723ec5 232 SPI::write(0x08);
dreschpe 1:6d6125e88de7 233 _cs = 1;
dreschpe 1:6d6125e88de7 234
dreschpe 1:6d6125e88de7 235 wr_cmd(0x26);
dreschpe 11:59eca2723ec5 236 SPI::write(0x01); // gamma set for curve 01/2/04/08
dreschpe 1:6d6125e88de7 237 _cs = 1;
dreschpe 1:6d6125e88de7 238
dreschpe 1:6d6125e88de7 239 wr_cmd(0xE0); // positive gamma correction
dreschpe 11:59eca2723ec5 240 SPI::write(0x1F);
dreschpe 11:59eca2723ec5 241 SPI::write(0x1A);
dreschpe 11:59eca2723ec5 242 SPI::write(0x18);
dreschpe 11:59eca2723ec5 243 SPI::write(0x0A);
dreschpe 11:59eca2723ec5 244 SPI::write(0x0F);
dreschpe 11:59eca2723ec5 245 SPI::write(0x06);
dreschpe 11:59eca2723ec5 246 SPI::write(0x45);
dreschpe 11:59eca2723ec5 247 SPI::write(0x87);
dreschpe 11:59eca2723ec5 248 SPI::write(0x32);
dreschpe 11:59eca2723ec5 249 SPI::write(0x0A);
dreschpe 11:59eca2723ec5 250 SPI::write(0x07);
dreschpe 11:59eca2723ec5 251 SPI::write(0x02);
dreschpe 11:59eca2723ec5 252 SPI::write(0x07);
dreschpe 11:59eca2723ec5 253 SPI::write(0x05);
dreschpe 11:59eca2723ec5 254 SPI::write(0x00);
dreschpe 1:6d6125e88de7 255 _cs = 1;
dreschpe 1:6d6125e88de7 256
dreschpe 1:6d6125e88de7 257 wr_cmd(0xE1); // negativ gamma correction
dreschpe 11:59eca2723ec5 258 SPI::write(0x00);
dreschpe 11:59eca2723ec5 259 SPI::write(0x25);
dreschpe 11:59eca2723ec5 260 SPI::write(0x27);
dreschpe 11:59eca2723ec5 261 SPI::write(0x05);
dreschpe 11:59eca2723ec5 262 SPI::write(0x10);
dreschpe 11:59eca2723ec5 263 SPI::write(0x09);
dreschpe 11:59eca2723ec5 264 SPI::write(0x3A);
dreschpe 11:59eca2723ec5 265 SPI::write(0x78);
dreschpe 11:59eca2723ec5 266 SPI::write(0x4D);
dreschpe 11:59eca2723ec5 267 SPI::write(0x05);
dreschpe 11:59eca2723ec5 268 SPI::write(0x18);
dreschpe 11:59eca2723ec5 269 SPI::write(0x0D);
dreschpe 11:59eca2723ec5 270 SPI::write(0x38);
dreschpe 11:59eca2723ec5 271 SPI::write(0x3A);
dreschpe 11:59eca2723ec5 272 SPI::write(0x1F);
dreschpe 1:6d6125e88de7 273 _cs = 1;
dreschpe 1:6d6125e88de7 274
dreschpe 1:6d6125e88de7 275 WindowMax ();
dreschpe 1:6d6125e88de7 276
dreschpe 1:6d6125e88de7 277 //wr_cmd(0x34); // tearing effect off
dreschpe 1:6d6125e88de7 278 //_cs = 1;
dreschpe 1:6d6125e88de7 279
dreschpe 1:6d6125e88de7 280 //wr_cmd(0x35); // tearing effect on
dreschpe 1:6d6125e88de7 281 //_cs = 1;
dreschpe 1:6d6125e88de7 282
dreschpe 1:6d6125e88de7 283 wr_cmd(0xB7); // entry mode
dreschpe 11:59eca2723ec5 284 SPI::write(0x07);
dreschpe 1:6d6125e88de7 285 _cs = 1;
dreschpe 1:6d6125e88de7 286
dreschpe 1:6d6125e88de7 287 wr_cmd(0xB6); // display function control
dreschpe 11:59eca2723ec5 288 SPI::write(0x0A);
dreschpe 11:59eca2723ec5 289 SPI::write(0x82);
dreschpe 11:59eca2723ec5 290 SPI::write(0x27);
dreschpe 11:59eca2723ec5 291 SPI::write(0x00);
dreschpe 1:6d6125e88de7 292 _cs = 1;
dreschpe 1:6d6125e88de7 293
dreschpe 1:6d6125e88de7 294 wr_cmd(0x11); // sleep out
dreschpe 1:6d6125e88de7 295 _cs = 1;
dreschpe 1:6d6125e88de7 296
dreschpe 1:6d6125e88de7 297 wait_ms(100);
dreschpe 1:6d6125e88de7 298
dreschpe 1:6d6125e88de7 299 wr_cmd(0x29); // display on
dreschpe 1:6d6125e88de7 300 _cs = 1;
dreschpe 1:6d6125e88de7 301
dreschpe 1:6d6125e88de7 302 wait_ms(100);
dreschpe 1:6d6125e88de7 303
dreschpe 1:6d6125e88de7 304 }
dreschpe 0:da1bf437cbc1 305
dreschpe 0:da1bf437cbc1 306
dreschpe 0:da1bf437cbc1 307 void SPI_TFT_ILI9341::pixel(int x, int y, int color)
dreschpe 0:da1bf437cbc1 308 {
dreschpe 0:da1bf437cbc1 309 wr_cmd(0x2A);
dreschpe 11:59eca2723ec5 310 SPI::write(x >> 8);
dreschpe 11:59eca2723ec5 311 SPI::write(x);
dreschpe 0:da1bf437cbc1 312 _cs = 1;
dreschpe 0:da1bf437cbc1 313 wr_cmd(0x2B);
dreschpe 11:59eca2723ec5 314 SPI::write(y >> 8);
dreschpe 11:59eca2723ec5 315 SPI::write(y);
dreschpe 0:da1bf437cbc1 316 _cs = 1;
dreschpe 5:55aed13f2630 317 wr_cmd(0x2C); // send pixel
dreschpe 5:55aed13f2630 318 #if defined TARGET_KL25Z // 8 Bit SPI
dreschpe 11:59eca2723ec5 319 SPI::write(color >> 8);
dreschpe 11:59eca2723ec5 320 SPI::write(color & 0xff);
dreschpe 5:55aed13f2630 321 #else
dreschpe 11:59eca2723ec5 322 SPI::format(16,3); // switch to 16 bit Mode 3
dreschpe 11:59eca2723ec5 323 SPI::write(color); // Write D0..D15
dreschpe 11:59eca2723ec5 324 SPI::format(8,3);
dreschpe 5:55aed13f2630 325 #endif
dreschpe 0:da1bf437cbc1 326 _cs = 1;
dreschpe 0:da1bf437cbc1 327 }
dreschpe 0:da1bf437cbc1 328
dreschpe 0:da1bf437cbc1 329
dreschpe 0:da1bf437cbc1 330 void SPI_TFT_ILI9341::window (unsigned int x, unsigned int y, unsigned int w, unsigned int h)
dreschpe 0:da1bf437cbc1 331 {
dreschpe 0:da1bf437cbc1 332 wr_cmd(0x2A);
dreschpe 11:59eca2723ec5 333 SPI::write(x >> 8);
dreschpe 11:59eca2723ec5 334 SPI::write(x);
dreschpe 11:59eca2723ec5 335 SPI::write((x+w-1) >> 8);
dreschpe 11:59eca2723ec5 336 SPI::write(x+w-1);
dreschpe 0:da1bf437cbc1 337
dreschpe 0:da1bf437cbc1 338 _cs = 1;
dreschpe 0:da1bf437cbc1 339 wr_cmd(0x2B);
dreschpe 11:59eca2723ec5 340 SPI::write(y >> 8);
dreschpe 11:59eca2723ec5 341 SPI::write(y);
dreschpe 11:59eca2723ec5 342 SPI::write((y+h-1) >> 8);
dreschpe 11:59eca2723ec5 343 SPI::write(y+h-1);
dreschpe 0:da1bf437cbc1 344 _cs = 1;
dreschpe 0:da1bf437cbc1 345 }
dreschpe 0:da1bf437cbc1 346
dreschpe 0:da1bf437cbc1 347
dreschpe 0:da1bf437cbc1 348 void SPI_TFT_ILI9341::WindowMax (void)
dreschpe 0:da1bf437cbc1 349 {
dreschpe 0:da1bf437cbc1 350 window (0, 0, width(), height());
dreschpe 0:da1bf437cbc1 351 }
dreschpe 0:da1bf437cbc1 352
dreschpe 0:da1bf437cbc1 353
dreschpe 0:da1bf437cbc1 354
dreschpe 0:da1bf437cbc1 355 void SPI_TFT_ILI9341::cls (void)
dreschpe 0:da1bf437cbc1 356 {
dreschpe 0:da1bf437cbc1 357 int pixel = ( width() * height());
dreschpe 0:da1bf437cbc1 358 WindowMax();
dreschpe 5:55aed13f2630 359 wr_cmd(0x2C); // send pixel
dreschpe 5:55aed13f2630 360 #if defined TARGET_KL25Z // 8 Bit SPI
dreschpe 5:55aed13f2630 361 unsigned int i;
dreschpe 5:55aed13f2630 362 for (i = 0; i < ( width() * height()); i++){
dreschpe 11:59eca2723ec5 363 SPI::write(_background >> 8);
dreschpe 11:59eca2723ec5 364 SPI::write(_background & 0xff);
dreschpe 5:55aed13f2630 365 }
dreschpe 5:55aed13f2630 366
dreschpe 5:55aed13f2630 367 #else
dreschpe 11:59eca2723ec5 368 SPI::format(16,3); // switch to 16 bit Mode 3
dreschpe 0:da1bf437cbc1 369 unsigned int i;
dreschpe 0:da1bf437cbc1 370 for (i = 0; i < ( width() * height()); i++)
dreschpe 11:59eca2723ec5 371 SPI::write(_background);
dreschpe 11:59eca2723ec5 372 SPI::format(8,3);
dreschpe 5:55aed13f2630 373 #endif
dreschpe 5:55aed13f2630 374 _cs = 1;
dreschpe 0:da1bf437cbc1 375 }
dreschpe 0:da1bf437cbc1 376
dreschpe 0:da1bf437cbc1 377
dreschpe 0:da1bf437cbc1 378 void SPI_TFT_ILI9341::circle(int x0, int y0, int r, int color)
dreschpe 0:da1bf437cbc1 379 {
dreschpe 0:da1bf437cbc1 380
mazgch 3:3d7298360e45 381 int x = -r, y = 0, err = 2-2*r, e2;
mazgch 3:3d7298360e45 382 do {
mazgch 3:3d7298360e45 383 pixel(x0-x, y0+y,color);
mazgch 3:3d7298360e45 384 pixel(x0+x, y0+y,color);
mazgch 3:3d7298360e45 385 pixel(x0+x, y0-y,color);
mazgch 3:3d7298360e45 386 pixel(x0-x, y0-y,color);
mazgch 3:3d7298360e45 387 e2 = err;
mazgch 3:3d7298360e45 388 if (e2 <= y) {
mazgch 3:3d7298360e45 389 err += ++y*2+1;
mazgch 3:3d7298360e45 390 if (-x == y && e2 <= x) e2 = 0;
mazgch 3:3d7298360e45 391 }
mazgch 3:3d7298360e45 392 if (e2 > x) err += ++x*2+1;
mazgch 3:3d7298360e45 393 } while (x <= 0);
dreschpe 4:f018e272220b 394
dreschpe 0:da1bf437cbc1 395 }
dreschpe 0:da1bf437cbc1 396
mazgch 3:3d7298360e45 397 void SPI_TFT_ILI9341::fillcircle(int x0, int y0, int r, int color)
dreschpe 0:da1bf437cbc1 398 {
mazgch 3:3d7298360e45 399 int x = -r, y = 0, err = 2-2*r, e2;
mazgch 3:3d7298360e45 400 do {
mazgch 3:3d7298360e45 401 vline(x0-x, y0-y, y0+y, color);
mazgch 3:3d7298360e45 402 vline(x0+x, y0-y, y0+y, color);
mazgch 3:3d7298360e45 403 e2 = err;
mazgch 3:3d7298360e45 404 if (e2 <= y) {
mazgch 3:3d7298360e45 405 err += ++y*2+1;
mazgch 3:3d7298360e45 406 if (-x == y && e2 <= x) e2 = 0;
mazgch 3:3d7298360e45 407 }
mazgch 3:3d7298360e45 408 if (e2 > x) err += ++x*2+1;
mazgch 3:3d7298360e45 409 } while (x <= 0);
dreschpe 0:da1bf437cbc1 410 }
dreschpe 0:da1bf437cbc1 411
dreschpe 0:da1bf437cbc1 412
dreschpe 0:da1bf437cbc1 413 void SPI_TFT_ILI9341::hline(int x0, int x1, int y, int color)
dreschpe 0:da1bf437cbc1 414 {
dreschpe 0:da1bf437cbc1 415 int w;
dreschpe 0:da1bf437cbc1 416 w = x1 - x0 + 1;
dreschpe 0:da1bf437cbc1 417 window(x0,y,w,1);
dreschpe 5:55aed13f2630 418 wr_cmd(0x2C); // send pixel
dreschpe 5:55aed13f2630 419 #if defined TARGET_KL25Z // 8 Bit SPI
dreschpe 5:55aed13f2630 420 int j;
dreschpe 5:55aed13f2630 421 for (j=0; j<w; j++) {
dreschpe 11:59eca2723ec5 422 SPI::write(color >> 8);
dreschpe 11:59eca2723ec5 423 SPI::write(color & 0xff);
dreschpe 5:55aed13f2630 424 }
dreschpe 5:55aed13f2630 425 #else
dreschpe 11:59eca2723ec5 426 SPI::format(16,3); // switch to 16 bit Mode 3
dreschpe 0:da1bf437cbc1 427 int j;
dreschpe 0:da1bf437cbc1 428 for (j=0; j<w; j++) {
dreschpe 11:59eca2723ec5 429 SPI::write(color);
dreschpe 0:da1bf437cbc1 430 }
dreschpe 11:59eca2723ec5 431 SPI::format(8,3);
dreschpe 5:55aed13f2630 432 #endif
dreschpe 0:da1bf437cbc1 433 _cs = 1;
dreschpe 0:da1bf437cbc1 434 WindowMax();
dreschpe 0:da1bf437cbc1 435 return;
dreschpe 0:da1bf437cbc1 436 }
dreschpe 0:da1bf437cbc1 437
dreschpe 0:da1bf437cbc1 438 void SPI_TFT_ILI9341::vline(int x, int y0, int y1, int color)
dreschpe 0:da1bf437cbc1 439 {
dreschpe 0:da1bf437cbc1 440 int h;
dreschpe 0:da1bf437cbc1 441 h = y1 - y0 + 1;
dreschpe 0:da1bf437cbc1 442 window(x,y0,1,h);
dreschpe 5:55aed13f2630 443 wr_cmd(0x2C); // send pixel
dreschpe 5:55aed13f2630 444 #if defined TARGET_KL25Z // 8 Bit SPI
dreschpe 5:55aed13f2630 445 for (int y=0; y<h; y++) {
dreschpe 11:59eca2723ec5 446 SPI::write(color >> 8);
dreschpe 11:59eca2723ec5 447 SPI::write(color & 0xff);
dreschpe 5:55aed13f2630 448 }
dreschpe 5:55aed13f2630 449 #else
dreschpe 11:59eca2723ec5 450 SPI::format(16,3); // switch to 16 bit Mode 3
dreschpe 0:da1bf437cbc1 451 for (int y=0; y<h; y++) {
dreschpe 11:59eca2723ec5 452 SPI::write(color);
dreschpe 0:da1bf437cbc1 453 }
dreschpe 11:59eca2723ec5 454 SPI::format(8,3);
dreschpe 5:55aed13f2630 455 #endif
dreschpe 0:da1bf437cbc1 456 _cs = 1;
dreschpe 0:da1bf437cbc1 457 WindowMax();
dreschpe 0:da1bf437cbc1 458 return;
dreschpe 0:da1bf437cbc1 459 }
dreschpe 0:da1bf437cbc1 460
dreschpe 0:da1bf437cbc1 461
dreschpe 0:da1bf437cbc1 462
dreschpe 0:da1bf437cbc1 463 void SPI_TFT_ILI9341::line(int x0, int y0, int x1, int y1, int color)
dreschpe 0:da1bf437cbc1 464 {
dreschpe 0:da1bf437cbc1 465 //WindowMax();
dreschpe 0:da1bf437cbc1 466 int dx = 0, dy = 0;
dreschpe 0:da1bf437cbc1 467 int dx_sym = 0, dy_sym = 0;
dreschpe 0:da1bf437cbc1 468 int dx_x2 = 0, dy_x2 = 0;
dreschpe 0:da1bf437cbc1 469 int di = 0;
dreschpe 0:da1bf437cbc1 470
dreschpe 0:da1bf437cbc1 471 dx = x1-x0;
dreschpe 0:da1bf437cbc1 472 dy = y1-y0;
dreschpe 0:da1bf437cbc1 473
dreschpe 0:da1bf437cbc1 474 if (dx == 0) { /* vertical line */
dreschpe 0:da1bf437cbc1 475 if (y1 > y0) vline(x0,y0,y1,color);
dreschpe 0:da1bf437cbc1 476 else vline(x0,y1,y0,color);
dreschpe 0:da1bf437cbc1 477 return;
dreschpe 0:da1bf437cbc1 478 }
dreschpe 0:da1bf437cbc1 479
dreschpe 0:da1bf437cbc1 480 if (dx > 0) {
dreschpe 0:da1bf437cbc1 481 dx_sym = 1;
dreschpe 0:da1bf437cbc1 482 } else {
dreschpe 0:da1bf437cbc1 483 dx_sym = -1;
dreschpe 0:da1bf437cbc1 484 }
dreschpe 0:da1bf437cbc1 485 if (dy == 0) { /* horizontal line */
dreschpe 0:da1bf437cbc1 486 if (x1 > x0) hline(x0,x1,y0,color);
dreschpe 0:da1bf437cbc1 487 else hline(x1,x0,y0,color);
dreschpe 0:da1bf437cbc1 488 return;
dreschpe 0:da1bf437cbc1 489 }
dreschpe 0:da1bf437cbc1 490
dreschpe 0:da1bf437cbc1 491 if (dy > 0) {
dreschpe 0:da1bf437cbc1 492 dy_sym = 1;
dreschpe 0:da1bf437cbc1 493 } else {
dreschpe 0:da1bf437cbc1 494 dy_sym = -1;
dreschpe 0:da1bf437cbc1 495 }
dreschpe 0:da1bf437cbc1 496
dreschpe 0:da1bf437cbc1 497 dx = dx_sym*dx;
dreschpe 0:da1bf437cbc1 498 dy = dy_sym*dy;
dreschpe 0:da1bf437cbc1 499
dreschpe 0:da1bf437cbc1 500 dx_x2 = dx*2;
dreschpe 0:da1bf437cbc1 501 dy_x2 = dy*2;
dreschpe 0:da1bf437cbc1 502
dreschpe 0:da1bf437cbc1 503 if (dx >= dy) {
dreschpe 0:da1bf437cbc1 504 di = dy_x2 - dx;
dreschpe 0:da1bf437cbc1 505 while (x0 != x1) {
dreschpe 0:da1bf437cbc1 506
dreschpe 0:da1bf437cbc1 507 pixel(x0, y0, color);
dreschpe 0:da1bf437cbc1 508 x0 += dx_sym;
dreschpe 0:da1bf437cbc1 509 if (di<0) {
dreschpe 0:da1bf437cbc1 510 di += dy_x2;
dreschpe 0:da1bf437cbc1 511 } else {
dreschpe 0:da1bf437cbc1 512 di += dy_x2 - dx_x2;
dreschpe 0:da1bf437cbc1 513 y0 += dy_sym;
dreschpe 0:da1bf437cbc1 514 }
dreschpe 0:da1bf437cbc1 515 }
dreschpe 0:da1bf437cbc1 516 pixel(x0, y0, color);
dreschpe 0:da1bf437cbc1 517 } else {
dreschpe 0:da1bf437cbc1 518 di = dx_x2 - dy;
dreschpe 0:da1bf437cbc1 519 while (y0 != y1) {
dreschpe 0:da1bf437cbc1 520 pixel(x0, y0, color);
dreschpe 0:da1bf437cbc1 521 y0 += dy_sym;
dreschpe 0:da1bf437cbc1 522 if (di < 0) {
dreschpe 0:da1bf437cbc1 523 di += dx_x2;
dreschpe 0:da1bf437cbc1 524 } else {
dreschpe 0:da1bf437cbc1 525 di += dx_x2 - dy_x2;
dreschpe 0:da1bf437cbc1 526 x0 += dx_sym;
dreschpe 0:da1bf437cbc1 527 }
dreschpe 0:da1bf437cbc1 528 }
dreschpe 0:da1bf437cbc1 529 pixel(x0, y0, color);
dreschpe 0:da1bf437cbc1 530 }
dreschpe 0:da1bf437cbc1 531 return;
dreschpe 0:da1bf437cbc1 532 }
dreschpe 0:da1bf437cbc1 533
dreschpe 0:da1bf437cbc1 534
dreschpe 0:da1bf437cbc1 535 void SPI_TFT_ILI9341::rect(int x0, int y0, int x1, int y1, int color)
dreschpe 0:da1bf437cbc1 536 {
dreschpe 0:da1bf437cbc1 537
dreschpe 0:da1bf437cbc1 538 if (x1 > x0) hline(x0,x1,y0,color);
dreschpe 0:da1bf437cbc1 539 else hline(x1,x0,y0,color);
dreschpe 0:da1bf437cbc1 540
dreschpe 0:da1bf437cbc1 541 if (y1 > y0) vline(x0,y0,y1,color);
dreschpe 0:da1bf437cbc1 542 else vline(x0,y1,y0,color);
dreschpe 0:da1bf437cbc1 543
dreschpe 0:da1bf437cbc1 544 if (x1 > x0) hline(x0,x1,y1,color);
dreschpe 0:da1bf437cbc1 545 else hline(x1,x0,y1,color);
dreschpe 0:da1bf437cbc1 546
dreschpe 0:da1bf437cbc1 547 if (y1 > y0) vline(x1,y0,y1,color);
dreschpe 0:da1bf437cbc1 548 else vline(x1,y1,y0,color);
dreschpe 0:da1bf437cbc1 549
dreschpe 0:da1bf437cbc1 550 return;
dreschpe 0:da1bf437cbc1 551 }
dreschpe 0:da1bf437cbc1 552
dreschpe 0:da1bf437cbc1 553
dreschpe 0:da1bf437cbc1 554
dreschpe 0:da1bf437cbc1 555 void SPI_TFT_ILI9341::fillrect(int x0, int y0, int x1, int y1, int color)
dreschpe 0:da1bf437cbc1 556 {
dreschpe 0:da1bf437cbc1 557
dreschpe 0:da1bf437cbc1 558 int h = y1 - y0 + 1;
dreschpe 0:da1bf437cbc1 559 int w = x1 - x0 + 1;
dreschpe 0:da1bf437cbc1 560 int pixel = h * w;
dreschpe 0:da1bf437cbc1 561 window(x0,y0,w,h);
dreschpe 0:da1bf437cbc1 562 wr_cmd(0x2C); // send pixel
dreschpe 5:55aed13f2630 563 #if defined TARGET_KL25Z // 8 Bit SPI
dreschpe 5:55aed13f2630 564 for (int p=0; p<pixel; p++) {
dreschpe 11:59eca2723ec5 565 SPI::write(color >> 8);
dreschpe 11:59eca2723ec5 566 SPI::write(color & 0xff);
dreschpe 5:55aed13f2630 567 }
dreschpe 5:55aed13f2630 568 #else
dreschpe 11:59eca2723ec5 569 SPI::format(16,3); // switch to 16 bit Mode 3
dreschpe 0:da1bf437cbc1 570 for (int p=0; p<pixel; p++) {
dreschpe 11:59eca2723ec5 571 SPI::write(color);
dreschpe 0:da1bf437cbc1 572 }
dreschpe 11:59eca2723ec5 573 SPI::format(8,3);
dreschpe 5:55aed13f2630 574 #endif
dreschpe 0:da1bf437cbc1 575 _cs = 1;
dreschpe 0:da1bf437cbc1 576 WindowMax();
dreschpe 0:da1bf437cbc1 577 return;
dreschpe 0:da1bf437cbc1 578 }
dreschpe 0:da1bf437cbc1 579
dreschpe 0:da1bf437cbc1 580
dreschpe 0:da1bf437cbc1 581 void SPI_TFT_ILI9341::locate(int x, int y)
dreschpe 0:da1bf437cbc1 582 {
dreschpe 0:da1bf437cbc1 583 char_x = x;
dreschpe 0:da1bf437cbc1 584 char_y = y;
dreschpe 0:da1bf437cbc1 585 }
dreschpe 0:da1bf437cbc1 586
dreschpe 0:da1bf437cbc1 587
dreschpe 0:da1bf437cbc1 588
dreschpe 0:da1bf437cbc1 589 int SPI_TFT_ILI9341::columns()
dreschpe 0:da1bf437cbc1 590 {
dreschpe 0:da1bf437cbc1 591 return width() / font[1];
dreschpe 0:da1bf437cbc1 592 }
dreschpe 0:da1bf437cbc1 593
dreschpe 0:da1bf437cbc1 594
dreschpe 0:da1bf437cbc1 595
dreschpe 0:da1bf437cbc1 596 int SPI_TFT_ILI9341::rows()
dreschpe 0:da1bf437cbc1 597 {
dreschpe 0:da1bf437cbc1 598 return height() / font[2];
dreschpe 0:da1bf437cbc1 599 }
dreschpe 0:da1bf437cbc1 600
dreschpe 0:da1bf437cbc1 601
dreschpe 0:da1bf437cbc1 602
dreschpe 0:da1bf437cbc1 603 int SPI_TFT_ILI9341::_putc(int value)
dreschpe 0:da1bf437cbc1 604 {
dreschpe 0:da1bf437cbc1 605 if (value == '\n') { // new line
dreschpe 0:da1bf437cbc1 606 char_x = 0;
dreschpe 0:da1bf437cbc1 607 char_y = char_y + font[2];
dreschpe 0:da1bf437cbc1 608 if (char_y >= height() - font[2]) {
dreschpe 0:da1bf437cbc1 609 char_y = 0;
dreschpe 0:da1bf437cbc1 610 }
dreschpe 0:da1bf437cbc1 611 } else {
dreschpe 0:da1bf437cbc1 612 character(char_x, char_y, value);
dreschpe 0:da1bf437cbc1 613 }
dreschpe 0:da1bf437cbc1 614 return value;
dreschpe 0:da1bf437cbc1 615 }
dreschpe 0:da1bf437cbc1 616
dreschpe 0:da1bf437cbc1 617
dreschpe 0:da1bf437cbc1 618 void SPI_TFT_ILI9341::character(int x, int y, int c)
dreschpe 0:da1bf437cbc1 619 {
dreschpe 0:da1bf437cbc1 620 unsigned int hor,vert,offset,bpl,j,i,b;
dreschpe 0:da1bf437cbc1 621 unsigned char* zeichen;
dreschpe 0:da1bf437cbc1 622 unsigned char z,w;
dreschpe 0:da1bf437cbc1 623
dreschpe 0:da1bf437cbc1 624 if ((c < 31) || (c > 127)) return; // test char range
dreschpe 0:da1bf437cbc1 625
dreschpe 0:da1bf437cbc1 626 // read font parameter from start of array
dreschpe 0:da1bf437cbc1 627 offset = font[0]; // bytes / char
dreschpe 0:da1bf437cbc1 628 hor = font[1]; // get hor size of font
dreschpe 0:da1bf437cbc1 629 vert = font[2]; // get vert size of font
dreschpe 0:da1bf437cbc1 630 bpl = font[3]; // bytes per line
dreschpe 0:da1bf437cbc1 631
dreschpe 0:da1bf437cbc1 632 if (char_x + hor > width()) {
dreschpe 0:da1bf437cbc1 633 char_x = 0;
dreschpe 0:da1bf437cbc1 634 char_y = char_y + vert;
dreschpe 0:da1bf437cbc1 635 if (char_y >= height() - font[2]) {
dreschpe 0:da1bf437cbc1 636 char_y = 0;
dreschpe 0:da1bf437cbc1 637 }
dreschpe 0:da1bf437cbc1 638 }
dreschpe 0:da1bf437cbc1 639 window(char_x, char_y,hor,vert); // char box
dreschpe 5:55aed13f2630 640 wr_cmd(0x2C); // send pixel
dreschpe 5:55aed13f2630 641 #ifndef TARGET_KL25Z // 16 Bit SPI
dreschpe 11:59eca2723ec5 642 SPI::format(16,3);
dreschpe 5:55aed13f2630 643 #endif // switch to 16 bit Mode 3
dreschpe 0:da1bf437cbc1 644 zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap
dreschpe 0:da1bf437cbc1 645 w = zeichen[0]; // width of actual char
dreschpe 0:da1bf437cbc1 646 for (j=0; j<vert; j++) { // vert line
dreschpe 0:da1bf437cbc1 647 for (i=0; i<hor; i++) { // horz line
dreschpe 0:da1bf437cbc1 648 z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
dreschpe 0:da1bf437cbc1 649 b = 1 << (j & 0x07);
dreschpe 0:da1bf437cbc1 650 if (( z & b ) == 0x00) {
dreschpe 5:55aed13f2630 651 #ifndef TARGET_KL25Z // 16 Bit SPI
dreschpe 11:59eca2723ec5 652 SPI::write(_background);
dreschpe 5:55aed13f2630 653 #else
dreschpe 11:59eca2723ec5 654 SPI::write(_background >> 8);
dreschpe 11:59eca2723ec5 655 SPI::write(_background & 0xff);
dreschpe 5:55aed13f2630 656 #endif
dreschpe 0:da1bf437cbc1 657 } else {
dreschpe 5:55aed13f2630 658 #ifndef TARGET_KL25Z // 16 Bit SPI
dreschpe 11:59eca2723ec5 659 SPI::write(_foreground);
dreschpe 5:55aed13f2630 660 #else
dreschpe 11:59eca2723ec5 661 SPI::write(_foreground >> 8);
dreschpe 11:59eca2723ec5 662 SPI::write(_foreground & 0xff);
dreschpe 5:55aed13f2630 663 #endif
dreschpe 0:da1bf437cbc1 664 }
dreschpe 0:da1bf437cbc1 665 }
dreschpe 0:da1bf437cbc1 666 }
dreschpe 0:da1bf437cbc1 667 _cs = 1;
dreschpe 5:55aed13f2630 668 #ifndef TARGET_KL25Z // 16 Bit SPI
dreschpe 11:59eca2723ec5 669 SPI::format(8,3);
dreschpe 5:55aed13f2630 670 #endif
dreschpe 0:da1bf437cbc1 671 WindowMax();
dreschpe 0:da1bf437cbc1 672 if ((w + 2) < hor) { // x offset to next char
dreschpe 0:da1bf437cbc1 673 char_x += w + 2;
dreschpe 0:da1bf437cbc1 674 } else char_x += hor;
dreschpe 0:da1bf437cbc1 675 }
dreschpe 0:da1bf437cbc1 676
dreschpe 0:da1bf437cbc1 677
dreschpe 0:da1bf437cbc1 678 void SPI_TFT_ILI9341::set_font(unsigned char* f)
dreschpe 0:da1bf437cbc1 679 {
dreschpe 0:da1bf437cbc1 680 font = f;
dreschpe 0:da1bf437cbc1 681 }
dreschpe 0:da1bf437cbc1 682
dreschpe 0:da1bf437cbc1 683
dreschpe 0:da1bf437cbc1 684
dreschpe 0:da1bf437cbc1 685 void SPI_TFT_ILI9341::Bitmap(unsigned int x, unsigned int y, unsigned int w, unsigned int h,unsigned char *bitmap)
dreschpe 0:da1bf437cbc1 686 {
dreschpe 0:da1bf437cbc1 687 unsigned int j;
dreschpe 0:da1bf437cbc1 688 int padd;
dreschpe 0:da1bf437cbc1 689 unsigned short *bitmap_ptr = (unsigned short *)bitmap;
dreschpe 5:55aed13f2630 690 #if defined TARGET_KL25Z // 8 Bit SPI
dreschpe 5:55aed13f2630 691 unsigned short pix_temp;
dreschpe 5:55aed13f2630 692 #endif
dreschpe 5:55aed13f2630 693
dreschpe 2:0a16083193a4 694 unsigned int i;
dreschpe 2:0a16083193a4 695
dreschpe 0:da1bf437cbc1 696 // the lines are padded to multiple of 4 bytes in a bitmap
dreschpe 0:da1bf437cbc1 697 padd = -1;
dreschpe 0:da1bf437cbc1 698 do {
dreschpe 0:da1bf437cbc1 699 padd ++;
dreschpe 0:da1bf437cbc1 700 } while (2*(w + padd)%4 != 0);
dreschpe 0:da1bf437cbc1 701 window(x, y, w, h);
dreschpe 2:0a16083193a4 702 bitmap_ptr += ((h - 1)* (w + padd));
dreschpe 5:55aed13f2630 703 wr_cmd(0x2C); // send pixel
dreschpe 5:55aed13f2630 704 #ifndef TARGET_KL25Z // 16 Bit SPI
dreschpe 11:59eca2723ec5 705 SPI::format(16,3);
dreschpe 5:55aed13f2630 706 #endif // switch to 16 bit Mode 3
dreschpe 2:0a16083193a4 707 for (j = 0; j < h; j++) { //Lines
dreschpe 2:0a16083193a4 708 for (i = 0; i < w; i++) { // one line
dreschpe 5:55aed13f2630 709 #if defined TARGET_KL25Z // 8 Bit SPI
dreschpe 5:55aed13f2630 710 pix_temp = *bitmap_ptr;
dreschpe 11:59eca2723ec5 711 SPI::write(pix_temp >> 8);
dreschpe 11:59eca2723ec5 712 SPI::write(pix_temp);
dreschpe 5:55aed13f2630 713 bitmap_ptr++;
dreschpe 5:55aed13f2630 714 #else
dreschpe 11:59eca2723ec5 715 SPI::write(*bitmap_ptr); // one line
dreschpe 5:55aed13f2630 716 bitmap_ptr++;
dreschpe 5:55aed13f2630 717 #endif
dreschpe 0:da1bf437cbc1 718 }
dreschpe 0:da1bf437cbc1 719 bitmap_ptr -= 2*w;
dreschpe 0:da1bf437cbc1 720 bitmap_ptr -= padd;
dreschpe 0:da1bf437cbc1 721 }
dreschpe 0:da1bf437cbc1 722 _cs = 1;
dreschpe 5:55aed13f2630 723 #ifndef TARGET_KL25Z // 16 Bit SPI
dreschpe 11:59eca2723ec5 724 SPI::format(8,3);
dreschpe 5:55aed13f2630 725 #endif
dreschpe 0:da1bf437cbc1 726 WindowMax();
dreschpe 0:da1bf437cbc1 727 }
dreschpe 0:da1bf437cbc1 728
dreschpe 0:da1bf437cbc1 729
dreschpe 6:fe07ae8329f7 730 // local filesystem is not implemented in kinetis board , but you can add a SD card
dreschpe 5:55aed13f2630 731
dreschpe 0:da1bf437cbc1 732 int SPI_TFT_ILI9341::BMP_16(unsigned int x, unsigned int y, const char *Name_BMP)
dreschpe 0:da1bf437cbc1 733 {
dreschpe 0:da1bf437cbc1 734
dreschpe 0:da1bf437cbc1 735 #define OffsetPixelWidth 18
dreschpe 0:da1bf437cbc1 736 #define OffsetPixelHeigh 22
dreschpe 0:da1bf437cbc1 737 #define OffsetFileSize 34
dreschpe 0:da1bf437cbc1 738 #define OffsetPixData 10
dreschpe 0:da1bf437cbc1 739 #define OffsetBPP 28
dreschpe 0:da1bf437cbc1 740
dreschpe 0:da1bf437cbc1 741 char filename[50];
dreschpe 0:da1bf437cbc1 742 unsigned char BMP_Header[54];
dreschpe 0:da1bf437cbc1 743 unsigned short BPP_t;
dreschpe 0:da1bf437cbc1 744 unsigned int PixelWidth,PixelHeigh,start_data;
dreschpe 0:da1bf437cbc1 745 unsigned int i,off;
dreschpe 0:da1bf437cbc1 746 int padd,j;
dreschpe 0:da1bf437cbc1 747 unsigned short *line;
dreschpe 0:da1bf437cbc1 748
dreschpe 0:da1bf437cbc1 749 // get the filename
dreschpe 6:fe07ae8329f7 750 i=0;
dreschpe 0:da1bf437cbc1 751 while (*Name_BMP!='\0') {
dreschpe 0:da1bf437cbc1 752 filename[i++]=*Name_BMP++;
dreschpe 0:da1bf437cbc1 753 }
dreschpe 6:fe07ae8329f7 754 filename[i] = 0;
dreschpe 6:fe07ae8329f7 755
dreschpe 0:da1bf437cbc1 756 FILE *Image = fopen((const char *)&filename[0], "rb"); // open the bmp file
dreschpe 0:da1bf437cbc1 757 if (!Image) {
dreschpe 0:da1bf437cbc1 758 return(0); // error file not found !
dreschpe 0:da1bf437cbc1 759 }
dreschpe 0:da1bf437cbc1 760
dreschpe 0:da1bf437cbc1 761 fread(&BMP_Header[0],1,54,Image); // get the BMP Header
dreschpe 0:da1bf437cbc1 762
dreschpe 0:da1bf437cbc1 763 if (BMP_Header[0] != 0x42 || BMP_Header[1] != 0x4D) { // check magic byte
dreschpe 0:da1bf437cbc1 764 fclose(Image);
dreschpe 0:da1bf437cbc1 765 return(-1); // error no BMP file
dreschpe 0:da1bf437cbc1 766 }
dreschpe 0:da1bf437cbc1 767
dreschpe 0:da1bf437cbc1 768 BPP_t = BMP_Header[OffsetBPP] + (BMP_Header[OffsetBPP + 1] << 8);
dreschpe 0:da1bf437cbc1 769 if (BPP_t != 0x0010) {
dreschpe 0:da1bf437cbc1 770 fclose(Image);
dreschpe 0:da1bf437cbc1 771 return(-2); // error no 16 bit BMP
dreschpe 0:da1bf437cbc1 772 }
dreschpe 0:da1bf437cbc1 773
dreschpe 0:da1bf437cbc1 774 PixelHeigh = BMP_Header[OffsetPixelHeigh] + (BMP_Header[OffsetPixelHeigh + 1] << 8) + (BMP_Header[OffsetPixelHeigh + 2] << 16) + (BMP_Header[OffsetPixelHeigh + 3] << 24);
dreschpe 0:da1bf437cbc1 775 PixelWidth = BMP_Header[OffsetPixelWidth] + (BMP_Header[OffsetPixelWidth + 1] << 8) + (BMP_Header[OffsetPixelWidth + 2] << 16) + (BMP_Header[OffsetPixelWidth + 3] << 24);
dreschpe 0:da1bf437cbc1 776 if (PixelHeigh > height() + y || PixelWidth > width() + x) {
dreschpe 0:da1bf437cbc1 777 fclose(Image);
dreschpe 0:da1bf437cbc1 778 return(-3); // to big
dreschpe 0:da1bf437cbc1 779 }
dreschpe 0:da1bf437cbc1 780
dreschpe 0:da1bf437cbc1 781 start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24);
dreschpe 0:da1bf437cbc1 782
dreschpe 0:da1bf437cbc1 783 line = (unsigned short *) malloc (2 * PixelWidth); // we need a buffer for a line
dreschpe 0:da1bf437cbc1 784 if (line == NULL) {
dreschpe 0:da1bf437cbc1 785 return(-4); // error no memory
dreschpe 0:da1bf437cbc1 786 }
dreschpe 0:da1bf437cbc1 787
dreschpe 0:da1bf437cbc1 788 // the bmp lines are padded to multiple of 4 bytes
dreschpe 0:da1bf437cbc1 789 padd = -1;
dreschpe 0:da1bf437cbc1 790 do {
dreschpe 0:da1bf437cbc1 791 padd ++;
dreschpe 0:da1bf437cbc1 792 } while ((PixelWidth * 2 + padd)%4 != 0);
dreschpe 0:da1bf437cbc1 793
dreschpe 0:da1bf437cbc1 794 window(x, y,PixelWidth ,PixelHeigh);
dreschpe 6:fe07ae8329f7 795 wr_cmd(0x2C); // send pixel
dreschpe 6:fe07ae8329f7 796 #ifndef TARGET_KL25Z // only 8 Bit SPI
dreschpe 11:59eca2723ec5 797 SPI::format(16,3);
dreschpe 6:fe07ae8329f7 798 #endif // switch to 16 bit Mode 3
dreschpe 0:da1bf437cbc1 799 for (j = PixelHeigh - 1; j >= 0; j--) { //Lines bottom up
dreschpe 0:da1bf437cbc1 800 off = j * (PixelWidth * 2 + padd) + start_data; // start of line
dreschpe 0:da1bf437cbc1 801 fseek(Image, off ,SEEK_SET);
dreschpe 6:fe07ae8329f7 802 fread(line,1,PixelWidth * 2,Image); // read a line - slow
dreschpe 0:da1bf437cbc1 803 for (i = 0; i < PixelWidth; i++) { // copy pixel data to TFT
dreschpe 6:fe07ae8329f7 804 #ifndef TARGET_KL25Z // only 8 Bit SPI
dreschpe 11:59eca2723ec5 805 SPI::write(line[i]); // one 16 bit pixel
dreschpe 6:fe07ae8329f7 806 #else
dreschpe 11:59eca2723ec5 807 SPI::write(line[i] >> 8);
dreschpe 11:59eca2723ec5 808 SPI::write(line[i]);
dreschpe 6:fe07ae8329f7 809 #endif
dreschpe 0:da1bf437cbc1 810 }
dreschpe 0:da1bf437cbc1 811 }
dreschpe 0:da1bf437cbc1 812 _cs = 1;
dreschpe 11:59eca2723ec5 813 SPI::format(8,3);
dreschpe 0:da1bf437cbc1 814 free (line);
dreschpe 0:da1bf437cbc1 815 fclose(Image);
dreschpe 0:da1bf437cbc1 816 WindowMax();
dreschpe 0:da1bf437cbc1 817 return(1);
dreschpe 5:55aed13f2630 818 }
dreschpe 11:59eca2723ec5 819
dreschpe 11:59eca2723ec5 820 #endif