aitendo T18003T01-V2,TFT1.8,SPI,FRDM-KL25Z

Dependents:   FRDM_SPI18TFT_demo

Fork of ST7735_TFT by Jonne Valola

Committer:
king33jp
Date:
Thu Mar 19 13:34:50 2015 +0000
Revision:
2:047ca9682450
aitendo 1.8"TFT,SPI,ST7735B

Who changed what in which revision?

UserRevisionLine numberNew contents of line
king33jp 2:047ca9682450 1 /* mbed library for 128*160 pixel display TFT based on ST7735 LCD Controller
king33jp 2:047ca9682450 2 * ST7735 specific routines (initialization, window addressing, pixel output)
king33jp 2:047ca9682450 3 * Copyright (c) 2011 Jonne Valola
king33jp 2:047ca9682450 4 *
king33jp 2:047ca9682450 5 * WARNING !! WORK IN PROGRESS !!!
king33jp 2:047ca9682450 6 *
king33jp 2:047ca9682450 7 * Graphics routines and SPI routines derived work used with permission from:
king33jp 2:047ca9682450 8 * mbed library for 240*320 pixel display TFT based on HX8347D LCD Controller
king33jp 2:047ca9682450 9 * Copyright (c) 2011 Peter Drescher - DC2PD
king33jp 2:047ca9682450 10 *
king33jp 2:047ca9682450 11 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
king33jp 2:047ca9682450 12 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
king33jp 2:047ca9682450 13 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
king33jp 2:047ca9682450 14 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
king33jp 2:047ca9682450 15 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
king33jp 2:047ca9682450 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
king33jp 2:047ca9682450 17 * THE SOFTWARE.
king33jp 2:047ca9682450 18 */
king33jp 2:047ca9682450 19
king33jp 2:047ca9682450 20
king33jp 2:047ca9682450 21 #include "ST7735B_TFT.h"
king33jp 2:047ca9682450 22 #include "mbed.h"
king33jp 2:047ca9682450 23
king33jp 2:047ca9682450 24 #define BPP 16 // Bits per pixel
king33jp 2:047ca9682450 25
king33jp 2:047ca9682450 26 ST7735_TFT::ST7735_TFT(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName rs, PinName reset, const char *name)
king33jp 2:047ca9682450 27 : _spi(mosi, miso, sclk), _cs(cs), _rs(rs), _reset(reset),GraphicsDisplay(name) {
king33jp 2:047ca9682450 28 tft_reset();
king33jp 2:047ca9682450 29 orientation = 2;
king33jp 2:047ca9682450 30 char_x = 0;
king33jp 2:047ca9682450 31 }
king33jp 2:047ca9682450 32
king33jp 2:047ca9682450 33
king33jp 2:047ca9682450 34 int ST7735_TFT::width() {
king33jp 2:047ca9682450 35 if (orientation == 0 || orientation == 2) return 128;
king33jp 2:047ca9682450 36 else return 160;
king33jp 2:047ca9682450 37 }
king33jp 2:047ca9682450 38
king33jp 2:047ca9682450 39
king33jp 2:047ca9682450 40 int ST7735_TFT::height() {
king33jp 2:047ca9682450 41 if (orientation == 0 || orientation == 2) return 160;
king33jp 2:047ca9682450 42 else return 128;
king33jp 2:047ca9682450 43 }
king33jp 2:047ca9682450 44
king33jp 2:047ca9682450 45
king33jp 2:047ca9682450 46 void ST7735_TFT::set_orientation(unsigned int o) {
king33jp 2:047ca9682450 47 orientation = o;
king33jp 2:047ca9682450 48 #if 0
king33jp 2:047ca9682450 49 switch (orientation) {
king33jp 2:047ca9682450 50 case 0:
king33jp 2:047ca9682450 51 wr_reg(ST7735_MADCTL, 0x0008);
king33jp 2:047ca9682450 52 break;
king33jp 2:047ca9682450 53 case 1:
king33jp 2:047ca9682450 54 wr_reg(ST7735_MADCTL, 0x0068);
king33jp 2:047ca9682450 55 break;
king33jp 2:047ca9682450 56 case 2:
king33jp 2:047ca9682450 57 wr_reg(ST7735_MADCTL, 0x00C8);
king33jp 2:047ca9682450 58 break;
king33jp 2:047ca9682450 59 case 3:
king33jp 2:047ca9682450 60 wr_reg(ST7735_MADCTL, 0x00A8);
king33jp 2:047ca9682450 61 break;
king33jp 2:047ca9682450 62 #else
king33jp 2:047ca9682450 63 switch (orientation) {
king33jp 2:047ca9682450 64 case 0:
king33jp 2:047ca9682450 65 wr_reg(ST7735_MADCTL, 0x0000);
king33jp 2:047ca9682450 66 break;
king33jp 2:047ca9682450 67 case 1:
king33jp 2:047ca9682450 68 wr_reg(ST7735_MADCTL, 0x0060);
king33jp 2:047ca9682450 69 break;
king33jp 2:047ca9682450 70 case 2:
king33jp 2:047ca9682450 71 wr_reg(ST7735_MADCTL, 0x00C0);
king33jp 2:047ca9682450 72 break;
king33jp 2:047ca9682450 73 case 3:
king33jp 2:047ca9682450 74 wr_reg(ST7735_MADCTL, 0x00A0);
king33jp 2:047ca9682450 75 break;
king33jp 2:047ca9682450 76 #endif
king33jp 2:047ca9682450 77 }
king33jp 2:047ca9682450 78 }
king33jp 2:047ca9682450 79
king33jp 2:047ca9682450 80
king33jp 2:047ca9682450 81
king33jp 2:047ca9682450 82 void ST7735_TFT::wr_cmd(int cmd) {
king33jp 2:047ca9682450 83 _rs = 0; // rs low, cs low for transmitting command
king33jp 2:047ca9682450 84 _cs = 0;
king33jp 2:047ca9682450 85 _spi.write(cmd);
king33jp 2:047ca9682450 86 _cs = 1;
king33jp 2:047ca9682450 87 }
king33jp 2:047ca9682450 88
king33jp 2:047ca9682450 89
king33jp 2:047ca9682450 90
king33jp 2:047ca9682450 91 void ST7735_TFT::wr_dat(int dat) {
king33jp 2:047ca9682450 92 _rs = 1; // rs high, cs low for transmitting data
king33jp 2:047ca9682450 93 _cs = 0;
king33jp 2:047ca9682450 94 _spi.write(dat);
king33jp 2:047ca9682450 95 _cs = 1;
king33jp 2:047ca9682450 96 }
king33jp 2:047ca9682450 97
king33jp 2:047ca9682450 98
king33jp 2:047ca9682450 99
king33jp 2:047ca9682450 100 void ST7735_TFT::wr_dat_start(void) {
king33jp 2:047ca9682450 101 _rs = 1; // rs high, cs low for transmitting data
king33jp 2:047ca9682450 102 _cs = 0;
king33jp 2:047ca9682450 103 }
king33jp 2:047ca9682450 104
king33jp 2:047ca9682450 105
king33jp 2:047ca9682450 106
king33jp 2:047ca9682450 107 void ST7735_TFT::wr_dat_stop (void) {
king33jp 2:047ca9682450 108 _cs = 1;
king33jp 2:047ca9682450 109 }
king33jp 2:047ca9682450 110
king33jp 2:047ca9682450 111
king33jp 2:047ca9682450 112
king33jp 2:047ca9682450 113 void ST7735_TFT::wr_dat_only (unsigned short dat) {
king33jp 2:047ca9682450 114 _spi.write(dat);
king33jp 2:047ca9682450 115 }
king33jp 2:047ca9682450 116
king33jp 2:047ca9682450 117
king33jp 2:047ca9682450 118 unsigned short ST7735_TFT::rd_dat (void) {
king33jp 2:047ca9682450 119 unsigned short val = 0;
king33jp 2:047ca9682450 120 _cs = 0;
king33jp 2:047ca9682450 121 _spi.write(0); /* Dummy read 1 */
king33jp 2:047ca9682450 122 val = _spi.write(0); /* Read D8..D15 */
king33jp 2:047ca9682450 123 val <<= 8;
king33jp 2:047ca9682450 124 val |= _spi.write(0); /* Read D0..D7 */
king33jp 2:047ca9682450 125 _cs = 1;
king33jp 2:047ca9682450 126 return (val);
king33jp 2:047ca9682450 127 }
king33jp 2:047ca9682450 128
king33jp 2:047ca9682450 129 void ST7735_TFT::wr_reg (unsigned char reg, unsigned short val) {
king33jp 2:047ca9682450 130
king33jp 2:047ca9682450 131 wr_cmd(reg);
king33jp 2:047ca9682450 132 wr_dat(val);
king33jp 2:047ca9682450 133 }
king33jp 2:047ca9682450 134
king33jp 2:047ca9682450 135
king33jp 2:047ca9682450 136 unsigned short ST7735_TFT::rd_reg (unsigned char reg) {
king33jp 2:047ca9682450 137
king33jp 2:047ca9682450 138 wr_cmd(reg);
king33jp 2:047ca9682450 139 return(rd_dat());
king33jp 2:047ca9682450 140 }
king33jp 2:047ca9682450 141
king33jp 2:047ca9682450 142 void ST7735_TFT::read_area(unsigned int x, unsigned int y, unsigned int w, unsigned int h,unsigned char *buffer) {
king33jp 2:047ca9682450 143 // BEWARE !
king33jp 2:047ca9682450 144 // DOES NOT WORK CORRECTLY YET !!!
king33jp 2:047ca9682450 145 int val;
king33jp 2:047ca9682450 146 window(x,y,w,h);
king33jp 2:047ca9682450 147 wr_cmd(ST7735_RAMRD); // write to RAM
king33jp 2:047ca9682450 148 _cs = 0;
king33jp 2:047ca9682450 149 _rs = 1;
king33jp 2:047ca9682450 150 _spi.write(0); /* Dummy read 1 */
king33jp 2:047ca9682450 151
king33jp 2:047ca9682450 152 val = _spi.write(0); /* Read D8..D15 */
king33jp 2:047ca9682450 153 val <<= 8;
king33jp 2:047ca9682450 154 val |= _spi.write(0); /* Read D0..D7 */
king33jp 2:047ca9682450 155 _cs = 1;
king33jp 2:047ca9682450 156 }
king33jp 2:047ca9682450 157
king33jp 2:047ca9682450 158 int ST7735_TFT::getpixel(unsigned int x, unsigned int y) {
king33jp 2:047ca9682450 159 // BEWARE !
king33jp 2:047ca9682450 160 // DOES NOT WORK CORRECTLY YET !!!
king33jp 2:047ca9682450 161 int val;
king33jp 2:047ca9682450 162 _spi.format(8,3);
king33jp 2:047ca9682450 163 wr_cmd(ST7735_CASET); // column addr set
king33jp 2:047ca9682450 164 wr_dat(0x00);
king33jp 2:047ca9682450 165 wr_dat(x+2); // XSTART
king33jp 2:047ca9682450 166 wr_dat(0x00);
king33jp 2:047ca9682450 167 wr_dat(x+2+2); // XEND
king33jp 2:047ca9682450 168
king33jp 2:047ca9682450 169 wr_cmd(ST7735_RASET); // row addr set
king33jp 2:047ca9682450 170 wr_dat(0x00);
king33jp 2:047ca9682450 171 wr_dat(y+1); // YSTART
king33jp 2:047ca9682450 172 wr_dat(0x00);
king33jp 2:047ca9682450 173 wr_dat(y+1+1); // YEND
king33jp 2:047ca9682450 174
king33jp 2:047ca9682450 175 _rs = 0; // rs low, cs low for transmitting command
king33jp 2:047ca9682450 176 _cs = 0;
king33jp 2:047ca9682450 177 _spi.write(0x2E);
king33jp 2:047ca9682450 178 _rs = 1;
king33jp 2:047ca9682450 179 _spi.write(0x00); /* Dummy read 1 */
king33jp 2:047ca9682450 180
king33jp 2:047ca9682450 181 val = _spi.write(0x00); /* Read D8..D15 */
king33jp 2:047ca9682450 182 val <<= 8;
king33jp 2:047ca9682450 183 val |= _spi.write(0x00); /* Read D0..D7 */
king33jp 2:047ca9682450 184
king33jp 2:047ca9682450 185 _cs = 1;
king33jp 2:047ca9682450 186 return val;
king33jp 2:047ca9682450 187 }
king33jp 2:047ca9682450 188
king33jp 2:047ca9682450 189
king33jp 2:047ca9682450 190 void ST7735_TFT::tft_reset() {
king33jp 2:047ca9682450 191 static unsigned short driverCode;
king33jp 2:047ca9682450 192
king33jp 2:047ca9682450 193 // init SPI
king33jp 2:047ca9682450 194 _spi.format(8,3); // 8 bit spi mode 3
king33jp 2:047ca9682450 195 //_spi.frequency(16000000); // 16Mhz SPI clock ... 15Mhz is maximum for display, but it seems to work
king33jp 2:047ca9682450 196 _spi.frequency(10000000); // 16Mhz SPI clock ... 15Mhz is maximum for display, but it seems to work
king33jp 2:047ca9682450 197
king33jp 2:047ca9682450 198 // reset exactly like in Arduino version
king33jp 2:047ca9682450 199 _cs = 0;
king33jp 2:047ca9682450 200 _reset = 1; // reset
king33jp 2:047ca9682450 201 wait_ms(500);
king33jp 2:047ca9682450 202 _reset = 0; // reset
king33jp 2:047ca9682450 203 wait_ms(500);
king33jp 2:047ca9682450 204 _reset = 1; // reset
king33jp 2:047ca9682450 205 wait_ms(500);
king33jp 2:047ca9682450 206
king33jp 2:047ca9682450 207 /* Start Initial Sequence ----------------------------------------------------*/
king33jp 2:047ca9682450 208 wr_cmd(ST7735_SWRESET); /* SW Reset */
king33jp 2:047ca9682450 209 wait_ms(150);
king33jp 2:047ca9682450 210 wr_cmd(ST7735_SLPOUT); /* Out of sleepmode */
king33jp 2:047ca9682450 211 wait_ms(500);
king33jp 2:047ca9682450 212
king33jp 2:047ca9682450 213 wr_cmd(ST7735_FRMCTR1); /* Frame rate in normal mode */
king33jp 2:047ca9682450 214 wr_dat(0x01);
king33jp 2:047ca9682450 215 wr_dat(0x2C);
king33jp 2:047ca9682450 216 wr_dat(0x2D);
king33jp 2:047ca9682450 217
king33jp 2:047ca9682450 218 wr_cmd(ST7735_FRMCTR2); /* Frame rate in idle mode */
king33jp 2:047ca9682450 219 wr_dat(0x01);
king33jp 2:047ca9682450 220 wr_dat(0x2C);
king33jp 2:047ca9682450 221 wr_dat(0x2D);
king33jp 2:047ca9682450 222
king33jp 2:047ca9682450 223 wr_cmd(ST7735_FRMCTR3); /* Frame rate in partial mode */
king33jp 2:047ca9682450 224 wr_dat(0x01);
king33jp 2:047ca9682450 225 wr_dat(0x2C);
king33jp 2:047ca9682450 226 wr_dat(0x2D);
king33jp 2:047ca9682450 227 wr_dat(0x01); // inversion mode settings
king33jp 2:047ca9682450 228 wr_dat(0x2C);
king33jp 2:047ca9682450 229 wr_dat(0x2D);
king33jp 2:047ca9682450 230
king33jp 2:047ca9682450 231 wr_cmd(ST7735_INVCTR); // Inverted mode off
king33jp 2:047ca9682450 232 wr_dat(0x07);
king33jp 2:047ca9682450 233
king33jp 2:047ca9682450 234 wr_cmd(ST7735_PWCTR1); // POWER CONTROL 1
king33jp 2:047ca9682450 235 wr_dat(0xA2);
king33jp 2:047ca9682450 236 wr_dat(0x02); // -4.6V
king33jp 2:047ca9682450 237 wr_dat(0x84); // AUTO mode
king33jp 2:047ca9682450 238
king33jp 2:047ca9682450 239 wr_cmd(ST7735_PWCTR2); // POWER CONTROL 2
king33jp 2:047ca9682450 240 wr_dat(0xC5); // VGH25 = 2.4C VGSEL =-10 VGH = 3*AVDD
king33jp 2:047ca9682450 241
king33jp 2:047ca9682450 242 wr_cmd(ST7735_PWCTR3); // POWER CONTROL 3
king33jp 2:047ca9682450 243 wr_dat(0x0A); // Opamp current small
king33jp 2:047ca9682450 244 wr_dat(0x00); // Boost freq
king33jp 2:047ca9682450 245
king33jp 2:047ca9682450 246 wr_cmd(ST7735_PWCTR4); // POWER CONTROL 4
king33jp 2:047ca9682450 247 wr_dat(0x8A); // BCLK/2, Opamp current small / medium low
king33jp 2:047ca9682450 248 wr_dat(0x2A); //
king33jp 2:047ca9682450 249
king33jp 2:047ca9682450 250 wr_cmd(ST7735_PWCTR5); // POWER CONTROL 5
king33jp 2:047ca9682450 251 wr_dat(0x8A); // BCLK/2, Opamp current small / medium low
king33jp 2:047ca9682450 252 wr_dat(0xEE); //
king33jp 2:047ca9682450 253
king33jp 2:047ca9682450 254 wr_cmd(ST7735_VMCTR1); // POWER CONTROL 6
king33jp 2:047ca9682450 255 wr_dat(0x0E); //
king33jp 2:047ca9682450 256
king33jp 2:047ca9682450 257 wr_cmd(ST7735_INVOFF); // INVOFF
king33jp 2:047ca9682450 258
king33jp 2:047ca9682450 259 wr_cmd(ST7735_MADCTL); // ORIENTATION
king33jp 2:047ca9682450 260 // wr_dat(0xC8); //
king33jp 2:047ca9682450 261 wr_dat(0xC0); // RGB bit=0
king33jp 2:047ca9682450 262
king33jp 2:047ca9682450 263 wr_cmd(ST7735_COLMOD); // COLOR MODE
king33jp 2:047ca9682450 264 wr_dat(0x05); //
king33jp 2:047ca9682450 265
king33jp 2:047ca9682450 266 wr_cmd(ST7735_CASET); // COLUMN ADDR SET
king33jp 2:047ca9682450 267 wr_dat(0x00); //
king33jp 2:047ca9682450 268 wr_dat(0x00); // xstart = 0
king33jp 2:047ca9682450 269 wr_dat(0x00); //
king33jp 2:047ca9682450 270 wr_dat(0x7F); // xend = 127
king33jp 2:047ca9682450 271
king33jp 2:047ca9682450 272 wr_cmd(ST7735_RASET); // ROW ADDR SET
king33jp 2:047ca9682450 273 wr_dat(0x00); //
king33jp 2:047ca9682450 274 wr_dat(0x00); // ystart = 0
king33jp 2:047ca9682450 275 wr_dat(0x00); //
king33jp 2:047ca9682450 276 wr_dat(0x9F); // yend = 159
king33jp 2:047ca9682450 277
king33jp 2:047ca9682450 278 /* Gamma settings -----------------------------------------------------------*/
king33jp 2:047ca9682450 279
king33jp 2:047ca9682450 280 wr_cmd(0xE0); // GMCTRP1
king33jp 2:047ca9682450 281 wr_dat(0x02);
king33jp 2:047ca9682450 282 wr_dat(0x1c);
king33jp 2:047ca9682450 283 wr_dat(0x07);
king33jp 2:047ca9682450 284 wr_dat(0x12);
king33jp 2:047ca9682450 285 wr_dat(0x37);
king33jp 2:047ca9682450 286 wr_dat(0x32);
king33jp 2:047ca9682450 287 wr_dat(0x29);
king33jp 2:047ca9682450 288 wr_dat(0x2d);
king33jp 2:047ca9682450 289 wr_dat(0x29);
king33jp 2:047ca9682450 290 wr_dat(0x25);
king33jp 2:047ca9682450 291 wr_dat(0x2B);
king33jp 2:047ca9682450 292 wr_dat(0x39);
king33jp 2:047ca9682450 293 wr_dat(0x00);
king33jp 2:047ca9682450 294 wr_dat(0x01);
king33jp 2:047ca9682450 295 wr_dat(0x03);
king33jp 2:047ca9682450 296 wr_dat(0x10);
king33jp 2:047ca9682450 297 wr_cmd(0xE1); // GMCTRN1
king33jp 2:047ca9682450 298 wr_dat(0x03);
king33jp 2:047ca9682450 299 wr_dat(0x1d);
king33jp 2:047ca9682450 300 wr_dat(0x07);
king33jp 2:047ca9682450 301 wr_dat(0x06);
king33jp 2:047ca9682450 302 wr_dat(0x2E);
king33jp 2:047ca9682450 303 wr_dat(0x2C);
king33jp 2:047ca9682450 304 wr_dat(0x29);
king33jp 2:047ca9682450 305 wr_dat(0x2D);
king33jp 2:047ca9682450 306 wr_dat(0x2E);
king33jp 2:047ca9682450 307 wr_dat(0x2E);
king33jp 2:047ca9682450 308 wr_dat(0x37);
king33jp 2:047ca9682450 309 wr_dat(0x3F);
king33jp 2:047ca9682450 310 wr_dat(0x00);
king33jp 2:047ca9682450 311 wr_dat(0x00);
king33jp 2:047ca9682450 312 wr_dat(0x02);
king33jp 2:047ca9682450 313 wr_dat(0x10);
king33jp 2:047ca9682450 314
king33jp 2:047ca9682450 315 wr_cmd(ST7735_DISPON); // display ON
king33jp 2:047ca9682450 316 wait_ms(100);
king33jp 2:047ca9682450 317
king33jp 2:047ca9682450 318 wr_cmd(ST7735_NORON); // normal display on
king33jp 2:047ca9682450 319 wait_ms(10);
king33jp 2:047ca9682450 320
king33jp 2:047ca9682450 321 switch (orientation) {
king33jp 2:047ca9682450 322 case 0:
king33jp 2:047ca9682450 323 wr_reg(0xC8, 0x0008);
king33jp 2:047ca9682450 324 break;
king33jp 2:047ca9682450 325 case 1:
king33jp 2:047ca9682450 326 wr_reg(0xC8, 0x0068);
king33jp 2:047ca9682450 327 break;
king33jp 2:047ca9682450 328 case 2:
king33jp 2:047ca9682450 329 wr_reg(0xC8, 0x00C8);
king33jp 2:047ca9682450 330 break;
king33jp 2:047ca9682450 331 case 3:
king33jp 2:047ca9682450 332 wr_reg(0xC8, 0x00A8);
king33jp 2:047ca9682450 333 break;
king33jp 2:047ca9682450 334 }
king33jp 2:047ca9682450 335 WindowMax ();
king33jp 2:047ca9682450 336 }
king33jp 2:047ca9682450 337
king33jp 2:047ca9682450 338
king33jp 2:047ca9682450 339 void ST7735_TFT::pixel(int x, int y, int color) {
king33jp 2:047ca9682450 340 if ((x >= width()) || (y >= height())) return;
king33jp 2:047ca9682450 341
king33jp 2:047ca9682450 342 window(x,y,x+1,y+1);
king33jp 2:047ca9682450 343
king33jp 2:047ca9682450 344 // setup for data
king33jp 2:047ca9682450 345 _rs = 1;
king33jp 2:047ca9682450 346 _cs = 0;
king33jp 2:047ca9682450 347 #if defined TARGET_KL25Z
king33jp 2:047ca9682450 348 _spi.write(color >> 8);
king33jp 2:047ca9682450 349 _spi.write(color & 0xFF);
king33jp 2:047ca9682450 350 #else
king33jp 2:047ca9682450 351 _spi.format(16,3);
king33jp 2:047ca9682450 352 _spi.write(color);
king33jp 2:047ca9682450 353 _spi.format(8,3);
king33jp 2:047ca9682450 354 #endif
king33jp 2:047ca9682450 355 _cs = 1;
king33jp 2:047ca9682450 356 }
king33jp 2:047ca9682450 357
king33jp 2:047ca9682450 358 void ST7735_TFT::window (unsigned int x, unsigned int y, unsigned int w, unsigned int h) {
king33jp 2:047ca9682450 359 #if 0
king33jp 2:047ca9682450 360 wr_cmd(ST7735_CASET); // column addr set
king33jp 2:047ca9682450 361 wr_dat(0x00);
king33jp 2:047ca9682450 362 wr_dat(x+2); // XSTART
king33jp 2:047ca9682450 363 wr_dat(0x00);
king33jp 2:047ca9682450 364 wr_dat(x+w+1); // XEND
king33jp 2:047ca9682450 365
king33jp 2:047ca9682450 366 wr_cmd(ST7735_RASET); // row addr set
king33jp 2:047ca9682450 367 wr_dat(0x00);
king33jp 2:047ca9682450 368 wr_dat(y+1); // YSTART
king33jp 2:047ca9682450 369 wr_dat(0x00);
king33jp 2:047ca9682450 370 wr_dat(y+h+1); // YEND
king33jp 2:047ca9682450 371 #else
king33jp 2:047ca9682450 372 wr_cmd(ST7735_CASET); // column addr set
king33jp 2:047ca9682450 373 wr_dat(0x00);
king33jp 2:047ca9682450 374 wr_dat(x); // XSTART
king33jp 2:047ca9682450 375 wr_dat(0x00);
king33jp 2:047ca9682450 376 wr_dat(x+w-1); // XEND
king33jp 2:047ca9682450 377
king33jp 2:047ca9682450 378 wr_cmd(ST7735_RASET); // row addr set
king33jp 2:047ca9682450 379 wr_dat(0x00);
king33jp 2:047ca9682450 380 wr_dat(y); // YSTART
king33jp 2:047ca9682450 381 wr_dat(0x00);
king33jp 2:047ca9682450 382 wr_dat(y+h-1); // YEND
king33jp 2:047ca9682450 383 #endif
king33jp 2:047ca9682450 384 wr_cmd(ST7735_RAMWR); // write to RAM
king33jp 2:047ca9682450 385 }
king33jp 2:047ca9682450 386
king33jp 2:047ca9682450 387
king33jp 2:047ca9682450 388 void ST7735_TFT::WindowMax (void) {
king33jp 2:047ca9682450 389 window (0, 0, width(), height());
king33jp 2:047ca9682450 390 }
king33jp 2:047ca9682450 391
king33jp 2:047ca9682450 392
king33jp 2:047ca9682450 393 void ST7735_TFT::cls (void) {
king33jp 2:047ca9682450 394 unsigned int i;
king33jp 2:047ca9682450 395 WindowMax();
king33jp 2:047ca9682450 396 wr_dat_start();
king33jp 2:047ca9682450 397 #if defined TARGET_KL25Z
king33jp 2:047ca9682450 398 for (i = 0; i < ( (width()+1) * (height()+3)); i++) {
king33jp 2:047ca9682450 399 _spi.write(_background >> 8);
king33jp 2:047ca9682450 400 _spi.write(_background & 0xFF);
king33jp 2:047ca9682450 401 }
king33jp 2:047ca9682450 402 #else
king33jp 2:047ca9682450 403 _spi.format(16,3);
king33jp 2:047ca9682450 404 for (i = 0; i < ( (width()+1) * (height()+3)); i++) {
king33jp 2:047ca9682450 405 _spi.write(_background);
king33jp 2:047ca9682450 406 }
king33jp 2:047ca9682450 407 _spi.format(8,3);
king33jp 2:047ca9682450 408 #endif
king33jp 2:047ca9682450 409 wr_dat_stop();
king33jp 2:047ca9682450 410 }
king33jp 2:047ca9682450 411
king33jp 2:047ca9682450 412
king33jp 2:047ca9682450 413 void ST7735_TFT::circle(int x0, int y0, int r, int color) {
king33jp 2:047ca9682450 414
king33jp 2:047ca9682450 415 int draw_x0, draw_y0;
king33jp 2:047ca9682450 416 int draw_x1, draw_y1;
king33jp 2:047ca9682450 417 int draw_x2, draw_y2;
king33jp 2:047ca9682450 418 int draw_x3, draw_y3;
king33jp 2:047ca9682450 419 int draw_x4, draw_y4;
king33jp 2:047ca9682450 420 int draw_x5, draw_y5;
king33jp 2:047ca9682450 421 int draw_x6, draw_y6;
king33jp 2:047ca9682450 422 int draw_x7, draw_y7;
king33jp 2:047ca9682450 423 int xx, yy;
king33jp 2:047ca9682450 424 int di;
king33jp 2:047ca9682450 425 WindowMax();
king33jp 2:047ca9682450 426 if (r == 0) { /* no radius */
king33jp 2:047ca9682450 427 return;
king33jp 2:047ca9682450 428 }
king33jp 2:047ca9682450 429
king33jp 2:047ca9682450 430 draw_x0 = draw_x1 = x0;
king33jp 2:047ca9682450 431 draw_y0 = draw_y1 = y0 + r;
king33jp 2:047ca9682450 432 if (draw_y0 < height()) {
king33jp 2:047ca9682450 433 pixel(draw_x0, draw_y0, color); /* 90 degree */
king33jp 2:047ca9682450 434 }
king33jp 2:047ca9682450 435
king33jp 2:047ca9682450 436 draw_x2 = draw_x3 = x0;
king33jp 2:047ca9682450 437 draw_y2 = draw_y3 = y0 - r;
king33jp 2:047ca9682450 438 if (draw_y2 >= 0) {
king33jp 2:047ca9682450 439 pixel(draw_x2, draw_y2, color); /* 270 degree */
king33jp 2:047ca9682450 440 }
king33jp 2:047ca9682450 441
king33jp 2:047ca9682450 442 draw_x4 = draw_x6 = x0 + r;
king33jp 2:047ca9682450 443 draw_y4 = draw_y6 = y0;
king33jp 2:047ca9682450 444 if (draw_x4 < width()) {
king33jp 2:047ca9682450 445 pixel(draw_x4, draw_y4, color); /* 0 degree */
king33jp 2:047ca9682450 446 }
king33jp 2:047ca9682450 447
king33jp 2:047ca9682450 448 draw_x5 = draw_x7 = x0 - r;
king33jp 2:047ca9682450 449 draw_y5 = draw_y7 = y0;
king33jp 2:047ca9682450 450 if (draw_x5>=0) {
king33jp 2:047ca9682450 451 pixel(draw_x5, draw_y5, color); /* 180 degree */
king33jp 2:047ca9682450 452 }
king33jp 2:047ca9682450 453
king33jp 2:047ca9682450 454 if (r == 1) {
king33jp 2:047ca9682450 455 return;
king33jp 2:047ca9682450 456 }
king33jp 2:047ca9682450 457
king33jp 2:047ca9682450 458 di = 3 - 2*r;
king33jp 2:047ca9682450 459 xx = 0;
king33jp 2:047ca9682450 460 yy = r;
king33jp 2:047ca9682450 461 while (xx < yy) {
king33jp 2:047ca9682450 462
king33jp 2:047ca9682450 463 if (di < 0) {
king33jp 2:047ca9682450 464 di += 4*xx + 6;
king33jp 2:047ca9682450 465 } else {
king33jp 2:047ca9682450 466 di += 4*(xx - yy) + 10;
king33jp 2:047ca9682450 467 yy--;
king33jp 2:047ca9682450 468 draw_y0--;
king33jp 2:047ca9682450 469 draw_y1--;
king33jp 2:047ca9682450 470 draw_y2++;
king33jp 2:047ca9682450 471 draw_y3++;
king33jp 2:047ca9682450 472 draw_x4--;
king33jp 2:047ca9682450 473 draw_x5++;
king33jp 2:047ca9682450 474 draw_x6--;
king33jp 2:047ca9682450 475 draw_x7++;
king33jp 2:047ca9682450 476 }
king33jp 2:047ca9682450 477 xx++;
king33jp 2:047ca9682450 478 draw_x0++;
king33jp 2:047ca9682450 479 draw_x1--;
king33jp 2:047ca9682450 480 draw_x2++;
king33jp 2:047ca9682450 481 draw_x3--;
king33jp 2:047ca9682450 482 draw_y4++;
king33jp 2:047ca9682450 483 draw_y5++;
king33jp 2:047ca9682450 484 draw_y6--;
king33jp 2:047ca9682450 485 draw_y7--;
king33jp 2:047ca9682450 486
king33jp 2:047ca9682450 487 if ( (draw_x0 <= width()) && (draw_y0>=0) ) {
king33jp 2:047ca9682450 488 pixel(draw_x0, draw_y0, color);
king33jp 2:047ca9682450 489 }
king33jp 2:047ca9682450 490
king33jp 2:047ca9682450 491 if ( (draw_x1 >= 0) && (draw_y1 >= 0) ) {
king33jp 2:047ca9682450 492 pixel(draw_x1, draw_y1, color);
king33jp 2:047ca9682450 493 }
king33jp 2:047ca9682450 494
king33jp 2:047ca9682450 495 if ( (draw_x2 <= width()) && (draw_y2 <= height()) ) {
king33jp 2:047ca9682450 496 pixel(draw_x2, draw_y2, color);
king33jp 2:047ca9682450 497 }
king33jp 2:047ca9682450 498
king33jp 2:047ca9682450 499 if ( (draw_x3 >=0 ) && (draw_y3 <= height()) ) {
king33jp 2:047ca9682450 500 pixel(draw_x3, draw_y3, color);
king33jp 2:047ca9682450 501 }
king33jp 2:047ca9682450 502
king33jp 2:047ca9682450 503 if ( (draw_x4 <= width()) && (draw_y4 >= 0) ) {
king33jp 2:047ca9682450 504 pixel(draw_x4, draw_y4, color);
king33jp 2:047ca9682450 505 }
king33jp 2:047ca9682450 506
king33jp 2:047ca9682450 507 if ( (draw_x5 >= 0) && (draw_y5 >= 0) ) {
king33jp 2:047ca9682450 508 pixel(draw_x5, draw_y5, color);
king33jp 2:047ca9682450 509 }
king33jp 2:047ca9682450 510 if ( (draw_x6 <=width()) && (draw_y6 <= height()) ) {
king33jp 2:047ca9682450 511 pixel(draw_x6, draw_y6, color);
king33jp 2:047ca9682450 512 }
king33jp 2:047ca9682450 513 if ( (draw_x7 >= 0) && (draw_y7 <= height()) ) {
king33jp 2:047ca9682450 514 pixel(draw_x7, draw_y7, color);
king33jp 2:047ca9682450 515 }
king33jp 2:047ca9682450 516 }
king33jp 2:047ca9682450 517 return;
king33jp 2:047ca9682450 518 }
king33jp 2:047ca9682450 519
king33jp 2:047ca9682450 520 void ST7735_TFT::fillcircle(int x, int y, int r, int color) {
king33jp 2:047ca9682450 521 int i;
king33jp 2:047ca9682450 522 for (i = 0; i <= r; i++)
king33jp 2:047ca9682450 523 circle(x,y,i,color);
king33jp 2:047ca9682450 524 }
king33jp 2:047ca9682450 525
king33jp 2:047ca9682450 526 void ST7735_TFT::fillcircle2(int x0, int y0, int r, int color){
king33jp 2:047ca9682450 527 int x = -r, y = 0, err = 2-2*r, e2;
king33jp 2:047ca9682450 528 do {
king33jp 2:047ca9682450 529 vline(x0-x, y0-y, y0+y, color);
king33jp 2:047ca9682450 530 vline(x0+x, y0-y, y0+y, color);
king33jp 2:047ca9682450 531 e2 = err;
king33jp 2:047ca9682450 532 if (e2 <= y) {
king33jp 2:047ca9682450 533 err += ++y*2+1;
king33jp 2:047ca9682450 534 if (-x == y && e2 <= x) e2 = 0;
king33jp 2:047ca9682450 535 }
king33jp 2:047ca9682450 536 if (e2 > x) err += ++x*2+1;
king33jp 2:047ca9682450 537 } while (x <= 0);
king33jp 2:047ca9682450 538 }
king33jp 2:047ca9682450 539
king33jp 2:047ca9682450 540 void ST7735_TFT::hline(int x0, int x1, int y, int color) {
king33jp 2:047ca9682450 541 int w;
king33jp 2:047ca9682450 542 w = x1 - x0 + 1;
king33jp 2:047ca9682450 543 window(x0,y,w,1);
king33jp 2:047ca9682450 544 wr_cmd(0x2C);
king33jp 2:047ca9682450 545 wr_dat_start();
king33jp 2:047ca9682450 546 for (int x=0; x<w; x++) {
king33jp 2:047ca9682450 547 _spi.write(color >> 8);
king33jp 2:047ca9682450 548 _spi.write(color);
king33jp 2:047ca9682450 549 }
king33jp 2:047ca9682450 550 wr_dat_stop();
king33jp 2:047ca9682450 551 return;
king33jp 2:047ca9682450 552 }
king33jp 2:047ca9682450 553
king33jp 2:047ca9682450 554
king33jp 2:047ca9682450 555
king33jp 2:047ca9682450 556 void ST7735_TFT::vline(int x, int y0, int y1, int color) {
king33jp 2:047ca9682450 557 int h;
king33jp 2:047ca9682450 558 h = y1 - y0 + 1;
king33jp 2:047ca9682450 559 window(x,y0,1,h);
king33jp 2:047ca9682450 560 wr_cmd(0x2C);
king33jp 2:047ca9682450 561 wr_dat_start();
king33jp 2:047ca9682450 562 for (int y=0; y<h; y++) {
king33jp 2:047ca9682450 563 _spi.write(color >> 8);
king33jp 2:047ca9682450 564 _spi.write(color);
king33jp 2:047ca9682450 565 }
king33jp 2:047ca9682450 566 wr_dat_stop();
king33jp 2:047ca9682450 567 return;
king33jp 2:047ca9682450 568 }
king33jp 2:047ca9682450 569
king33jp 2:047ca9682450 570
king33jp 2:047ca9682450 571
king33jp 2:047ca9682450 572 void ST7735_TFT::line(int x0, int y0, int x1, int y1, int color) {
king33jp 2:047ca9682450 573 WindowMax();
king33jp 2:047ca9682450 574 int dx = 0, dy = 0;
king33jp 2:047ca9682450 575 int dx_sym = 0, dy_sym = 0;
king33jp 2:047ca9682450 576 int dx_x2 = 0, dy_x2 = 0;
king33jp 2:047ca9682450 577 int di = 0;
king33jp 2:047ca9682450 578
king33jp 2:047ca9682450 579 dx = x1-x0;
king33jp 2:047ca9682450 580 dy = y1-y0;
king33jp 2:047ca9682450 581
king33jp 2:047ca9682450 582 if (dx == 0) { /* vertical line */
king33jp 2:047ca9682450 583 if (y1 > y0) vline(x0,y0,y1,color);
king33jp 2:047ca9682450 584 else vline(x0,y1,y0,color);
king33jp 2:047ca9682450 585 return;
king33jp 2:047ca9682450 586 }
king33jp 2:047ca9682450 587
king33jp 2:047ca9682450 588 if (dx > 0) {
king33jp 2:047ca9682450 589 dx_sym = 1;
king33jp 2:047ca9682450 590 } else {
king33jp 2:047ca9682450 591 dx_sym = -1;
king33jp 2:047ca9682450 592 }
king33jp 2:047ca9682450 593 if (dy == 0) { /* horizontal line */
king33jp 2:047ca9682450 594 if (x1 > x0) hline(x0,x1,y0,color);
king33jp 2:047ca9682450 595 else hline(x1,x0,y0,color);
king33jp 2:047ca9682450 596 return;
king33jp 2:047ca9682450 597 }
king33jp 2:047ca9682450 598
king33jp 2:047ca9682450 599 if (dy > 0) {
king33jp 2:047ca9682450 600 dy_sym = 1;
king33jp 2:047ca9682450 601 } else {
king33jp 2:047ca9682450 602 dy_sym = -1;
king33jp 2:047ca9682450 603 }
king33jp 2:047ca9682450 604
king33jp 2:047ca9682450 605 dx = dx_sym*dx;
king33jp 2:047ca9682450 606 dy = dy_sym*dy;
king33jp 2:047ca9682450 607
king33jp 2:047ca9682450 608 dx_x2 = dx*2;
king33jp 2:047ca9682450 609 dy_x2 = dy*2;
king33jp 2:047ca9682450 610
king33jp 2:047ca9682450 611 if (dx >= dy) {
king33jp 2:047ca9682450 612 di = dy_x2 - dx;
king33jp 2:047ca9682450 613 while (x0 != x1) {
king33jp 2:047ca9682450 614
king33jp 2:047ca9682450 615 pixel(x0, y0, color);
king33jp 2:047ca9682450 616 x0 += dx_sym;
king33jp 2:047ca9682450 617 if (di<0) {
king33jp 2:047ca9682450 618 di += dy_x2;
king33jp 2:047ca9682450 619 } else {
king33jp 2:047ca9682450 620 di += dy_x2 - dx_x2;
king33jp 2:047ca9682450 621 y0 += dy_sym;
king33jp 2:047ca9682450 622 }
king33jp 2:047ca9682450 623 }
king33jp 2:047ca9682450 624 pixel(x0, y0, color);
king33jp 2:047ca9682450 625 } else {
king33jp 2:047ca9682450 626 di = dx_x2 - dy;
king33jp 2:047ca9682450 627 while (y0 != y1) {
king33jp 2:047ca9682450 628 pixel(x0, y0, color);
king33jp 2:047ca9682450 629 y0 += dy_sym;
king33jp 2:047ca9682450 630 if (di < 0) {
king33jp 2:047ca9682450 631 di += dx_x2;
king33jp 2:047ca9682450 632 } else {
king33jp 2:047ca9682450 633 di += dx_x2 - dy_x2;
king33jp 2:047ca9682450 634 x0 += dx_sym;
king33jp 2:047ca9682450 635 }
king33jp 2:047ca9682450 636 }
king33jp 2:047ca9682450 637 pixel(x0, y0, color);
king33jp 2:047ca9682450 638 }
king33jp 2:047ca9682450 639 return;
king33jp 2:047ca9682450 640 }
king33jp 2:047ca9682450 641
king33jp 2:047ca9682450 642
king33jp 2:047ca9682450 643
king33jp 2:047ca9682450 644
king33jp 2:047ca9682450 645 void ST7735_TFT::rect(int x0, int y0, int x1, int y1, int color) {
king33jp 2:047ca9682450 646
king33jp 2:047ca9682450 647 if (x1 > x0) hline(x0,x1,y0,color);
king33jp 2:047ca9682450 648 else hline(x1,x0,y0,color);
king33jp 2:047ca9682450 649
king33jp 2:047ca9682450 650 if (y1 > y0) vline(x0,y0,y1,color);
king33jp 2:047ca9682450 651 else vline(x0,y1,y0,color);
king33jp 2:047ca9682450 652
king33jp 2:047ca9682450 653 if (x1 > x0) hline(x0,x1,y1,color);
king33jp 2:047ca9682450 654 else hline(x1,x0,y1,color);
king33jp 2:047ca9682450 655
king33jp 2:047ca9682450 656 if (y1 > y0) vline(x1,y0,y1,color);
king33jp 2:047ca9682450 657 else vline(x1,y1,y0,color);
king33jp 2:047ca9682450 658
king33jp 2:047ca9682450 659 return;
king33jp 2:047ca9682450 660 }
king33jp 2:047ca9682450 661
king33jp 2:047ca9682450 662
king33jp 2:047ca9682450 663
king33jp 2:047ca9682450 664 void ST7735_TFT::fillrect(int x0, int y0, int x1, int y1, int color) {
king33jp 2:047ca9682450 665
king33jp 2:047ca9682450 666 int h = y1 - y0 + 1;
king33jp 2:047ca9682450 667 int w = x1 - x0 + 1;
king33jp 2:047ca9682450 668 int pixel = h * w;
king33jp 2:047ca9682450 669 window(x0,y0,w,h);
king33jp 2:047ca9682450 670 wr_cmd(0x2C);
king33jp 2:047ca9682450 671 wr_dat_start();
king33jp 2:047ca9682450 672 for (int p=0; p<pixel; p++) {
king33jp 2:047ca9682450 673 _spi.write(color >> 8);
king33jp 2:047ca9682450 674 _spi.write(color);
king33jp 2:047ca9682450 675 }
king33jp 2:047ca9682450 676 wr_dat_stop();
king33jp 2:047ca9682450 677 return;
king33jp 2:047ca9682450 678 }
king33jp 2:047ca9682450 679
king33jp 2:047ca9682450 680
king33jp 2:047ca9682450 681
king33jp 2:047ca9682450 682 void ST7735_TFT::locate(int x, int y) {
king33jp 2:047ca9682450 683 char_x = x;
king33jp 2:047ca9682450 684 char_y = y;
king33jp 2:047ca9682450 685 }
king33jp 2:047ca9682450 686
king33jp 2:047ca9682450 687
king33jp 2:047ca9682450 688
king33jp 2:047ca9682450 689 int ST7735_TFT::columns() {
king33jp 2:047ca9682450 690 return width() / font[1];
king33jp 2:047ca9682450 691 }
king33jp 2:047ca9682450 692
king33jp 2:047ca9682450 693
king33jp 2:047ca9682450 694
king33jp 2:047ca9682450 695 int ST7735_TFT::rows() {
king33jp 2:047ca9682450 696 return height() / font[2];
king33jp 2:047ca9682450 697 }
king33jp 2:047ca9682450 698
king33jp 2:047ca9682450 699
king33jp 2:047ca9682450 700
king33jp 2:047ca9682450 701 int ST7735_TFT::_putc(int value) {
king33jp 2:047ca9682450 702 if (value == '\n') { // new line
king33jp 2:047ca9682450 703 char_x = 0;
king33jp 2:047ca9682450 704 char_y = char_y + font[2];
king33jp 2:047ca9682450 705 if (char_y >= height() - font[2]) {
king33jp 2:047ca9682450 706 char_y = 0;
king33jp 2:047ca9682450 707 }
king33jp 2:047ca9682450 708 } else {
king33jp 2:047ca9682450 709 character(char_x, char_y, value);
king33jp 2:047ca9682450 710 }
king33jp 2:047ca9682450 711 return value;
king33jp 2:047ca9682450 712 }
king33jp 2:047ca9682450 713
king33jp 2:047ca9682450 714
king33jp 2:047ca9682450 715
king33jp 2:047ca9682450 716
king33jp 2:047ca9682450 717 void ST7735_TFT::character(int x, int y, int c) {
king33jp 2:047ca9682450 718 unsigned int hor,vert,offset,bpl,j,i,b;
king33jp 2:047ca9682450 719 unsigned char* zeichen;
king33jp 2:047ca9682450 720 unsigned char z,w;
king33jp 2:047ca9682450 721
king33jp 2:047ca9682450 722 if ((c < 31) || (c > 156)) return; // test char range
king33jp 2:047ca9682450 723
king33jp 2:047ca9682450 724 // read font parameter from start of array
king33jp 2:047ca9682450 725 offset = font[0]; // bytes / char
king33jp 2:047ca9682450 726 hor = font[1]; // get hor size of font
king33jp 2:047ca9682450 727 vert = font[2]; // get vert size of font
king33jp 2:047ca9682450 728 bpl = font[3]; // bytes per line
king33jp 2:047ca9682450 729
king33jp 2:047ca9682450 730 if (char_x + hor > width()) {
king33jp 2:047ca9682450 731 char_x = 0;
king33jp 2:047ca9682450 732 char_y = char_y + vert;
king33jp 2:047ca9682450 733 if (char_y >= height() - font[2]) {
king33jp 2:047ca9682450 734 char_y = 0;
king33jp 2:047ca9682450 735 }
king33jp 2:047ca9682450 736 }
king33jp 2:047ca9682450 737
king33jp 2:047ca9682450 738 window(char_x, char_y,hor,vert); // char box
king33jp 2:047ca9682450 739 wr_cmd(0x2C);
king33jp 2:047ca9682450 740 wr_dat_start();
king33jp 2:047ca9682450 741 zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap
king33jp 2:047ca9682450 742 w = zeichen[0]; // width of actual char
king33jp 2:047ca9682450 743 #ifndef TARGET_KL25Z
king33jp 2:047ca9682450 744 _spi.format(16,3); // pixel are 16 bit
king33jp 2:047ca9682450 745 #endif
king33jp 2:047ca9682450 746 for (j=0; j<vert; j++) { // vert line
king33jp 2:047ca9682450 747 for (i=0; i<hor; i++) { // horz line
king33jp 2:047ca9682450 748 z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
king33jp 2:047ca9682450 749 b = 1 << (j & 0x07);
king33jp 2:047ca9682450 750 if (( z & b ) == 0x00) {
king33jp 2:047ca9682450 751 #ifndef TARGET_KL25Z // 16 Bit SPI
king33jp 2:047ca9682450 752 _spi.write(_background);
king33jp 2:047ca9682450 753 #else
king33jp 2:047ca9682450 754 _spi.write(_background >> 8);
king33jp 2:047ca9682450 755 _spi.write(_background & 0xff);
king33jp 2:047ca9682450 756 #endif
king33jp 2:047ca9682450 757 } else {
king33jp 2:047ca9682450 758 #ifndef TARGET_KL25Z // 16 Bit SPI
king33jp 2:047ca9682450 759 _spi.write(_foreground);
king33jp 2:047ca9682450 760 #else
king33jp 2:047ca9682450 761 _spi.write(_foreground >> 8);
king33jp 2:047ca9682450 762 _spi.write(_foreground & 0xff);
king33jp 2:047ca9682450 763 #endif
king33jp 2:047ca9682450 764 }
king33jp 2:047ca9682450 765 }
king33jp 2:047ca9682450 766 }
king33jp 2:047ca9682450 767 #ifndef TARGET_KL25Z // 16 Bit SPI
king33jp 2:047ca9682450 768 _spi.format(8,3);
king33jp 2:047ca9682450 769 #endif
king33jp 2:047ca9682450 770 wr_dat_stop();
king33jp 2:047ca9682450 771 if ((w + 2) < hor) { // x offset to next char
king33jp 2:047ca9682450 772 char_x += w + 2;
king33jp 2:047ca9682450 773 } else char_x += hor;
king33jp 2:047ca9682450 774 }
king33jp 2:047ca9682450 775
king33jp 2:047ca9682450 776
king33jp 2:047ca9682450 777
king33jp 2:047ca9682450 778
king33jp 2:047ca9682450 779
king33jp 2:047ca9682450 780 void ST7735_TFT::set_font(unsigned char* f) {
king33jp 2:047ca9682450 781 font = f;
king33jp 2:047ca9682450 782 }
king33jp 2:047ca9682450 783
king33jp 2:047ca9682450 784
king33jp 2:047ca9682450 785
king33jp 2:047ca9682450 786 void ST7735_TFT::Bitmap(unsigned int x, unsigned int y, unsigned int w, unsigned int h,unsigned char *bitmap) {
king33jp 2:047ca9682450 787 unsigned int i,j;
king33jp 2:047ca9682450 788 unsigned short *bitmap_ptr = (unsigned short *)bitmap;
king33jp 2:047ca9682450 789 unsigned short pix_temp;
king33jp 2:047ca9682450 790 window(x, y, w, h);
king33jp 2:047ca9682450 791 wr_cmd(0x2C);
king33jp 2:047ca9682450 792 wr_dat_start();
king33jp 2:047ca9682450 793 for (j = 0; j < h; j++) { //Lines
king33jp 2:047ca9682450 794 for (i = 0; i < w; i++) { // copy pixel data to TFT
king33jp 2:047ca9682450 795 #if 0
king33jp 2:047ca9682450 796 pix_temp = *bitmap_ptr;
king33jp 2:047ca9682450 797 _spi.write( ((pix_temp << 3)|( (pix_temp >> 8)&0x07) )&0xFF );
king33jp 2:047ca9682450 798 _spi.write( ((pix_temp >>11)|(pix_temp&0xE0)&0xFF) );
king33jp 2:047ca9682450 799
king33jp 2:047ca9682450 800 //_spi.write(pix_temp >> 8);
king33jp 2:047ca9682450 801 //_spi.write(pix_temp);
king33jp 2:047ca9682450 802 #else
king33jp 2:047ca9682450 803 _spi.write(*bitmap_ptr >> 8);
king33jp 2:047ca9682450 804 _spi.write(*bitmap_ptr); // one line
king33jp 2:047ca9682450 805 #endif
king33jp 2:047ca9682450 806 bitmap_ptr++;
king33jp 2:047ca9682450 807 }
king33jp 2:047ca9682450 808 }
king33jp 2:047ca9682450 809 wr_dat_stop();
king33jp 2:047ca9682450 810 }
king33jp 2:047ca9682450 811
king33jp 2:047ca9682450 812
king33jp 2:047ca9682450 813 int ST7735_TFT::BMP_16(unsigned int x, unsigned int y, const char *Name_BMP) {
king33jp 2:047ca9682450 814 // BEWARE !
king33jp 2:047ca9682450 815 // NOT TESTED
king33jp 2:047ca9682450 816 #define OffsetPixelWidth 18
king33jp 2:047ca9682450 817 #define OffsetPixelHeigh 22
king33jp 2:047ca9682450 818 #define OffsetFileSize 34
king33jp 2:047ca9682450 819 #define OffsetPixData 10
king33jp 2:047ca9682450 820 #define OffsetBPP 28
king33jp 2:047ca9682450 821
king33jp 2:047ca9682450 822 char filename[50];
king33jp 2:047ca9682450 823 unsigned char BMP_Header[54];
king33jp 2:047ca9682450 824 unsigned short BPP_t;
king33jp 2:047ca9682450 825 unsigned int PixelWidth,PixelHeigh,start_data;
king33jp 2:047ca9682450 826 unsigned int i,off;
king33jp 2:047ca9682450 827 int padd,j;
king33jp 2:047ca9682450 828 unsigned short *line;
king33jp 2:047ca9682450 829
king33jp 2:047ca9682450 830 // get the filename
king33jp 2:047ca9682450 831 #if 0
king33jp 2:047ca9682450 832 LocalFileSystem local("local");
king33jp 2:047ca9682450 833 #endif
king33jp 2:047ca9682450 834 sprintf(&filename[0],"/local/");
king33jp 2:047ca9682450 835 i=7;
king33jp 2:047ca9682450 836 while (*Name_BMP!='\0') {
king33jp 2:047ca9682450 837 filename[i++]=*Name_BMP++;
king33jp 2:047ca9682450 838 }
king33jp 2:047ca9682450 839 FILE *Image = fopen((const char *)&filename[0], "r"); // open the bmp file
king33jp 2:047ca9682450 840 if (!Image) {
king33jp 2:047ca9682450 841 return(0); // error file not found !
king33jp 2:047ca9682450 842 }
king33jp 2:047ca9682450 843
king33jp 2:047ca9682450 844 fread(&BMP_Header[0],1,54,Image); // get the BMP Header
king33jp 2:047ca9682450 845
king33jp 2:047ca9682450 846 if (BMP_Header[0] != 0x42 || BMP_Header[1] != 0x4D) { // check magic byte
king33jp 2:047ca9682450 847 fclose(Image);
king33jp 2:047ca9682450 848 return(-1); // error no BMP file
king33jp 2:047ca9682450 849 }
king33jp 2:047ca9682450 850
king33jp 2:047ca9682450 851 BPP_t = BMP_Header[OffsetBPP] + (BMP_Header[OffsetBPP + 1] << 8);
king33jp 2:047ca9682450 852 if (BPP_t != 0x0010) {
king33jp 2:047ca9682450 853 fclose(Image);
king33jp 2:047ca9682450 854 return(-2); // error no 16 bit BMP
king33jp 2:047ca9682450 855 }
king33jp 2:047ca9682450 856
king33jp 2:047ca9682450 857 PixelHeigh = BMP_Header[OffsetPixelHeigh] + (BMP_Header[OffsetPixelHeigh + 1] << 8) + (BMP_Header[OffsetPixelHeigh + 2] << 16) + (BMP_Header[OffsetPixelHeigh + 3] << 24);
king33jp 2:047ca9682450 858 PixelWidth = BMP_Header[OffsetPixelWidth] + (BMP_Header[OffsetPixelWidth + 1] << 8) + (BMP_Header[OffsetPixelWidth + 2] << 16) + (BMP_Header[OffsetPixelWidth + 3] << 24);
king33jp 2:047ca9682450 859 if (PixelHeigh > height() + y || PixelWidth > width() + x) {
king33jp 2:047ca9682450 860 fclose(Image);
king33jp 2:047ca9682450 861 return(-3); // to big
king33jp 2:047ca9682450 862 }
king33jp 2:047ca9682450 863
king33jp 2:047ca9682450 864 start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24);
king33jp 2:047ca9682450 865
king33jp 2:047ca9682450 866 line = (unsigned short *) malloc (PixelWidth); // we need a buffer for a line
king33jp 2:047ca9682450 867 if (line == NULL) {
king33jp 2:047ca9682450 868 return(-4); // error no memory
king33jp 2:047ca9682450 869 }
king33jp 2:047ca9682450 870
king33jp 2:047ca9682450 871 // the lines are padded to multiple of 4 bytes
king33jp 2:047ca9682450 872 padd = -1;
king33jp 2:047ca9682450 873 do {
king33jp 2:047ca9682450 874 padd ++;
king33jp 2:047ca9682450 875 } while ((PixelWidth * 2 + padd)%4 != 0);
king33jp 2:047ca9682450 876
king33jp 2:047ca9682450 877 window(x, y,PixelWidth,PixelHeigh);
king33jp 2:047ca9682450 878 wr_cmd(0x2C);
king33jp 2:047ca9682450 879 wr_dat_start();
king33jp 2:047ca9682450 880 #ifndef TARGET_KL25Z // only 8 Bit SPI
king33jp 2:047ca9682450 881 _spi.format(16,3);
king33jp 2:047ca9682450 882 #endif // switch to 16 bit Mode 3
king33jp 2:047ca9682450 883 for (j = PixelHeigh - 1; j >= 0; j--) { //Lines bottom up
king33jp 2:047ca9682450 884 off = j * (PixelWidth * 2 + padd) + start_data; // start of line
king33jp 2:047ca9682450 885 fseek(Image, off ,SEEK_SET);
king33jp 2:047ca9682450 886 fread(line,1,PixelWidth * 2,Image); // read a line - slow !
king33jp 2:047ca9682450 887 for (i = 0; i < PixelWidth; i++) { // copy pixel data to TFT
king33jp 2:047ca9682450 888 #ifndef TARGET_KL25Z // only 8 Bit SPI
king33jp 2:047ca9682450 889 _spi.write(line[i]); // one 16 bit pixel
king33jp 2:047ca9682450 890 #else
king33jp 2:047ca9682450 891 _spi.write(line[i] >> 8);
king33jp 2:047ca9682450 892 _spi.write(line[i]);
king33jp 2:047ca9682450 893 #endif
king33jp 2:047ca9682450 894 }
king33jp 2:047ca9682450 895 }
king33jp 2:047ca9682450 896 _spi.format(8,3);
king33jp 2:047ca9682450 897 wr_dat_stop();
king33jp 2:047ca9682450 898 free (line);
king33jp 2:047ca9682450 899 fclose(Image);
king33jp 2:047ca9682450 900 return(1);
king33jp 2:047ca9682450 901 }