test st7735 on lpc1768 with mbed v5. bug with spi frequency...

Committer:
skydarc
Date:
Wed Apr 08 15:00:13 2020 +0000
Revision:
2:2946f9eefcae
v2

Who changed what in which revision?

UserRevisionLine numberNew 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