Library for 1.8 inch 160*180 TFT Display. Nice fonts in different formats.

Committer:
rolo644u
Date:
Sat Aug 15 10:58:51 2015 +0000
Revision:
0:3015b613b20d
Child:
1:6a6d8d2b19f1
Library for 1.8 inch 160*180 TFT Display

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rolo644u 0:3015b613b20d 1 #include "mbed.h"
rolo644u 0:3015b613b20d 2 #include "ST7735.h"
rolo644u 0:3015b613b20d 3
rolo644u 0:3015b613b20d 4 #ifdef LOAD_FONT2
rolo644u 0:3015b613b20d 5 #include "Font16.h"
rolo644u 0:3015b613b20d 6 #endif
rolo644u 0:3015b613b20d 7
rolo644u 0:3015b613b20d 8 #ifdef LOAD_FONT4
rolo644u 0:3015b613b20d 9 #include "Font32.h"
rolo644u 0:3015b613b20d 10 #endif
rolo644u 0:3015b613b20d 11
rolo644u 0:3015b613b20d 12 #ifdef LOAD_FONT6
rolo644u 0:3015b613b20d 13 #include "Font64.h"
rolo644u 0:3015b613b20d 14 #endif
rolo644u 0:3015b613b20d 15
rolo644u 0:3015b613b20d 16 #ifdef LOAD_FONT7
rolo644u 0:3015b613b20d 17 #include "Font7s.h"
rolo644u 0:3015b613b20d 18 #endif
rolo644u 0:3015b613b20d 19
rolo644u 0:3015b613b20d 20 #ifdef LOAD_FONT8
rolo644u 0:3015b613b20d 21 #include "Font72.h"
rolo644u 0:3015b613b20d 22 #endif
rolo644u 0:3015b613b20d 23
rolo644u 0:3015b613b20d 24
rolo644u 0:3015b613b20d 25 ST7735::ST7735(PinName cePin, PinName dcPin, PinName mosiPin, PinName sclkPin)
rolo644u 0:3015b613b20d 26 {
rolo644u 0:3015b613b20d 27 spi = new SPI(mosiPin, NC, sclkPin); // create new SPI instance and initialise
rolo644u 0:3015b613b20d 28 initSPI();
rolo644u 0:3015b613b20d 29
rolo644u 0:3015b613b20d 30 // set up other pins as required
rolo644u 0:3015b613b20d 31 ce = new DigitalOut(cePin,1);
rolo644u 0:3015b613b20d 32 dc = new DigitalOut(dcPin,0);
rolo644u 0:3015b613b20d 33
rolo644u 0:3015b613b20d 34
rolo644u 0:3015b613b20d 35 }
rolo644u 0:3015b613b20d 36
rolo644u 0:3015b613b20d 37 // function to initialise SPI peripheral
rolo644u 0:3015b613b20d 38 void ST7735::initSPI()
rolo644u 0:3015b613b20d 39 {
rolo644u 0:3015b613b20d 40 spi->format(8,0); // 8 bits, Mode 0
rolo644u 0:3015b613b20d 41 spi->frequency(12000000); // SPI clock frequency
rolo644u 0:3015b613b20d 42 //spi->frequency(4000000); // SPI clock frequency
rolo644u 0:3015b613b20d 43 //spi->frequency(22000000); // SPI clock frequency 20.83 Mhz
rolo644u 0:3015b613b20d 44 }
rolo644u 0:3015b613b20d 45
rolo644u 0:3015b613b20d 46 // Write data word
rolo644u 0:3015b613b20d 47 void ST7735::writecommand(char c)
rolo644u 0:3015b613b20d 48 {
rolo644u 0:3015b613b20d 49 dc->write(0);
rolo644u 0:3015b613b20d 50 ce->write(0);
rolo644u 0:3015b613b20d 51 spi->write(c);
rolo644u 0:3015b613b20d 52 ce->write(1);
rolo644u 0:3015b613b20d 53 }
rolo644u 0:3015b613b20d 54
rolo644u 0:3015b613b20d 55 // Write command word
rolo644u 0:3015b613b20d 56 void ST7735::writedata(char c)
rolo644u 0:3015b613b20d 57 {
rolo644u 0:3015b613b20d 58 dc->write(1);
rolo644u 0:3015b613b20d 59 ce->write(0);
rolo644u 0:3015b613b20d 60 spi->write(c);
rolo644u 0:3015b613b20d 61 ce->write(1);
rolo644u 0:3015b613b20d 62 }
rolo644u 0:3015b613b20d 63
rolo644u 0:3015b613b20d 64
rolo644u 0:3015b613b20d 65 // Rather than a bazillion writecommand() and writedata() calls, screen
rolo644u 0:3015b613b20d 66 // initialization commands and arguments are organized in these tables
rolo644u 0:3015b613b20d 67 // stored in PROGMEM. The table may look bulky, but that's mostly the
rolo644u 0:3015b613b20d 68 // formatting -- storage-wise this is hundreds of bytes more compact
rolo644u 0:3015b613b20d 69 // than the equivalent code. Companion function follows.
rolo644u 0:3015b613b20d 70 #define DELAY 0x80
rolo644u 0:3015b613b20d 71 static const uint8_t Bcmd[] = { // Initialization commands for 7735B screens
rolo644u 0:3015b613b20d 72 18, // 18 commands in list:
rolo644u 0:3015b613b20d 73 ST7735_SWRESET, DELAY, // 1: Software reset, no args, w/delay
rolo644u 0:3015b613b20d 74 50, // 50 ms delay
rolo644u 0:3015b613b20d 75 ST7735_SLPOUT , DELAY, // 2: Out of sleep mode, no args, w/delay
rolo644u 0:3015b613b20d 76 255, // 255 = 500 ms delay
rolo644u 0:3015b613b20d 77 ST7735_COLMOD , 1+DELAY, // 3: Set color mode, 1 arg + delay:
rolo644u 0:3015b613b20d 78 0x05, // 16-bit color
rolo644u 0:3015b613b20d 79 10, // 10 ms delay
rolo644u 0:3015b613b20d 80 ST7735_FRMCTR1, 3+DELAY, // 4: Frame rate control, 3 args + delay:
rolo644u 0:3015b613b20d 81 0x00, // fastest refresh
rolo644u 0:3015b613b20d 82 0x06, // 6 lines front porch
rolo644u 0:3015b613b20d 83 0x03, // 3 lines back porch
rolo644u 0:3015b613b20d 84 10, // 10 ms delay
rolo644u 0:3015b613b20d 85 ST7735_MADCTL , 1 , // 5: Memory access ctrl (directions), 1 arg:
rolo644u 0:3015b613b20d 86 0x08, // Row addr/col addr, bottom to top refresh
rolo644u 0:3015b613b20d 87 ST7735_DISSET5, 2 , // 6: Display settings #5, 2 args, no delay:
rolo644u 0:3015b613b20d 88 0x15, // 1 clk cycle nonoverlap, 2 cycle gate
rolo644u 0:3015b613b20d 89 // rise, 3 cycle osc equalize
rolo644u 0:3015b613b20d 90 0x02, // Fix on VTL
rolo644u 0:3015b613b20d 91 ST7735_INVCTR , 1 , // 7: Display inversion control, 1 arg:
rolo644u 0:3015b613b20d 92 0x0, // Line inversion
rolo644u 0:3015b613b20d 93 ST7735_PWCTR1 , 2+DELAY, // 8: Power control, 2 args + delay:
rolo644u 0:3015b613b20d 94 0x02, // GVDD = 4.7V
rolo644u 0:3015b613b20d 95 0x70, // 1.0uA
rolo644u 0:3015b613b20d 96 10, // 10 ms delay
rolo644u 0:3015b613b20d 97 ST7735_PWCTR2 , 1 , // 9: Power control, 1 arg, no delay:
rolo644u 0:3015b613b20d 98 0x05, // VGH = 14.7V, VGL = -7.35V
rolo644u 0:3015b613b20d 99 ST7735_PWCTR3 , 2 , // 10: Power control, 2 args, no delay:
rolo644u 0:3015b613b20d 100 0x01, // Opamp current small
rolo644u 0:3015b613b20d 101 0x02, // Boost frequency
rolo644u 0:3015b613b20d 102 ST7735_VMCTR1 , 2+DELAY, // 11: Power control, 2 args + delay:
rolo644u 0:3015b613b20d 103 0x3C, // VCOMH = 4V
rolo644u 0:3015b613b20d 104 0x38, // VCOML = -1.1V
rolo644u 0:3015b613b20d 105 10, // 10 ms delay
rolo644u 0:3015b613b20d 106 ST7735_PWCTR6 , 2 , // 12: Power control, 2 args, no delay:
rolo644u 0:3015b613b20d 107 0x11, 0x15,
rolo644u 0:3015b613b20d 108 ST7735_GMCTRP1,16 , // 13: Magical unicorn dust, 16 args, no delay:
rolo644u 0:3015b613b20d 109 0x09, 0x16, 0x09, 0x20, // (seriously though, not sure what
rolo644u 0:3015b613b20d 110 0x21, 0x1B, 0x13, 0x19, // these config values represent)
rolo644u 0:3015b613b20d 111 0x17, 0x15, 0x1E, 0x2B,
rolo644u 0:3015b613b20d 112 0x04, 0x05, 0x02, 0x0E,
rolo644u 0:3015b613b20d 113 ST7735_GMCTRN1,16+DELAY, // 14: Sparkles and rainbows, 16 args + delay:
rolo644u 0:3015b613b20d 114 0x0B, 0x14, 0x08, 0x1E, // (ditto)
rolo644u 0:3015b613b20d 115 0x22, 0x1D, 0x18, 0x1E,
rolo644u 0:3015b613b20d 116 0x1B, 0x1A, 0x24, 0x2B,
rolo644u 0:3015b613b20d 117 0x06, 0x06, 0x02, 0x0F,
rolo644u 0:3015b613b20d 118 10, // 10 ms delay
rolo644u 0:3015b613b20d 119 ST7735_CASET , 4 , // 15: Column addr set, 4 args, no delay:
rolo644u 0:3015b613b20d 120 0x00, 0x02, // XSTART = 2
rolo644u 0:3015b613b20d 121 0x00, 0x81, // XEND = 129
rolo644u 0:3015b613b20d 122 ST7735_RASET , 4 , // 16: Row addr set, 4 args, no delay:
rolo644u 0:3015b613b20d 123 0x00, 0x02, // XSTART = 1
rolo644u 0:3015b613b20d 124 0x00, 0x81, // XEND = 160
rolo644u 0:3015b613b20d 125 ST7735_NORON , DELAY, // 17: Normal display on, no args, w/delay
rolo644u 0:3015b613b20d 126 10, // 10 ms delay
rolo644u 0:3015b613b20d 127 ST7735_DISPON , DELAY, // 18: Main screen turn on, no args, w/delay
rolo644u 0:3015b613b20d 128 255 }, // 255 = 500 ms delay
rolo644u 0:3015b613b20d 129
rolo644u 0:3015b613b20d 130 Rcmd1[] = { // Init for 7735R, part 1 (red or green tab)
rolo644u 0:3015b613b20d 131 15, // 15 commands in list:
rolo644u 0:3015b613b20d 132 ST7735_SWRESET, DELAY, // 1: Software reset, 0 args, w/delay
rolo644u 0:3015b613b20d 133 150, // 150 ms delay
rolo644u 0:3015b613b20d 134 ST7735_SLPOUT , DELAY, // 2: Out of sleep mode, 0 args, w/delay
rolo644u 0:3015b613b20d 135 255, // 500 ms delay
rolo644u 0:3015b613b20d 136 ST7735_FRMCTR1, 3 , // 3: Frame rate ctrl - normal mode, 3 args:
rolo644u 0:3015b613b20d 137 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D)
rolo644u 0:3015b613b20d 138 ST7735_FRMCTR2, 3 , // 4: Frame rate control - idle mode, 3 args:
rolo644u 0:3015b613b20d 139 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D)
rolo644u 0:3015b613b20d 140 ST7735_FRMCTR3, 6 , // 5: Frame rate ctrl - partial mode, 6 args:
rolo644u 0:3015b613b20d 141 0x01, 0x2C, 0x2D, // Dot inversion mode
rolo644u 0:3015b613b20d 142 0x01, 0x2C, 0x2D, // Line inversion mode
rolo644u 0:3015b613b20d 143 ST7735_INVCTR , 1 , // 6: Display inversion ctrl, 1 arg, no delay:
rolo644u 0:3015b613b20d 144 0x07, // No inversion
rolo644u 0:3015b613b20d 145 ST7735_PWCTR1 , 3 , // 7: Power control, 3 args, no delay:
rolo644u 0:3015b613b20d 146 0xA2,
rolo644u 0:3015b613b20d 147 0x02, // -4.6V
rolo644u 0:3015b613b20d 148 0x84, // AUTO mode
rolo644u 0:3015b613b20d 149 ST7735_PWCTR2 , 1 , // 8: Power control, 1 arg, no delay:
rolo644u 0:3015b613b20d 150 0xC5, // VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD
rolo644u 0:3015b613b20d 151 ST7735_PWCTR3 , 2 , // 9: Power control, 2 args, no delay:
rolo644u 0:3015b613b20d 152 0x0A, // Opamp current small
rolo644u 0:3015b613b20d 153 0x00, // Boost frequency
rolo644u 0:3015b613b20d 154 ST7735_PWCTR4 , 2 , // 10: Power control, 2 args, no delay:
rolo644u 0:3015b613b20d 155 0x8A, // BCLK/2, Opamp current small & Medium low
rolo644u 0:3015b613b20d 156 0x2A,
rolo644u 0:3015b613b20d 157 ST7735_PWCTR5 , 2 , // 11: Power control, 2 args, no delay:
rolo644u 0:3015b613b20d 158 0x8A, 0xEE,
rolo644u 0:3015b613b20d 159 ST7735_VMCTR1 , 1 , // 12: Power control, 1 arg, no delay:
rolo644u 0:3015b613b20d 160 0x0E,
rolo644u 0:3015b613b20d 161 ST7735_INVOFF , 0 , // 13: Don't invert display, no args, no delay
rolo644u 0:3015b613b20d 162 ST7735_MADCTL , 1 , // 14: Memory access control (directions), 1 arg:
rolo644u 0:3015b613b20d 163 0xC8, // row addr/col addr, bottom to top refresh
rolo644u 0:3015b613b20d 164 ST7735_COLMOD , 1 , // 15: set color mode, 1 arg, no delay:
rolo644u 0:3015b613b20d 165 0x05 }, // 16-bit color
rolo644u 0:3015b613b20d 166
rolo644u 0:3015b613b20d 167 Rcmd2green[] = { // Init for 7735R, part 2 (green tab only)
rolo644u 0:3015b613b20d 168 2, // 2 commands in list:
rolo644u 0:3015b613b20d 169 ST7735_CASET , 4 , // 1: Column addr set, 4 args, no delay:
rolo644u 0:3015b613b20d 170 0x00, 0x02, // XSTART = 0
rolo644u 0:3015b613b20d 171 0x00, 0x7F+0x02, // XEND = 127
rolo644u 0:3015b613b20d 172 ST7735_RASET , 4 , // 2: Row addr set, 4 args, no delay:
rolo644u 0:3015b613b20d 173 0x00, 0x01, // XSTART = 0
rolo644u 0:3015b613b20d 174 0x00, 0x9F+0x01 }, // XEND = 159
rolo644u 0:3015b613b20d 175 Rcmd2red[] = { // Init for 7735R, part 2 (red tab only)
rolo644u 0:3015b613b20d 176 2, // 2 commands in list:
rolo644u 0:3015b613b20d 177 ST7735_CASET , 4 , // 1: Column addr set, 4 args, no delay:
rolo644u 0:3015b613b20d 178 0x00, 0x00, // XSTART = 0
rolo644u 0:3015b613b20d 179 0x00, 0x7F, // XEND = 127
rolo644u 0:3015b613b20d 180 ST7735_RASET , 4 , // 2: Row addr set, 4 args, no delay:
rolo644u 0:3015b613b20d 181 0x00, 0x00, // XSTART = 0
rolo644u 0:3015b613b20d 182 0x00, 0x9F }, // XEND = 159
rolo644u 0:3015b613b20d 183
rolo644u 0:3015b613b20d 184 Rcmd3[] = { // Init for 7735R, part 3 (red or green tab)
rolo644u 0:3015b613b20d 185 4, // 4 commands in list:
rolo644u 0:3015b613b20d 186 ST7735_GMCTRP1, 16 , // 1: Magical unicorn dust, 16 args, no delay:
rolo644u 0:3015b613b20d 187 0x02, 0x1c, 0x07, 0x12,
rolo644u 0:3015b613b20d 188 0x37, 0x32, 0x29, 0x2d,
rolo644u 0:3015b613b20d 189 0x29, 0x25, 0x2B, 0x39,
rolo644u 0:3015b613b20d 190 0x00, 0x01, 0x03, 0x10,
rolo644u 0:3015b613b20d 191 ST7735_GMCTRN1, 16 , // 2: Sparkles and rainbows, 16 args, no delay:
rolo644u 0:3015b613b20d 192 0x03, 0x1d, 0x07, 0x06,
rolo644u 0:3015b613b20d 193 0x2E, 0x2C, 0x29, 0x2D,
rolo644u 0:3015b613b20d 194 0x2E, 0x2E, 0x37, 0x3F,
rolo644u 0:3015b613b20d 195 0x00, 0x00, 0x02, 0x10,
rolo644u 0:3015b613b20d 196 ST7735_NORON , DELAY, // 3: Normal display on, no args, w/delay
rolo644u 0:3015b613b20d 197 10, // 10 ms delay
rolo644u 0:3015b613b20d 198 ST7735_DISPON , DELAY, // 4: Main screen turn on, no args w/delay
rolo644u 0:3015b613b20d 199 100 }; // 100 ms delay
rolo644u 0:3015b613b20d 200
rolo644u 0:3015b613b20d 201
rolo644u 0:3015b613b20d 202
rolo644u 0:3015b613b20d 203 // Companion code to the above tables. Reads and issues
rolo644u 0:3015b613b20d 204 // a series of LCD commands stored in PROGMEM byte array.
rolo644u 0:3015b613b20d 205 void ST7735::commandList(const uint8_t *addr){
rolo644u 0:3015b613b20d 206 uint8_t numCommands, numArgs;
rolo644u 0:3015b613b20d 207 uint16_t ms;
rolo644u 0:3015b613b20d 208
rolo644u 0:3015b613b20d 209 numCommands = pgm_read_byte(addr++); // Number of commands to follow
rolo644u 0:3015b613b20d 210 while(numCommands--) { // For each command...
rolo644u 0:3015b613b20d 211 writecommand(pgm_read_byte(addr++)); // Read, issue command
rolo644u 0:3015b613b20d 212 numArgs = pgm_read_byte(addr++); // Number of args to follow
rolo644u 0:3015b613b20d 213 ms = numArgs & DELAY; // If hibit set, delay follows args
rolo644u 0:3015b613b20d 214 numArgs &= ~DELAY; // Mask out delay bit
rolo644u 0:3015b613b20d 215 while(numArgs--) { // For each argument...
rolo644u 0:3015b613b20d 216 writedata(pgm_read_byte(addr++)); // Read, issue argument
rolo644u 0:3015b613b20d 217 }
rolo644u 0:3015b613b20d 218
rolo644u 0:3015b613b20d 219 if(ms) {
rolo644u 0:3015b613b20d 220 ms = pgm_read_byte(addr++); // Read post-command delay time (ms)
rolo644u 0:3015b613b20d 221 if(ms == 255) ms = 500; // If 255, delay for 500 ms
rolo644u 0:3015b613b20d 222 wait_ms(ms);
rolo644u 0:3015b613b20d 223 }
rolo644u 0:3015b613b20d 224 }
rolo644u 0:3015b613b20d 225 }
rolo644u 0:3015b613b20d 226
rolo644u 0:3015b613b20d 227 // Initialization code common to both 'B' and 'R' type displays
rolo644u 0:3015b613b20d 228 void ST7735::commonInit(const uint8_t *cmdList){
rolo644u 0:3015b613b20d 229 wait_ms(50); // Wait for reset to be stable after power-up
rolo644u 0:3015b613b20d 230 colstart = rowstart = 0; // May be overridden in init func
rolo644u 0:3015b613b20d 231 if(cmdList) commandList(cmdList);
rolo644u 0:3015b613b20d 232 }
rolo644u 0:3015b613b20d 233
rolo644u 0:3015b613b20d 234 // Initialization for ST7735B screens
rolo644u 0:3015b613b20d 235 void ST7735::initB() {
rolo644u 0:3015b613b20d 236 commonInit(Bcmd);
rolo644u 0:3015b613b20d 237 }
rolo644u 0:3015b613b20d 238
rolo644u 0:3015b613b20d 239 // Initialization for ST7735R screens (green or red tabs)
rolo644u 0:3015b613b20d 240 void ST7735::initR(uint8_t options) {
rolo644u 0:3015b613b20d 241 commonInit(Rcmd1);
rolo644u 0:3015b613b20d 242 if(options == INITR_GREENTAB) {
rolo644u 0:3015b613b20d 243 commandList(Rcmd2green);
rolo644u 0:3015b613b20d 244 colstart = 2;
rolo644u 0:3015b613b20d 245 rowstart = 1;
rolo644u 0:3015b613b20d 246 } else {
rolo644u 0:3015b613b20d 247 // colstart, rowstart left at default '0' values
rolo644u 0:3015b613b20d 248 commandList(Rcmd2red);
rolo644u 0:3015b613b20d 249 }
rolo644u 0:3015b613b20d 250 commandList(Rcmd3);
rolo644u 0:3015b613b20d 251
rolo644u 0:3015b613b20d 252 // if black, change MADCTL color filter
rolo644u 0:3015b613b20d 253 if (options == INITR_BLACKTAB) {
rolo644u 0:3015b613b20d 254 writecommand(ST7735_MADCTL);
rolo644u 0:3015b613b20d 255 writedata(0xC0);
rolo644u 0:3015b613b20d 256 }
rolo644u 0:3015b613b20d 257
rolo644u 0:3015b613b20d 258 tabcolor = options;
rolo644u 0:3015b613b20d 259 }
rolo644u 0:3015b613b20d 260
rolo644u 0:3015b613b20d 261 void ST7735::setRotation(uint8_t m) {
rolo644u 0:3015b613b20d 262
rolo644u 0:3015b613b20d 263 writecommand(ST7735_MADCTL);
rolo644u 0:3015b613b20d 264 rotation = m % 4; // can't be higher than 3
rolo644u 0:3015b613b20d 265 switch (rotation) {
rolo644u 0:3015b613b20d 266 case 0:
rolo644u 0:3015b613b20d 267 if (tabcolor == INITR_BLACKTAB) {
rolo644u 0:3015b613b20d 268 writedata(MADCTL_MX | MADCTL_MY | MADCTL_RGB);
rolo644u 0:3015b613b20d 269 } else {
rolo644u 0:3015b613b20d 270 writedata(MADCTL_MX | MADCTL_MY | MADCTL_BGR);
rolo644u 0:3015b613b20d 271 }
rolo644u 0:3015b613b20d 272 _width = ST7735_TFTWIDTH;
rolo644u 0:3015b613b20d 273 _height = ST7735_TFTHEIGHT;
rolo644u 0:3015b613b20d 274 break;
rolo644u 0:3015b613b20d 275 case 1:
rolo644u 0:3015b613b20d 276 if (tabcolor == INITR_BLACKTAB) {
rolo644u 0:3015b613b20d 277 writedata(MADCTL_MY | MADCTL_MV | MADCTL_RGB);
rolo644u 0:3015b613b20d 278 } else {
rolo644u 0:3015b613b20d 279 writedata(MADCTL_MY | MADCTL_MV | MADCTL_BGR);
rolo644u 0:3015b613b20d 280 }
rolo644u 0:3015b613b20d 281 _width = ST7735_TFTHEIGHT;
rolo644u 0:3015b613b20d 282 _height = ST7735_TFTWIDTH;
rolo644u 0:3015b613b20d 283 break;
rolo644u 0:3015b613b20d 284 case 2:
rolo644u 0:3015b613b20d 285 if (tabcolor == INITR_BLACKTAB) {
rolo644u 0:3015b613b20d 286 writedata(MADCTL_RGB);
rolo644u 0:3015b613b20d 287 } else {
rolo644u 0:3015b613b20d 288 writedata(MADCTL_BGR);
rolo644u 0:3015b613b20d 289 }
rolo644u 0:3015b613b20d 290 _width = ST7735_TFTWIDTH;
rolo644u 0:3015b613b20d 291 _height = ST7735_TFTHEIGHT;
rolo644u 0:3015b613b20d 292 break;
rolo644u 0:3015b613b20d 293 case 3:
rolo644u 0:3015b613b20d 294 if (tabcolor == INITR_BLACKTAB) {
rolo644u 0:3015b613b20d 295 writedata(MADCTL_MX | MADCTL_MV | MADCTL_RGB);
rolo644u 0:3015b613b20d 296 } else {
rolo644u 0:3015b613b20d 297 writedata(MADCTL_MX | MADCTL_MV | MADCTL_BGR);
rolo644u 0:3015b613b20d 298 }
rolo644u 0:3015b613b20d 299 _width = ST7735_TFTHEIGHT;
rolo644u 0:3015b613b20d 300 _height = ST7735_TFTWIDTH;
rolo644u 0:3015b613b20d 301 break;
rolo644u 0:3015b613b20d 302 }
rolo644u 0:3015b613b20d 303 }
rolo644u 0:3015b613b20d 304
rolo644u 0:3015b613b20d 305 void ST7735::fillScreen(uint16_t color) {
rolo644u 0:3015b613b20d 306 fillRect(0, 0, _width, _height, color);
rolo644u 0:3015b613b20d 307 }
rolo644u 0:3015b613b20d 308
rolo644u 0:3015b613b20d 309
rolo644u 0:3015b613b20d 310
rolo644u 0:3015b613b20d 311 void ST7735::pushColor(uint16_t color) {
rolo644u 0:3015b613b20d 312 dc->write(1);
rolo644u 0:3015b613b20d 313 ce->write(0);
rolo644u 0:3015b613b20d 314 spi->write(color >> 8);
rolo644u 0:3015b613b20d 315 spi->write(color);
rolo644u 0:3015b613b20d 316 ce->write(1);
rolo644u 0:3015b613b20d 317 }
rolo644u 0:3015b613b20d 318
rolo644u 0:3015b613b20d 319 // fill a rectangle
rolo644u 0:3015b613b20d 320 void ST7735::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) {
rolo644u 0:3015b613b20d 321
rolo644u 0:3015b613b20d 322 // rudimentary clipping (drawChar w/big text requires this)
rolo644u 0:3015b613b20d 323 if((x >= _width) || (y >= _height)) return;
rolo644u 0:3015b613b20d 324 if((x + w - 1) >= _width) w = _width - x;
rolo644u 0:3015b613b20d 325 if((y + h - 1) >= _height) h = _height - y;
rolo644u 0:3015b613b20d 326
rolo644u 0:3015b613b20d 327 setAddrWindow(x, y, x+w-1, y+h-1);
rolo644u 0:3015b613b20d 328
rolo644u 0:3015b613b20d 329 uint8_t hi = color >> 8, lo = color;
rolo644u 0:3015b613b20d 330
rolo644u 0:3015b613b20d 331 dc->write(1);
rolo644u 0:3015b613b20d 332 ce->write(0);
rolo644u 0:3015b613b20d 333
rolo644u 0:3015b613b20d 334 for(y=h; y>0; y--) {
rolo644u 0:3015b613b20d 335 for(x=w; x>0; x--) {
rolo644u 0:3015b613b20d 336 spi->write(hi);
rolo644u 0:3015b613b20d 337 spi->write(lo);
rolo644u 0:3015b613b20d 338 }
rolo644u 0:3015b613b20d 339 }
rolo644u 0:3015b613b20d 340 ce->write(1);
rolo644u 0:3015b613b20d 341 }
rolo644u 0:3015b613b20d 342
rolo644u 0:3015b613b20d 343
rolo644u 0:3015b613b20d 344
rolo644u 0:3015b613b20d 345 void ST7735::invertDisplay(bool i) {
rolo644u 0:3015b613b20d 346 writecommand(i ? ST7735_INVON : ST7735_INVOFF);
rolo644u 0:3015b613b20d 347 }
rolo644u 0:3015b613b20d 348
rolo644u 0:3015b613b20d 349 void ST7735::drawPixel(int16_t x, int16_t y, uint16_t color) {
rolo644u 0:3015b613b20d 350
rolo644u 0:3015b613b20d 351 if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
rolo644u 0:3015b613b20d 352
rolo644u 0:3015b613b20d 353 setAddrWindow(x,y,x+1,y+1);
rolo644u 0:3015b613b20d 354 dc->write(1);
rolo644u 0:3015b613b20d 355 ce->write(0);
rolo644u 0:3015b613b20d 356 spi->write(color >> 8);
rolo644u 0:3015b613b20d 357 spi->write(color);
rolo644u 0:3015b613b20d 358 ce->write(1);
rolo644u 0:3015b613b20d 359 }
rolo644u 0:3015b613b20d 360
rolo644u 0:3015b613b20d 361 void ST7735::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
rolo644u 0:3015b613b20d 362
rolo644u 0:3015b613b20d 363 // Rudimentary clipping
rolo644u 0:3015b613b20d 364 if((x >= _width) || (y >= _height)) return;
rolo644u 0:3015b613b20d 365 if((y+h-1) >= _height) h = _height-y;
rolo644u 0:3015b613b20d 366 setAddrWindow(x, y, x, y+h-1);
rolo644u 0:3015b613b20d 367
rolo644u 0:3015b613b20d 368 uint8_t hi = color >> 8, lo = color;
rolo644u 0:3015b613b20d 369
rolo644u 0:3015b613b20d 370 dc->write(1);
rolo644u 0:3015b613b20d 371 ce->write(0);
rolo644u 0:3015b613b20d 372 while (h--) {
rolo644u 0:3015b613b20d 373 spi->write(hi);
rolo644u 0:3015b613b20d 374 spi->write(lo);
rolo644u 0:3015b613b20d 375 }
rolo644u 0:3015b613b20d 376 ce->write(1);
rolo644u 0:3015b613b20d 377 }
rolo644u 0:3015b613b20d 378
rolo644u 0:3015b613b20d 379 void ST7735::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
rolo644u 0:3015b613b20d 380
rolo644u 0:3015b613b20d 381 // Rudimentary clipping
rolo644u 0:3015b613b20d 382 if((x >= _width) || (y >= _height)) return;
rolo644u 0:3015b613b20d 383 if((x+w-1) >= _width) w = _width-x;
rolo644u 0:3015b613b20d 384 setAddrWindow(x, y, x+w-1, y);
rolo644u 0:3015b613b20d 385 uint8_t hi = color >> 8, lo = color;
rolo644u 0:3015b613b20d 386
rolo644u 0:3015b613b20d 387 dc->write(1);;
rolo644u 0:3015b613b20d 388 ce->write(0);;
rolo644u 0:3015b613b20d 389
rolo644u 0:3015b613b20d 390 while (w--) {
rolo644u 0:3015b613b20d 391 spi->write(hi);
rolo644u 0:3015b613b20d 392 spi->write(lo);
rolo644u 0:3015b613b20d 393 }
rolo644u 0:3015b613b20d 394
rolo644u 0:3015b613b20d 395 ce->write(1);
rolo644u 0:3015b613b20d 396 }
rolo644u 0:3015b613b20d 397
rolo644u 0:3015b613b20d 398 // Pass 8-bit (each) R,G,B, get back 16-bit packed color
rolo644u 0:3015b613b20d 399 uint16_t ST7735::Color565(uint8_t r, uint8_t g, uint8_t b) {
rolo644u 0:3015b613b20d 400 return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
rolo644u 0:3015b613b20d 401 }
rolo644u 0:3015b613b20d 402
rolo644u 0:3015b613b20d 403 // Bresenham's algorithm - thx wikpedia
rolo644u 0:3015b613b20d 404 void ST7735::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color) {
rolo644u 0:3015b613b20d 405 int16_t steep = abs(y1 - y0) > abs(x1 - x0);
rolo644u 0:3015b613b20d 406 if (steep) {
rolo644u 0:3015b613b20d 407 swap(x0, y0);
rolo644u 0:3015b613b20d 408 swap(x1, y1);
rolo644u 0:3015b613b20d 409 }
rolo644u 0:3015b613b20d 410
rolo644u 0:3015b613b20d 411 if (x0 > x1) {
rolo644u 0:3015b613b20d 412 swap(x0, x1);
rolo644u 0:3015b613b20d 413 swap(y0, y1);
rolo644u 0:3015b613b20d 414 }
rolo644u 0:3015b613b20d 415
rolo644u 0:3015b613b20d 416 int16_t dx, dy;
rolo644u 0:3015b613b20d 417 dx = x1 - x0;
rolo644u 0:3015b613b20d 418 dy = abs(y1 - y0);
rolo644u 0:3015b613b20d 419
rolo644u 0:3015b613b20d 420 int16_t err = dx / 2;
rolo644u 0:3015b613b20d 421 int16_t ystep;
rolo644u 0:3015b613b20d 422
rolo644u 0:3015b613b20d 423 if (y0 < y1) {
rolo644u 0:3015b613b20d 424 ystep = 1;
rolo644u 0:3015b613b20d 425 } else {
rolo644u 0:3015b613b20d 426 ystep = -1;
rolo644u 0:3015b613b20d 427 }
rolo644u 0:3015b613b20d 428
rolo644u 0:3015b613b20d 429 for (; x0<=x1; x0++) {
rolo644u 0:3015b613b20d 430 if (steep) {
rolo644u 0:3015b613b20d 431 drawPixel(y0, x0, color);
rolo644u 0:3015b613b20d 432 } else {
rolo644u 0:3015b613b20d 433 drawPixel(x0, y0, color);
rolo644u 0:3015b613b20d 434 }
rolo644u 0:3015b613b20d 435 err -= dy;
rolo644u 0:3015b613b20d 436 if (err < 0) {
rolo644u 0:3015b613b20d 437 y0 += ystep;
rolo644u 0:3015b613b20d 438 err += dx;
rolo644u 0:3015b613b20d 439 }
rolo644u 0:3015b613b20d 440 }
rolo644u 0:3015b613b20d 441 }
rolo644u 0:3015b613b20d 442
rolo644u 0:3015b613b20d 443 // Draw a rectangle
rolo644u 0:3015b613b20d 444 void ST7735::drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) {
rolo644u 0:3015b613b20d 445 drawFastHLine(x, y, w, color);
rolo644u 0:3015b613b20d 446 drawFastHLine(x, y+h-1, w, color);
rolo644u 0:3015b613b20d 447 drawFastVLine(x, y, h, color);
rolo644u 0:3015b613b20d 448 drawFastVLine(x+w-1, y, h, color);
rolo644u 0:3015b613b20d 449 }
rolo644u 0:3015b613b20d 450
rolo644u 0:3015b613b20d 451 // Draw a circle outline
rolo644u 0:3015b613b20d 452 void ST7735::drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) {
rolo644u 0:3015b613b20d 453 int16_t f = 1 - r;
rolo644u 0:3015b613b20d 454 int16_t ddF_x = 1;
rolo644u 0:3015b613b20d 455 int16_t ddF_y = -2 * r;
rolo644u 0:3015b613b20d 456 int16_t x = 0;
rolo644u 0:3015b613b20d 457 int16_t y = r;
rolo644u 0:3015b613b20d 458
rolo644u 0:3015b613b20d 459 drawPixel(x0 , y0+r, color);
rolo644u 0:3015b613b20d 460 drawPixel(x0 , y0-r, color);
rolo644u 0:3015b613b20d 461 drawPixel(x0+r, y0 , color);
rolo644u 0:3015b613b20d 462 drawPixel(x0-r, y0 , color);
rolo644u 0:3015b613b20d 463
rolo644u 0:3015b613b20d 464 while (x<y) {
rolo644u 0:3015b613b20d 465 if (f >= 0) {
rolo644u 0:3015b613b20d 466 y--;
rolo644u 0:3015b613b20d 467 ddF_y += 2;
rolo644u 0:3015b613b20d 468 f += ddF_y;
rolo644u 0:3015b613b20d 469 }
rolo644u 0:3015b613b20d 470 x++;
rolo644u 0:3015b613b20d 471 ddF_x += 2;
rolo644u 0:3015b613b20d 472 f += ddF_x;
rolo644u 0:3015b613b20d 473
rolo644u 0:3015b613b20d 474 drawPixel(x0 + x, y0 + y, color);
rolo644u 0:3015b613b20d 475 drawPixel(x0 - x, y0 + y, color);
rolo644u 0:3015b613b20d 476 drawPixel(x0 + x, y0 - y, color);
rolo644u 0:3015b613b20d 477 drawPixel(x0 - x, y0 - y, color);
rolo644u 0:3015b613b20d 478 drawPixel(x0 + y, y0 + x, color);
rolo644u 0:3015b613b20d 479 drawPixel(x0 - y, y0 + x, color);
rolo644u 0:3015b613b20d 480 drawPixel(x0 + y, y0 - x, color);
rolo644u 0:3015b613b20d 481 drawPixel(x0 - y, y0 - x, color);
rolo644u 0:3015b613b20d 482 }
rolo644u 0:3015b613b20d 483 }
rolo644u 0:3015b613b20d 484
rolo644u 0:3015b613b20d 485 void ST7735::drawCircleHelper( int16_t x0, int16_t y0, int16_t r, uint8_t cornername, uint16_t color) {
rolo644u 0:3015b613b20d 486 int16_t f = 1 - r;
rolo644u 0:3015b613b20d 487 int16_t ddF_x = 1;
rolo644u 0:3015b613b20d 488 int16_t ddF_y = -2 * r;
rolo644u 0:3015b613b20d 489 int16_t x = 0;
rolo644u 0:3015b613b20d 490 int16_t y = r;
rolo644u 0:3015b613b20d 491
rolo644u 0:3015b613b20d 492 while (x<y) {
rolo644u 0:3015b613b20d 493 if (f >= 0) {
rolo644u 0:3015b613b20d 494 y--;
rolo644u 0:3015b613b20d 495 ddF_y += 2;
rolo644u 0:3015b613b20d 496 f += ddF_y;
rolo644u 0:3015b613b20d 497 }
rolo644u 0:3015b613b20d 498 x++;
rolo644u 0:3015b613b20d 499 ddF_x += 2;
rolo644u 0:3015b613b20d 500 f += ddF_x;
rolo644u 0:3015b613b20d 501 if (cornername & 0x4) {
rolo644u 0:3015b613b20d 502 drawPixel(x0 + x, y0 + y, color);
rolo644u 0:3015b613b20d 503 drawPixel(x0 + y, y0 + x, color);
rolo644u 0:3015b613b20d 504 }
rolo644u 0:3015b613b20d 505 if (cornername & 0x2) {
rolo644u 0:3015b613b20d 506 drawPixel(x0 + x, y0 - y, color);
rolo644u 0:3015b613b20d 507 drawPixel(x0 + y, y0 - x, color);
rolo644u 0:3015b613b20d 508 }
rolo644u 0:3015b613b20d 509 if (cornername & 0x8) {
rolo644u 0:3015b613b20d 510 drawPixel(x0 - y, y0 + x, color);
rolo644u 0:3015b613b20d 511 drawPixel(x0 - x, y0 + y, color);
rolo644u 0:3015b613b20d 512 }
rolo644u 0:3015b613b20d 513 if (cornername & 0x1) {
rolo644u 0:3015b613b20d 514 drawPixel(x0 - y, y0 - x, color);
rolo644u 0:3015b613b20d 515 drawPixel(x0 - x, y0 - y, color);
rolo644u 0:3015b613b20d 516 }
rolo644u 0:3015b613b20d 517 }
rolo644u 0:3015b613b20d 518 }
rolo644u 0:3015b613b20d 519
rolo644u 0:3015b613b20d 520 void ST7735::fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) {
rolo644u 0:3015b613b20d 521 drawFastVLine(x0, y0-r, 2*r+1, color);
rolo644u 0:3015b613b20d 522 fillCircleHelper(x0, y0, r, 3, 0, color);
rolo644u 0:3015b613b20d 523 }
rolo644u 0:3015b613b20d 524
rolo644u 0:3015b613b20d 525 // Used to do circles and roundrects
rolo644u 0:3015b613b20d 526 void ST7735::fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, int16_t delta, uint16_t color) {
rolo644u 0:3015b613b20d 527
rolo644u 0:3015b613b20d 528 int16_t f = 1 - r;
rolo644u 0:3015b613b20d 529 int16_t ddF_x = 1;
rolo644u 0:3015b613b20d 530 int16_t ddF_y = -2 * r;
rolo644u 0:3015b613b20d 531 int16_t x = 0;
rolo644u 0:3015b613b20d 532 int16_t y = r;
rolo644u 0:3015b613b20d 533
rolo644u 0:3015b613b20d 534 while (x<y) {
rolo644u 0:3015b613b20d 535 if (f >= 0) {
rolo644u 0:3015b613b20d 536 y--;
rolo644u 0:3015b613b20d 537 ddF_y += 2;
rolo644u 0:3015b613b20d 538 f += ddF_y;
rolo644u 0:3015b613b20d 539 }
rolo644u 0:3015b613b20d 540 x++;
rolo644u 0:3015b613b20d 541 ddF_x += 2;
rolo644u 0:3015b613b20d 542 f += ddF_x;
rolo644u 0:3015b613b20d 543
rolo644u 0:3015b613b20d 544 if (cornername & 0x1) {
rolo644u 0:3015b613b20d 545 drawFastVLine(x0+x, y0-y, 2*y+1+delta, color);
rolo644u 0:3015b613b20d 546 drawFastVLine(x0+y, y0-x, 2*x+1+delta, color);
rolo644u 0:3015b613b20d 547 }
rolo644u 0:3015b613b20d 548 if (cornername & 0x2) {
rolo644u 0:3015b613b20d 549 drawFastVLine(x0-x, y0-y, 2*y+1+delta, color);
rolo644u 0:3015b613b20d 550 drawFastVLine(x0-y, y0-x, 2*x+1+delta, color);
rolo644u 0:3015b613b20d 551 }
rolo644u 0:3015b613b20d 552 }
rolo644u 0:3015b613b20d 553 }
rolo644u 0:3015b613b20d 554
rolo644u 0:3015b613b20d 555
rolo644u 0:3015b613b20d 556 // Draw a triangle
rolo644u 0:3015b613b20d 557 void ST7735::drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) {
rolo644u 0:3015b613b20d 558 drawLine(x0, y0, x1, y1, color);
rolo644u 0:3015b613b20d 559 drawLine(x1, y1, x2, y2, color);
rolo644u 0:3015b613b20d 560 drawLine(x2, y2, x0, y0, color);
rolo644u 0:3015b613b20d 561 }
rolo644u 0:3015b613b20d 562
rolo644u 0:3015b613b20d 563 // Fill a triangle
rolo644u 0:3015b613b20d 564 void ST7735::fillTriangle ( int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) {
rolo644u 0:3015b613b20d 565
rolo644u 0:3015b613b20d 566 int16_t a, b, y, last;
rolo644u 0:3015b613b20d 567
rolo644u 0:3015b613b20d 568 // Sort coordinates by Y order (y2 >= y1 >= y0)
rolo644u 0:3015b613b20d 569 if (y0 > y1) {
rolo644u 0:3015b613b20d 570 swap(y0, y1); swap(x0, x1);
rolo644u 0:3015b613b20d 571 }
rolo644u 0:3015b613b20d 572 if (y1 > y2) {
rolo644u 0:3015b613b20d 573 swap(y2, y1); swap(x2, x1);
rolo644u 0:3015b613b20d 574 }
rolo644u 0:3015b613b20d 575 if (y0 > y1) {
rolo644u 0:3015b613b20d 576 swap(y0, y1); swap(x0, x1);
rolo644u 0:3015b613b20d 577 }
rolo644u 0:3015b613b20d 578
rolo644u 0:3015b613b20d 579 if(y0 == y2) { // Handle awkward all-on-same-line case as its own thing
rolo644u 0:3015b613b20d 580 a = b = x0;
rolo644u 0:3015b613b20d 581 if(x1 < a) a = x1;
rolo644u 0:3015b613b20d 582 else if(x1 > b) b = x1;
rolo644u 0:3015b613b20d 583 if(x2 < a) a = x2;
rolo644u 0:3015b613b20d 584 else if(x2 > b) b = x2;
rolo644u 0:3015b613b20d 585 drawFastHLine(a, y0, b-a+1, color);
rolo644u 0:3015b613b20d 586 return;
rolo644u 0:3015b613b20d 587 }
rolo644u 0:3015b613b20d 588
rolo644u 0:3015b613b20d 589 int16_t
rolo644u 0:3015b613b20d 590 dx01 = x1 - x0,
rolo644u 0:3015b613b20d 591 dy01 = y1 - y0,
rolo644u 0:3015b613b20d 592 dx02 = x2 - x0,
rolo644u 0:3015b613b20d 593 dy02 = y2 - y0,
rolo644u 0:3015b613b20d 594 dx12 = x2 - x1,
rolo644u 0:3015b613b20d 595 dy12 = y2 - y1,
rolo644u 0:3015b613b20d 596 sa = 0,
rolo644u 0:3015b613b20d 597 sb = 0;
rolo644u 0:3015b613b20d 598
rolo644u 0:3015b613b20d 599 // For upper part of triangle, find scanline crossings for segments
rolo644u 0:3015b613b20d 600 // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1
rolo644u 0:3015b613b20d 601 // is included here (and second loop will be skipped, avoiding a /0
rolo644u 0:3015b613b20d 602 // error there), otherwise scanline y1 is skipped here and handled
rolo644u 0:3015b613b20d 603 // in the second loop...which also avoids a /0 error here if y0=y1
rolo644u 0:3015b613b20d 604 // (flat-topped triangle).
rolo644u 0:3015b613b20d 605 if(y1 == y2) last = y1; // Include y1 scanline
rolo644u 0:3015b613b20d 606 else last = y1-1; // Skip it
rolo644u 0:3015b613b20d 607
rolo644u 0:3015b613b20d 608 for(y=y0; y<=last; y++) {
rolo644u 0:3015b613b20d 609 a = x0 + sa / dy01;
rolo644u 0:3015b613b20d 610 b = x0 + sb / dy02;
rolo644u 0:3015b613b20d 611 sa += dx01;
rolo644u 0:3015b613b20d 612 sb += dx02;
rolo644u 0:3015b613b20d 613 /* longhand:
rolo644u 0:3015b613b20d 614 a = x0 + (x1 - x0) * (y - y0) / (y1 - y0);
rolo644u 0:3015b613b20d 615 b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
rolo644u 0:3015b613b20d 616 */
rolo644u 0:3015b613b20d 617 if(a > b) swap(a,b);
rolo644u 0:3015b613b20d 618 drawFastHLine(a, y, b-a+1, color);
rolo644u 0:3015b613b20d 619 }
rolo644u 0:3015b613b20d 620
rolo644u 0:3015b613b20d 621 // For lower part of triangle, find scanline crossings for segments
rolo644u 0:3015b613b20d 622 // 0-2 and 1-2. This loop is skipped if y1=y2.
rolo644u 0:3015b613b20d 623 sa = dx12 * (y - y1);
rolo644u 0:3015b613b20d 624 sb = dx02 * (y - y0);
rolo644u 0:3015b613b20d 625 for(; y<=y2; y++) {
rolo644u 0:3015b613b20d 626 a = x1 + sa / dy12;
rolo644u 0:3015b613b20d 627 b = x0 + sb / dy02;
rolo644u 0:3015b613b20d 628 sa += dx12;
rolo644u 0:3015b613b20d 629 sb += dx02;
rolo644u 0:3015b613b20d 630 /* longhand:
rolo644u 0:3015b613b20d 631 a = x1 + (x2 - x1) * (y - y1) / (y2 - y1);
rolo644u 0:3015b613b20d 632 b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
rolo644u 0:3015b613b20d 633 */
rolo644u 0:3015b613b20d 634 if(a > b) swap(a,b);
rolo644u 0:3015b613b20d 635 drawFastHLine(a, y, b-a+1, color);
rolo644u 0:3015b613b20d 636 }
rolo644u 0:3015b613b20d 637 }
rolo644u 0:3015b613b20d 638
rolo644u 0:3015b613b20d 639 // Draw a rounded rectangle
rolo644u 0:3015b613b20d 640 void ST7735::drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color) {
rolo644u 0:3015b613b20d 641 // smarter version
rolo644u 0:3015b613b20d 642 drawFastHLine(x+r , y , w-2*r, color); // Top
rolo644u 0:3015b613b20d 643 drawFastHLine(x+r , y+h-1, w-2*r, color); // Bottom
rolo644u 0:3015b613b20d 644 drawFastVLine(x , y+r , h-2*r, color); // Left
rolo644u 0:3015b613b20d 645 drawFastVLine(x+w-1, y+r , h-2*r, color); // Right
rolo644u 0:3015b613b20d 646 // draw four corners
rolo644u 0:3015b613b20d 647 drawCircleHelper(x+r , y+r , r, 1, color);
rolo644u 0:3015b613b20d 648 drawCircleHelper(x+w-r-1, y+r , r, 2, color);
rolo644u 0:3015b613b20d 649 drawCircleHelper(x+w-r-1, y+h-r-1, r, 4, color);
rolo644u 0:3015b613b20d 650 drawCircleHelper(x+r , y+h-r-1, r, 8, color);
rolo644u 0:3015b613b20d 651 }
rolo644u 0:3015b613b20d 652
rolo644u 0:3015b613b20d 653 // Fill a rounded rectangle
rolo644u 0:3015b613b20d 654 void ST7735::fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color) {
rolo644u 0:3015b613b20d 655 // smarter version
rolo644u 0:3015b613b20d 656 fillRect(x+r, y, w-2*r, h, color);
rolo644u 0:3015b613b20d 657
rolo644u 0:3015b613b20d 658 // draw four corners
rolo644u 0:3015b613b20d 659 fillCircleHelper(x+w-r-1, y+r, r, 1, h-2*r-1, color);
rolo644u 0:3015b613b20d 660 fillCircleHelper(x+r , y+r, r, 2, h-2*r-1, color);
rolo644u 0:3015b613b20d 661 }
rolo644u 0:3015b613b20d 662
rolo644u 0:3015b613b20d 663 void ST7735::setCursor(int16_t x, int16_t y) {
rolo644u 0:3015b613b20d 664 cursor_x = x;
rolo644u 0:3015b613b20d 665 cursor_y = y;
rolo644u 0:3015b613b20d 666 }
rolo644u 0:3015b613b20d 667
rolo644u 0:3015b613b20d 668 void ST7735::setTextSize(uint8_t s) {
rolo644u 0:3015b613b20d 669 textsize = (s > 0) ? s : 1;
rolo644u 0:3015b613b20d 670 }
rolo644u 0:3015b613b20d 671
rolo644u 0:3015b613b20d 672
rolo644u 0:3015b613b20d 673 void ST7735::setTextColor(uint16_t c) {
rolo644u 0:3015b613b20d 674 // For 'transparent' background, we'll set the bg
rolo644u 0:3015b613b20d 675 // to the same as fg instead of using a flag
rolo644u 0:3015b613b20d 676 textcolor = textbgcolor = c;
rolo644u 0:3015b613b20d 677 }
rolo644u 0:3015b613b20d 678
rolo644u 0:3015b613b20d 679 void ST7735::setTextColor(uint16_t c, uint16_t b) {
rolo644u 0:3015b613b20d 680 textcolor = c;
rolo644u 0:3015b613b20d 681 textbgcolor = b;
rolo644u 0:3015b613b20d 682 }
rolo644u 0:3015b613b20d 683
rolo644u 0:3015b613b20d 684 void ST7735::setTextWrap(bool w) {
rolo644u 0:3015b613b20d 685 wrap = w;
rolo644u 0:3015b613b20d 686 }
rolo644u 0:3015b613b20d 687
rolo644u 0:3015b613b20d 688 uint8_t ST7735::getRotation(void) {
rolo644u 0:3015b613b20d 689 return rotation;
rolo644u 0:3015b613b20d 690 }
rolo644u 0:3015b613b20d 691
rolo644u 0:3015b613b20d 692 void ST7735::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color) {
rolo644u 0:3015b613b20d 693
rolo644u 0:3015b613b20d 694 int16_t i, j, byteWidth = (w + 7) / 8;
rolo644u 0:3015b613b20d 695
rolo644u 0:3015b613b20d 696 for(j=0; j<h; j++) {
rolo644u 0:3015b613b20d 697 for(i=0; i<w; i++ ) {
rolo644u 0:3015b613b20d 698 if(pgm_read_byte(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7))) {
rolo644u 0:3015b613b20d 699 drawPixel(x+i, y+j, color);
rolo644u 0:3015b613b20d 700 }
rolo644u 0:3015b613b20d 701 }
rolo644u 0:3015b613b20d 702 }
rolo644u 0:3015b613b20d 703 }
rolo644u 0:3015b613b20d 704
rolo644u 0:3015b613b20d 705
rolo644u 0:3015b613b20d 706 /***************************************************************************************
rolo644u 0:3015b613b20d 707 ** Function name: drawUnicode
rolo644u 0:3015b613b20d 708 ** Descriptions: draw a unicode
rolo644u 0:3015b613b20d 709 ***************************************************************************************/
rolo644u 0:3015b613b20d 710 int ST7735::drawUnicode(unsigned int uniCode, int x, int y, int font)
rolo644u 0:3015b613b20d 711 {
rolo644u 0:3015b613b20d 712
rolo644u 0:3015b613b20d 713 if (font) uniCode -= 32;
rolo644u 0:3015b613b20d 714
rolo644u 0:3015b613b20d 715 unsigned int width = 0;
rolo644u 0:3015b613b20d 716 unsigned int height = 0;
rolo644u 0:3015b613b20d 717 unsigned int flash_address = 0;
rolo644u 0:3015b613b20d 718 int8_t gap = 0;
rolo644u 0:3015b613b20d 719
rolo644u 0:3015b613b20d 720 // if (size == 1) {
rolo644u 0:3015b613b20d 721 // flash_address = pgm_read_word(&chrtbl_f8[uniCode]);
rolo644u 0:3015b613b20d 722 // width = pgm_read_byte(widtbl_f8+uniCode);
rolo644u 0:3015b613b20d 723 // height = chr_hgt_f8;
rolo644u 0:3015b613b20d 724 // gap = 1;
rolo644u 0:3015b613b20d 725 // }
rolo644u 0:3015b613b20d 726 #ifdef LOAD_FONT2
rolo644u 0:3015b613b20d 727 if (font == 2) {
rolo644u 0:3015b613b20d 728 flash_address = pgm_read_word(&chrtbl_f16[uniCode]);
rolo644u 0:3015b613b20d 729 width = pgm_read_byte(widtbl_f16+uniCode);
rolo644u 0:3015b613b20d 730 height = chr_hgt_f16;
rolo644u 0:3015b613b20d 731 gap = 1;
rolo644u 0:3015b613b20d 732 }
rolo644u 0:3015b613b20d 733 #endif
rolo644u 0:3015b613b20d 734 // if (font == 3) {
rolo644u 0:3015b613b20d 735 // flash_address = pgm_read_word(&chrtbl_f24[uniCode]);
rolo644u 0:3015b613b20d 736 // width = pgm_read_byte(widtbl_f24+uniCode);
rolo644u 0:3015b613b20d 737 // height = chr_hgt_f24;
rolo644u 0:3015b613b20d 738 // gap = 0;
rolo644u 0:3015b613b20d 739 // }
rolo644u 0:3015b613b20d 740 #ifdef LOAD_FONT4
rolo644u 0:3015b613b20d 741 if (font == 4) {
rolo644u 0:3015b613b20d 742 flash_address = pgm_read_word(&chrtbl_f32[uniCode]);
rolo644u 0:3015b613b20d 743 width = pgm_read_byte(widtbl_f32+uniCode);
rolo644u 0:3015b613b20d 744 height = chr_hgt_f32;
rolo644u 0:3015b613b20d 745 gap = -3;
rolo644u 0:3015b613b20d 746 }
rolo644u 0:3015b613b20d 747 #endif
rolo644u 0:3015b613b20d 748 // if (font == 5) {
rolo644u 0:3015b613b20d 749 // flash_address = pgm_read_word(&chrtbl_f48[uniCode]);
rolo644u 0:3015b613b20d 750 // width = pgm_read_byte(widtbl_f48+uniCode);
rolo644u 0:3015b613b20d 751 // height = chr_hgt_f48;
rolo644u 0:3015b613b20d 752 // gap = -3;
rolo644u 0:3015b613b20d 753 // }
rolo644u 0:3015b613b20d 754 #ifdef LOAD_FONT6
rolo644u 0:3015b613b20d 755 if (font == 6) {
rolo644u 0:3015b613b20d 756 flash_address = pgm_read_word(&chrtbl_f64[uniCode]);
rolo644u 0:3015b613b20d 757 width = pgm_read_byte(widtbl_f64+uniCode);
rolo644u 0:3015b613b20d 758 height = chr_hgt_f64;
rolo644u 0:3015b613b20d 759 gap = -3;
rolo644u 0:3015b613b20d 760 }
rolo644u 0:3015b613b20d 761 #endif
rolo644u 0:3015b613b20d 762 #ifdef LOAD_FONT7
rolo644u 0:3015b613b20d 763 if (font == 7) {
rolo644u 0:3015b613b20d 764 flash_address = pgm_read_word(&chrtbl_f7s[uniCode]);
rolo644u 0:3015b613b20d 765 width = pgm_read_byte(widtbl_f7s+uniCode);
rolo644u 0:3015b613b20d 766 height = chr_hgt_f7s;
rolo644u 0:3015b613b20d 767 gap = 2;
rolo644u 0:3015b613b20d 768 }
rolo644u 0:3015b613b20d 769 #endif
rolo644u 0:3015b613b20d 770 #ifdef LOAD_FONT8
rolo644u 0:3015b613b20d 771 if (font == 8) {
rolo644u 0:3015b613b20d 772 flash_address = pgm_read_word(&chrtbl_f72[uniCode]);
rolo644u 0:3015b613b20d 773 width = pgm_read_byte(widtbl_f72+uniCode);
rolo644u 0:3015b613b20d 774 height = chr_hgt_f72;
rolo644u 0:3015b613b20d 775 gap = 2;
rolo644u 0:3015b613b20d 776 }
rolo644u 0:3015b613b20d 777 #endif
rolo644u 0:3015b613b20d 778
rolo644u 0:3015b613b20d 779
rolo644u 0:3015b613b20d 780 int w = (width+7)/8;
rolo644u 0:3015b613b20d 781 int pX = 0;
rolo644u 0:3015b613b20d 782 int pY = y;
rolo644u 0:3015b613b20d 783 int color = 0;
rolo644u 0:3015b613b20d 784 char line = 0;
rolo644u 0:3015b613b20d 785
rolo644u 0:3015b613b20d 786 //fillRect(x,pY,width+gap,height,textbgcolor);
rolo644u 0:3015b613b20d 787
rolo644u 0:3015b613b20d 788 for(int i=0; i<height; i++)
rolo644u 0:3015b613b20d 789 {
rolo644u 0:3015b613b20d 790 if (textcolor != textbgcolor) {
rolo644u 0:3015b613b20d 791 if (textsize == 1) drawFastHLine(x, pY, width+gap, textbgcolor);
rolo644u 0:3015b613b20d 792 else fillRect(x, pY, (width+gap)*textsize, textsize, textbgcolor);
rolo644u 0:3015b613b20d 793 }
rolo644u 0:3015b613b20d 794 for (int k = 0;k < w; k++)
rolo644u 0:3015b613b20d 795 {
rolo644u 0:3015b613b20d 796 line = pgm_read_byte(flash_address+w*i+k);
rolo644u 0:3015b613b20d 797 if(line) {
rolo644u 0:3015b613b20d 798 if (textsize==1){
rolo644u 0:3015b613b20d 799 pX = x + k*8;
rolo644u 0:3015b613b20d 800 if(line & 0x80) drawPixel(pX, pY, textcolor);
rolo644u 0:3015b613b20d 801 if(line & 0x40) drawPixel(pX+1, pY, textcolor);
rolo644u 0:3015b613b20d 802 if(line & 0x20) drawPixel(pX+2, pY, textcolor);
rolo644u 0:3015b613b20d 803 if(line & 0x10) drawPixel(pX+3, pY, textcolor);
rolo644u 0:3015b613b20d 804 if(line & 0x8) drawPixel(pX+4, pY, textcolor);
rolo644u 0:3015b613b20d 805 if(line & 0x4) drawPixel(pX+5, pY, textcolor);
rolo644u 0:3015b613b20d 806 if(line & 0x2) drawPixel(pX+6, pY, textcolor);
rolo644u 0:3015b613b20d 807 if(line & 0x1) drawPixel(pX+7, pY, textcolor);
rolo644u 0:3015b613b20d 808 }
rolo644u 0:3015b613b20d 809 else {
rolo644u 0:3015b613b20d 810 pX = x + k*8*textsize;
rolo644u 0:3015b613b20d 811 if(line & 0x80) fillRect(pX, pY, textsize, textsize, textcolor);
rolo644u 0:3015b613b20d 812 if(line & 0x40) fillRect(pX+textsize, pY, textsize, textsize, textcolor);
rolo644u 0:3015b613b20d 813 if(line & 0x20) fillRect(pX+2*textsize, pY, textsize, textsize, textcolor);
rolo644u 0:3015b613b20d 814 if(line & 0x10) fillRect(pX+3*textsize, pY, textsize, textsize, textcolor);
rolo644u 0:3015b613b20d 815 if(line & 0x8) fillRect(pX+4*textsize, pY, textsize, textsize, textcolor);
rolo644u 0:3015b613b20d 816 if(line & 0x4) fillRect(pX+5*textsize, pY, textsize, textsize, textcolor);
rolo644u 0:3015b613b20d 817 if(line & 0x2) fillRect(pX+6*textsize, pY, textsize, textsize, textcolor);
rolo644u 0:3015b613b20d 818 if(line & 0x1) fillRect(pX+7*textsize, pY, textsize, textsize, textcolor);
rolo644u 0:3015b613b20d 819 }
rolo644u 0:3015b613b20d 820 }
rolo644u 0:3015b613b20d 821 }
rolo644u 0:3015b613b20d 822 pY+=textsize;
rolo644u 0:3015b613b20d 823 }
rolo644u 0:3015b613b20d 824 return (width+gap)*textsize; // x +
rolo644u 0:3015b613b20d 825 }
rolo644u 0:3015b613b20d 826
rolo644u 0:3015b613b20d 827 /***************************************************************************************
rolo644u 0:3015b613b20d 828 ** Function name: drawNumber unsigned with size
rolo644u 0:3015b613b20d 829 ** Descriptions: drawNumber
rolo644u 0:3015b613b20d 830 ***************************************************************************************/
rolo644u 0:3015b613b20d 831 int ST7735::drawNumber(long long_num,int poX, int poY, int font)
rolo644u 0:3015b613b20d 832 {
rolo644u 0:3015b613b20d 833 char tmp[10];
rolo644u 0:3015b613b20d 834 if (long_num < 0) sprintf(tmp, "%li", long_num);
rolo644u 0:3015b613b20d 835 else sprintf(tmp, "%lu", long_num);
rolo644u 0:3015b613b20d 836 return drawString(tmp, poX, poY, font);
rolo644u 0:3015b613b20d 837 }
rolo644u 0:3015b613b20d 838
rolo644u 0:3015b613b20d 839 /***************************************************************************************
rolo644u 0:3015b613b20d 840 ** Function name: drawChar
rolo644u 0:3015b613b20d 841 ** Descriptions: draw char
rolo644u 0:3015b613b20d 842 ***************************************************************************************/
rolo644u 0:3015b613b20d 843 int ST7735::drawChar(char c, int x, int y, int font)
rolo644u 0:3015b613b20d 844 {
rolo644u 0:3015b613b20d 845 return drawUnicode(c, x, y, font);
rolo644u 0:3015b613b20d 846 }
rolo644u 0:3015b613b20d 847
rolo644u 0:3015b613b20d 848 /***************************************************************************************
rolo644u 0:3015b613b20d 849 ** Function name: drawString
rolo644u 0:3015b613b20d 850 ** Descriptions: draw string
rolo644u 0:3015b613b20d 851 ***************************************************************************************/
rolo644u 0:3015b613b20d 852 int ST7735::drawString(char *string, int poX, int poY, int font)
rolo644u 0:3015b613b20d 853 {
rolo644u 0:3015b613b20d 854 int sumX = 0;
rolo644u 0:3015b613b20d 855
rolo644u 0:3015b613b20d 856 while(*string)
rolo644u 0:3015b613b20d 857 {
rolo644u 0:3015b613b20d 858 int xPlus = drawChar(*string, poX, poY, font);
rolo644u 0:3015b613b20d 859 sumX += xPlus;
rolo644u 0:3015b613b20d 860 *string++;
rolo644u 0:3015b613b20d 861 poX += xPlus; /* Move cursor right */
rolo644u 0:3015b613b20d 862 }
rolo644u 0:3015b613b20d 863 return sumX;
rolo644u 0:3015b613b20d 864 }
rolo644u 0:3015b613b20d 865
rolo644u 0:3015b613b20d 866 /***************************************************************************************
rolo644u 0:3015b613b20d 867 ** Function name: drawCentreString
rolo644u 0:3015b613b20d 868 ** Descriptions: draw string across centre
rolo644u 0:3015b613b20d 869 ***************************************************************************************/
rolo644u 0:3015b613b20d 870 int ST7735::drawCentreString(char *string, int dX, int poY, int font)
rolo644u 0:3015b613b20d 871 {
rolo644u 0:3015b613b20d 872 int sumX = 0;
rolo644u 0:3015b613b20d 873 int len = 0;
rolo644u 0:3015b613b20d 874 char *pointer = string;
rolo644u 0:3015b613b20d 875 char ascii;
rolo644u 0:3015b613b20d 876
rolo644u 0:3015b613b20d 877 while(*pointer)
rolo644u 0:3015b613b20d 878 {
rolo644u 0:3015b613b20d 879 ascii = *pointer;
rolo644u 0:3015b613b20d 880 //if (font==0)len += 1+pgm_read_byte(widtbl_log+ascii);
rolo644u 0:3015b613b20d 881 //if (font==1)len += 1+pgm_read_byte(widtbl_f8+ascii-32);
rolo644u 0:3015b613b20d 882 #ifdef LOAD_FONT2
rolo644u 0:3015b613b20d 883 if (font==2)len += 1+pgm_read_byte(widtbl_f16+ascii-32);
rolo644u 0:3015b613b20d 884 #endif
rolo644u 0:3015b613b20d 885 //if (font==3)len += 1+pgm_read_byte(widtbl_f48+ascii-32)/2;
rolo644u 0:3015b613b20d 886 #ifdef LOAD_FONT4
rolo644u 0:3015b613b20d 887 if (font==4)len += pgm_read_byte(widtbl_f32+ascii-32)-3;
rolo644u 0:3015b613b20d 888 #endif
rolo644u 0:3015b613b20d 889 //if (font==5) len += pgm_read_byte(widtbl_f48+ascii-32)-3;
rolo644u 0:3015b613b20d 890 #ifdef LOAD_FONT6
rolo644u 0:3015b613b20d 891 if (font==6) len += pgm_read_byte(widtbl_f64+ascii-32)-3;
rolo644u 0:3015b613b20d 892 #endif
rolo644u 0:3015b613b20d 893 #ifdef LOAD_FONT7
rolo644u 0:3015b613b20d 894 if (font==7) len += pgm_read_byte(widtbl_f7s+ascii-32)+2;
rolo644u 0:3015b613b20d 895 #endif
rolo644u 0:3015b613b20d 896 #ifdef LOAD_FONT8
rolo644u 0:3015b613b20d 897 if (font==8) len += pgm_read_byte(widtbl_f72+ascii-32)+2;
rolo644u 0:3015b613b20d 898 #endif
rolo644u 0:3015b613b20d 899 *pointer++;
rolo644u 0:3015b613b20d 900 }
rolo644u 0:3015b613b20d 901 len = len*textsize;
rolo644u 0:3015b613b20d 902 int poX = dX - len/2;
rolo644u 0:3015b613b20d 903
rolo644u 0:3015b613b20d 904 if (poX < 0) poX = 0;
rolo644u 0:3015b613b20d 905
rolo644u 0:3015b613b20d 906 while(*string)
rolo644u 0:3015b613b20d 907 {
rolo644u 0:3015b613b20d 908
rolo644u 0:3015b613b20d 909 int xPlus = drawChar(*string, poX, poY, font);
rolo644u 0:3015b613b20d 910 sumX += xPlus;
rolo644u 0:3015b613b20d 911 *string++;
rolo644u 0:3015b613b20d 912 poX += xPlus; /* Move cursor right */
rolo644u 0:3015b613b20d 913 }
rolo644u 0:3015b613b20d 914
rolo644u 0:3015b613b20d 915 return sumX;
rolo644u 0:3015b613b20d 916 }
rolo644u 0:3015b613b20d 917
rolo644u 0:3015b613b20d 918 /***************************************************************************************
rolo644u 0:3015b613b20d 919 ** Function name: drawRightString
rolo644u 0:3015b613b20d 920 ** Descriptions: draw string right justified
rolo644u 0:3015b613b20d 921 ***************************************************************************************/
rolo644u 0:3015b613b20d 922 int ST7735::drawRightString(char *string, int dX, int poY, int font)
rolo644u 0:3015b613b20d 923 {
rolo644u 0:3015b613b20d 924 int sumX = 0;
rolo644u 0:3015b613b20d 925 int len = 0;
rolo644u 0:3015b613b20d 926 char *pointer = string;
rolo644u 0:3015b613b20d 927 char ascii;
rolo644u 0:3015b613b20d 928
rolo644u 0:3015b613b20d 929 while(*pointer)
rolo644u 0:3015b613b20d 930 {
rolo644u 0:3015b613b20d 931 ascii = *pointer;
rolo644u 0:3015b613b20d 932 //if (font==0)len += 1+pgm_read_byte(widtbl_log+ascii);
rolo644u 0:3015b613b20d 933 //if (font==1)len += 1+pgm_read_byte(widtbl_f8+ascii-32);
rolo644u 0:3015b613b20d 934 #ifdef LOAD_FONT2
rolo644u 0:3015b613b20d 935 if (font==2)len += 1+pgm_read_byte(widtbl_f16+ascii-32);
rolo644u 0:3015b613b20d 936 #endif
rolo644u 0:3015b613b20d 937 //if (font==3)len += 1+pgm_read_byte(widtbl_f48+ascii-32)/2;
rolo644u 0:3015b613b20d 938 #ifdef LOAD_FONT4
rolo644u 0:3015b613b20d 939 if (font==4)len += pgm_read_byte(widtbl_f32+ascii-32)-3;
rolo644u 0:3015b613b20d 940 #endif
rolo644u 0:3015b613b20d 941 //if (font==5) len += pgm_read_byte(widtbl_f48+ascii-32)-3;
rolo644u 0:3015b613b20d 942 #ifdef LOAD_FONT6
rolo644u 0:3015b613b20d 943 if (font==6) len += pgm_read_byte(widtbl_f64+ascii-32)-3;
rolo644u 0:3015b613b20d 944 #endif
rolo644u 0:3015b613b20d 945 #ifdef LOAD_FONT7
rolo644u 0:3015b613b20d 946 if (font==7) len += pgm_read_byte(widtbl_f7s+ascii-32)+2;
rolo644u 0:3015b613b20d 947 #endif
rolo644u 0:3015b613b20d 948 #ifdef LOAD_FONT8
rolo644u 0:3015b613b20d 949 if (font==8) len += pgm_read_byte(widtbl_f72+ascii-32)+2;
rolo644u 0:3015b613b20d 950 #endif
rolo644u 0:3015b613b20d 951 *pointer++;
rolo644u 0:3015b613b20d 952 }
rolo644u 0:3015b613b20d 953
rolo644u 0:3015b613b20d 954 len = len*textsize;
rolo644u 0:3015b613b20d 955 int poX = dX - len;
rolo644u 0:3015b613b20d 956
rolo644u 0:3015b613b20d 957 if (poX < 0) poX = 0;
rolo644u 0:3015b613b20d 958
rolo644u 0:3015b613b20d 959 while(*string)
rolo644u 0:3015b613b20d 960 {
rolo644u 0:3015b613b20d 961
rolo644u 0:3015b613b20d 962 int xPlus = drawChar(*string, poX, poY, font);
rolo644u 0:3015b613b20d 963 sumX += xPlus;
rolo644u 0:3015b613b20d 964 *string++;
rolo644u 0:3015b613b20d 965 poX += xPlus; /* Move cursor right */
rolo644u 0:3015b613b20d 966 }
rolo644u 0:3015b613b20d 967
rolo644u 0:3015b613b20d 968 return sumX;
rolo644u 0:3015b613b20d 969 }
rolo644u 0:3015b613b20d 970
rolo644u 0:3015b613b20d 971 /***************************************************************************************
rolo644u 0:3015b613b20d 972 ** Function name: drawFloat
rolo644u 0:3015b613b20d 973 ** Descriptions: drawFloat
rolo644u 0:3015b613b20d 974 ***************************************************************************************/
rolo644u 0:3015b613b20d 975 int ST7735::drawFloat(float floatNumber, int decimal, int poX, int poY, int font)
rolo644u 0:3015b613b20d 976 {
rolo644u 0:3015b613b20d 977 unsigned long temp=0;
rolo644u 0:3015b613b20d 978 float decy=0.0;
rolo644u 0:3015b613b20d 979 float rounding = 0.5;
rolo644u 0:3015b613b20d 980
rolo644u 0:3015b613b20d 981 float eep = 0.000001;
rolo644u 0:3015b613b20d 982
rolo644u 0:3015b613b20d 983 int sumX = 0;
rolo644u 0:3015b613b20d 984 int xPlus = 0;
rolo644u 0:3015b613b20d 985
rolo644u 0:3015b613b20d 986 if(floatNumber-0.0 < eep) // floatNumber < 0
rolo644u 0:3015b613b20d 987 {
rolo644u 0:3015b613b20d 988 xPlus = drawChar('-',poX, poY, font);
rolo644u 0:3015b613b20d 989 floatNumber = -floatNumber;
rolo644u 0:3015b613b20d 990
rolo644u 0:3015b613b20d 991 poX += xPlus;
rolo644u 0:3015b613b20d 992 sumX += xPlus;
rolo644u 0:3015b613b20d 993 }
rolo644u 0:3015b613b20d 994
rolo644u 0:3015b613b20d 995 for (unsigned char i=0; i<decimal; ++i)
rolo644u 0:3015b613b20d 996 {
rolo644u 0:3015b613b20d 997 rounding /= 10.0;
rolo644u 0:3015b613b20d 998 }
rolo644u 0:3015b613b20d 999
rolo644u 0:3015b613b20d 1000 floatNumber += rounding;
rolo644u 0:3015b613b20d 1001
rolo644u 0:3015b613b20d 1002 temp = (long)floatNumber;
rolo644u 0:3015b613b20d 1003
rolo644u 0:3015b613b20d 1004
rolo644u 0:3015b613b20d 1005 xPlus = drawNumber(temp,poX, poY, font);
rolo644u 0:3015b613b20d 1006
rolo644u 0:3015b613b20d 1007 poX += xPlus;
rolo644u 0:3015b613b20d 1008 sumX += xPlus;
rolo644u 0:3015b613b20d 1009
rolo644u 0:3015b613b20d 1010 if(decimal>0)
rolo644u 0:3015b613b20d 1011 {
rolo644u 0:3015b613b20d 1012 xPlus = drawChar('.',poX, poY, font);
rolo644u 0:3015b613b20d 1013 poX += xPlus; /* Move cursor right */
rolo644u 0:3015b613b20d 1014 sumX += xPlus;
rolo644u 0:3015b613b20d 1015 }
rolo644u 0:3015b613b20d 1016 else
rolo644u 0:3015b613b20d 1017 {
rolo644u 0:3015b613b20d 1018 return sumX;
rolo644u 0:3015b613b20d 1019 }
rolo644u 0:3015b613b20d 1020
rolo644u 0:3015b613b20d 1021 decy = floatNumber - temp;
rolo644u 0:3015b613b20d 1022 for(unsigned char i=0; i<decimal; i++)
rolo644u 0:3015b613b20d 1023 {
rolo644u 0:3015b613b20d 1024 decy *= 10; /* for the next decimal */
rolo644u 0:3015b613b20d 1025 temp = decy; /* get the decimal */
rolo644u 0:3015b613b20d 1026 xPlus = drawNumber(temp,poX, poY, font);
rolo644u 0:3015b613b20d 1027
rolo644u 0:3015b613b20d 1028 poX += xPlus; /* Move cursor right */
rolo644u 0:3015b613b20d 1029 sumX += xPlus;
rolo644u 0:3015b613b20d 1030 decy -= temp;
rolo644u 0:3015b613b20d 1031 }
rolo644u 0:3015b613b20d 1032 return sumX;
rolo644u 0:3015b613b20d 1033 }
rolo644u 0:3015b613b20d 1034