Modifié pour fonctionner avec les écran arduino. Ecran surplaque blanche, dos bleu, au dimensions de l'arduino esplora

Dependencies:   ST7735_TFT

Dependents:   Arduino_screen

Fork of ST7735_TFT by Jonne Valola

Committer:
alex_asi_elec
Date:
Fri Dec 06 21:39:29 2013 +0000
Revision:
2:b9c08958fef9
Parent:
1:967235e6fd48
Fonctionne sur ?cran arduino (adafruit)

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