skydarc meneldoll
/
test_TFT_11_v5
test st7735 on lpc1768 with mbed v5. bug with spi frequency...
ST7735/ST7735.cpp@2:2946f9eefcae, 2020-04-08 (annotated)
- Committer:
- skydarc
- Date:
- Wed Apr 08 15:00:13 2020 +0000
- Revision:
- 2:2946f9eefcae
v2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
skydarc | 2:2946f9eefcae | 1 | /*************************************************** |
skydarc | 2:2946f9eefcae | 2 | This is a library for the Adafruit 1.8" SPI display. |
skydarc | 2:2946f9eefcae | 3 | This library works with the Adafruit 1.8" TFT Breakout w/SD card |
skydarc | 2:2946f9eefcae | 4 | ----> http://www.adafruit.com/products/358 |
skydarc | 2:2946f9eefcae | 5 | as well as Adafruit raw 1.8" TFT display |
skydarc | 2:2946f9eefcae | 6 | ----> http://www.adafruit.com/products/618 |
skydarc | 2:2946f9eefcae | 7 | |
skydarc | 2:2946f9eefcae | 8 | Check out the links above for our tutorials and wiring diagrams |
skydarc | 2:2946f9eefcae | 9 | These displays use SPI to communicate, 4 or 5 pins are required to |
skydarc | 2:2946f9eefcae | 10 | interface (RST is optional) |
skydarc | 2:2946f9eefcae | 11 | Adafruit invests time and resources providing this open source code, |
skydarc | 2:2946f9eefcae | 12 | please support Adafruit and open-source hardware by purchasing |
skydarc | 2:2946f9eefcae | 13 | products from Adafruit! |
skydarc | 2:2946f9eefcae | 14 | |
skydarc | 2:2946f9eefcae | 15 | Written by Limor Fried/Ladyada for Adafruit Industries. |
skydarc | 2:2946f9eefcae | 16 | MIT license, all text above must be included in any redistribution |
skydarc | 2:2946f9eefcae | 17 | ****************************************************/ |
skydarc | 2:2946f9eefcae | 18 | |
skydarc | 2:2946f9eefcae | 19 | #include "mbed.h" |
skydarc | 2:2946f9eefcae | 20 | #include "ST7735.h" |
skydarc | 2:2946f9eefcae | 21 | |
skydarc | 2:2946f9eefcae | 22 | Serial output1(USBTX, USBRX); |
skydarc | 2:2946f9eefcae | 23 | |
skydarc | 2:2946f9eefcae | 24 | //uint16_t table[1028][18] __attribute__((section("AHBSRAM0"))); |
skydarc | 2:2946f9eefcae | 25 | |
skydarc | 2:2946f9eefcae | 26 | inline uint16_t swapcolor(uint16_t x) { |
skydarc | 2:2946f9eefcae | 27 | return (x << 11) | (x & 0x07E0) | (x >> 11); |
skydarc | 2:2946f9eefcae | 28 | } |
skydarc | 2:2946f9eefcae | 29 | |
skydarc | 2:2946f9eefcae | 30 | // Constructor |
skydarc | 2:2946f9eefcae | 31 | ST7735::ST7735(PinName mosi, PinName miso, PinName sck, PinName cs, PinName rs, PinName rst) |
skydarc | 2:2946f9eefcae | 32 | : lcdPort(mosi, miso, sck), _cs(cs), _rs(rs), _rst(rst), GFX(ST7735_TFTWIDTH_128, ST7735_TFTHEIGHT_160) |
skydarc | 2:2946f9eefcae | 33 | { } |
skydarc | 2:2946f9eefcae | 34 | |
skydarc | 2:2946f9eefcae | 35 | |
skydarc | 2:2946f9eefcae | 36 | void ST7735::writecommand(uint8_t c) |
skydarc | 2:2946f9eefcae | 37 | { |
skydarc | 2:2946f9eefcae | 38 | _rs = 0; |
skydarc | 2:2946f9eefcae | 39 | _cs = 0; |
skydarc | 2:2946f9eefcae | 40 | lcdPort.write( c ); |
skydarc | 2:2946f9eefcae | 41 | _cs = 1; |
skydarc | 2:2946f9eefcae | 42 | } |
skydarc | 2:2946f9eefcae | 43 | |
skydarc | 2:2946f9eefcae | 44 | |
skydarc | 2:2946f9eefcae | 45 | void ST7735::writedata(uint8_t c) |
skydarc | 2:2946f9eefcae | 46 | { |
skydarc | 2:2946f9eefcae | 47 | _rs = 1; |
skydarc | 2:2946f9eefcae | 48 | _cs = 0; |
skydarc | 2:2946f9eefcae | 49 | lcdPort.write( c ); |
skydarc | 2:2946f9eefcae | 50 | |
skydarc | 2:2946f9eefcae | 51 | _cs = 1; |
skydarc | 2:2946f9eefcae | 52 | } |
skydarc | 2:2946f9eefcae | 53 | |
skydarc | 2:2946f9eefcae | 54 | |
skydarc | 2:2946f9eefcae | 55 | // Rather than a bazillion writecommand() and writedata() calls, screen |
skydarc | 2:2946f9eefcae | 56 | // initialization commands and arguments are organized in these tables |
skydarc | 2:2946f9eefcae | 57 | // stored in PROGMEM. The table may look bulky, but that's mostly the |
skydarc | 2:2946f9eefcae | 58 | // formatting -- storage-wise this is hundreds of bytes more compact |
skydarc | 2:2946f9eefcae | 59 | // than the equivalent code. Companion function follows. |
skydarc | 2:2946f9eefcae | 60 | #define DELAY 0x80 |
skydarc | 2:2946f9eefcae | 61 | static unsigned char |
skydarc | 2:2946f9eefcae | 62 | Bcmd[] = { // Initialization commands for 7735B screens |
skydarc | 2:2946f9eefcae | 63 | 18, // 18 commands in list: |
skydarc | 2:2946f9eefcae | 64 | ST7735_SWRESET, DELAY, // 1: Software reset, no args, w/delay |
skydarc | 2:2946f9eefcae | 65 | 50, // 50 ms delay |
skydarc | 2:2946f9eefcae | 66 | ST7735_SLPOUT , DELAY, // 2: Out of sleep mode, no args, w/delay |
skydarc | 2:2946f9eefcae | 67 | 255, // 255 = 500 ms delay |
skydarc | 2:2946f9eefcae | 68 | ST7735_COLMOD , 1+DELAY, // 3: Set color mode, 1 arg + delay: |
skydarc | 2:2946f9eefcae | 69 | 0x05, // 16-bit color |
skydarc | 2:2946f9eefcae | 70 | 10, // 10 ms delay |
skydarc | 2:2946f9eefcae | 71 | ST7735_FRMCTR1, 3+DELAY, // 4: Frame rate control, 3 args + delay: |
skydarc | 2:2946f9eefcae | 72 | 0x00, // fastest refresh |
skydarc | 2:2946f9eefcae | 73 | 0x06, // 6 lines front porch |
skydarc | 2:2946f9eefcae | 74 | 0x03, // 3 lines back porch |
skydarc | 2:2946f9eefcae | 75 | 10, // 10 ms delay |
skydarc | 2:2946f9eefcae | 76 | ST7735_MADCTL , 1 , // 5: Memory access ctrl (directions), 1 arg: |
skydarc | 2:2946f9eefcae | 77 | 0x08, // Row addr/col addr, bottom to top refresh |
skydarc | 2:2946f9eefcae | 78 | ST7735_DISSET5, 2 , // 6: Display settings #5, 2 args, no delay: |
skydarc | 2:2946f9eefcae | 79 | 0x15, // 1 clk cycle nonoverlap, 2 cycle gate |
skydarc | 2:2946f9eefcae | 80 | // rise, 3 cycle osc equalize |
skydarc | 2:2946f9eefcae | 81 | 0x02, // Fix on VTL |
skydarc | 2:2946f9eefcae | 82 | ST7735_INVCTR , 1 , // 7: Display inversion control, 1 arg: |
skydarc | 2:2946f9eefcae | 83 | 0x0, // Line inversion |
skydarc | 2:2946f9eefcae | 84 | ST7735_PWCTR1 , 2+DELAY, // 8: Power control, 2 args + delay: |
skydarc | 2:2946f9eefcae | 85 | 0x02, // GVDD = 4.7V |
skydarc | 2:2946f9eefcae | 86 | 0x70, // 1.0uA |
skydarc | 2:2946f9eefcae | 87 | 10, // 10 ms delay |
skydarc | 2:2946f9eefcae | 88 | ST7735_PWCTR2 , 1 , // 9: Power control, 1 arg, no delay: |
skydarc | 2:2946f9eefcae | 89 | 0x05, // VGH = 14.7V, VGL = -7.35V |
skydarc | 2:2946f9eefcae | 90 | ST7735_PWCTR3 , 2 , // 10: Power control, 2 args, no delay: |
skydarc | 2:2946f9eefcae | 91 | 0x01, // Opamp current small |
skydarc | 2:2946f9eefcae | 92 | 0x02, // Boost frequency |
skydarc | 2:2946f9eefcae | 93 | ST7735_VMCTR1 , 2+DELAY, // 11: Power control, 2 args + delay: |
skydarc | 2:2946f9eefcae | 94 | 0x3C, // VCOMH = 4V |
skydarc | 2:2946f9eefcae | 95 | 0x38, // VCOML = -1.1V |
skydarc | 2:2946f9eefcae | 96 | 10, // 10 ms delay |
skydarc | 2:2946f9eefcae | 97 | ST7735_PWCTR6 , 2 , // 12: Power control, 2 args, no delay: |
skydarc | 2:2946f9eefcae | 98 | 0x11, 0x15, |
skydarc | 2:2946f9eefcae | 99 | ST7735_GMCTRP1,16 , // 13: Magical unicorn dust, 16 args, no delay: |
skydarc | 2:2946f9eefcae | 100 | 0x09, 0x16, 0x09, 0x20, // (seriously though, not sure what |
skydarc | 2:2946f9eefcae | 101 | 0x21, 0x1B, 0x13, 0x19, // these config values represent) |
skydarc | 2:2946f9eefcae | 102 | 0x17, 0x15, 0x1E, 0x2B, |
skydarc | 2:2946f9eefcae | 103 | 0x04, 0x05, 0x02, 0x0E, |
skydarc | 2:2946f9eefcae | 104 | ST7735_GMCTRN1,16+DELAY, // 14: Sparkles and rainbows, 16 args + delay: |
skydarc | 2:2946f9eefcae | 105 | 0x0B, 0x14, 0x08, 0x1E, // (ditto) |
skydarc | 2:2946f9eefcae | 106 | 0x22, 0x1D, 0x18, 0x1E, |
skydarc | 2:2946f9eefcae | 107 | 0x1B, 0x1A, 0x24, 0x2B, |
skydarc | 2:2946f9eefcae | 108 | 0x06, 0x06, 0x02, 0x0F, |
skydarc | 2:2946f9eefcae | 109 | 10, // 10 ms delay |
skydarc | 2:2946f9eefcae | 110 | ST7735_CASET , 4 , // 15: Column addr set, 4 args, no delay: |
skydarc | 2:2946f9eefcae | 111 | 0x00, 0x02, // XSTART = 2 |
skydarc | 2:2946f9eefcae | 112 | 0x00, 0x81, // XEND = 129 |
skydarc | 2:2946f9eefcae | 113 | ST7735_RASET , 4 , // 16: Row addr set, 4 args, no delay: |
skydarc | 2:2946f9eefcae | 114 | 0x00, 0x02, // XSTART = 1 |
skydarc | 2:2946f9eefcae | 115 | 0x00, 0x81, // XEND = 160 |
skydarc | 2:2946f9eefcae | 116 | ST7735_NORON , DELAY, // 17: Normal display on, no args, w/delay |
skydarc | 2:2946f9eefcae | 117 | 10, // 10 ms delay |
skydarc | 2:2946f9eefcae | 118 | ST7735_DISPON , DELAY, // 18: Main screen turn on, no args, w/delay |
skydarc | 2:2946f9eefcae | 119 | 255 }, // 255 = 500 ms delay |
skydarc | 2:2946f9eefcae | 120 | |
skydarc | 2:2946f9eefcae | 121 | Rcmd1[] = { // Init for 7735R, part 1 (red or green tab) |
skydarc | 2:2946f9eefcae | 122 | 15, // 15 commands in list: |
skydarc | 2:2946f9eefcae | 123 | ST7735_SWRESET, DELAY, // 1: Software reset, 0 args, w/delay |
skydarc | 2:2946f9eefcae | 124 | 150, // 150 ms delay |
skydarc | 2:2946f9eefcae | 125 | ST7735_SLPOUT , DELAY, // 2: Out of sleep mode, 0 args, w/delay |
skydarc | 2:2946f9eefcae | 126 | 255, // 500 ms delay |
skydarc | 2:2946f9eefcae | 127 | ST7735_FRMCTR1, 3 , // 3: Frame rate ctrl - normal mode, 3 args: |
skydarc | 2:2946f9eefcae | 128 | 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) |
skydarc | 2:2946f9eefcae | 129 | ST7735_FRMCTR2, 3 , // 4: Frame rate control - idle mode, 3 args: |
skydarc | 2:2946f9eefcae | 130 | 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) |
skydarc | 2:2946f9eefcae | 131 | ST7735_FRMCTR3, 6 , // 5: Frame rate ctrl - partial mode, 6 args: |
skydarc | 2:2946f9eefcae | 132 | 0x01, 0x2C, 0x2D, // Dot inversion mode |
skydarc | 2:2946f9eefcae | 133 | 0x01, 0x2C, 0x2D, // Line inversion mode |
skydarc | 2:2946f9eefcae | 134 | ST7735_INVCTR , 1 , // 6: Display inversion ctrl, 1 arg, no delay: |
skydarc | 2:2946f9eefcae | 135 | 0x07, // No inversion |
skydarc | 2:2946f9eefcae | 136 | ST7735_PWCTR1 , 3 , // 7: Power control, 3 args, no delay: |
skydarc | 2:2946f9eefcae | 137 | 0xA2, |
skydarc | 2:2946f9eefcae | 138 | 0x02, // -4.6V |
skydarc | 2:2946f9eefcae | 139 | 0x84, // AUTO mode |
skydarc | 2:2946f9eefcae | 140 | ST7735_PWCTR2 , 1 , // 8: Power control, 1 arg, no delay: |
skydarc | 2:2946f9eefcae | 141 | 0xC5, // VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD |
skydarc | 2:2946f9eefcae | 142 | ST7735_PWCTR3 , 2 , // 9: Power control, 2 args, no delay: |
skydarc | 2:2946f9eefcae | 143 | 0x0A, // Opamp current small |
skydarc | 2:2946f9eefcae | 144 | 0x00, // Boost frequency |
skydarc | 2:2946f9eefcae | 145 | ST7735_PWCTR4 , 2 , // 10: Power control, 2 args, no delay: |
skydarc | 2:2946f9eefcae | 146 | 0x8A, // BCLK/2, Opamp current small & Medium low |
skydarc | 2:2946f9eefcae | 147 | 0x2A, |
skydarc | 2:2946f9eefcae | 148 | ST7735_PWCTR5 , 2 , // 11: Power control, 2 args, no delay: |
skydarc | 2:2946f9eefcae | 149 | 0x8A, 0xEE, |
skydarc | 2:2946f9eefcae | 150 | ST7735_VMCTR1 , 1 , // 12: Power control, 1 arg, no delay: |
skydarc | 2:2946f9eefcae | 151 | 0x0E, |
skydarc | 2:2946f9eefcae | 152 | ST7735_INVOFF , 0 , // 13: Don't invert display, no args, no delay |
skydarc | 2:2946f9eefcae | 153 | ST7735_MADCTL , 1 , // 14: Memory access control (directions), 1 arg: |
skydarc | 2:2946f9eefcae | 154 | 0xC0, // row addr/col addr, bottom to top refresh |
skydarc | 2:2946f9eefcae | 155 | ST7735_COLMOD , 1 , // 15: set color mode, 1 arg, no delay: |
skydarc | 2:2946f9eefcae | 156 | 0x05 }, // 16-bit color |
skydarc | 2:2946f9eefcae | 157 | |
skydarc | 2:2946f9eefcae | 158 | Rcmd2green[] = { // Init for 7735R, part 2 (green tab only) |
skydarc | 2:2946f9eefcae | 159 | 2, // 2 commands in list: |
skydarc | 2:2946f9eefcae | 160 | ST7735_CASET , 4 , // 1: Column addr set, 4 args, no delay: |
skydarc | 2:2946f9eefcae | 161 | 0x00, 0x02, // XSTART = 0 |
skydarc | 2:2946f9eefcae | 162 | 0x00, 0x7F+0x02, // XEND = 127 |
skydarc | 2:2946f9eefcae | 163 | ST7735_RASET , 4 , // 2: Row addr set, 4 args, no delay: |
skydarc | 2:2946f9eefcae | 164 | 0x00, 0x01, // XSTART = 0 |
skydarc | 2:2946f9eefcae | 165 | 0x00, 0x9F+0x01 }, // XEND = 159 |
skydarc | 2:2946f9eefcae | 166 | Rcmd2red[] = { // Init for 7735R, part 2 (red tab only) |
skydarc | 2:2946f9eefcae | 167 | 2, // 2 commands in list: |
skydarc | 2:2946f9eefcae | 168 | ST7735_CASET , 4 , // 1: Column addr set, 4 args, no delay: |
skydarc | 2:2946f9eefcae | 169 | 0x00, 0x00, // XSTART = 0 |
skydarc | 2:2946f9eefcae | 170 | 0x00, 0x7F, // XEND = 127 |
skydarc | 2:2946f9eefcae | 171 | ST7735_RASET , 4 , // 2: Row addr set, 4 args, no delay: |
skydarc | 2:2946f9eefcae | 172 | 0x00, 0x00, // XSTART = 0 |
skydarc | 2:2946f9eefcae | 173 | 0x00, 0x9F }, // XEND = 159 |
skydarc | 2:2946f9eefcae | 174 | |
skydarc | 2:2946f9eefcae | 175 | Rcmd2green144[] = { // Init for 7735R, part 2 (green 1.44 tab) |
skydarc | 2:2946f9eefcae | 176 | 2, // 2 commands in list: |
skydarc | 2:2946f9eefcae | 177 | ST7735_CASET , 4 , // 1: Column addr set, 4 args, no delay: |
skydarc | 2:2946f9eefcae | 178 | 0x00, 0x00, // XSTART = 0 |
skydarc | 2:2946f9eefcae | 179 | 0x00, 0x7F, // XEND = 127 |
skydarc | 2:2946f9eefcae | 180 | ST7735_RASET , 4 , // 2: Row addr set, 4 args, no delay: |
skydarc | 2:2946f9eefcae | 181 | 0x00, 0x00, // XSTART = 0 |
skydarc | 2:2946f9eefcae | 182 | 0x00, 0x7F }, // XEND = 127 |
skydarc | 2:2946f9eefcae | 183 | |
skydarc | 2:2946f9eefcae | 184 | Rcmd2green160x80[] = { // Init for 7735R, part 2 (mini 160x80) |
skydarc | 2:2946f9eefcae | 185 | 2, // 2 commands in list: |
skydarc | 2:2946f9eefcae | 186 | ST7735_CASET , 4 , // 1: Column addr set, 4 args, no delay: |
skydarc | 2:2946f9eefcae | 187 | 0x00, 0x00, // XSTART = 0 |
skydarc | 2:2946f9eefcae | 188 | 0x00, 0x7F, // XEND = 79 |
skydarc | 2:2946f9eefcae | 189 | ST7735_RASET , 4 , // 2: Row addr set, 4 args, no delay: |
skydarc | 2:2946f9eefcae | 190 | 0x00, 0x00, // XSTART = 0 |
skydarc | 2:2946f9eefcae | 191 | 0x00, 0x9F+0x01 }, // XEND = 159 |
skydarc | 2:2946f9eefcae | 192 | |
skydarc | 2:2946f9eefcae | 193 | Rcmd3[] = { // Init for 7735R, part 3 (red or green tab) |
skydarc | 2:2946f9eefcae | 194 | 4, // 4 commands in list: |
skydarc | 2:2946f9eefcae | 195 | ST7735_GMCTRP1, 16 , // 1: Magical unicorn dust, 16 args, no delay: |
skydarc | 2:2946f9eefcae | 196 | 0x02, 0x1c, 0x07, 0x12, |
skydarc | 2:2946f9eefcae | 197 | 0x37, 0x32, 0x29, 0x2d, |
skydarc | 2:2946f9eefcae | 198 | 0x29, 0x25, 0x2B, 0x39, |
skydarc | 2:2946f9eefcae | 199 | 0x00, 0x01, 0x03, 0x10, |
skydarc | 2:2946f9eefcae | 200 | ST7735_GMCTRN1, 16 , // 2: Sparkles and rainbows, 16 args, no delay: |
skydarc | 2:2946f9eefcae | 201 | 0x03, 0x1d, 0x07, 0x06, |
skydarc | 2:2946f9eefcae | 202 | 0x2E, 0x2C, 0x29, 0x2D, |
skydarc | 2:2946f9eefcae | 203 | 0x2E, 0x2E, 0x37, 0x3F, |
skydarc | 2:2946f9eefcae | 204 | 0x00, 0x00, 0x02, 0x10, |
skydarc | 2:2946f9eefcae | 205 | ST7735_NORON , DELAY, // 3: Normal display on, no args, w/delay |
skydarc | 2:2946f9eefcae | 206 | 10, // 10 ms delay |
skydarc | 2:2946f9eefcae | 207 | ST7735_DISPON , DELAY, // 4: Main screen turn on, no args w/delay |
skydarc | 2:2946f9eefcae | 208 | 100 }; // 100 ms delay |
skydarc | 2:2946f9eefcae | 209 | |
skydarc | 2:2946f9eefcae | 210 | |
skydarc | 2:2946f9eefcae | 211 | // Companion code to the above tables. Reads and issues |
skydarc | 2:2946f9eefcae | 212 | // a series of LCD commands stored in byte array. |
skydarc | 2:2946f9eefcae | 213 | void ST7735::commandList(uint8_t *addr) |
skydarc | 2:2946f9eefcae | 214 | { |
skydarc | 2:2946f9eefcae | 215 | |
skydarc | 2:2946f9eefcae | 216 | uint8_t numCommands, numArgs; |
skydarc | 2:2946f9eefcae | 217 | uint16_t ms; |
skydarc | 2:2946f9eefcae | 218 | |
skydarc | 2:2946f9eefcae | 219 | numCommands = *addr++; // Number of commands to follow |
skydarc | 2:2946f9eefcae | 220 | while(numCommands--) { // For each command... |
skydarc | 2:2946f9eefcae | 221 | writecommand(*addr++); // Read, issue command |
skydarc | 2:2946f9eefcae | 222 | numArgs = *addr++; // Number of args to follow |
skydarc | 2:2946f9eefcae | 223 | ms = numArgs & DELAY; // If hibit set, delay follows args |
skydarc | 2:2946f9eefcae | 224 | numArgs &= ~DELAY; // Mask out delay bit |
skydarc | 2:2946f9eefcae | 225 | while(numArgs--) { // For each argument... |
skydarc | 2:2946f9eefcae | 226 | writedata(*addr++); // Read, issue argument |
skydarc | 2:2946f9eefcae | 227 | } |
skydarc | 2:2946f9eefcae | 228 | |
skydarc | 2:2946f9eefcae | 229 | if(ms) { |
skydarc | 2:2946f9eefcae | 230 | ms = *addr++; // Read post-command delay time (ms) |
skydarc | 2:2946f9eefcae | 231 | if(ms == 255) ms = 500; // If 255, delay for 500 ms |
skydarc | 2:2946f9eefcae | 232 | wait_ms(ms); |
skydarc | 2:2946f9eefcae | 233 | } |
skydarc | 2:2946f9eefcae | 234 | } |
skydarc | 2:2946f9eefcae | 235 | } |
skydarc | 2:2946f9eefcae | 236 | |
skydarc | 2:2946f9eefcae | 237 | |
skydarc | 2:2946f9eefcae | 238 | // Initialization code common to both 'B' and 'R' type displays |
skydarc | 2:2946f9eefcae | 239 | void ST7735::commonInit(uint8_t *cmdList) |
skydarc | 2:2946f9eefcae | 240 | { |
skydarc | 2:2946f9eefcae | 241 | |
skydarc | 2:2946f9eefcae | 242 | colstart = rowstart = 0; // May be overridden in init func |
skydarc | 2:2946f9eefcae | 243 | |
skydarc | 2:2946f9eefcae | 244 | _rs = 1; |
skydarc | 2:2946f9eefcae | 245 | _cs = 1; |
skydarc | 2:2946f9eefcae | 246 | |
skydarc | 2:2946f9eefcae | 247 | // use default SPI format |
skydarc | 2:2946f9eefcae | 248 | lcdPort.format(8,0); |
skydarc | 2:2946f9eefcae | 249 | //lcdPort.frequency(16000000); // Lets try 4MHz |
skydarc | 2:2946f9eefcae | 250 | lcdPort.frequency(64000000); // Lets try 4MHz |
skydarc | 2:2946f9eefcae | 251 | |
skydarc | 2:2946f9eefcae | 252 | // toggle RST low to reset; CS low so it'll listen to us |
skydarc | 2:2946f9eefcae | 253 | _cs = 0; |
skydarc | 2:2946f9eefcae | 254 | _rst = 1; |
skydarc | 2:2946f9eefcae | 255 | wait_ms(500); |
skydarc | 2:2946f9eefcae | 256 | _rst = 0; |
skydarc | 2:2946f9eefcae | 257 | wait_ms(500); |
skydarc | 2:2946f9eefcae | 258 | _rst = 1; |
skydarc | 2:2946f9eefcae | 259 | wait_ms(500); |
skydarc | 2:2946f9eefcae | 260 | |
skydarc | 2:2946f9eefcae | 261 | if(cmdList) commandList(cmdList); |
skydarc | 2:2946f9eefcae | 262 | } |
skydarc | 2:2946f9eefcae | 263 | |
skydarc | 2:2946f9eefcae | 264 | |
skydarc | 2:2946f9eefcae | 265 | // Initialization for ST7735B screens |
skydarc | 2:2946f9eefcae | 266 | void ST7735::initB(void) |
skydarc | 2:2946f9eefcae | 267 | { |
skydarc | 2:2946f9eefcae | 268 | commonInit(Bcmd); |
skydarc | 2:2946f9eefcae | 269 | } |
skydarc | 2:2946f9eefcae | 270 | |
skydarc | 2:2946f9eefcae | 271 | |
skydarc | 2:2946f9eefcae | 272 | // Initialization for ST7735R screens (green or red tabs) |
skydarc | 2:2946f9eefcae | 273 | void ST7735::initR(uint8_t options) { |
skydarc | 2:2946f9eefcae | 274 | commonInit(Rcmd1); |
skydarc | 2:2946f9eefcae | 275 | if(options == INITR_GREENTAB) { |
skydarc | 2:2946f9eefcae | 276 | commandList(Rcmd2green); |
skydarc | 2:2946f9eefcae | 277 | colstart = 2; |
skydarc | 2:2946f9eefcae | 278 | rowstart = 1; |
skydarc | 2:2946f9eefcae | 279 | } else if(options == INITR_144GREENTAB) { |
skydarc | 2:2946f9eefcae | 280 | _height = ST7735_TFTHEIGHT_128; |
skydarc | 2:2946f9eefcae | 281 | _width = ST7735_TFTWIDTH_128; |
skydarc | 2:2946f9eefcae | 282 | commandList(Rcmd2green144); |
skydarc | 2:2946f9eefcae | 283 | colstart = 2; |
skydarc | 2:2946f9eefcae | 284 | rowstart = 3; |
skydarc | 2:2946f9eefcae | 285 | } else if(options == INITR_MINI160x80) { |
skydarc | 2:2946f9eefcae | 286 | _height = ST7735_TFTHEIGHT_160; |
skydarc | 2:2946f9eefcae | 287 | _width = ST7735_TFTWIDTH_80; |
skydarc | 2:2946f9eefcae | 288 | commandList(Rcmd2green160x80); |
skydarc | 2:2946f9eefcae | 289 | colstart = 24; |
skydarc | 2:2946f9eefcae | 290 | rowstart = 0; |
skydarc | 2:2946f9eefcae | 291 | } else if(options == INITR_MINI160x80_RS) { |
skydarc | 2:2946f9eefcae | 292 | _height = ST7735_TFTHEIGHT_160; |
skydarc | 2:2946f9eefcae | 293 | _width = ST7735_TFTWIDTH_80; |
skydarc | 2:2946f9eefcae | 294 | commandList(Rcmd2green160x80); |
skydarc | 2:2946f9eefcae | 295 | writecommand(1 ? ST7735_INVON : ST7735_INVOFF); |
skydarc | 2:2946f9eefcae | 296 | colstart = 26; |
skydarc | 2:2946f9eefcae | 297 | rowstart = 1; |
skydarc | 2:2946f9eefcae | 298 | _tft_type = 2; |
skydarc | 2:2946f9eefcae | 299 | } else { |
skydarc | 2:2946f9eefcae | 300 | // colstart, rowstart left at default '0' values |
skydarc | 2:2946f9eefcae | 301 | commandList(Rcmd2red); |
skydarc | 2:2946f9eefcae | 302 | } |
skydarc | 2:2946f9eefcae | 303 | commandList(Rcmd3); |
skydarc | 2:2946f9eefcae | 304 | |
skydarc | 2:2946f9eefcae | 305 | // if black, change MADCTL color filter |
skydarc | 2:2946f9eefcae | 306 | if (options == INITR_BLACKTAB) { |
skydarc | 2:2946f9eefcae | 307 | writecommand(ST7735_MADCTL); |
skydarc | 2:2946f9eefcae | 308 | writedata(0xC0); |
skydarc | 2:2946f9eefcae | 309 | } |
skydarc | 2:2946f9eefcae | 310 | |
skydarc | 2:2946f9eefcae | 311 | tabcolor = options; |
skydarc | 2:2946f9eefcae | 312 | } |
skydarc | 2:2946f9eefcae | 313 | |
skydarc | 2:2946f9eefcae | 314 | void ST7735::setAddrWindow(uint8_t x0, uint8_t y0, uint8_t x1, |
skydarc | 2:2946f9eefcae | 315 | uint8_t y1) |
skydarc | 2:2946f9eefcae | 316 | { |
skydarc | 2:2946f9eefcae | 317 | |
skydarc | 2:2946f9eefcae | 318 | writecommand(ST7735_CASET); // Column addr set |
skydarc | 2:2946f9eefcae | 319 | writedata(0x00); |
skydarc | 2:2946f9eefcae | 320 | writedata(x0+xstart); // XSTART |
skydarc | 2:2946f9eefcae | 321 | writedata(0x00); |
skydarc | 2:2946f9eefcae | 322 | writedata(x1+xstart); // XEND |
skydarc | 2:2946f9eefcae | 323 | |
skydarc | 2:2946f9eefcae | 324 | writecommand(ST7735_RASET); // Row addr set |
skydarc | 2:2946f9eefcae | 325 | writedata(0x00); |
skydarc | 2:2946f9eefcae | 326 | writedata(y0+ystart); // YSTART |
skydarc | 2:2946f9eefcae | 327 | writedata(0x00); |
skydarc | 2:2946f9eefcae | 328 | writedata(y1+ystart); // YEND |
skydarc | 2:2946f9eefcae | 329 | |
skydarc | 2:2946f9eefcae | 330 | writecommand(ST7735_RAMWR); // write to RAM |
skydarc | 2:2946f9eefcae | 331 | } |
skydarc | 2:2946f9eefcae | 332 | |
skydarc | 2:2946f9eefcae | 333 | void ST7735::pushColor(uint16_t color) |
skydarc | 2:2946f9eefcae | 334 | { |
skydarc | 2:2946f9eefcae | 335 | _rs = 1; |
skydarc | 2:2946f9eefcae | 336 | _cs = 0; |
skydarc | 2:2946f9eefcae | 337 | |
skydarc | 2:2946f9eefcae | 338 | lcdPort.write( color >> 8 ); |
skydarc | 2:2946f9eefcae | 339 | lcdPort.write( color ); |
skydarc | 2:2946f9eefcae | 340 | _cs = 1; |
skydarc | 2:2946f9eefcae | 341 | } |
skydarc | 2:2946f9eefcae | 342 | |
skydarc | 2:2946f9eefcae | 343 | |
skydarc | 2:2946f9eefcae | 344 | void ST7735::drawPixel(int16_t x, int16_t y, uint16_t color) |
skydarc | 2:2946f9eefcae | 345 | { |
skydarc | 2:2946f9eefcae | 346 | |
skydarc | 2:2946f9eefcae | 347 | if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return; |
skydarc | 2:2946f9eefcae | 348 | |
skydarc | 2:2946f9eefcae | 349 | setAddrWindow(x,y,x+1,y+1); |
skydarc | 2:2946f9eefcae | 350 | |
skydarc | 2:2946f9eefcae | 351 | _rs = 1; |
skydarc | 2:2946f9eefcae | 352 | _cs = 0; |
skydarc | 2:2946f9eefcae | 353 | |
skydarc | 2:2946f9eefcae | 354 | lcdPort.write( color >> 8 ); |
skydarc | 2:2946f9eefcae | 355 | lcdPort.write( color ); |
skydarc | 2:2946f9eefcae | 356 | |
skydarc | 2:2946f9eefcae | 357 | _cs = 1; |
skydarc | 2:2946f9eefcae | 358 | } |
skydarc | 2:2946f9eefcae | 359 | |
skydarc | 2:2946f9eefcae | 360 | |
skydarc | 2:2946f9eefcae | 361 | void ST7735::drawFastVLine(int16_t x, int16_t y, int16_t h, |
skydarc | 2:2946f9eefcae | 362 | uint16_t color) |
skydarc | 2:2946f9eefcae | 363 | { |
skydarc | 2:2946f9eefcae | 364 | |
skydarc | 2:2946f9eefcae | 365 | // Rudimentary clipping |
skydarc | 2:2946f9eefcae | 366 | if((x >= _width) || (y >= _height)) return; |
skydarc | 2:2946f9eefcae | 367 | if((y+h-1) >= _height) h = _height-y; |
skydarc | 2:2946f9eefcae | 368 | setAddrWindow(x, y, x, y+h-1); |
skydarc | 2:2946f9eefcae | 369 | |
skydarc | 2:2946f9eefcae | 370 | uint8_t hi = color >> 8, lo = color; |
skydarc | 2:2946f9eefcae | 371 | _rs = 1; |
skydarc | 2:2946f9eefcae | 372 | _cs = 0; |
skydarc | 2:2946f9eefcae | 373 | while (h--) { |
skydarc | 2:2946f9eefcae | 374 | lcdPort.write( hi ); |
skydarc | 2:2946f9eefcae | 375 | lcdPort.write( lo ); |
skydarc | 2:2946f9eefcae | 376 | } |
skydarc | 2:2946f9eefcae | 377 | _cs = 1; |
skydarc | 2:2946f9eefcae | 378 | } |
skydarc | 2:2946f9eefcae | 379 | |
skydarc | 2:2946f9eefcae | 380 | |
skydarc | 2:2946f9eefcae | 381 | void ST7735::drawFastHLine(int16_t x, int16_t y, int16_t w, |
skydarc | 2:2946f9eefcae | 382 | uint16_t color) |
skydarc | 2:2946f9eefcae | 383 | { |
skydarc | 2:2946f9eefcae | 384 | |
skydarc | 2:2946f9eefcae | 385 | // Rudimentary clipping |
skydarc | 2:2946f9eefcae | 386 | if((x >= _width) || (y >= _height)) return; |
skydarc | 2:2946f9eefcae | 387 | if((x+w-1) >= _width) w = _width-x; |
skydarc | 2:2946f9eefcae | 388 | setAddrWindow(x, y, x+w-1, y); |
skydarc | 2:2946f9eefcae | 389 | |
skydarc | 2:2946f9eefcae | 390 | uint8_t hi = color >> 8, lo = color; |
skydarc | 2:2946f9eefcae | 391 | _rs = 1; |
skydarc | 2:2946f9eefcae | 392 | _cs = 0; |
skydarc | 2:2946f9eefcae | 393 | while (w--) { |
skydarc | 2:2946f9eefcae | 394 | lcdPort.write( hi ); |
skydarc | 2:2946f9eefcae | 395 | lcdPort.write( lo ); |
skydarc | 2:2946f9eefcae | 396 | } |
skydarc | 2:2946f9eefcae | 397 | _cs = 1; |
skydarc | 2:2946f9eefcae | 398 | } |
skydarc | 2:2946f9eefcae | 399 | |
skydarc | 2:2946f9eefcae | 400 | |
skydarc | 2:2946f9eefcae | 401 | |
skydarc | 2:2946f9eefcae | 402 | void ST7735::fillScreen(uint16_t color) |
skydarc | 2:2946f9eefcae | 403 | { |
skydarc | 2:2946f9eefcae | 404 | fillRect(-10, -10, _width+20, _height+20, color); |
skydarc | 2:2946f9eefcae | 405 | } |
skydarc | 2:2946f9eefcae | 406 | |
skydarc | 2:2946f9eefcae | 407 | |
skydarc | 2:2946f9eefcae | 408 | // fill a rectangle |
skydarc | 2:2946f9eefcae | 409 | void ST7735::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, |
skydarc | 2:2946f9eefcae | 410 | uint16_t color) |
skydarc | 2:2946f9eefcae | 411 | { |
skydarc | 2:2946f9eefcae | 412 | |
skydarc | 2:2946f9eefcae | 413 | // rudimentary clipping (drawChar w/big text requires this) |
skydarc | 2:2946f9eefcae | 414 | if((x >= _width) || (y >= _height)) return; |
skydarc | 2:2946f9eefcae | 415 | if((x + w - 1) >= _width) w = _width - x; |
skydarc | 2:2946f9eefcae | 416 | if((y + h - 1) >= _height) h = _height - y; |
skydarc | 2:2946f9eefcae | 417 | |
skydarc | 2:2946f9eefcae | 418 | setAddrWindow(x, y, x+w-1, y+h-1); |
skydarc | 2:2946f9eefcae | 419 | |
skydarc | 2:2946f9eefcae | 420 | uint8_t hi = color >> 8, lo = color; |
skydarc | 2:2946f9eefcae | 421 | _rs = 1; |
skydarc | 2:2946f9eefcae | 422 | _cs = 0; |
skydarc | 2:2946f9eefcae | 423 | for(y=h; y>0; y--) { |
skydarc | 2:2946f9eefcae | 424 | for(x=w; x>0; x--) { |
skydarc | 2:2946f9eefcae | 425 | lcdPort.write( hi ); |
skydarc | 2:2946f9eefcae | 426 | lcdPort.write( lo ); |
skydarc | 2:2946f9eefcae | 427 | } |
skydarc | 2:2946f9eefcae | 428 | } |
skydarc | 2:2946f9eefcae | 429 | |
skydarc | 2:2946f9eefcae | 430 | _cs = 1; |
skydarc | 2:2946f9eefcae | 431 | } |
skydarc | 2:2946f9eefcae | 432 | |
skydarc | 2:2946f9eefcae | 433 | |
skydarc | 2:2946f9eefcae | 434 | // Pass 8-bit (each) R,G,B, get back 16-bit packed color |
skydarc | 2:2946f9eefcae | 435 | uint16_t ST7735::Color565(uint8_t r, uint8_t g, uint8_t b) |
skydarc | 2:2946f9eefcae | 436 | { |
skydarc | 2:2946f9eefcae | 437 | return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); |
skydarc | 2:2946f9eefcae | 438 | } |
skydarc | 2:2946f9eefcae | 439 | |
skydarc | 2:2946f9eefcae | 440 | // Pass 8-bit (each) R,G,B, get back 16-bit packed color |
skydarc | 2:2946f9eefcae | 441 | char* ST7735::Color565string(uint8_t r, uint8_t g, uint8_t b) |
skydarc | 2:2946f9eefcae | 442 | { |
skydarc | 2:2946f9eefcae | 443 | uint16_t color; |
skydarc | 2:2946f9eefcae | 444 | char colorString[4]; |
skydarc | 2:2946f9eefcae | 445 | |
skydarc | 2:2946f9eefcae | 446 | color = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); |
skydarc | 2:2946f9eefcae | 447 | |
skydarc | 2:2946f9eefcae | 448 | sprintf(colorString, "%04x", color); |
skydarc | 2:2946f9eefcae | 449 | |
skydarc | 2:2946f9eefcae | 450 | //output1.printf("0x%04x : %s\n", color, colorString); |
skydarc | 2:2946f9eefcae | 451 | |
skydarc | 2:2946f9eefcae | 452 | return colorString; |
skydarc | 2:2946f9eefcae | 453 | //return "test"; |
skydarc | 2:2946f9eefcae | 454 | } |
skydarc | 2:2946f9eefcae | 455 | |
skydarc | 2:2946f9eefcae | 456 | |
skydarc | 2:2946f9eefcae | 457 | #define MADCTL_MY 0x80 |
skydarc | 2:2946f9eefcae | 458 | #define MADCTL_MX 0x40 |
skydarc | 2:2946f9eefcae | 459 | #define MADCTL_MV 0x20 |
skydarc | 2:2946f9eefcae | 460 | #define MADCTL_ML 0x10 |
skydarc | 2:2946f9eefcae | 461 | #define MADCTL_RGB 0x00 |
skydarc | 2:2946f9eefcae | 462 | #define MADCTL_BGR 0x08 |
skydarc | 2:2946f9eefcae | 463 | #define MADCTL_MH 0x04 |
skydarc | 2:2946f9eefcae | 464 | |
skydarc | 2:2946f9eefcae | 465 | void ST7735::setRotation(uint8_t m) { |
skydarc | 2:2946f9eefcae | 466 | _orientation = m; |
skydarc | 2:2946f9eefcae | 467 | writecommand(ST7735_MADCTL); |
skydarc | 2:2946f9eefcae | 468 | rotation = m % 4; // can't be higher than 3 |
skydarc | 2:2946f9eefcae | 469 | switch (rotation) { |
skydarc | 2:2946f9eefcae | 470 | case 0: |
skydarc | 2:2946f9eefcae | 471 | if ((tabcolor == INITR_BLACKTAB) || (tabcolor == INITR_MINI160x80)) { |
skydarc | 2:2946f9eefcae | 472 | writedata(MADCTL_MX | MADCTL_MY | MADCTL_RGB); |
skydarc | 2:2946f9eefcae | 473 | } else if (tabcolor == INITR_MINI160x80_RS) { |
skydarc | 2:2946f9eefcae | 474 | writedata(MADCTL_MX | MADCTL_MY | MADCTL_BGR); |
skydarc | 2:2946f9eefcae | 475 | } else { |
skydarc | 2:2946f9eefcae | 476 | writedata(MADCTL_MX | MADCTL_MY | MADCTL_BGR); |
skydarc | 2:2946f9eefcae | 477 | } |
skydarc | 2:2946f9eefcae | 478 | |
skydarc | 2:2946f9eefcae | 479 | if (tabcolor == INITR_144GREENTAB) { |
skydarc | 2:2946f9eefcae | 480 | _height = ST7735_TFTHEIGHT_128; |
skydarc | 2:2946f9eefcae | 481 | _width = ST7735_TFTWIDTH_128; |
skydarc | 2:2946f9eefcae | 482 | } else if ((tabcolor == INITR_MINI160x80) || (tabcolor == INITR_MINI160x80_RS)) { |
skydarc | 2:2946f9eefcae | 483 | _height = ST7735_TFTHEIGHT_160; |
skydarc | 2:2946f9eefcae | 484 | _width = ST7735_TFTWIDTH_80; |
skydarc | 2:2946f9eefcae | 485 | } else { |
skydarc | 2:2946f9eefcae | 486 | _height = ST7735_TFTHEIGHT_160; |
skydarc | 2:2946f9eefcae | 487 | _width = ST7735_TFTWIDTH_128; |
skydarc | 2:2946f9eefcae | 488 | } |
skydarc | 2:2946f9eefcae | 489 | xstart = colstart; |
skydarc | 2:2946f9eefcae | 490 | ystart = rowstart; |
skydarc | 2:2946f9eefcae | 491 | break; |
skydarc | 2:2946f9eefcae | 492 | case 1: |
skydarc | 2:2946f9eefcae | 493 | if ((tabcolor == INITR_BLACKTAB) || (tabcolor == INITR_MINI160x80)) { |
skydarc | 2:2946f9eefcae | 494 | writedata(MADCTL_MY | MADCTL_MV | MADCTL_RGB); |
skydarc | 2:2946f9eefcae | 495 | } else if (tabcolor == INITR_MINI160x80_RS) { |
skydarc | 2:2946f9eefcae | 496 | writedata(MADCTL_MY | MADCTL_MV | MADCTL_BGR); |
skydarc | 2:2946f9eefcae | 497 | } else { |
skydarc | 2:2946f9eefcae | 498 | writedata(MADCTL_MY | MADCTL_MV | MADCTL_BGR); |
skydarc | 2:2946f9eefcae | 499 | } |
skydarc | 2:2946f9eefcae | 500 | |
skydarc | 2:2946f9eefcae | 501 | if (tabcolor == INITR_144GREENTAB) { |
skydarc | 2:2946f9eefcae | 502 | _width = ST7735_TFTHEIGHT_128; |
skydarc | 2:2946f9eefcae | 503 | _height = ST7735_TFTWIDTH_128; |
skydarc | 2:2946f9eefcae | 504 | } else if ((tabcolor == INITR_MINI160x80) || (tabcolor == INITR_MINI160x80_RS)) { |
skydarc | 2:2946f9eefcae | 505 | _width = ST7735_TFTHEIGHT_160; |
skydarc | 2:2946f9eefcae | 506 | _height = ST7735_TFTWIDTH_80; |
skydarc | 2:2946f9eefcae | 507 | } else { |
skydarc | 2:2946f9eefcae | 508 | _width = ST7735_TFTHEIGHT_160; |
skydarc | 2:2946f9eefcae | 509 | _height = ST7735_TFTWIDTH_128; |
skydarc | 2:2946f9eefcae | 510 | } |
skydarc | 2:2946f9eefcae | 511 | ystart = colstart; |
skydarc | 2:2946f9eefcae | 512 | xstart = rowstart; |
skydarc | 2:2946f9eefcae | 513 | break; |
skydarc | 2:2946f9eefcae | 514 | case 2: |
skydarc | 2:2946f9eefcae | 515 | if ((tabcolor == INITR_BLACKTAB) || (tabcolor == INITR_MINI160x80)) { |
skydarc | 2:2946f9eefcae | 516 | writedata(MADCTL_RGB); |
skydarc | 2:2946f9eefcae | 517 | } else if (tabcolor == INITR_MINI160x80_RS) { |
skydarc | 2:2946f9eefcae | 518 | writedata(MADCTL_BGR); |
skydarc | 2:2946f9eefcae | 519 | } else { |
skydarc | 2:2946f9eefcae | 520 | writedata(MADCTL_BGR); |
skydarc | 2:2946f9eefcae | 521 | } |
skydarc | 2:2946f9eefcae | 522 | |
skydarc | 2:2946f9eefcae | 523 | if (tabcolor == INITR_144GREENTAB) { |
skydarc | 2:2946f9eefcae | 524 | _height = ST7735_TFTHEIGHT_128; |
skydarc | 2:2946f9eefcae | 525 | _width = ST7735_TFTWIDTH_128; |
skydarc | 2:2946f9eefcae | 526 | } else if ((tabcolor == INITR_MINI160x80) || (tabcolor == INITR_MINI160x80_RS)) { |
skydarc | 2:2946f9eefcae | 527 | _height = ST7735_TFTHEIGHT_160; |
skydarc | 2:2946f9eefcae | 528 | _width = ST7735_TFTWIDTH_80; |
skydarc | 2:2946f9eefcae | 529 | } else { |
skydarc | 2:2946f9eefcae | 530 | _height = ST7735_TFTHEIGHT_160; |
skydarc | 2:2946f9eefcae | 531 | _width = ST7735_TFTWIDTH_128; |
skydarc | 2:2946f9eefcae | 532 | } |
skydarc | 2:2946f9eefcae | 533 | xstart = colstart; |
skydarc | 2:2946f9eefcae | 534 | ystart = rowstart; |
skydarc | 2:2946f9eefcae | 535 | break; |
skydarc | 2:2946f9eefcae | 536 | case 3: |
skydarc | 2:2946f9eefcae | 537 | if ((tabcolor == INITR_BLACKTAB) || (tabcolor == INITR_MINI160x80)) { |
skydarc | 2:2946f9eefcae | 538 | writedata(MADCTL_MX | MADCTL_MV | MADCTL_RGB); |
skydarc | 2:2946f9eefcae | 539 | } else if (tabcolor == INITR_MINI160x80_RS) { |
skydarc | 2:2946f9eefcae | 540 | writedata(MADCTL_MX | MADCTL_MV | MADCTL_BGR); |
skydarc | 2:2946f9eefcae | 541 | } else { |
skydarc | 2:2946f9eefcae | 542 | writedata(MADCTL_MX | MADCTL_MV | MADCTL_BGR); |
skydarc | 2:2946f9eefcae | 543 | } |
skydarc | 2:2946f9eefcae | 544 | |
skydarc | 2:2946f9eefcae | 545 | if (tabcolor == INITR_144GREENTAB) { |
skydarc | 2:2946f9eefcae | 546 | _width = ST7735_TFTHEIGHT_128; |
skydarc | 2:2946f9eefcae | 547 | _height = ST7735_TFTWIDTH_128; |
skydarc | 2:2946f9eefcae | 548 | } else if ((tabcolor == INITR_MINI160x80) || (tabcolor == INITR_MINI160x80_RS)) { |
skydarc | 2:2946f9eefcae | 549 | _width = ST7735_TFTHEIGHT_160; |
skydarc | 2:2946f9eefcae | 550 | _height = ST7735_TFTWIDTH_80; |
skydarc | 2:2946f9eefcae | 551 | } else { |
skydarc | 2:2946f9eefcae | 552 | _width = ST7735_TFTHEIGHT_160; |
skydarc | 2:2946f9eefcae | 553 | _height = ST7735_TFTWIDTH_128; |
skydarc | 2:2946f9eefcae | 554 | } |
skydarc | 2:2946f9eefcae | 555 | ystart = colstart; |
skydarc | 2:2946f9eefcae | 556 | xstart = rowstart; |
skydarc | 2:2946f9eefcae | 557 | break; |
skydarc | 2:2946f9eefcae | 558 | } |
skydarc | 2:2946f9eefcae | 559 | } |
skydarc | 2:2946f9eefcae | 560 | |
skydarc | 2:2946f9eefcae | 561 | void ST7735::invertDisplay(boolean i) |
skydarc | 2:2946f9eefcae | 562 | { |
skydarc | 2:2946f9eefcae | 563 | writecommand(i ? ST7735_INVON : ST7735_INVOFF); |
skydarc | 2:2946f9eefcae | 564 | } |
skydarc | 2:2946f9eefcae | 565 | |
skydarc | 2:2946f9eefcae | 566 | void ST7735::DrawBMP(int offsetx, int offsety, FILE *Image) |
skydarc | 2:2946f9eefcae | 567 | { |
skydarc | 2:2946f9eefcae | 568 | uint32_t index = 0, width = 0, height = 0; |
skydarc | 2:2946f9eefcae | 569 | int i=0, x, y, byteCour; |
skydarc | 2:2946f9eefcae | 570 | |
skydarc | 2:2946f9eefcae | 571 | int fpOffset = ftell(Image); |
skydarc | 2:2946f9eefcae | 572 | //output1.printf("current cursor : %02x\n", ftell(Image)); |
skydarc | 2:2946f9eefcae | 573 | //output1.printf("first bytes bmp : %02x\n", fgetc(Image)); |
skydarc | 2:2946f9eefcae | 574 | |
skydarc | 2:2946f9eefcae | 575 | /* Get bitmap data address offset */ |
skydarc | 2:2946f9eefcae | 576 | fseek(Image, 10+fpOffset , SEEK_SET ); |
skydarc | 2:2946f9eefcae | 577 | index = fgetc(Image); |
skydarc | 2:2946f9eefcae | 578 | //output1.printf("index : 0x%02x ; ", index); |
skydarc | 2:2946f9eefcae | 579 | |
skydarc | 2:2946f9eefcae | 580 | /* Read bitmap width */ |
skydarc | 2:2946f9eefcae | 581 | fseek(Image, 18+fpOffset , SEEK_SET ); |
skydarc | 2:2946f9eefcae | 582 | width = fgetc(Image); |
skydarc | 2:2946f9eefcae | 583 | width += fgetc(Image)<<8; |
skydarc | 2:2946f9eefcae | 584 | width += fgetc(Image)<<16; |
skydarc | 2:2946f9eefcae | 585 | width += fgetc(Image)<<24; |
skydarc | 2:2946f9eefcae | 586 | //output1.printf("width : %d ; ", width); |
skydarc | 2:2946f9eefcae | 587 | |
skydarc | 2:2946f9eefcae | 588 | /* Read bitmap height */ |
skydarc | 2:2946f9eefcae | 589 | fseek(Image, 22+fpOffset , SEEK_SET ); |
skydarc | 2:2946f9eefcae | 590 | height = fgetc(Image); |
skydarc | 2:2946f9eefcae | 591 | height += fgetc(Image)<<8; |
skydarc | 2:2946f9eefcae | 592 | height += fgetc(Image)<<16; |
skydarc | 2:2946f9eefcae | 593 | height += fgetc(Image)<<24; |
skydarc | 2:2946f9eefcae | 594 | //output1.printf("height : %d\n", height); |
skydarc | 2:2946f9eefcae | 595 | |
skydarc | 2:2946f9eefcae | 596 | fseek(Image, index+fpOffset , SEEK_SET ); |
skydarc | 2:2946f9eefcae | 597 | |
skydarc | 2:2946f9eefcae | 598 | byteCour = fgetc(Image); |
skydarc | 2:2946f9eefcae | 599 | byteCour += fgetc(Image)<<8; |
skydarc | 2:2946f9eefcae | 600 | |
skydarc | 2:2946f9eefcae | 601 | for (y = height+offsety; offsety < y; y--) { |
skydarc | 2:2946f9eefcae | 602 | setAddrWindow(offsetx, y, offsetx+width-1, y); |
skydarc | 2:2946f9eefcae | 603 | _rs = 1; |
skydarc | 2:2946f9eefcae | 604 | _cs = 0; |
skydarc | 2:2946f9eefcae | 605 | |
skydarc | 2:2946f9eefcae | 606 | for (x = 0; x < width; x++) { |
skydarc | 2:2946f9eefcae | 607 | if(x == width-1) fseek(Image, width%2, SEEK_CUR); |
skydarc | 2:2946f9eefcae | 608 | |
skydarc | 2:2946f9eefcae | 609 | if(x <= width && y >= 0) { |
skydarc | 2:2946f9eefcae | 610 | lcdPort.write(byteCour>>8); // one line |
skydarc | 2:2946f9eefcae | 611 | lcdPort.write(byteCour); |
skydarc | 2:2946f9eefcae | 612 | } |
skydarc | 2:2946f9eefcae | 613 | _cs = 1; |
skydarc | 2:2946f9eefcae | 614 | byteCour = fgetc(Image); |
skydarc | 2:2946f9eefcae | 615 | byteCour += fgetc(Image)<<8; |
skydarc | 2:2946f9eefcae | 616 | _cs = 0; |
skydarc | 2:2946f9eefcae | 617 | } |
skydarc | 2:2946f9eefcae | 618 | } |
skydarc | 2:2946f9eefcae | 619 | _cs = 1; |
skydarc | 2:2946f9eefcae | 620 | } |
skydarc | 2:2946f9eefcae | 621 | |
skydarc | 2:2946f9eefcae | 622 | // use imageconverter565.exe to generate bitmap array and put it in bitmap.c |
skydarc | 2:2946f9eefcae | 623 | void ST7735::DrawRam(unsigned int x, unsigned int y, unsigned int w, unsigned int h, int *Image) { |
skydarc | 2:2946f9eefcae | 624 | unsigned int i,j; |
skydarc | 2:2946f9eefcae | 625 | setAddrWindow(x, y, x+w-1, y+h); |
skydarc | 2:2946f9eefcae | 626 | _rs = 1; |
skydarc | 2:2946f9eefcae | 627 | _cs = 0; |
skydarc | 2:2946f9eefcae | 628 | for (j = 0; j < h; j++) { //Lines |
skydarc | 2:2946f9eefcae | 629 | for (i = 0; i < w; i++) { // copy pixel data to TFT |
skydarc | 2:2946f9eefcae | 630 | lcdPort.write(*Image>>8); // one line |
skydarc | 2:2946f9eefcae | 631 | lcdPort.write(*Image); |
skydarc | 2:2946f9eefcae | 632 | *Image++; |
skydarc | 2:2946f9eefcae | 633 | } |
skydarc | 2:2946f9eefcae | 634 | } |
skydarc | 2:2946f9eefcae | 635 | _cs = 1; |
skydarc | 2:2946f9eefcae | 636 | } |
skydarc | 2:2946f9eefcae | 637 | |
skydarc | 2:2946f9eefcae | 638 | void ST7735::DrawGIF(int offsetx, int offsety, FILE *Image) { |
skydarc | 2:2946f9eefcae | 639 | |
skydarc | 2:2946f9eefcae | 640 | uint32_t width = 0, height = 0; |
skydarc | 2:2946f9eefcae | 641 | uint16_t code, preCode, clearCode, endCode, sizePalette; |
skydarc | 2:2946f9eefcae | 642 | uint8_t r, v, b, pxl, pxls[256]; |
skydarc | 2:2946f9eefcae | 643 | int i, j; |
skydarc | 2:2946f9eefcae | 644 | int fpOffset = ftell(Image); |
skydarc | 2:2946f9eefcae | 645 | |
skydarc | 2:2946f9eefcae | 646 | // palette |
skydarc | 2:2946f9eefcae | 647 | uint16_t table[750][17]; |
skydarc | 2:2946f9eefcae | 648 | for(int i = 0; i < 750; i++) |
skydarc | 2:2946f9eefcae | 649 | for(int j = 0; j < 17; j++) |
skydarc | 2:2946f9eefcae | 650 | table[i][j] = NULL; |
skydarc | 2:2946f9eefcae | 651 | |
skydarc | 2:2946f9eefcae | 652 | // Read bitmap width |
skydarc | 2:2946f9eefcae | 653 | fseek(Image, 6+fpOffset , SEEK_SET ); |
skydarc | 2:2946f9eefcae | 654 | width = fgetc(Image); |
skydarc | 2:2946f9eefcae | 655 | width += fgetc(Image); |
skydarc | 2:2946f9eefcae | 656 | //output1.printf("width : %d ; ", width); |
skydarc | 2:2946f9eefcae | 657 | |
skydarc | 2:2946f9eefcae | 658 | // Read bitmap height |
skydarc | 2:2946f9eefcae | 659 | fseek(Image, 8+fpOffset , SEEK_SET ); |
skydarc | 2:2946f9eefcae | 660 | height = fgetc(Image); |
skydarc | 2:2946f9eefcae | 661 | height += fgetc(Image); |
skydarc | 2:2946f9eefcae | 662 | //output1.printf("height : %d\n", height); |
skydarc | 2:2946f9eefcae | 663 | |
skydarc | 2:2946f9eefcae | 664 | // Get size of palette |
skydarc | 2:2946f9eefcae | 665 | fseek(Image, 10+fpOffset , SEEK_SET ); |
skydarc | 2:2946f9eefcae | 666 | sizePalette = fgetc(Image)<<5; |
skydarc | 2:2946f9eefcae | 667 | sizePalette = ((uint8_t) sizePalette)>>5; |
skydarc | 2:2946f9eefcae | 668 | sizePalette = pow(2, sizePalette+1.0); |
skydarc | 2:2946f9eefcae | 669 | |
skydarc | 2:2946f9eefcae | 670 | // Get palette |
skydarc | 2:2946f9eefcae | 671 | uint16_t palette[sizePalette]; |
skydarc | 2:2946f9eefcae | 672 | fseek(Image, 13+fpOffset , SEEK_SET ); |
skydarc | 2:2946f9eefcae | 673 | for(i=0; i < sizePalette; i++) { |
skydarc | 2:2946f9eefcae | 674 | r = fgetc(Image); |
skydarc | 2:2946f9eefcae | 675 | v = fgetc(Image); |
skydarc | 2:2946f9eefcae | 676 | b = fgetc(Image); |
skydarc | 2:2946f9eefcae | 677 | |
skydarc | 2:2946f9eefcae | 678 | // palette simple |
skydarc | 2:2946f9eefcae | 679 | palette[i] = Color565(r, v, b); |
skydarc | 2:2946f9eefcae | 680 | table[i][0] = 1;table[i][1] = i; |
skydarc | 2:2946f9eefcae | 681 | } |
skydarc | 2:2946f9eefcae | 682 | |
skydarc | 2:2946f9eefcae | 683 | preCode = i; |
skydarc | 2:2946f9eefcae | 684 | table[i][0] = i; |
skydarc | 2:2946f9eefcae | 685 | clearCode = i; |
skydarc | 2:2946f9eefcae | 686 | table[i+1][0] = i+1; |
skydarc | 2:2946f9eefcae | 687 | endCode = i+1; |
skydarc | 2:2946f9eefcae | 688 | |
skydarc | 2:2946f9eefcae | 689 | // Find Image separator |
skydarc | 2:2946f9eefcae | 690 | while(1) { |
skydarc | 2:2946f9eefcae | 691 | pxl = fgetc(Image); |
skydarc | 2:2946f9eefcae | 692 | if(0x2C == pxl) break; |
skydarc | 2:2946f9eefcae | 693 | } |
skydarc | 2:2946f9eefcae | 694 | |
skydarc | 2:2946f9eefcae | 695 | // Get minimal size of code |
skydarc | 2:2946f9eefcae | 696 | fseek(Image, 9 , SEEK_CUR ); |
skydarc | 2:2946f9eefcae | 697 | uint8_t sizeCode = fgetc(Image);sizeCode++; |
skydarc | 2:2946f9eefcae | 698 | |
skydarc | 2:2946f9eefcae | 699 | // Get size of block |
skydarc | 2:2946f9eefcae | 700 | uint8_t sizeBlock = fgetc(Image); |
skydarc | 2:2946f9eefcae | 701 | output1.printf("taille du block : %d\n", sizeBlock); |
skydarc | 2:2946f9eefcae | 702 | |
skydarc | 2:2946f9eefcae | 703 | setAddrWindow(offsetx, offsety, offsetx+width-1, offsety+height); |
skydarc | 2:2946f9eefcae | 704 | _rs = 1; |
skydarc | 2:2946f9eefcae | 705 | _cs = 0; |
skydarc | 2:2946f9eefcae | 706 | |
skydarc | 2:2946f9eefcae | 707 | // image data |
skydarc | 2:2946f9eefcae | 708 | uint16_t imgByte = fgetc(Image); |
skydarc | 2:2946f9eefcae | 709 | int sizeImgByte = 8; |
skydarc | 2:2946f9eefcae | 710 | int16_t index = sizePalette; |
skydarc | 2:2946f9eefcae | 711 | for(i=0; i < sizeBlock; ) { |
skydarc | 2:2946f9eefcae | 712 | |
skydarc | 2:2946f9eefcae | 713 | // ajout d'un octet pour le calcul du prochain code |
skydarc | 2:2946f9eefcae | 714 | while(sizeImgByte < sizeCode) { |
skydarc | 2:2946f9eefcae | 715 | pxl = fgetc(Image); |
skydarc | 2:2946f9eefcae | 716 | i++; |
skydarc | 2:2946f9eefcae | 717 | if(sizeBlock == 0xff && i == sizeBlock) { |
skydarc | 2:2946f9eefcae | 718 | i = 0; |
skydarc | 2:2946f9eefcae | 719 | sizeBlock = pxl; |
skydarc | 2:2946f9eefcae | 720 | pxl = fgetc(Image); |
skydarc | 2:2946f9eefcae | 721 | } |
skydarc | 2:2946f9eefcae | 722 | imgByte = (pxl<<(sizeImgByte)) + bitExtracted(imgByte, sizeImgByte, 1); |
skydarc | 2:2946f9eefcae | 723 | sizeImgByte += 8; |
skydarc | 2:2946f9eefcae | 724 | } |
skydarc | 2:2946f9eefcae | 725 | |
skydarc | 2:2946f9eefcae | 726 | // extraction du code |
skydarc | 2:2946f9eefcae | 727 | code = bitExtracted(imgByte, sizeCode, 1); |
skydarc | 2:2946f9eefcae | 728 | |
skydarc | 2:2946f9eefcae | 729 | //output1.printf(">%03x; %03x; %03x; ", code, preCode, index); |
skydarc | 2:2946f9eefcae | 730 | |
skydarc | 2:2946f9eefcae | 731 | ////////////////////// |
skydarc | 2:2946f9eefcae | 732 | // traitement image // |
skydarc | 2:2946f9eefcae | 733 | ////////////////////// |
skydarc | 2:2946f9eefcae | 734 | |
skydarc | 2:2946f9eefcae | 735 | if(code == clearCode) index = sizePalette; |
skydarc | 2:2946f9eefcae | 736 | else if(code == endCode) break; |
skydarc | 2:2946f9eefcae | 737 | else { |
skydarc | 2:2946f9eefcae | 738 | |
skydarc | 2:2946f9eefcae | 739 | // sauf si premier code : chargement du "pixel string" du precode |
skydarc | 2:2946f9eefcae | 740 | if(preCode != clearCode){ |
skydarc | 2:2946f9eefcae | 741 | for(j=0; j < table[preCode][0];j++) |
skydarc | 2:2946f9eefcae | 742 | pxls[j] = table[preCode][j+1]; |
skydarc | 2:2946f9eefcae | 743 | } |
skydarc | 2:2946f9eefcae | 744 | |
skydarc | 2:2946f9eefcae | 745 | // si code connu : |
skydarc | 2:2946f9eefcae | 746 | if(code < index) { |
skydarc | 2:2946f9eefcae | 747 | |
skydarc | 2:2946f9eefcae | 748 | for(int k=1; k <= table[code][0];k++) { |
skydarc | 2:2946f9eefcae | 749 | if(k==1) pxls[j] = table[code][k]; |
skydarc | 2:2946f9eefcae | 750 | |
skydarc | 2:2946f9eefcae | 751 | lcdPort.write((uint8_t) (palette[ table[code][k] ]>>8)); |
skydarc | 2:2946f9eefcae | 752 | lcdPort.write((uint8_t) palette[ table[code][k] ]); |
skydarc | 2:2946f9eefcae | 753 | } |
skydarc | 2:2946f9eefcae | 754 | |
skydarc | 2:2946f9eefcae | 755 | for(int k=1; k <= j+1; k++) |
skydarc | 2:2946f9eefcae | 756 | table[index][k] = pxls[k-1]; |
skydarc | 2:2946f9eefcae | 757 | |
skydarc | 2:2946f9eefcae | 758 | table[index][0] = j+1; |
skydarc | 2:2946f9eefcae | 759 | |
skydarc | 2:2946f9eefcae | 760 | |
skydarc | 2:2946f9eefcae | 761 | } else { |
skydarc | 2:2946f9eefcae | 762 | |
skydarc | 2:2946f9eefcae | 763 | // add new stream pixel in palette and display |
skydarc | 2:2946f9eefcae | 764 | pxl = pxls[0]; |
skydarc | 2:2946f9eefcae | 765 | pxls[j] = pxl; |
skydarc | 2:2946f9eefcae | 766 | for(int k=1; k <= j+1; k++) { |
skydarc | 2:2946f9eefcae | 767 | table[index][k] = pxls[k-1]; |
skydarc | 2:2946f9eefcae | 768 | |
skydarc | 2:2946f9eefcae | 769 | lcdPort.write((uint8_t) (palette[ pxls[k-1] ]>>8)); |
skydarc | 2:2946f9eefcae | 770 | lcdPort.write((uint8_t) palette[ pxls[k-1] ]); |
skydarc | 2:2946f9eefcae | 771 | |
skydarc | 2:2946f9eefcae | 772 | } |
skydarc | 2:2946f9eefcae | 773 | table[index][0] = j+1; |
skydarc | 2:2946f9eefcae | 774 | } |
skydarc | 2:2946f9eefcae | 775 | |
skydarc | 2:2946f9eefcae | 776 | // clear buffer string |
skydarc | 2:2946f9eefcae | 777 | for(int k=0; k < 256; k++) pxls[k] = 0; |
skydarc | 2:2946f9eefcae | 778 | } |
skydarc | 2:2946f9eefcae | 779 | |
skydarc | 2:2946f9eefcae | 780 | preCode = code; |
skydarc | 2:2946f9eefcae | 781 | |
skydarc | 2:2946f9eefcae | 782 | // to compute next code |
skydarc | 2:2946f9eefcae | 783 | sizeImgByte -= sizeCode; |
skydarc | 2:2946f9eefcae | 784 | imgByte = bitExtracted(imgByte, sizeImgByte, sizeCode+1); |
skydarc | 2:2946f9eefcae | 785 | |
skydarc | 2:2946f9eefcae | 786 | if( index == (pow(2, sizeCode*1.0)-1)) sizeCode++; |
skydarc | 2:2946f9eefcae | 787 | |
skydarc | 2:2946f9eefcae | 788 | index++; |
skydarc | 2:2946f9eefcae | 789 | } |
skydarc | 2:2946f9eefcae | 790 | |
skydarc | 2:2946f9eefcae | 791 | _cs = 1; |
skydarc | 2:2946f9eefcae | 792 | |
skydarc | 2:2946f9eefcae | 793 | } |
skydarc | 2:2946f9eefcae | 794 | |
skydarc | 2:2946f9eefcae | 795 | void ST7735::DrawANI(int offsetx, int offsety, FILE *Anim, int frame) { |
skydarc | 2:2946f9eefcae | 796 | |
skydarc | 2:2946f9eefcae | 797 | int i; |
skydarc | 2:2946f9eefcae | 798 | char buf[32]; |
skydarc | 2:2946f9eefcae | 799 | char sizeStr[12]; |
skydarc | 2:2946f9eefcae | 800 | char *valExit = "error"; |
skydarc | 2:2946f9eefcae | 801 | char namefile[32]; |
skydarc | 2:2946f9eefcae | 802 | int size, offset = 0; |
skydarc | 2:2946f9eefcae | 803 | |
skydarc | 2:2946f9eefcae | 804 | sprintf(namefile, "%d.bmp", frame); |
skydarc | 2:2946f9eefcae | 805 | |
skydarc | 2:2946f9eefcae | 806 | while(!feof(Anim)) { |
skydarc | 2:2946f9eefcae | 807 | for(i=0; i <= strlen(namefile); i++) buf[i] = fgetc(Anim); |
skydarc | 2:2946f9eefcae | 808 | |
skydarc | 2:2946f9eefcae | 809 | if(!strcmp(buf, namefile)) { |
skydarc | 2:2946f9eefcae | 810 | valExit = ""; |
skydarc | 2:2946f9eefcae | 811 | break; |
skydarc | 2:2946f9eefcae | 812 | } |
skydarc | 2:2946f9eefcae | 813 | |
skydarc | 2:2946f9eefcae | 814 | fseek(Anim , 124+offset , SEEK_SET); |
skydarc | 2:2946f9eefcae | 815 | for(i=0; i < 12; i++) sizeStr[i] = fgetc(Anim); |
skydarc | 2:2946f9eefcae | 816 | //printf("size string: %s; octal: %d; dec.: %x\n", sizeStr, atoi(sizeStr), oct2dec(atoi(sizeStr)) ); |
skydarc | 2:2946f9eefcae | 817 | |
skydarc | 2:2946f9eefcae | 818 | size = oct2dec(atoi(sizeStr)); |
skydarc | 2:2946f9eefcae | 819 | if(offset % 512 != 0) offset += (size/512 + 2)*512; |
skydarc | 2:2946f9eefcae | 820 | else offset += (size/512 + 1)*512; |
skydarc | 2:2946f9eefcae | 821 | |
skydarc | 2:2946f9eefcae | 822 | fseek(Anim , offset , SEEK_SET); |
skydarc | 2:2946f9eefcae | 823 | } |
skydarc | 2:2946f9eefcae | 824 | |
skydarc | 2:2946f9eefcae | 825 | if(valExit == "error") { |
skydarc | 2:2946f9eefcae | 826 | printf("file \"%s\" not find in tar\n", namefile); |
skydarc | 2:2946f9eefcae | 827 | //return NULL; |
skydarc | 2:2946f9eefcae | 828 | } else { |
skydarc | 2:2946f9eefcae | 829 | fseek(Anim, offset+512 , SEEK_SET); |
skydarc | 2:2946f9eefcae | 830 | |
skydarc | 2:2946f9eefcae | 831 | DrawBMP(offsetx, offsety, Anim); |
skydarc | 2:2946f9eefcae | 832 | |
skydarc | 2:2946f9eefcae | 833 | //return 1; |
skydarc | 2:2946f9eefcae | 834 | } |
skydarc | 2:2946f9eefcae | 835 | |
skydarc | 2:2946f9eefcae | 836 | |
skydarc | 2:2946f9eefcae | 837 | } |
skydarc | 2:2946f9eefcae | 838 | |
skydarc | 2:2946f9eefcae | 839 | void ST7735::scrollBmp(uint8_t top_fix_height, uint8_t bottom_fix_height, int _scroll_direction, int *bitmap) { |
skydarc | 2:2946f9eefcae | 840 | unsigned int i, startOffset, endOffset;// line = 0; |
skydarc | 2:2946f9eefcae | 841 | float a, b; |
skydarc | 2:2946f9eefcae | 842 | |
skydarc | 2:2946f9eefcae | 843 | a = 7.7142*pow( 162.0-(top_fix_height+bottom_fix_height), -2.0 ); |
skydarc | 2:2946f9eefcae | 844 | b = 8.0717*pow( 162.0-(top_fix_height+bottom_fix_height), -1.0 ); |
skydarc | 2:2946f9eefcae | 845 | |
skydarc | 2:2946f9eefcae | 846 | if(!_orientation) _scroll_direction = !_scroll_direction; |
skydarc | 2:2946f9eefcae | 847 | |
skydarc | 2:2946f9eefcae | 848 | if((_scroll_direction && _orientation == 2) || (!_scroll_direction && !_orientation)) { |
skydarc | 2:2946f9eefcae | 849 | for (i = 0; i < 3248; i++) *bitmap++; |
skydarc | 2:2946f9eefcae | 850 | } |
skydarc | 2:2946f9eefcae | 851 | |
skydarc | 2:2946f9eefcae | 852 | if((!_scroll_direction && _orientation == 2) || (_scroll_direction && !_orientation)) { |
skydarc | 2:2946f9eefcae | 853 | startOffset = top_fix_height; |
skydarc | 2:2946f9eefcae | 854 | endOffset = bottom_fix_height+1; |
skydarc | 2:2946f9eefcae | 855 | } else { |
skydarc | 2:2946f9eefcae | 856 | startOffset = bottom_fix_height; |
skydarc | 2:2946f9eefcae | 857 | endOffset = top_fix_height+1; |
skydarc | 2:2946f9eefcae | 858 | } |
skydarc | 2:2946f9eefcae | 859 | |
skydarc | 2:2946f9eefcae | 860 | if((_scroll_direction && _orientation == 2) || (!_scroll_direction && !_orientation)) setScrollDefinition(bottom_fix_height, top_fix_height+1, _scroll_direction); |
skydarc | 2:2946f9eefcae | 861 | else setScrollDefinition(top_fix_height+1, bottom_fix_height, _scroll_direction); |
skydarc | 2:2946f9eefcae | 862 | |
skydarc | 2:2946f9eefcae | 863 | for( int scroll = 1+startOffset; scroll <= 162-endOffset ; scroll++){ |
skydarc | 2:2946f9eefcae | 864 | |
skydarc | 2:2946f9eefcae | 865 | VerticalScroll(scroll); |
skydarc | 2:2946f9eefcae | 866 | |
skydarc | 2:2946f9eefcae | 867 | if(scroll >=(53) && scroll <=109) { |
skydarc | 2:2946f9eefcae | 868 | if(_orientation == 0){ |
skydarc | 2:2946f9eefcae | 869 | if(_scroll_direction) { |
skydarc | 2:2946f9eefcae | 870 | drawFastHLine(0, 162-(scroll)-2, 80, ST7735_BLACK); |
skydarc | 2:2946f9eefcae | 871 | |
skydarc | 2:2946f9eefcae | 872 | for (i = 0; i < 57; i++) { |
skydarc | 2:2946f9eefcae | 873 | drawPixel(57+11-i, 162-(scroll)-2, *bitmap); |
skydarc | 2:2946f9eefcae | 874 | *bitmap++; |
skydarc | 2:2946f9eefcae | 875 | } |
skydarc | 2:2946f9eefcae | 876 | } else { |
skydarc | 2:2946f9eefcae | 877 | drawFastHLine(0, scroll-2, 80, ST7735_BLACK); |
skydarc | 2:2946f9eefcae | 878 | |
skydarc | 2:2946f9eefcae | 879 | for (i = 0; i < 57; i++) { |
skydarc | 2:2946f9eefcae | 880 | drawPixel(12+i, scroll-2, *bitmap); |
skydarc | 2:2946f9eefcae | 881 | *bitmap--; |
skydarc | 2:2946f9eefcae | 882 | } |
skydarc | 2:2946f9eefcae | 883 | } |
skydarc | 2:2946f9eefcae | 884 | } else if(_orientation == 2) { |
skydarc | 2:2946f9eefcae | 885 | if(_scroll_direction) { |
skydarc | 2:2946f9eefcae | 886 | drawFastHLine(0, 162-scroll-1, 80, ST7735_BLACK); |
skydarc | 2:2946f9eefcae | 887 | |
skydarc | 2:2946f9eefcae | 888 | for (i = 0; i < 57; i++) { |
skydarc | 2:2946f9eefcae | 889 | drawPixel(57+10-i,162-scroll-1, *bitmap); |
skydarc | 2:2946f9eefcae | 890 | *bitmap--; |
skydarc | 2:2946f9eefcae | 891 | } |
skydarc | 2:2946f9eefcae | 892 | } else { |
skydarc | 2:2946f9eefcae | 893 | drawFastHLine(0, scroll-1, 80, ST7735_BLACK); |
skydarc | 2:2946f9eefcae | 894 | |
skydarc | 2:2946f9eefcae | 895 | for (i = 0; i < 57; i++) { |
skydarc | 2:2946f9eefcae | 896 | drawPixel(11+i,scroll-1, *bitmap); |
skydarc | 2:2946f9eefcae | 897 | *bitmap++; |
skydarc | 2:2946f9eefcae | 898 | } |
skydarc | 2:2946f9eefcae | 899 | } |
skydarc | 2:2946f9eefcae | 900 | } |
skydarc | 2:2946f9eefcae | 901 | } |
skydarc | 2:2946f9eefcae | 902 | |
skydarc | 2:2946f9eefcae | 903 | float tempo = (a*scroll*scroll)-b*scroll+2.9408; |
skydarc | 2:2946f9eefcae | 904 | wait_ms(tempo); |
skydarc | 2:2946f9eefcae | 905 | //wait(0.1); |
skydarc | 2:2946f9eefcae | 906 | } |
skydarc | 2:2946f9eefcae | 907 | if(!_orientation) setRotation(0); |
skydarc | 2:2946f9eefcae | 908 | VerticalScroll(0); |
skydarc | 2:2946f9eefcae | 909 | } |
skydarc | 2:2946f9eefcae | 910 | |
skydarc | 2:2946f9eefcae | 911 | int ST7735::oct2dec(int n) /* Function to convert octal to decimal */ |
skydarc | 2:2946f9eefcae | 912 | { |
skydarc | 2:2946f9eefcae | 913 | int decimal=0, i=0, rem; |
skydarc | 2:2946f9eefcae | 914 | while (n!=0) |
skydarc | 2:2946f9eefcae | 915 | { |
skydarc | 2:2946f9eefcae | 916 | rem = n%10; |
skydarc | 2:2946f9eefcae | 917 | n/=10; |
skydarc | 2:2946f9eefcae | 918 | decimal += rem*pow(8.0,i); |
skydarc | 2:2946f9eefcae | 919 | ++i; |
skydarc | 2:2946f9eefcae | 920 | } |
skydarc | 2:2946f9eefcae | 921 | return decimal; |
skydarc | 2:2946f9eefcae | 922 | } |
skydarc | 2:2946f9eefcae | 923 | |
skydarc | 2:2946f9eefcae | 924 | int ST7735::bitExtracted(int number, int k, int p) |
skydarc | 2:2946f9eefcae | 925 | { |
skydarc | 2:2946f9eefcae | 926 | return (((1 << k) - 1) & (number >> (p - 1))); |
skydarc | 2:2946f9eefcae | 927 | } |
skydarc | 2:2946f9eefcae | 928 | |
skydarc | 2:2946f9eefcae | 929 | void ST7735::makeTable(void) { |
skydarc | 2:2946f9eefcae | 930 | remove("/sd/table.csv"); |
skydarc | 2:2946f9eefcae | 931 | remove("/sd/pointers.csv"); |
skydarc | 2:2946f9eefcae | 932 | FILE *table = fopen("/sd/table.csv", "w"); |
skydarc | 2:2946f9eefcae | 933 | FILE *pointers = fopen("/sd/pointers.csv", "w"); |
skydarc | 2:2946f9eefcae | 934 | fclose(table); |
skydarc | 2:2946f9eefcae | 935 | fclose(pointers); |
skydarc | 2:2946f9eefcae | 936 | } |
skydarc | 2:2946f9eefcae | 937 | |
skydarc | 2:2946f9eefcae | 938 | uint16_t ST7735::readTable(unsigned int y, unsigned int x) { |
skydarc | 2:2946f9eefcae | 939 | |
skydarc | 2:2946f9eefcae | 940 | FILE *table = fopen("/sd/table.csv", "r"); |
skydarc | 2:2946f9eefcae | 941 | FILE *pointers = fopen("/sd/pointers.csv", "r"); |
skydarc | 2:2946f9eefcae | 942 | char out[3]; |
skydarc | 2:2946f9eefcae | 943 | char ptr[17]; |
skydarc | 2:2946f9eefcae | 944 | |
skydarc | 2:2946f9eefcae | 945 | fseek(pointers , y*17 , SEEK_SET); |
skydarc | 2:2946f9eefcae | 946 | //output1.printf("%d: ", y); |
skydarc | 2:2946f9eefcae | 947 | for(int i=0; i < 17; i++) { |
skydarc | 2:2946f9eefcae | 948 | ptr[i] = fgetc(pointers); |
skydarc | 2:2946f9eefcae | 949 | //output1.printf("%c", ptr[i]); |
skydarc | 2:2946f9eefcae | 950 | } |
skydarc | 2:2946f9eefcae | 951 | //output1.printf("\n%s>>%d\n", ptr, atoi(ptr)); |
skydarc | 2:2946f9eefcae | 952 | |
skydarc | 2:2946f9eefcae | 953 | // utiliser pointers |
skydarc | 2:2946f9eefcae | 954 | //for(int i=0; i < y;) |
skydarc | 2:2946f9eefcae | 955 | //if(fgetc(table) == 0x0A) i++; |
skydarc | 2:2946f9eefcae | 956 | fseek(table , atoi(ptr) , SEEK_SET); |
skydarc | 2:2946f9eefcae | 957 | |
skydarc | 2:2946f9eefcae | 958 | for(int i=0; i < x;) |
skydarc | 2:2946f9eefcae | 959 | if(fgetc(table) == 0x3B) i++; |
skydarc | 2:2946f9eefcae | 960 | |
skydarc | 2:2946f9eefcae | 961 | out[0] = fgetc(table); |
skydarc | 2:2946f9eefcae | 962 | out[1] = fgetc(table); |
skydarc | 2:2946f9eefcae | 963 | out[2] = fgetc(table); |
skydarc | 2:2946f9eefcae | 964 | |
skydarc | 2:2946f9eefcae | 965 | //output1.printf("%s>>%x ", out, atoi(out)); |
skydarc | 2:2946f9eefcae | 966 | |
skydarc | 2:2946f9eefcae | 967 | fclose(table); |
skydarc | 2:2946f9eefcae | 968 | fclose(pointers); |
skydarc | 2:2946f9eefcae | 969 | return atoi(out); |
skydarc | 2:2946f9eefcae | 970 | } |
skydarc | 2:2946f9eefcae | 971 | |
skydarc | 2:2946f9eefcae | 972 | void ST7735::addrowTable(uint16_t *row) { |
skydarc | 2:2946f9eefcae | 973 | |
skydarc | 2:2946f9eefcae | 974 | int size; |
skydarc | 2:2946f9eefcae | 975 | |
skydarc | 2:2946f9eefcae | 976 | FILE *table = fopen("/sd/table.csv", "r"); |
skydarc | 2:2946f9eefcae | 977 | fseek(table , 0 , SEEK_END); |
skydarc | 2:2946f9eefcae | 978 | size = ftell(table); |
skydarc | 2:2946f9eefcae | 979 | fclose(table); |
skydarc | 2:2946f9eefcae | 980 | |
skydarc | 2:2946f9eefcae | 981 | table = fopen("/sd/table.csv", "a"); |
skydarc | 2:2946f9eefcae | 982 | for(int i = 0; i< row[0]+1; i++) |
skydarc | 2:2946f9eefcae | 983 | fprintf(table, "%03d;", row[i]); |
skydarc | 2:2946f9eefcae | 984 | fprintf(table, "\n"); |
skydarc | 2:2946f9eefcae | 985 | |
skydarc | 2:2946f9eefcae | 986 | FILE *pointers = fopen("/sd/pointers.csv", "a"); |
skydarc | 2:2946f9eefcae | 987 | fprintf(pointers, "%16d\n", size); |
skydarc | 2:2946f9eefcae | 988 | |
skydarc | 2:2946f9eefcae | 989 | fclose(table); |
skydarc | 2:2946f9eefcae | 990 | fclose(pointers); |
skydarc | 2:2946f9eefcae | 991 | } |
skydarc | 2:2946f9eefcae | 992 | |
skydarc | 2:2946f9eefcae | 993 | void ST7735::init_star(STAR* star, int i) |
skydarc | 2:2946f9eefcae | 994 | { |
skydarc | 2:2946f9eefcae | 995 | /* randomly init stars, generate them around the center of the screen */ |
skydarc | 2:2946f9eefcae | 996 | |
skydarc | 2:2946f9eefcae | 997 | star->xpos = -10.0 + (20.0 * (rand()/(RAND_MAX+1.0))); |
skydarc | 2:2946f9eefcae | 998 | star->ypos = -10.0 + (20.0 * (rand()/(RAND_MAX+1.0))); |
skydarc | 2:2946f9eefcae | 999 | |
skydarc | 2:2946f9eefcae | 1000 | star->xpos *= 3072.0; /*change viewpoint */ |
skydarc | 2:2946f9eefcae | 1001 | star->ypos *= 3072.0; |
skydarc | 2:2946f9eefcae | 1002 | |
skydarc | 2:2946f9eefcae | 1003 | star->zpos = i; |
skydarc | 2:2946f9eefcae | 1004 | star->speed = 2 + (int)(2.0 * (rand()/(RAND_MAX+1.0))); |
skydarc | 2:2946f9eefcae | 1005 | |
skydarc | 2:2946f9eefcae | 1006 | star->color = i*ST7735_WHITE >> 2; /*the closer to the viewer the brighter*/ |
skydarc | 2:2946f9eefcae | 1007 | } |
skydarc | 2:2946f9eefcae | 1008 | |
skydarc | 2:2946f9eefcae | 1009 | void ST7735::DrawStarfield(int centerx, int centery, int acc, int color, int NbrsStars, int duration) |
skydarc | 2:2946f9eefcae | 1010 | { |
skydarc | 2:2946f9eefcae | 1011 | int i, j=0, tempx, tempy; |
skydarc | 2:2946f9eefcae | 1012 | STAR stars[NbrsStars]; |
skydarc | 2:2946f9eefcae | 1013 | Timer timerStars; |
skydarc | 2:2946f9eefcae | 1014 | |
skydarc | 2:2946f9eefcae | 1015 | timerStars.start(); |
skydarc | 2:2946f9eefcae | 1016 | while(timerStars.read() < duration) { |
skydarc | 2:2946f9eefcae | 1017 | |
skydarc | 2:2946f9eefcae | 1018 | j++; |
skydarc | 2:2946f9eefcae | 1019 | |
skydarc | 2:2946f9eefcae | 1020 | // move and draw stars |
skydarc | 2:2946f9eefcae | 1021 | |
skydarc | 2:2946f9eefcae | 1022 | for (i = 0; i < NbrsStars; i++) { |
skydarc | 2:2946f9eefcae | 1023 | tempx = (stars[i].xpos / stars[i].zpos) + centerx; |
skydarc | 2:2946f9eefcae | 1024 | tempy = (stars[i].ypos / stars[i].zpos) + centery; |
skydarc | 2:2946f9eefcae | 1025 | drawPixel(tempx,tempy, ST7735_BLACK); |
skydarc | 2:2946f9eefcae | 1026 | |
skydarc | 2:2946f9eefcae | 1027 | |
skydarc | 2:2946f9eefcae | 1028 | stars[i].zpos -= stars[i].speed*acc; |
skydarc | 2:2946f9eefcae | 1029 | |
skydarc | 2:2946f9eefcae | 1030 | if (stars[i].zpos <= 0) { |
skydarc | 2:2946f9eefcae | 1031 | init_star(stars + i, i + 1); |
skydarc | 2:2946f9eefcae | 1032 | } |
skydarc | 2:2946f9eefcae | 1033 | |
skydarc | 2:2946f9eefcae | 1034 | //compute 3D position |
skydarc | 2:2946f9eefcae | 1035 | tempx = (stars[i].xpos / stars[i].zpos) + centerx; |
skydarc | 2:2946f9eefcae | 1036 | tempy = (stars[i].ypos / stars[i].zpos) + centery; |
skydarc | 2:2946f9eefcae | 1037 | |
skydarc | 2:2946f9eefcae | 1038 | if (tempx < 0 || tempx > _width - 1 || tempy < 0 || tempy > _height - 1) { //check if a star leaves the screen |
skydarc | 2:2946f9eefcae | 1039 | |
skydarc | 2:2946f9eefcae | 1040 | init_star(stars + i, i + 1); |
skydarc | 2:2946f9eefcae | 1041 | continue; |
skydarc | 2:2946f9eefcae | 1042 | } |
skydarc | 2:2946f9eefcae | 1043 | |
skydarc | 2:2946f9eefcae | 1044 | if(color) drawPixel(tempx,tempy,color); |
skydarc | 2:2946f9eefcae | 1045 | else drawPixel(tempx,tempy,stars[i].color); |
skydarc | 2:2946f9eefcae | 1046 | |
skydarc | 2:2946f9eefcae | 1047 | } |
skydarc | 2:2946f9eefcae | 1048 | } |
skydarc | 2:2946f9eefcae | 1049 | |
skydarc | 2:2946f9eefcae | 1050 | timerStars.stop(); |
skydarc | 2:2946f9eefcae | 1051 | } |
skydarc | 2:2946f9eefcae | 1052 | |
skydarc | 2:2946f9eefcae | 1053 | void ST7735::setScrollDefinition(uint8_t top_fix_height, uint8_t bottom_fix_height, int _scroll_direction){ |
skydarc | 2:2946f9eefcae | 1054 | uint8_t scroll_height; |
skydarc | 2:2946f9eefcae | 1055 | scroll_height = _height - top_fix_height - bottom_fix_height; |
skydarc | 2:2946f9eefcae | 1056 | writecommand(ST7735_VSCRDEF); |
skydarc | 2:2946f9eefcae | 1057 | writedata(0x00); |
skydarc | 2:2946f9eefcae | 1058 | writedata(top_fix_height); |
skydarc | 2:2946f9eefcae | 1059 | writedata(0x00); |
skydarc | 2:2946f9eefcae | 1060 | writedata(scroll_height); |
skydarc | 2:2946f9eefcae | 1061 | writedata(0x00); |
skydarc | 2:2946f9eefcae | 1062 | writedata(bottom_fix_height); |
skydarc | 2:2946f9eefcae | 1063 | writecommand(ST7735_MADCTL); |
skydarc | 2:2946f9eefcae | 1064 | if(_scroll_direction){ |
skydarc | 2:2946f9eefcae | 1065 | if(_tft_type == 0){ |
skydarc | 2:2946f9eefcae | 1066 | writedata(0xD8); |
skydarc | 2:2946f9eefcae | 1067 | } |
skydarc | 2:2946f9eefcae | 1068 | if(_tft_type == 1){ |
skydarc | 2:2946f9eefcae | 1069 | writedata(0xD0); |
skydarc | 2:2946f9eefcae | 1070 | } |
skydarc | 2:2946f9eefcae | 1071 | if(_tft_type == 2){ |
skydarc | 2:2946f9eefcae | 1072 | writedata(0x18); |
skydarc | 2:2946f9eefcae | 1073 | } |
skydarc | 2:2946f9eefcae | 1074 | } |
skydarc | 2:2946f9eefcae | 1075 | else{ |
skydarc | 2:2946f9eefcae | 1076 | if(_tft_type == 0){ |
skydarc | 2:2946f9eefcae | 1077 | writedata(0xC8); |
skydarc | 2:2946f9eefcae | 1078 | } |
skydarc | 2:2946f9eefcae | 1079 | if(_tft_type == 1){ |
skydarc | 2:2946f9eefcae | 1080 | writedata(0xC0); |
skydarc | 2:2946f9eefcae | 1081 | } |
skydarc | 2:2946f9eefcae | 1082 | if(_tft_type == 2){ |
skydarc | 2:2946f9eefcae | 1083 | writedata(0x08); |
skydarc | 2:2946f9eefcae | 1084 | } |
skydarc | 2:2946f9eefcae | 1085 | } |
skydarc | 2:2946f9eefcae | 1086 | } |
skydarc | 2:2946f9eefcae | 1087 | void ST7735::VerticalScroll(uint8_t _vsp) { |
skydarc | 2:2946f9eefcae | 1088 | writecommand(ST7735_VSCRSADD); |
skydarc | 2:2946f9eefcae | 1089 | writedata(0x00); |
skydarc | 2:2946f9eefcae | 1090 | writedata(_vsp); |
skydarc | 2:2946f9eefcae | 1091 | } |
skydarc | 2:2946f9eefcae | 1092 | |
skydarc | 2:2946f9eefcae | 1093 | //void ST7735::read_area(unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned char *buffer) { |
skydarc | 2:2946f9eefcae | 1094 | void ST7735::read_area(unsigned int x, unsigned int y, unsigned int w, unsigned int h) { |
skydarc | 2:2946f9eefcae | 1095 | // BEWARE ! |
skydarc | 2:2946f9eefcae | 1096 | // DOES NOT WORK CORRECTLY YET !!! |
skydarc | 2:2946f9eefcae | 1097 | int val; |
skydarc | 2:2946f9eefcae | 1098 | setAddrWindow2(x,y,w,h); |
skydarc | 2:2946f9eefcae | 1099 | writecommand(ST7735_RAMRD); // write to RAM |
skydarc | 2:2946f9eefcae | 1100 | _cs = 0; |
skydarc | 2:2946f9eefcae | 1101 | _rs = 1; |
skydarc | 2:2946f9eefcae | 1102 | lcdPort.write(0); /* Dummy read 1 */ |
skydarc | 2:2946f9eefcae | 1103 | |
skydarc | 2:2946f9eefcae | 1104 | val = lcdPort.write(0); /* Read D8..D15 */ |
skydarc | 2:2946f9eefcae | 1105 | val <<= 8; |
skydarc | 2:2946f9eefcae | 1106 | val |= lcdPort.write(0); /* Read D0..D7 */ |
skydarc | 2:2946f9eefcae | 1107 | _cs = 1; |
skydarc | 2:2946f9eefcae | 1108 | output1.printf("%d ", val); |
skydarc | 2:2946f9eefcae | 1109 | |
skydarc | 2:2946f9eefcae | 1110 | |
skydarc | 2:2946f9eefcae | 1111 | |
skydarc | 2:2946f9eefcae | 1112 | } |
skydarc | 2:2946f9eefcae | 1113 | |
skydarc | 2:2946f9eefcae | 1114 | |
skydarc | 2:2946f9eefcae | 1115 | void ST7735::setAddrWindow2(uint8_t x0, uint8_t y0, uint8_t x1, |
skydarc | 2:2946f9eefcae | 1116 | uint8_t y1) |
skydarc | 2:2946f9eefcae | 1117 | { |
skydarc | 2:2946f9eefcae | 1118 | |
skydarc | 2:2946f9eefcae | 1119 | writecommand(ST7735_CASET); // Column addr set |
skydarc | 2:2946f9eefcae | 1120 | writedata(0x00); |
skydarc | 2:2946f9eefcae | 1121 | writedata(x0+xstart); // XSTART |
skydarc | 2:2946f9eefcae | 1122 | writedata(0x00); |
skydarc | 2:2946f9eefcae | 1123 | writedata(x1+xstart); // XEND |
skydarc | 2:2946f9eefcae | 1124 | |
skydarc | 2:2946f9eefcae | 1125 | writecommand(ST7735_RASET); // Row addr set |
skydarc | 2:2946f9eefcae | 1126 | writedata(0x00); |
skydarc | 2:2946f9eefcae | 1127 | writedata(y0+ystart); // YSTART |
skydarc | 2:2946f9eefcae | 1128 | writedata(0x00); |
skydarc | 2:2946f9eefcae | 1129 | writedata(y1+ystart); // YEND |
skydarc | 2:2946f9eefcae | 1130 | |
skydarc | 2:2946f9eefcae | 1131 | //writecommand(ST7735_RAMWR); // write to RAM |
skydarc | 2:2946f9eefcae | 1132 | } |
skydarc | 2:2946f9eefcae | 1133 | |
skydarc | 2:2946f9eefcae | 1134 |