a white square appears on SPI LCD which controlled by WII nunchuck on the other hand it outputs log mwessage on USBTX/RX incompatible with latest mbed library

Dependencies:   WiiChuck mbed

Committer:
k4zuki
Date:
Tue Aug 27 14:31:22 2013 +0000
Revision:
0:0c777a879891
p9 and p10 forI2C, p11,12,13,14,23 are for SPI, R/S select and reset

Who changed what in which revision?

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