ST7735 library, e.g. for Adafruit 1.8" TFT

Fork of ST7735_TFT by Jonne Valola

Fixed a few compiler warning and also some errors that were showing on my STM-F3 device.

Committer:
cbuss
Date:
Tue Aug 19 19:58:08 2014 +0000
Revision:
2:264c52bc760c
Parent:
1:967235e6fd48
Resolved many small compiler warnings

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)
cbuss 2:264c52bc760c 27 : GraphicsDisplay(name), _spi(mosi, miso, sclk), _cs(cs), _rs(rs), _reset(reset) {
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 // init SPI
smultron1977 0:246f2fb5be59 176 _spi.format(8,3); // 8 bit spi mode 3
cbuss 2:264c52bc760c 177 _spi.frequency(8000000); // 16Mhz SPI clock ... 15Mhz is maximum for display, but it seems to work
smultron1977 0:246f2fb5be59 178
smultron1977 0:246f2fb5be59 179 // reset exactly like in Arduino version
smultron1977 0:246f2fb5be59 180 _cs = 0;
smultron1977 0:246f2fb5be59 181 _reset = 1; // reset
smultron1977 0:246f2fb5be59 182 wait_ms(500);
smultron1977 0:246f2fb5be59 183 _reset = 0; // reset
smultron1977 0:246f2fb5be59 184 wait_ms(500);
smultron1977 0:246f2fb5be59 185 _reset = 1; // reset
smultron1977 0:246f2fb5be59 186 wait_ms(500);
smultron1977 0:246f2fb5be59 187
smultron1977 0:246f2fb5be59 188 /* Start Initial Sequence ----------------------------------------------------*/
smultron1977 0:246f2fb5be59 189 wr_cmd(ST7735_SWRESET); /* SW Reset */
smultron1977 0:246f2fb5be59 190 wait_ms(150);
smultron1977 0:246f2fb5be59 191 wr_cmd(ST7735_SLPOUT); /* Out of sleepmode */
smultron1977 0:246f2fb5be59 192 wait_ms(500);
smultron1977 0:246f2fb5be59 193
smultron1977 0:246f2fb5be59 194 wr_cmd(ST7735_FRMCTR1); /* Frame rate in normal mode */
smultron1977 0:246f2fb5be59 195 wr_dat(0x01);
smultron1977 0:246f2fb5be59 196 wr_dat(0x2C);
smultron1977 0:246f2fb5be59 197 wr_dat(0x2D);
smultron1977 0:246f2fb5be59 198
smultron1977 0:246f2fb5be59 199 wr_cmd(ST7735_FRMCTR2); /* Frame rate in idle mode */
smultron1977 0:246f2fb5be59 200 wr_dat(0x01);
smultron1977 0:246f2fb5be59 201 wr_dat(0x2C);
smultron1977 0:246f2fb5be59 202 wr_dat(0x2D);
smultron1977 0:246f2fb5be59 203
smultron1977 0:246f2fb5be59 204 wr_cmd(ST7735_FRMCTR3); /* Frame rate in partial mode */
smultron1977 0:246f2fb5be59 205 wr_dat(0x01);
smultron1977 0:246f2fb5be59 206 wr_dat(0x2C);
smultron1977 0:246f2fb5be59 207 wr_dat(0x2D);
smultron1977 0:246f2fb5be59 208 wr_dat(0x01); // inversion mode settings
smultron1977 0:246f2fb5be59 209 wr_dat(0x2C);
smultron1977 0:246f2fb5be59 210 wr_dat(0x2D);
smultron1977 0:246f2fb5be59 211
smultron1977 0:246f2fb5be59 212 wr_cmd(ST7735_INVCTR); // Inverted mode off
smultron1977 0:246f2fb5be59 213 wr_dat(0x07);
smultron1977 0:246f2fb5be59 214
smultron1977 0:246f2fb5be59 215 wr_cmd(ST7735_PWCTR1); // POWER CONTROL 1
smultron1977 0:246f2fb5be59 216 wr_dat(0xA2);
smultron1977 0:246f2fb5be59 217 wr_dat(0x02); // -4.6V
smultron1977 0:246f2fb5be59 218 wr_dat(0x84); // AUTO mode
smultron1977 0:246f2fb5be59 219
smultron1977 0:246f2fb5be59 220 wr_cmd(ST7735_PWCTR2); // POWER CONTROL 2
smultron1977 0:246f2fb5be59 221 wr_dat(0xC5); // VGH25 = 2.4C VGSEL =-10 VGH = 3*AVDD
smultron1977 0:246f2fb5be59 222
smultron1977 0:246f2fb5be59 223 wr_cmd(ST7735_PWCTR3); // POWER CONTROL 3
smultron1977 0:246f2fb5be59 224 wr_dat(0x0A); // Opamp current small
smultron1977 0:246f2fb5be59 225 wr_dat(0x00); // Boost freq
smultron1977 0:246f2fb5be59 226
smultron1977 0:246f2fb5be59 227 wr_cmd(ST7735_PWCTR4); // POWER CONTROL 4
smultron1977 0:246f2fb5be59 228 wr_dat(0x8A); // BCLK/2, Opamp current small / medium low
smultron1977 0:246f2fb5be59 229 wr_dat(0x2A); //
smultron1977 0:246f2fb5be59 230
smultron1977 0:246f2fb5be59 231 wr_cmd(ST7735_PWCTR5); // POWER CONTROL 5
smultron1977 0:246f2fb5be59 232 wr_dat(0x8A); // BCLK/2, Opamp current small / medium low
smultron1977 0:246f2fb5be59 233 wr_dat(0xEE); //
smultron1977 0:246f2fb5be59 234
smultron1977 0:246f2fb5be59 235 wr_cmd(ST7735_VMCTR1); // POWER CONTROL 6
smultron1977 0:246f2fb5be59 236 wr_dat(0x0E); //
smultron1977 0:246f2fb5be59 237
smultron1977 0:246f2fb5be59 238 wr_cmd(ST7735_INVOFF); // INVOFF
smultron1977 0:246f2fb5be59 239
smultron1977 0:246f2fb5be59 240 wr_cmd(ST7735_MADCTL); // ORIENTATION
smultron1977 0:246f2fb5be59 241 wr_dat(0xC8); //
smultron1977 0:246f2fb5be59 242
smultron1977 0:246f2fb5be59 243 wr_cmd(ST7735_COLMOD); // COLOR MODE
smultron1977 0:246f2fb5be59 244 wr_dat(0x05); //
smultron1977 0:246f2fb5be59 245
smultron1977 0:246f2fb5be59 246 wr_cmd(ST7735_CASET); // COLUMN ADDR SET
smultron1977 0:246f2fb5be59 247 wr_dat(0x00); //
smultron1977 0:246f2fb5be59 248 wr_dat(0x00); // xstart = 0
smultron1977 0:246f2fb5be59 249 wr_dat(0x00); //
smultron1977 0:246f2fb5be59 250 wr_dat(0x7F); // xend = 127
smultron1977 0:246f2fb5be59 251
smultron1977 0:246f2fb5be59 252 wr_cmd(ST7735_RASET); // ROW ADDR SET
smultron1977 0:246f2fb5be59 253 wr_dat(0x00); //
smultron1977 0:246f2fb5be59 254 wr_dat(0x00); // ystart = 0
smultron1977 0:246f2fb5be59 255 wr_dat(0x00); //
smultron1977 0:246f2fb5be59 256 wr_dat(0x9F); // yend = 159
smultron1977 0:246f2fb5be59 257
smultron1977 0:246f2fb5be59 258 /* Gamma settings -----------------------------------------------------------*/
smultron1977 0:246f2fb5be59 259
smultron1977 0:246f2fb5be59 260 wr_cmd(0xE0); // GMCTRP1
smultron1977 0:246f2fb5be59 261 wr_dat(0x02);
smultron1977 0:246f2fb5be59 262 wr_dat(0x1c);
smultron1977 0:246f2fb5be59 263 wr_dat(0x07);
smultron1977 0:246f2fb5be59 264 wr_dat(0x12);
smultron1977 0:246f2fb5be59 265 wr_dat(0x37);
smultron1977 0:246f2fb5be59 266 wr_dat(0x32);
smultron1977 0:246f2fb5be59 267 wr_dat(0x29);
smultron1977 0:246f2fb5be59 268 wr_dat(0x2d);
smultron1977 0:246f2fb5be59 269 wr_dat(0x29);
smultron1977 0:246f2fb5be59 270 wr_dat(0x25);
smultron1977 0:246f2fb5be59 271 wr_dat(0x2B);
smultron1977 0:246f2fb5be59 272 wr_dat(0x39);
smultron1977 0:246f2fb5be59 273 wr_dat(0x00);
smultron1977 0:246f2fb5be59 274 wr_dat(0x01);
smultron1977 0:246f2fb5be59 275 wr_dat(0x03);
smultron1977 0:246f2fb5be59 276 wr_dat(0x10);
smultron1977 0:246f2fb5be59 277 wr_cmd(0xE1); // GMCTRN1
smultron1977 0:246f2fb5be59 278 wr_dat(0x03);
smultron1977 0:246f2fb5be59 279 wr_dat(0x1d);
smultron1977 0:246f2fb5be59 280 wr_dat(0x07);
smultron1977 0:246f2fb5be59 281 wr_dat(0x06);
smultron1977 0:246f2fb5be59 282 wr_dat(0x2E);
smultron1977 0:246f2fb5be59 283 wr_dat(0x2C);
smultron1977 0:246f2fb5be59 284 wr_dat(0x29);
smultron1977 0:246f2fb5be59 285 wr_dat(0x2D);
smultron1977 0:246f2fb5be59 286 wr_dat(0x2E);
smultron1977 0:246f2fb5be59 287 wr_dat(0x2E);
smultron1977 0:246f2fb5be59 288 wr_dat(0x37);
smultron1977 0:246f2fb5be59 289 wr_dat(0x3F);
smultron1977 0:246f2fb5be59 290 wr_dat(0x00);
smultron1977 0:246f2fb5be59 291 wr_dat(0x00);
smultron1977 0:246f2fb5be59 292 wr_dat(0x02);
smultron1977 0:246f2fb5be59 293 wr_dat(0x10);
smultron1977 0:246f2fb5be59 294
smultron1977 0:246f2fb5be59 295 wr_cmd(ST7735_DISPON); // display ON
smultron1977 0:246f2fb5be59 296 wait_ms(100);
smultron1977 0:246f2fb5be59 297
smultron1977 0:246f2fb5be59 298 wr_cmd(ST7735_NORON); // normal display on
smultron1977 0:246f2fb5be59 299 wait_ms(10);
smultron1977 0:246f2fb5be59 300
smultron1977 0:246f2fb5be59 301 switch (orientation) {
smultron1977 0:246f2fb5be59 302 case 0:
smultron1977 0:246f2fb5be59 303 wr_reg(0xC8, 0x0008);
smultron1977 0:246f2fb5be59 304 break;
smultron1977 0:246f2fb5be59 305 case 1:
smultron1977 0:246f2fb5be59 306 wr_reg(0xC8, 0x0068);
smultron1977 0:246f2fb5be59 307 break;
smultron1977 0:246f2fb5be59 308 case 2:
smultron1977 0:246f2fb5be59 309 wr_reg(0xC8, 0x00C8);
smultron1977 0:246f2fb5be59 310 break;
smultron1977 0:246f2fb5be59 311 case 3:
smultron1977 0:246f2fb5be59 312 wr_reg(0xC8, 0x00A8);
smultron1977 0:246f2fb5be59 313 break;
smultron1977 0:246f2fb5be59 314 }
smultron1977 0:246f2fb5be59 315 WindowMax ();
smultron1977 0:246f2fb5be59 316 }
smultron1977 0:246f2fb5be59 317
smultron1977 0:246f2fb5be59 318
smultron1977 0:246f2fb5be59 319 void ST7735_TFT::pixel(int x, int y, int color) {
smultron1977 0:246f2fb5be59 320 if ((x >= width()) || (y >= height())) return;
smultron1977 0:246f2fb5be59 321
smultron1977 0:246f2fb5be59 322 window(x,y,x+1,y+1);
smultron1977 0:246f2fb5be59 323
smultron1977 0:246f2fb5be59 324 // setup for data
smultron1977 0:246f2fb5be59 325 _rs = 1;
smultron1977 0:246f2fb5be59 326 _cs = 0;
smultron1977 0:246f2fb5be59 327 _spi.format(16,3);
smultron1977 0:246f2fb5be59 328 _spi.write(color);
smultron1977 0:246f2fb5be59 329 _cs = 1;
smultron1977 0:246f2fb5be59 330 _spi.format(8,3);
smultron1977 0:246f2fb5be59 331 }
smultron1977 0:246f2fb5be59 332
cbuss 2:264c52bc760c 333 void ST7735_TFT::window (int x, int y, int w, int h) {
smultron1977 0:246f2fb5be59 334 wr_cmd(ST7735_CASET); // column addr set
smultron1977 0:246f2fb5be59 335 wr_dat(0x00);
smultron1977 0:246f2fb5be59 336 wr_dat(x+2); // XSTART
smultron1977 0:246f2fb5be59 337 wr_dat(0x00);
smultron1977 0:246f2fb5be59 338 wr_dat(x+w+1); // XEND
smultron1977 0:246f2fb5be59 339
smultron1977 0:246f2fb5be59 340 wr_cmd(ST7735_RASET); // row addr set
smultron1977 0:246f2fb5be59 341 wr_dat(0x00);
smultron1977 0:246f2fb5be59 342 wr_dat(y+1); // YSTART
smultron1977 0:246f2fb5be59 343 wr_dat(0x00);
smultron1977 0:246f2fb5be59 344 wr_dat(y+h+1); // YEND
smultron1977 0:246f2fb5be59 345
smultron1977 0:246f2fb5be59 346 wr_cmd(ST7735_RAMWR); // write to RAM
smultron1977 0:246f2fb5be59 347 }
smultron1977 0:246f2fb5be59 348
smultron1977 0:246f2fb5be59 349
smultron1977 0:246f2fb5be59 350 void ST7735_TFT::WindowMax (void) {
smultron1977 0:246f2fb5be59 351 window (0, 0, width(), height());
smultron1977 0:246f2fb5be59 352 }
smultron1977 0:246f2fb5be59 353
smultron1977 0:246f2fb5be59 354
smultron1977 0:246f2fb5be59 355 void ST7735_TFT::cls (void) {
smultron1977 0:246f2fb5be59 356 unsigned int i;
smultron1977 0:246f2fb5be59 357 WindowMax();
smultron1977 0:246f2fb5be59 358 wr_dat_start();
smultron1977 0:246f2fb5be59 359 _spi.format(16,3);
smultron1977 0:246f2fb5be59 360 for (i = 0; i < ( (width()+1) * (height()+3)); i++) {
smultron1977 0:246f2fb5be59 361 _spi.write(_background);
smultron1977 0:246f2fb5be59 362 }
smultron1977 0:246f2fb5be59 363 _spi.format(8,3);
smultron1977 0:246f2fb5be59 364 wr_dat_stop();
smultron1977 0:246f2fb5be59 365 }
smultron1977 0:246f2fb5be59 366
smultron1977 0:246f2fb5be59 367
smultron1977 0:246f2fb5be59 368 void ST7735_TFT::circle(int x0, int y0, int r, int color) {
smultron1977 0:246f2fb5be59 369
smultron1977 0:246f2fb5be59 370 int draw_x0, draw_y0;
smultron1977 0:246f2fb5be59 371 int draw_x1, draw_y1;
smultron1977 0:246f2fb5be59 372 int draw_x2, draw_y2;
smultron1977 0:246f2fb5be59 373 int draw_x3, draw_y3;
smultron1977 0:246f2fb5be59 374 int draw_x4, draw_y4;
smultron1977 0:246f2fb5be59 375 int draw_x5, draw_y5;
smultron1977 0:246f2fb5be59 376 int draw_x6, draw_y6;
smultron1977 0:246f2fb5be59 377 int draw_x7, draw_y7;
smultron1977 0:246f2fb5be59 378 int xx, yy;
smultron1977 0:246f2fb5be59 379 int di;
smultron1977 0:246f2fb5be59 380 WindowMax();
smultron1977 0:246f2fb5be59 381 if (r == 0) { /* no radius */
smultron1977 0:246f2fb5be59 382 return;
smultron1977 0:246f2fb5be59 383 }
smultron1977 0:246f2fb5be59 384
smultron1977 0:246f2fb5be59 385 draw_x0 = draw_x1 = x0;
smultron1977 0:246f2fb5be59 386 draw_y0 = draw_y1 = y0 + r;
smultron1977 0:246f2fb5be59 387 if (draw_y0 < height()) {
smultron1977 0:246f2fb5be59 388 pixel(draw_x0, draw_y0, color); /* 90 degree */
smultron1977 0:246f2fb5be59 389 }
smultron1977 0:246f2fb5be59 390
smultron1977 0:246f2fb5be59 391 draw_x2 = draw_x3 = x0;
smultron1977 0:246f2fb5be59 392 draw_y2 = draw_y3 = y0 - r;
smultron1977 0:246f2fb5be59 393 if (draw_y2 >= 0) {
smultron1977 0:246f2fb5be59 394 pixel(draw_x2, draw_y2, color); /* 270 degree */
smultron1977 0:246f2fb5be59 395 }
smultron1977 0:246f2fb5be59 396
smultron1977 0:246f2fb5be59 397 draw_x4 = draw_x6 = x0 + r;
smultron1977 0:246f2fb5be59 398 draw_y4 = draw_y6 = y0;
smultron1977 0:246f2fb5be59 399 if (draw_x4 < width()) {
smultron1977 0:246f2fb5be59 400 pixel(draw_x4, draw_y4, color); /* 0 degree */
smultron1977 0:246f2fb5be59 401 }
smultron1977 0:246f2fb5be59 402
smultron1977 0:246f2fb5be59 403 draw_x5 = draw_x7 = x0 - r;
smultron1977 0:246f2fb5be59 404 draw_y5 = draw_y7 = y0;
smultron1977 0:246f2fb5be59 405 if (draw_x5>=0) {
smultron1977 0:246f2fb5be59 406 pixel(draw_x5, draw_y5, color); /* 180 degree */
smultron1977 0:246f2fb5be59 407 }
smultron1977 0:246f2fb5be59 408
smultron1977 0:246f2fb5be59 409 if (r == 1) {
smultron1977 0:246f2fb5be59 410 return;
smultron1977 0:246f2fb5be59 411 }
smultron1977 0:246f2fb5be59 412
smultron1977 0:246f2fb5be59 413 di = 3 - 2*r;
smultron1977 0:246f2fb5be59 414 xx = 0;
smultron1977 0:246f2fb5be59 415 yy = r;
smultron1977 0:246f2fb5be59 416 while (xx < yy) {
smultron1977 0:246f2fb5be59 417
smultron1977 0:246f2fb5be59 418 if (di < 0) {
smultron1977 0:246f2fb5be59 419 di += 4*xx + 6;
smultron1977 0:246f2fb5be59 420 } else {
smultron1977 0:246f2fb5be59 421 di += 4*(xx - yy) + 10;
smultron1977 0:246f2fb5be59 422 yy--;
smultron1977 0:246f2fb5be59 423 draw_y0--;
smultron1977 0:246f2fb5be59 424 draw_y1--;
smultron1977 0:246f2fb5be59 425 draw_y2++;
smultron1977 0:246f2fb5be59 426 draw_y3++;
smultron1977 0:246f2fb5be59 427 draw_x4--;
smultron1977 0:246f2fb5be59 428 draw_x5++;
smultron1977 0:246f2fb5be59 429 draw_x6--;
smultron1977 0:246f2fb5be59 430 draw_x7++;
smultron1977 0:246f2fb5be59 431 }
smultron1977 0:246f2fb5be59 432 xx++;
smultron1977 0:246f2fb5be59 433 draw_x0++;
smultron1977 0:246f2fb5be59 434 draw_x1--;
smultron1977 0:246f2fb5be59 435 draw_x2++;
smultron1977 0:246f2fb5be59 436 draw_x3--;
smultron1977 0:246f2fb5be59 437 draw_y4++;
smultron1977 0:246f2fb5be59 438 draw_y5++;
smultron1977 0:246f2fb5be59 439 draw_y6--;
smultron1977 0:246f2fb5be59 440 draw_y7--;
smultron1977 0:246f2fb5be59 441
smultron1977 0:246f2fb5be59 442 if ( (draw_x0 <= width()) && (draw_y0>=0) ) {
smultron1977 0:246f2fb5be59 443 pixel(draw_x0, draw_y0, color);
smultron1977 0:246f2fb5be59 444 }
smultron1977 0:246f2fb5be59 445
smultron1977 0:246f2fb5be59 446 if ( (draw_x1 >= 0) && (draw_y1 >= 0) ) {
smultron1977 0:246f2fb5be59 447 pixel(draw_x1, draw_y1, color);
smultron1977 0:246f2fb5be59 448 }
smultron1977 0:246f2fb5be59 449
smultron1977 0:246f2fb5be59 450 if ( (draw_x2 <= width()) && (draw_y2 <= height()) ) {
smultron1977 0:246f2fb5be59 451 pixel(draw_x2, draw_y2, color);
smultron1977 0:246f2fb5be59 452 }
smultron1977 0:246f2fb5be59 453
smultron1977 0:246f2fb5be59 454 if ( (draw_x3 >=0 ) && (draw_y3 <= height()) ) {
smultron1977 0:246f2fb5be59 455 pixel(draw_x3, draw_y3, color);
smultron1977 0:246f2fb5be59 456 }
smultron1977 0:246f2fb5be59 457
smultron1977 0:246f2fb5be59 458 if ( (draw_x4 <= width()) && (draw_y4 >= 0) ) {
smultron1977 0:246f2fb5be59 459 pixel(draw_x4, draw_y4, color);
smultron1977 0:246f2fb5be59 460 }
smultron1977 0:246f2fb5be59 461
smultron1977 0:246f2fb5be59 462 if ( (draw_x5 >= 0) && (draw_y5 >= 0) ) {
smultron1977 0:246f2fb5be59 463 pixel(draw_x5, draw_y5, color);
smultron1977 0:246f2fb5be59 464 }
smultron1977 0:246f2fb5be59 465 if ( (draw_x6 <=width()) && (draw_y6 <= height()) ) {
smultron1977 0:246f2fb5be59 466 pixel(draw_x6, draw_y6, color);
smultron1977 0:246f2fb5be59 467 }
smultron1977 0:246f2fb5be59 468 if ( (draw_x7 >= 0) && (draw_y7 <= height()) ) {
smultron1977 0:246f2fb5be59 469 pixel(draw_x7, draw_y7, color);
smultron1977 0:246f2fb5be59 470 }
smultron1977 0:246f2fb5be59 471 }
smultron1977 0:246f2fb5be59 472 return;
smultron1977 0:246f2fb5be59 473 }
smultron1977 0:246f2fb5be59 474
smultron1977 0:246f2fb5be59 475 void ST7735_TFT::fillcircle(int x, int y, int r, int color) {
smultron1977 0:246f2fb5be59 476 int i;
smultron1977 0:246f2fb5be59 477 for (i = 0; i <= r; i++)
smultron1977 0:246f2fb5be59 478 circle(x,y,i,color);
smultron1977 0:246f2fb5be59 479 }
smultron1977 0:246f2fb5be59 480
smultron1977 0:246f2fb5be59 481
smultron1977 0:246f2fb5be59 482
smultron1977 0:246f2fb5be59 483 void ST7735_TFT::hline(int x0, int x1, int y, int color) {
smultron1977 0:246f2fb5be59 484 int w;
smultron1977 0:246f2fb5be59 485 w = x1 - x0 + 1;
smultron1977 0:246f2fb5be59 486 window(x0,y,w,1);
smultron1977 0:246f2fb5be59 487 wr_cmd(0x2C);
smultron1977 0:246f2fb5be59 488 wr_dat_start();
smultron1977 0:246f2fb5be59 489 for (int x=0; x<w; x++) {
smultron1977 0:246f2fb5be59 490 _spi.write(color);
smultron1977 0:246f2fb5be59 491 _spi.write(color >> 8);
smultron1977 0:246f2fb5be59 492 }
smultron1977 0:246f2fb5be59 493 wr_dat_stop();
smultron1977 0:246f2fb5be59 494 return;
smultron1977 0:246f2fb5be59 495 }
smultron1977 0:246f2fb5be59 496
smultron1977 0:246f2fb5be59 497
smultron1977 0:246f2fb5be59 498
smultron1977 0:246f2fb5be59 499 void ST7735_TFT::vline(int x, int y0, int y1, int color) {
smultron1977 0:246f2fb5be59 500 int h;
smultron1977 0:246f2fb5be59 501 h = y1 - y0 + 1;
smultron1977 0:246f2fb5be59 502 window(x,y0,1,h);
smultron1977 0:246f2fb5be59 503 wr_cmd(0x2C);
smultron1977 0:246f2fb5be59 504 wr_dat_start();
smultron1977 0:246f2fb5be59 505 for (int y=0; y<h; y++) {
smultron1977 0:246f2fb5be59 506 _spi.write(color);
smultron1977 0:246f2fb5be59 507 _spi.write(color >> 8);
smultron1977 0:246f2fb5be59 508 }
smultron1977 0:246f2fb5be59 509 wr_dat_stop();
smultron1977 0:246f2fb5be59 510 return;
smultron1977 0:246f2fb5be59 511 }
smultron1977 0:246f2fb5be59 512
smultron1977 0:246f2fb5be59 513
smultron1977 0:246f2fb5be59 514
smultron1977 0:246f2fb5be59 515 void ST7735_TFT::line(int x0, int y0, int x1, int y1, int color) {
smultron1977 0:246f2fb5be59 516 WindowMax();
smultron1977 0:246f2fb5be59 517 int dx = 0, dy = 0;
smultron1977 0:246f2fb5be59 518 int dx_sym = 0, dy_sym = 0;
smultron1977 0:246f2fb5be59 519 int dx_x2 = 0, dy_x2 = 0;
smultron1977 0:246f2fb5be59 520 int di = 0;
smultron1977 0:246f2fb5be59 521
smultron1977 0:246f2fb5be59 522 dx = x1-x0;
smultron1977 0:246f2fb5be59 523 dy = y1-y0;
smultron1977 0:246f2fb5be59 524
smultron1977 0:246f2fb5be59 525 if (dx == 0) { /* vertical line */
smultron1977 0:246f2fb5be59 526 if (y1 > y0) vline(x0,y0,y1,color);
smultron1977 0:246f2fb5be59 527 else vline(x0,y1,y0,color);
smultron1977 0:246f2fb5be59 528 return;
smultron1977 0:246f2fb5be59 529 }
smultron1977 0:246f2fb5be59 530
smultron1977 0:246f2fb5be59 531 if (dx > 0) {
smultron1977 0:246f2fb5be59 532 dx_sym = 1;
smultron1977 0:246f2fb5be59 533 } else {
smultron1977 0:246f2fb5be59 534 dx_sym = -1;
smultron1977 0:246f2fb5be59 535 }
smultron1977 0:246f2fb5be59 536 if (dy == 0) { /* horizontal line */
smultron1977 0:246f2fb5be59 537 if (x1 > x0) hline(x0,x1,y0,color);
smultron1977 0:246f2fb5be59 538 else hline(x1,x0,y0,color);
smultron1977 0:246f2fb5be59 539 return;
smultron1977 0:246f2fb5be59 540 }
smultron1977 0:246f2fb5be59 541
smultron1977 0:246f2fb5be59 542 if (dy > 0) {
smultron1977 0:246f2fb5be59 543 dy_sym = 1;
smultron1977 0:246f2fb5be59 544 } else {
smultron1977 0:246f2fb5be59 545 dy_sym = -1;
smultron1977 0:246f2fb5be59 546 }
smultron1977 0:246f2fb5be59 547
smultron1977 0:246f2fb5be59 548 dx = dx_sym*dx;
smultron1977 0:246f2fb5be59 549 dy = dy_sym*dy;
smultron1977 0:246f2fb5be59 550
smultron1977 0:246f2fb5be59 551 dx_x2 = dx*2;
smultron1977 0:246f2fb5be59 552 dy_x2 = dy*2;
smultron1977 0:246f2fb5be59 553
smultron1977 0:246f2fb5be59 554 if (dx >= dy) {
smultron1977 0:246f2fb5be59 555 di = dy_x2 - dx;
smultron1977 0:246f2fb5be59 556 while (x0 != x1) {
smultron1977 0:246f2fb5be59 557
smultron1977 0:246f2fb5be59 558 pixel(x0, y0, color);
smultron1977 0:246f2fb5be59 559 x0 += dx_sym;
smultron1977 0:246f2fb5be59 560 if (di<0) {
smultron1977 0:246f2fb5be59 561 di += dy_x2;
smultron1977 0:246f2fb5be59 562 } else {
smultron1977 0:246f2fb5be59 563 di += dy_x2 - dx_x2;
smultron1977 0:246f2fb5be59 564 y0 += dy_sym;
smultron1977 0:246f2fb5be59 565 }
smultron1977 0:246f2fb5be59 566 }
smultron1977 0:246f2fb5be59 567 pixel(x0, y0, color);
smultron1977 0:246f2fb5be59 568 } else {
smultron1977 0:246f2fb5be59 569 di = dx_x2 - dy;
smultron1977 0:246f2fb5be59 570 while (y0 != y1) {
smultron1977 0:246f2fb5be59 571 pixel(x0, y0, color);
smultron1977 0:246f2fb5be59 572 y0 += dy_sym;
smultron1977 0:246f2fb5be59 573 if (di < 0) {
smultron1977 0:246f2fb5be59 574 di += dx_x2;
smultron1977 0:246f2fb5be59 575 } else {
smultron1977 0:246f2fb5be59 576 di += dx_x2 - dy_x2;
smultron1977 0:246f2fb5be59 577 x0 += dx_sym;
smultron1977 0:246f2fb5be59 578 }
smultron1977 0:246f2fb5be59 579 }
smultron1977 0:246f2fb5be59 580 pixel(x0, y0, color);
smultron1977 0:246f2fb5be59 581 }
smultron1977 0:246f2fb5be59 582 return;
smultron1977 0:246f2fb5be59 583 }
smultron1977 0:246f2fb5be59 584
smultron1977 0:246f2fb5be59 585
smultron1977 0:246f2fb5be59 586
smultron1977 0:246f2fb5be59 587
smultron1977 0:246f2fb5be59 588 void ST7735_TFT::rect(int x0, int y0, int x1, int y1, int color) {
smultron1977 0:246f2fb5be59 589
smultron1977 0:246f2fb5be59 590 if (x1 > x0) hline(x0,x1,y0,color);
smultron1977 0:246f2fb5be59 591 else hline(x1,x0,y0,color);
smultron1977 0:246f2fb5be59 592
smultron1977 0:246f2fb5be59 593 if (y1 > y0) vline(x0,y0,y1,color);
smultron1977 0:246f2fb5be59 594 else vline(x0,y1,y0,color);
smultron1977 0:246f2fb5be59 595
smultron1977 0:246f2fb5be59 596 if (x1 > x0) hline(x0,x1,y1,color);
smultron1977 0:246f2fb5be59 597 else hline(x1,x0,y1,color);
smultron1977 0:246f2fb5be59 598
smultron1977 0:246f2fb5be59 599 if (y1 > y0) vline(x1,y0,y1,color);
smultron1977 0:246f2fb5be59 600 else vline(x1,y1,y0,color);
smultron1977 0:246f2fb5be59 601
smultron1977 0:246f2fb5be59 602 return;
smultron1977 0:246f2fb5be59 603 }
smultron1977 0:246f2fb5be59 604
smultron1977 0:246f2fb5be59 605
smultron1977 0:246f2fb5be59 606
smultron1977 0:246f2fb5be59 607 void ST7735_TFT::fillrect(int x0, int y0, int x1, int y1, int color) {
smultron1977 0:246f2fb5be59 608
smultron1977 0:246f2fb5be59 609 int h = y1 - y0 + 1;
smultron1977 0:246f2fb5be59 610 int w = x1 - x0 + 1;
smultron1977 0:246f2fb5be59 611 int pixel = h * w;
smultron1977 0:246f2fb5be59 612 window(x0,y0,w,h);
smultron1977 0:246f2fb5be59 613 wr_cmd(0x2C);
smultron1977 0:246f2fb5be59 614 wr_dat_start();
smultron1977 0:246f2fb5be59 615 for (int p=0; p<pixel; p++) {
smultron1977 0:246f2fb5be59 616 _spi.write(color);
smultron1977 0:246f2fb5be59 617 _spi.write(color >> 8);
smultron1977 0:246f2fb5be59 618 }
smultron1977 0:246f2fb5be59 619 wr_dat_stop();
smultron1977 0:246f2fb5be59 620 return;
smultron1977 0:246f2fb5be59 621 }
smultron1977 0:246f2fb5be59 622
smultron1977 0:246f2fb5be59 623
smultron1977 0:246f2fb5be59 624
smultron1977 0:246f2fb5be59 625 void ST7735_TFT::locate(int x, int y) {
smultron1977 0:246f2fb5be59 626 char_x = x;
smultron1977 0:246f2fb5be59 627 char_y = y;
smultron1977 0:246f2fb5be59 628 }
smultron1977 0:246f2fb5be59 629
smultron1977 0:246f2fb5be59 630
smultron1977 0:246f2fb5be59 631
smultron1977 0:246f2fb5be59 632 int ST7735_TFT::columns() {
smultron1977 0:246f2fb5be59 633 return width() / font[1];
smultron1977 0:246f2fb5be59 634 }
smultron1977 0:246f2fb5be59 635
smultron1977 0:246f2fb5be59 636
smultron1977 0:246f2fb5be59 637
smultron1977 0:246f2fb5be59 638 int ST7735_TFT::rows() {
smultron1977 0:246f2fb5be59 639 return height() / font[2];
smultron1977 0:246f2fb5be59 640 }
smultron1977 0:246f2fb5be59 641
smultron1977 0:246f2fb5be59 642
smultron1977 0:246f2fb5be59 643
smultron1977 0:246f2fb5be59 644 int ST7735_TFT::_putc(int value) {
smultron1977 0:246f2fb5be59 645 if (value == '\n') { // new line
smultron1977 0:246f2fb5be59 646 char_x = 0;
smultron1977 0:246f2fb5be59 647 char_y = char_y + font[2];
smultron1977 0:246f2fb5be59 648 if (char_y >= height() - font[2]) {
smultron1977 0:246f2fb5be59 649 char_y = 0;
smultron1977 0:246f2fb5be59 650 }
smultron1977 0:246f2fb5be59 651 } else {
smultron1977 0:246f2fb5be59 652 character(char_x, char_y, value);
smultron1977 0:246f2fb5be59 653 }
smultron1977 0:246f2fb5be59 654 return value;
smultron1977 0:246f2fb5be59 655 }
smultron1977 0:246f2fb5be59 656
smultron1977 0:246f2fb5be59 657
smultron1977 0:246f2fb5be59 658
smultron1977 0:246f2fb5be59 659
smultron1977 0:246f2fb5be59 660 void ST7735_TFT::character(int x, int y, int c) {
smultron1977 0:246f2fb5be59 661 unsigned int hor,vert,offset,bpl,j,i,b;
smultron1977 0:246f2fb5be59 662 unsigned char* zeichen;
smultron1977 0:246f2fb5be59 663 unsigned char z,w;
smultron1977 0:246f2fb5be59 664
smultron1977 0:246f2fb5be59 665 if ((c < 31) || (c > 127)) return; // test char range
smultron1977 0:246f2fb5be59 666
smultron1977 0:246f2fb5be59 667 // read font parameter from start of array
smultron1977 0:246f2fb5be59 668 offset = font[0]; // bytes / char
smultron1977 0:246f2fb5be59 669 hor = font[1]; // get hor size of font
smultron1977 0:246f2fb5be59 670 vert = font[2]; // get vert size of font
smultron1977 0:246f2fb5be59 671 bpl = font[3]; // bytes per line
smultron1977 0:246f2fb5be59 672
smultron1977 0:246f2fb5be59 673 if (char_x + hor > width()) {
smultron1977 0:246f2fb5be59 674 char_x = 0;
smultron1977 0:246f2fb5be59 675 char_y = char_y + vert;
smultron1977 0:246f2fb5be59 676 if (char_y >= height() - font[2]) {
smultron1977 0:246f2fb5be59 677 char_y = 0;
smultron1977 0:246f2fb5be59 678 }
smultron1977 0:246f2fb5be59 679 }
smultron1977 0:246f2fb5be59 680
smultron1977 0:246f2fb5be59 681 window(char_x, char_y,hor,vert); // char box
smultron1977 0:246f2fb5be59 682 wr_cmd(0x2C);
smultron1977 0:246f2fb5be59 683 wr_dat_start();
smultron1977 0:246f2fb5be59 684 zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap
smultron1977 0:246f2fb5be59 685 w = zeichen[0]; // width of actual char
smultron1977 0:246f2fb5be59 686 _spi.format(16,3); // pixel are 16 bit
smultron1977 0:246f2fb5be59 687
smultron1977 0:246f2fb5be59 688 for (j=0; j<vert; j++) { // vert line
smultron1977 0:246f2fb5be59 689 for (i=0; i<hor; i++) { // horz line
smultron1977 0:246f2fb5be59 690 z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
smultron1977 0:246f2fb5be59 691 b = 1 << (j & 0x07);
smultron1977 0:246f2fb5be59 692 if (( z & b ) == 0x00) {
smultron1977 0:246f2fb5be59 693 _spi.write(_background);
smultron1977 0:246f2fb5be59 694 } else {
smultron1977 0:246f2fb5be59 695 _spi.write(_foreground);
smultron1977 0:246f2fb5be59 696 }
smultron1977 0:246f2fb5be59 697 }
smultron1977 0:246f2fb5be59 698 }
smultron1977 0:246f2fb5be59 699 _spi.format(8,3); // 8 bit
smultron1977 0:246f2fb5be59 700 wr_dat_stop();
smultron1977 0:246f2fb5be59 701 if ((w + 2) < hor) { // x offset to next char
smultron1977 0:246f2fb5be59 702 char_x += w + 2;
smultron1977 0:246f2fb5be59 703 } else char_x += hor;
smultron1977 0:246f2fb5be59 704 }
smultron1977 0:246f2fb5be59 705
smultron1977 0:246f2fb5be59 706
smultron1977 0:246f2fb5be59 707
smultron1977 0:246f2fb5be59 708
smultron1977 0:246f2fb5be59 709
smultron1977 0:246f2fb5be59 710 void ST7735_TFT::set_font(unsigned char* f) {
smultron1977 0:246f2fb5be59 711 font = f;
smultron1977 0:246f2fb5be59 712 }
smultron1977 0:246f2fb5be59 713
smultron1977 0:246f2fb5be59 714
smultron1977 0:246f2fb5be59 715
smultron1977 0:246f2fb5be59 716 void ST7735_TFT::Bitmap(unsigned int x, unsigned int y, unsigned int w, unsigned int h,unsigned char *bitmap) {
cbuss 2:264c52bc760c 717 unsigned int i,j;
smultron1977 0:246f2fb5be59 718 unsigned short *bitmap_ptr = (unsigned short *)bitmap;
smultron1977 0:246f2fb5be59 719 window(x, y, w, h);
smultron1977 0:246f2fb5be59 720 wr_cmd(0x2C);
smultron1977 0:246f2fb5be59 721 wr_dat_start();
smultron1977 0:246f2fb5be59 722 for (j = 0; j < h; j++) { //Lines
smultron1977 0:246f2fb5be59 723 for (i = 0; i < w; i++) { // copy pixel data to TFT
smultron1977 0:246f2fb5be59 724 _spi.write(*bitmap_ptr); // one line
smultron1977 0:246f2fb5be59 725 _spi.write(*bitmap_ptr >> 8);
smultron1977 0:246f2fb5be59 726 bitmap_ptr++;
smultron1977 0:246f2fb5be59 727 }
smultron1977 0:246f2fb5be59 728 }
smultron1977 0:246f2fb5be59 729 wr_dat_stop();
smultron1977 0:246f2fb5be59 730 }
smultron1977 0:246f2fb5be59 731
cbuss 2:264c52bc760c 732 /*
smultron1977 0:246f2fb5be59 733 int ST7735_TFT::BMP_16(unsigned int x, unsigned int y, const char *Name_BMP) {
smultron1977 0:246f2fb5be59 734 // BEWARE !
smultron1977 0:246f2fb5be59 735 // NOT TESTED
smultron1977 0:246f2fb5be59 736 #define OffsetPixelWidth 18
smultron1977 0:246f2fb5be59 737 #define OffsetPixelHeigh 22
smultron1977 0:246f2fb5be59 738 #define OffsetFileSize 34
smultron1977 0:246f2fb5be59 739 #define OffsetPixData 10
smultron1977 0:246f2fb5be59 740 #define OffsetBPP 28
smultron1977 0:246f2fb5be59 741
smultron1977 0:246f2fb5be59 742 char filename[50];
smultron1977 0:246f2fb5be59 743 unsigned char BMP_Header[54];
smultron1977 0:246f2fb5be59 744 unsigned short BPP_t;
smultron1977 0:246f2fb5be59 745 unsigned int PixelWidth,PixelHeigh,start_data;
smultron1977 0:246f2fb5be59 746 unsigned int i,off;
smultron1977 0:246f2fb5be59 747 int padd,j;
smultron1977 0:246f2fb5be59 748 unsigned short *line;
smultron1977 0:246f2fb5be59 749
smultron1977 0:246f2fb5be59 750 // get the filename
smultron1977 0:246f2fb5be59 751 LocalFileSystem local("local");
smultron1977 0:246f2fb5be59 752 sprintf(&filename[0],"/local/");
smultron1977 0:246f2fb5be59 753 i=7;
smultron1977 0:246f2fb5be59 754 while (*Name_BMP!='\0') {
smultron1977 0:246f2fb5be59 755 filename[i++]=*Name_BMP++;
smultron1977 0:246f2fb5be59 756 }
smultron1977 0:246f2fb5be59 757 FILE *Image = fopen((const char *)&filename[0], "r"); // open the bmp file
smultron1977 0:246f2fb5be59 758 if (!Image) {
smultron1977 0:246f2fb5be59 759 return(0); // error file not found !
smultron1977 0:246f2fb5be59 760 }
smultron1977 0:246f2fb5be59 761
smultron1977 0:246f2fb5be59 762 fread(&BMP_Header[0],1,54,Image); // get the BMP Header
smultron1977 0:246f2fb5be59 763
smultron1977 0:246f2fb5be59 764 if (BMP_Header[0] != 0x42 || BMP_Header[1] != 0x4D) { // check magic byte
smultron1977 0:246f2fb5be59 765 fclose(Image);
smultron1977 0:246f2fb5be59 766 return(-1); // error no BMP file
smultron1977 0:246f2fb5be59 767 }
smultron1977 0:246f2fb5be59 768
smultron1977 0:246f2fb5be59 769 BPP_t = BMP_Header[OffsetBPP] + (BMP_Header[OffsetBPP + 1] << 8);
smultron1977 0:246f2fb5be59 770 if (BPP_t != 0x0010) {
smultron1977 0:246f2fb5be59 771 fclose(Image);
smultron1977 0:246f2fb5be59 772 return(-2); // error no 16 bit BMP
smultron1977 0:246f2fb5be59 773 }
smultron1977 0:246f2fb5be59 774
smultron1977 0:246f2fb5be59 775 PixelHeigh = BMP_Header[OffsetPixelHeigh] + (BMP_Header[OffsetPixelHeigh + 1] << 8) + (BMP_Header[OffsetPixelHeigh + 2] << 16) + (BMP_Header[OffsetPixelHeigh + 3] << 24);
smultron1977 0:246f2fb5be59 776 PixelWidth = BMP_Header[OffsetPixelWidth] + (BMP_Header[OffsetPixelWidth + 1] << 8) + (BMP_Header[OffsetPixelWidth + 2] << 16) + (BMP_Header[OffsetPixelWidth + 3] << 24);
smultron1977 0:246f2fb5be59 777 if (PixelHeigh > height() + y || PixelWidth > width() + x) {
smultron1977 0:246f2fb5be59 778 fclose(Image);
smultron1977 0:246f2fb5be59 779 return(-3); // to big
smultron1977 0:246f2fb5be59 780 }
smultron1977 0:246f2fb5be59 781
smultron1977 0:246f2fb5be59 782 start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24);
smultron1977 0:246f2fb5be59 783
smultron1977 0:246f2fb5be59 784 line = (unsigned short *) malloc (PixelWidth); // we need a buffer for a line
smultron1977 0:246f2fb5be59 785 if (line == NULL) {
smultron1977 0:246f2fb5be59 786 return(-4); // error no memory
smultron1977 0:246f2fb5be59 787 }
smultron1977 0:246f2fb5be59 788
smultron1977 0:246f2fb5be59 789 // the lines are padded to multiple of 4 bytes
smultron1977 0:246f2fb5be59 790 padd = -1;
smultron1977 0:246f2fb5be59 791 do {
smultron1977 0:246f2fb5be59 792 padd ++;
smultron1977 0:246f2fb5be59 793 } while ((PixelWidth * 2 + padd)%4 != 0);
smultron1977 0:246f2fb5be59 794
smultron1977 0:246f2fb5be59 795 window(x, y,PixelWidth,PixelHeigh);
smultron1977 0:246f2fb5be59 796 wr_cmd(0x2C);
smultron1977 0:246f2fb5be59 797 wr_dat_start();
smultron1977 0:246f2fb5be59 798 _spi.format(16,3);
smultron1977 0:246f2fb5be59 799 for (j = PixelHeigh - 1; j >= 0; j--) { //Lines bottom up
smultron1977 0:246f2fb5be59 800 off = j * (PixelWidth * 2 + padd) + start_data; // start of line
smultron1977 0:246f2fb5be59 801 fseek(Image, off ,SEEK_SET);
smultron1977 0:246f2fb5be59 802 fread(line,1,PixelWidth * 2,Image); // read a line - slow !
smultron1977 0:246f2fb5be59 803 for (i = 0; i < PixelWidth; i++) { // copy pixel data to TFT
smultron1977 0:246f2fb5be59 804 _spi.write(line[i]); // one 16 bit pixel
smultron1977 0:246f2fb5be59 805 }
smultron1977 0:246f2fb5be59 806 }
smultron1977 0:246f2fb5be59 807 _spi.format(8,3);
smultron1977 0:246f2fb5be59 808 wr_dat_stop();
smultron1977 0:246f2fb5be59 809 free (line);
smultron1977 0:246f2fb5be59 810 fclose(Image);
smultron1977 0:246f2fb5be59 811 return(1);
cbuss 2:264c52bc760c 812 }*/