Library for 1.8 inch 160*180 TFT Display. Nice fonts in different formats.
ST7735.cpp@0:3015b613b20d, 2015-08-15 (annotated)
- 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?
User | Revision | Line number | New 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 |