This is a mbed library for a 1.8 inch 128x160 pixel SPI TFT display

Dependents:   ST7735_Pong ST7735_TFT SPI18TFT_FRDM-KL25Z SPI18TFT ... more

Committer:
smultron1977
Date:
Sun Dec 11 21:18:21 2011 +0000
Revision:
1:967235e6fd48
Parent:
0:246f2fb5be59
SPI frequency increased

Who changed what in which revision?

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