Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SDFileSystem mbed
Fork of Aitendo_HX8347D_HelloWorld by
main.cpp@0:eabefd4ea69c, 2016-08-29 (annotated)
- Committer:
- og
- Date:
- Mon Aug 29 05:45:10 2016 +0000
- Revision:
- 0:eabefd4ea69c
- Child:
- 1:8d7394e5f8de
bmp???
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| og | 0:eabefd4ea69c | 1 | /** |
| og | 0:eabefd4ea69c | 2 | ** http://www.aitendo.com/product/10942 |
| og | 0:eabefd4ea69c | 3 | ** HX8347D |
| og | 0:eabefd4ea69c | 4 | **/ |
| og | 0:eabefd4ea69c | 5 | #include "mbed.h" |
| og | 0:eabefd4ea69c | 6 | #include "mbed_debug.h" |
| og | 0:eabefd4ea69c | 7 | #include "SDFileSystem.h" |
| og | 0:eabefd4ea69c | 8 | #include "HX8347D.h" |
| og | 0:eabefd4ea69c | 9 | //#define ROW 320 |
| og | 0:eabefd4ea69c | 10 | //#define COL 240 |
| og | 0:eabefd4ea69c | 11 | |
| og | 0:eabefd4ea69c | 12 | #define BLACK 0x0000 |
| og | 0:eabefd4ea69c | 13 | #define BLUE 0x001F |
| og | 0:eabefd4ea69c | 14 | #define RED 0xF800 |
| og | 0:eabefd4ea69c | 15 | #define GREEN 0x07E0 |
| og | 0:eabefd4ea69c | 16 | #define CYAN 0x07FF |
| og | 0:eabefd4ea69c | 17 | #define MAGENTA 0xF81F |
| og | 0:eabefd4ea69c | 18 | #define YELLOW 0xFFE0 |
| og | 0:eabefd4ea69c | 19 | #define WHITE 0xFFFF |
| og | 0:eabefd4ea69c | 20 | |
| og | 0:eabefd4ea69c | 21 | |
| og | 0:eabefd4ea69c | 22 | #if defined(TARGET_ARCH_PRO) |
| og | 0:eabefd4ea69c | 23 | // ist worked |
| og | 0:eabefd4ea69c | 24 | /* |
| og | 0:eabefd4ea69c | 25 | DigitalOut RD0(A0); |
| og | 0:eabefd4ea69c | 26 | DigitalOut WR0(A1); |
| og | 0:eabefd4ea69c | 27 | DigitalOut RS(A2); |
| og | 0:eabefd4ea69c | 28 | DigitalOut CS0(A3); |
| og | 0:eabefd4ea69c | 29 | //BusOut DBH(D0, D1, D2, D3, D4, D5, D6, D7); |
| og | 0:eabefd4ea69c | 30 | BusOut DBH(D2, D3, D4, D5, D6, D7, D8, D9); |
| og | 0:eabefd4ea69c | 31 | */ |
| og | 0:eabefd4ea69c | 32 | HX8347D tft(A0, A1, A2, A3, A4, D2, D3, D4, D5, D6, D7, D8, D9); |
| og | 0:eabefd4ea69c | 33 | SDFileSystem sd(D11, D12, D13, D10, "sd"); // mosi miso sclk cs |
| og | 0:eabefd4ea69c | 34 | Serial pc(USBTX, USBRX); |
| og | 0:eabefd4ea69c | 35 | #elif defined TARGET_NUCLEO_F446RE |
| og | 0:eabefd4ea69c | 36 | /* D0, D1 short SB62,SB63*/ |
| og | 0:eabefd4ea69c | 37 | DigitalOut RD0(A0); |
| og | 0:eabefd4ea69c | 38 | DigitalOut WR0(A1); |
| og | 0:eabefd4ea69c | 39 | DigitalOut RS(A2); |
| og | 0:eabefd4ea69c | 40 | DigitalOut CS0(A3); |
| og | 0:eabefd4ea69c | 41 | //BusOut DBH(D8, D9, D10, D11, D12, D13, D14, D15); |
| og | 0:eabefd4ea69c | 42 | BusOut DBH(D2, D3, D4, D5, D6, D7, D8, D9); |
| og | 0:eabefd4ea69c | 43 | |
| og | 0:eabefd4ea69c | 44 | SDFileSystem sd(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS, "sd"); |
| og | 0:eabefd4ea69c | 45 | Serial pc(USBTX, USBRX); |
| og | 0:eabefd4ea69c | 46 | |
| og | 0:eabefd4ea69c | 47 | #elif defined TARGET_NUCLEO_F103RB |
| og | 0:eabefd4ea69c | 48 | /* D0, D1 short SB62,SB63*/ |
| og | 0:eabefd4ea69c | 49 | DigitalOut RD0(A0); |
| og | 0:eabefd4ea69c | 50 | DigitalOut WR0(A1); |
| og | 0:eabefd4ea69c | 51 | DigitalOut RS(A2); |
| og | 0:eabefd4ea69c | 52 | DigitalOut CS0(A3); |
| og | 0:eabefd4ea69c | 53 | BusOut DBH(D2, D3, D4, D5, D6, D7, D8, D9); |
| og | 0:eabefd4ea69c | 54 | // SPI_MOSI D11 |
| og | 0:eabefd4ea69c | 55 | // SPI_MISO D12 |
| og | 0:eabefd4ea69c | 56 | // SPI_SCK D13 |
| og | 0:eabefd4ea69c | 57 | // SPI_CS D10 |
| og | 0:eabefd4ea69c | 58 | SDFileSystem sd(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS, "sd") |
| og | 0:eabefd4ea69c | 59 | Serial pc(USBTX, USBRX); |
| og | 0:eabefd4ea69c | 60 | #endif |
| og | 0:eabefd4ea69c | 61 | |
| og | 0:eabefd4ea69c | 62 | char str[128]; |
| og | 0:eabefd4ea69c | 63 | |
| og | 0:eabefd4ea69c | 64 | void rotateTest() { |
| og | 0:eabefd4ea69c | 65 | tft.setRotation(1); |
| og | 0:eabefd4ea69c | 66 | for (uint16_t y=0; y < tft.height(); y+=5) { |
| og | 0:eabefd4ea69c | 67 | tft.drawHorizontalLine(0, y, tft.width(), RED); |
| og | 0:eabefd4ea69c | 68 | } |
| og | 0:eabefd4ea69c | 69 | wait_ms(500); |
| og | 0:eabefd4ea69c | 70 | for (uint16_t x=0; x < tft.width(); x+=5) { |
| og | 0:eabefd4ea69c | 71 | tft.drawVerticalLine(x, 0, 239, GREEN); |
| og | 0:eabefd4ea69c | 72 | pc.printf("x=%d %d\n", x, tft.height()); |
| og | 0:eabefd4ea69c | 73 | } |
| og | 0:eabefd4ea69c | 74 | wait_ms(500); |
| og | 0:eabefd4ea69c | 75 | |
| og | 0:eabefd4ea69c | 76 | } |
| og | 0:eabefd4ea69c | 77 | void rotateText() { |
| og | 0:eabefd4ea69c | 78 | for (uint8_t i=0; i<4; i++) { |
| og | 0:eabefd4ea69c | 79 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 80 | pc.printf("%d" , tft.getRotation()); |
| og | 0:eabefd4ea69c | 81 | |
| og | 0:eabefd4ea69c | 82 | tft.setCursor(0, 30); |
| og | 0:eabefd4ea69c | 83 | tft.setTextColor(RED); |
| og | 0:eabefd4ea69c | 84 | tft.setTextSize(1); |
| og | 0:eabefd4ea69c | 85 | tft.println("Hello World!\n"); |
| og | 0:eabefd4ea69c | 86 | wait_ms(500); |
| og | 0:eabefd4ea69c | 87 | tft.setTextColor(YELLOW); |
| og | 0:eabefd4ea69c | 88 | tft.setTextSize(2); |
| og | 0:eabefd4ea69c | 89 | tft.println("Hello World!\n"); |
| og | 0:eabefd4ea69c | 90 | wait_ms(500); |
| og | 0:eabefd4ea69c | 91 | tft.setTextColor(GREEN); |
| og | 0:eabefd4ea69c | 92 | tft.setTextSize(3); |
| og | 0:eabefd4ea69c | 93 | tft.println("Hello World!\n"); |
| og | 0:eabefd4ea69c | 94 | wait_ms(500); |
| og | 0:eabefd4ea69c | 95 | tft.setTextColor(CYAN); |
| og | 0:eabefd4ea69c | 96 | tft.setTextSize(3); |
| og | 0:eabefd4ea69c | 97 | tft.println("Hello World!\n"); |
| og | 0:eabefd4ea69c | 98 | wait_ms(500); |
| og | 0:eabefd4ea69c | 99 | tft.setTextColor(MAGENTA); |
| og | 0:eabefd4ea69c | 100 | tft.setTextSize(2); |
| og | 0:eabefd4ea69c | 101 | tft.println("Hello World!\n"); |
| og | 0:eabefd4ea69c | 102 | wait_ms(500); |
| og | 0:eabefd4ea69c | 103 | tft.setTextColor(WHITE); |
| og | 0:eabefd4ea69c | 104 | tft.setTextSize(1); |
| og | 0:eabefd4ea69c | 105 | tft.println("Hello World!\n"); |
| og | 0:eabefd4ea69c | 106 | wait_ms(500); |
| og | 0:eabefd4ea69c | 107 | tft.setTextColor(BLUE); |
| og | 0:eabefd4ea69c | 108 | tft.setTextSize(1); |
| og | 0:eabefd4ea69c | 109 | tft.println("1234.567\n"); |
| og | 0:eabefd4ea69c | 110 | wait_ms(500); |
| og | 0:eabefd4ea69c | 111 | |
| og | 0:eabefd4ea69c | 112 | tft.setRotation(tft.getRotation()+1); |
| og | 0:eabefd4ea69c | 113 | } |
| og | 0:eabefd4ea69c | 114 | } |
| og | 0:eabefd4ea69c | 115 | |
| og | 0:eabefd4ea69c | 116 | |
| og | 0:eabefd4ea69c | 117 | void testtext(uint16_t color) { |
| og | 0:eabefd4ea69c | 118 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 119 | tft.setCursor(0, 0); |
| og | 0:eabefd4ea69c | 120 | tft.setTextColor(color); |
| og | 0:eabefd4ea69c | 121 | tft.setTextSize(1); |
| og | 0:eabefd4ea69c | 122 | tft.drawString(0, 20, "Hello aitendo!", color); |
| og | 0:eabefd4ea69c | 123 | wait_ms(500); |
| og | 0:eabefd4ea69c | 124 | tft.drawChar(0, 50, '1', YELLOW, 1); |
| og | 0:eabefd4ea69c | 125 | tft.write('A'); |
| og | 0:eabefd4ea69c | 126 | //wait_ms(500); |
| og | 0:eabefd4ea69c | 127 | tft.setCursor(0, 100); |
| og | 0:eabefd4ea69c | 128 | tft.println("Hello aitendo!\n"); |
| og | 0:eabefd4ea69c | 129 | //wait_ms(500); |
| og | 0:eabefd4ea69c | 130 | tft.setCursor(0, 150); |
| og | 0:eabefd4ea69c | 131 | tft.setTextSize(3); |
| og | 0:eabefd4ea69c | 132 | tft.println("1234.56"); |
| og | 0:eabefd4ea69c | 133 | //wait_ms(500); |
| og | 0:eabefd4ea69c | 134 | tft.setCursor(0, 200); |
| og | 0:eabefd4ea69c | 135 | tft.setTextSize(3); |
| og | 0:eabefd4ea69c | 136 | sprintf(str, "%X", 0xDEADBEEF); |
| og | 0:eabefd4ea69c | 137 | tft.println(str); |
| og | 0:eabefd4ea69c | 138 | wait_ms(500); |
| og | 0:eabefd4ea69c | 139 | } |
| og | 0:eabefd4ea69c | 140 | |
| og | 0:eabefd4ea69c | 141 | void testFillRoundRect() { |
| og | 0:eabefd4ea69c | 142 | tft.fillScreen(RED); |
| og | 0:eabefd4ea69c | 143 | |
| og | 0:eabefd4ea69c | 144 | for (uint16_t x=tft.width(); x > 20 ; x-=6) { |
| og | 0:eabefd4ea69c | 145 | tft.fillRoundRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, x/8, tft.Color565(0, x, 0)); |
| og | 0:eabefd4ea69c | 146 | } |
| og | 0:eabefd4ea69c | 147 | } |
| og | 0:eabefd4ea69c | 148 | |
| og | 0:eabefd4ea69c | 149 | void testtriangles() { |
| og | 0:eabefd4ea69c | 150 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 151 | for (uint16_t i=0; i<tft.width()/2; i+=5) { |
| og | 0:eabefd4ea69c | 152 | tft.drawTriangle(tft.width()/2, tft.height()/2-i, |
| og | 0:eabefd4ea69c | 153 | tft.width()/2-i, tft.height()/2+i, |
| og | 0:eabefd4ea69c | 154 | tft.width()/2+i, tft.height()/2+i, tft.Color565(0, 0, i)); |
| og | 0:eabefd4ea69c | 155 | } |
| og | 0:eabefd4ea69c | 156 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 157 | for (uint16_t i=0; i<tft.width()/2; i+=5) { |
| og | 0:eabefd4ea69c | 158 | tft.drawTriangle(tft.width()/2, tft.height()/2-i, |
| og | 0:eabefd4ea69c | 159 | tft.width()/2-i, tft.height()/2+i, |
| og | 0:eabefd4ea69c | 160 | tft.width()/2+i, tft.height()/2+i, tft.Color565(0, i, 0)); |
| og | 0:eabefd4ea69c | 161 | } |
| og | 0:eabefd4ea69c | 162 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 163 | for (uint16_t i=0; i<tft.width()/2; i+=5) { |
| og | 0:eabefd4ea69c | 164 | tft.drawTriangle(tft.width()/2, tft.height()/2-i, |
| og | 0:eabefd4ea69c | 165 | tft.width()/2-i, tft.height()/2+i, |
| og | 0:eabefd4ea69c | 166 | tft.width()/2+i, tft.height()/2+i, tft.Color565(i, 0, 0)); |
| og | 0:eabefd4ea69c | 167 | } |
| og | 0:eabefd4ea69c | 168 | } |
| og | 0:eabefd4ea69c | 169 | |
| og | 0:eabefd4ea69c | 170 | void testfilltriangles() { |
| og | 0:eabefd4ea69c | 171 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 172 | |
| og | 0:eabefd4ea69c | 173 | for (uint16_t i=tft.width()/2; i>10; i-=5) { |
| og | 0:eabefd4ea69c | 174 | tft.fillTriangle(tft.width()/2, tft.height()/2-i, |
| og | 0:eabefd4ea69c | 175 | tft.width()/2-i, tft.height()/2+i, |
| og | 0:eabefd4ea69c | 176 | tft.width()/2+i, tft.height()/2+i, |
| og | 0:eabefd4ea69c | 177 | tft.Color565(0, i, i)); |
| og | 0:eabefd4ea69c | 178 | tft.drawTriangle(tft.width()/2, tft.height()/2-i, |
| og | 0:eabefd4ea69c | 179 | tft.width()/2-i, tft.height()/2+i, |
| og | 0:eabefd4ea69c | 180 | tft.width()/2+i, tft.height()/2+i, tft.Color565(i, i, 0)); |
| og | 0:eabefd4ea69c | 181 | } |
| og | 0:eabefd4ea69c | 182 | } |
| og | 0:eabefd4ea69c | 183 | void testfillcircles(uint8_t radius, uint16_t color) { |
| og | 0:eabefd4ea69c | 184 | for (uint16_t x=radius; x < tft.width(); x+=radius*2) { |
| og | 0:eabefd4ea69c | 185 | for (uint16_t y=radius; y < tft.height(); y+=radius*2) { |
| og | 0:eabefd4ea69c | 186 | tft.fillCircle(x, y, radius, color); |
| og | 0:eabefd4ea69c | 187 | } |
| og | 0:eabefd4ea69c | 188 | } |
| og | 0:eabefd4ea69c | 189 | } |
| og | 0:eabefd4ea69c | 190 | |
| og | 0:eabefd4ea69c | 191 | void testdrawcircles(uint8_t radius, uint16_t color) { |
| og | 0:eabefd4ea69c | 192 | for (uint16_t x=0; x < tft.width()+radius; x+=radius*2) { |
| og | 0:eabefd4ea69c | 193 | for (uint16_t y=0; y < tft.height()+radius; y+=radius*2) { |
| og | 0:eabefd4ea69c | 194 | tft.drawCircle(x, y, radius, color); |
| og | 0:eabefd4ea69c | 195 | } |
| og | 0:eabefd4ea69c | 196 | } |
| og | 0:eabefd4ea69c | 197 | } |
| og | 0:eabefd4ea69c | 198 | |
| og | 0:eabefd4ea69c | 199 | void testfillrects(uint16_t color1, uint16_t color2) { |
| og | 0:eabefd4ea69c | 200 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 201 | for (uint16_t x=tft.width()-1; x > 6; x-=6) { |
| og | 0:eabefd4ea69c | 202 | //Serial.println(x, DEC); |
| og | 0:eabefd4ea69c | 203 | tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1); |
| og | 0:eabefd4ea69c | 204 | tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2); |
| og | 0:eabefd4ea69c | 205 | } |
| og | 0:eabefd4ea69c | 206 | } |
| og | 0:eabefd4ea69c | 207 | |
| og | 0:eabefd4ea69c | 208 | void testdrawrects(uint16_t color) { |
| og | 0:eabefd4ea69c | 209 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 210 | for (uint16_t x=0; x < tft.width(); x+=6) { |
| og | 0:eabefd4ea69c | 211 | //pc.printf("%d\r\n", x); |
| og | 0:eabefd4ea69c | 212 | tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color); |
| og | 0:eabefd4ea69c | 213 | } |
| og | 0:eabefd4ea69c | 214 | } |
| og | 0:eabefd4ea69c | 215 | |
| og | 0:eabefd4ea69c | 216 | void testfastlines(uint16_t color1, uint16_t color2) { |
| og | 0:eabefd4ea69c | 217 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 218 | for (uint16_t y=0; y < tft.height(); y+=5) { |
| og | 0:eabefd4ea69c | 219 | // pc.printf("%d\r\n", y); |
| og | 0:eabefd4ea69c | 220 | tft.drawHorizontalLine(0, y, tft.width(), color1); |
| og | 0:eabefd4ea69c | 221 | } |
| og | 0:eabefd4ea69c | 222 | for (uint16_t x=0; x < tft.width(); x+=5) { |
| og | 0:eabefd4ea69c | 223 | // pc.printf("%d\r\n", x); |
| og | 0:eabefd4ea69c | 224 | tft.drawVerticalLine(x, 0, tft.height(), color2); |
| og | 0:eabefd4ea69c | 225 | } |
| og | 0:eabefd4ea69c | 226 | |
| og | 0:eabefd4ea69c | 227 | } |
| og | 0:eabefd4ea69c | 228 | |
| og | 0:eabefd4ea69c | 229 | |
| og | 0:eabefd4ea69c | 230 | void testlinerotate() { |
| og | 0:eabefd4ea69c | 231 | uint16_t color1; |
| og | 0:eabefd4ea69c | 232 | uint16_t color2; |
| og | 0:eabefd4ea69c | 233 | uint8_t n; |
| og | 0:eabefd4ea69c | 234 | for (uint8_t i=0; i<4; i++) { |
| og | 0:eabefd4ea69c | 235 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 236 | n = 3+i*4; |
| og | 0:eabefd4ea69c | 237 | tft.setCursor(0, 10); |
| og | 0:eabefd4ea69c | 238 | tft.setTextSize(1); |
| og | 0:eabefd4ea69c | 239 | color1 = tft.Color565(n, 0, 0); |
| og | 0:eabefd4ea69c | 240 | color2 = tft.Color565(0, 0, n); |
| og | 0:eabefd4ea69c | 241 | color1 = BLUE; |
| og | 0:eabefd4ea69c | 242 | color2 = RED; |
| og | 0:eabefd4ea69c | 243 | sprintf(str, "%X\n", color1); |
| og | 0:eabefd4ea69c | 244 | tft.println(str); |
| og | 0:eabefd4ea69c | 245 | sprintf(str, "%X\n", color2); |
| og | 0:eabefd4ea69c | 246 | tft.println(str); |
| og | 0:eabefd4ea69c | 247 | for (uint16_t y=0; y < tft.height(); y+=5) { |
| og | 0:eabefd4ea69c | 248 | tft.drawHorizontalLine(0, y, tft.width(), color1); |
| og | 0:eabefd4ea69c | 249 | //pc.printf("y=%d %d\n", y, tft.height()); |
| og | 0:eabefd4ea69c | 250 | } |
| og | 0:eabefd4ea69c | 251 | //wait_ms(500); |
| og | 0:eabefd4ea69c | 252 | for (uint16_t x=0; x < tft.width(); x+=5) { |
| og | 0:eabefd4ea69c | 253 | tft.drawVerticalLine(x, 0, tft.height(), color2); |
| og | 0:eabefd4ea69c | 254 | //pc.printf("x=%d %d\n", x, tft.height()); |
| og | 0:eabefd4ea69c | 255 | } |
| og | 0:eabefd4ea69c | 256 | tft.setRotation(tft.getRotation()+1); |
| og | 0:eabefd4ea69c | 257 | //wait_ms(500); |
| og | 0:eabefd4ea69c | 258 | } |
| og | 0:eabefd4ea69c | 259 | } |
| og | 0:eabefd4ea69c | 260 | |
| og | 0:eabefd4ea69c | 261 | void testlines(uint16_t color) { |
| og | 0:eabefd4ea69c | 262 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 263 | for (uint16_t x=0; x < tft.width(); x+=6) { |
| og | 0:eabefd4ea69c | 264 | tft.drawLine(0, 0, x, tft.height()-1, color); |
| og | 0:eabefd4ea69c | 265 | } |
| og | 0:eabefd4ea69c | 266 | for (uint16_t y=0; y < tft.height(); y+=6) { |
| og | 0:eabefd4ea69c | 267 | tft.drawLine(0, 0, tft.width()-1, y, color); |
| og | 0:eabefd4ea69c | 268 | } |
| og | 0:eabefd4ea69c | 269 | |
| og | 0:eabefd4ea69c | 270 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 271 | for (uint16_t x=0; x < tft.width(); x+=6) { |
| og | 0:eabefd4ea69c | 272 | tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color); |
| og | 0:eabefd4ea69c | 273 | } |
| og | 0:eabefd4ea69c | 274 | for (uint16_t y=0; y < tft.height(); y+=6) { |
| og | 0:eabefd4ea69c | 275 | tft.drawLine(tft.width()-1, 0, 0, y, color); |
| og | 0:eabefd4ea69c | 276 | } |
| og | 0:eabefd4ea69c | 277 | |
| og | 0:eabefd4ea69c | 278 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 279 | for (uint16_t x=0; x < tft.width(); x+=6) { |
| og | 0:eabefd4ea69c | 280 | tft.drawLine(0, tft.height()-1, x, 0, color); |
| og | 0:eabefd4ea69c | 281 | } |
| og | 0:eabefd4ea69c | 282 | for (uint16_t y=0; y < tft.height(); y+=6) { |
| og | 0:eabefd4ea69c | 283 | tft.drawLine(0, tft.height()-1, tft.width()-1, y, color); |
| og | 0:eabefd4ea69c | 284 | } |
| og | 0:eabefd4ea69c | 285 | |
| og | 0:eabefd4ea69c | 286 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 287 | for (uint16_t x=0; x < tft.width(); x+=6) { |
| og | 0:eabefd4ea69c | 288 | tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color); |
| og | 0:eabefd4ea69c | 289 | } |
| og | 0:eabefd4ea69c | 290 | for (uint16_t y=0; y < tft.height(); y+=6) { |
| og | 0:eabefd4ea69c | 291 | tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color); |
| og | 0:eabefd4ea69c | 292 | } |
| og | 0:eabefd4ea69c | 293 | } |
| og | 0:eabefd4ea69c | 294 | |
| og | 0:eabefd4ea69c | 295 | void testBars() { |
| og | 0:eabefd4ea69c | 296 | tft.goHome(); |
| og | 0:eabefd4ea69c | 297 | |
| og | 0:eabefd4ea69c | 298 | uint16_t i,j; |
| og | 0:eabefd4ea69c | 299 | for(i=0; i < tft.height(); i++) |
| og | 0:eabefd4ea69c | 300 | { |
| og | 0:eabefd4ea69c | 301 | for(j=tft.width()/2; j <tft.width(); j++) |
| og | 0:eabefd4ea69c | 302 | { |
| og | 0:eabefd4ea69c | 303 | if(i>279) tft.writeData(WHITE); |
| og | 0:eabefd4ea69c | 304 | else if(i>239) tft.writeData(BLUE); |
| og | 0:eabefd4ea69c | 305 | else if(i>199) tft.writeData(GREEN); |
| og | 0:eabefd4ea69c | 306 | else if(i>159) tft.writeData(CYAN); |
| og | 0:eabefd4ea69c | 307 | else if(i>119) tft.writeData(RED); |
| og | 0:eabefd4ea69c | 308 | else if(i>79) tft.writeData(MAGENTA); |
| og | 0:eabefd4ea69c | 309 | else if(i>39) tft.writeData(YELLOW); |
| og | 0:eabefd4ea69c | 310 | else tft.writeData(BLACK); |
| og | 0:eabefd4ea69c | 311 | //wait_ms(5); |
| og | 0:eabefd4ea69c | 312 | } |
| og | 0:eabefd4ea69c | 313 | for(j=0; j < tft.width()/2; j++) |
| og | 0:eabefd4ea69c | 314 | { |
| og | 0:eabefd4ea69c | 315 | if(i>159) tft.writeData(BLACK); |
| og | 0:eabefd4ea69c | 316 | //else if(i>239) tft.writeData(YELLOW); |
| og | 0:eabefd4ea69c | 317 | //else if(i>199) tft.writeData(MAGENTA); |
| og | 0:eabefd4ea69c | 318 | //else if(i>159) tft.writeData(RED); |
| og | 0:eabefd4ea69c | 319 | //else if(i>119) tft.writeData(CYAN); |
| og | 0:eabefd4ea69c | 320 | //else if(i>79) tft.writeData(GREEN); |
| og | 0:eabefd4ea69c | 321 | //else if(i>39) tft.writeData(BLUE); |
| og | 0:eabefd4ea69c | 322 | else tft.writeData(WHITE); |
| og | 0:eabefd4ea69c | 323 | //wait_ms(1); |
| og | 0:eabefd4ea69c | 324 | } |
| og | 0:eabefd4ea69c | 325 | } |
| og | 0:eabefd4ea69c | 326 | } |
| og | 0:eabefd4ea69c | 327 | |
| og | 0:eabefd4ea69c | 328 | /** |
| og | 0:eabefd4ea69c | 329 | |
| og | 0:eabefd4ea69c | 330 | |
| og | 0:eabefd4ea69c | 331 | **/ |
| og | 0:eabefd4ea69c | 332 | |
| og | 0:eabefd4ea69c | 333 | // information we extract about the bitmap file |
| og | 0:eabefd4ea69c | 334 | int bmpWidth, bmpHeight; |
| og | 0:eabefd4ea69c | 335 | uint8_t bmpDepth, bmpImageoffset; |
| og | 0:eabefd4ea69c | 336 | |
| og | 0:eabefd4ea69c | 337 | #define ROTATION 3 |
| og | 0:eabefd4ea69c | 338 | #define BUFFPIXEL 60 |
| og | 0:eabefd4ea69c | 339 | #define BYTES_PER_PIXEL 3 |
| og | 0:eabefd4ea69c | 340 | |
| og | 0:eabefd4ea69c | 341 | uint8_t picBuffer[BYTES_PER_PIXEL * BUFFPIXEL]; // 3 * pixels to buffer |
| og | 0:eabefd4ea69c | 342 | int bufferIndex = BYTES_PER_PIXEL * BUFFPIXEL; |
| og | 0:eabefd4ea69c | 343 | |
| og | 0:eabefd4ea69c | 344 | char path[80]; |
| og | 0:eabefd4ea69c | 345 | |
| og | 0:eabefd4ea69c | 346 | // These read data from the SD card file and convert them to big endian |
| og | 0:eabefd4ea69c | 347 | // (the data is stored in little endian format!) |
| og | 0:eabefd4ea69c | 348 | |
| og | 0:eabefd4ea69c | 349 | |
| og | 0:eabefd4ea69c | 350 | // LITTLE ENDIAN! |
| og | 0:eabefd4ea69c | 351 | |
| og | 0:eabefd4ea69c | 352 | uint16_t read16(FILE *f) { |
| og | 0:eabefd4ea69c | 353 | uint16_t d; |
| og | 0:eabefd4ea69c | 354 | uint8_t b; |
| og | 0:eabefd4ea69c | 355 | fread(&b, sizeof(uint8_t), 1, f); |
| og | 0:eabefd4ea69c | 356 | fread(&d, sizeof(uint8_t), 1, f); |
| og | 0:eabefd4ea69c | 357 | d <<= 8; |
| og | 0:eabefd4ea69c | 358 | d |= b; |
| og | 0:eabefd4ea69c | 359 | return d; |
| og | 0:eabefd4ea69c | 360 | } |
| og | 0:eabefd4ea69c | 361 | |
| og | 0:eabefd4ea69c | 362 | |
| og | 0:eabefd4ea69c | 363 | // LITTLE ENDIAN! |
| og | 0:eabefd4ea69c | 364 | uint32_t read32(FILE *f) { |
| og | 0:eabefd4ea69c | 365 | uint32_t d; |
| og | 0:eabefd4ea69c | 366 | uint16_t b; |
| og | 0:eabefd4ea69c | 367 | |
| og | 0:eabefd4ea69c | 368 | b = read16(f); |
| og | 0:eabefd4ea69c | 369 | d = read16(f); |
| og | 0:eabefd4ea69c | 370 | d <<= 16; |
| og | 0:eabefd4ea69c | 371 | d |= b; |
| og | 0:eabefd4ea69c | 372 | return d; |
| og | 0:eabefd4ea69c | 373 | } |
| og | 0:eabefd4ea69c | 374 | |
| og | 0:eabefd4ea69c | 375 | /* |
| og | 0:eabefd4ea69c | 376 | From example code. Reads bitmap header. Uses global variables. |
| og | 0:eabefd4ea69c | 377 | |
| og | 0:eabefd4ea69c | 378 | */ |
| og | 0:eabefd4ea69c | 379 | bool bmpReadHeader(FILE *f) { |
| og | 0:eabefd4ea69c | 380 | // read header |
| og | 0:eabefd4ea69c | 381 | uint32_t tmp; |
| og | 0:eabefd4ea69c | 382 | |
| og | 0:eabefd4ea69c | 383 | if (read16(f) != 0x4D42) { |
| og | 0:eabefd4ea69c | 384 | // magic bytes missing |
| og | 0:eabefd4ea69c | 385 | return false; |
| og | 0:eabefd4ea69c | 386 | } |
| og | 0:eabefd4ea69c | 387 | |
| og | 0:eabefd4ea69c | 388 | // read file size |
| og | 0:eabefd4ea69c | 389 | tmp = read32(f); |
| og | 0:eabefd4ea69c | 390 | pc.printf("size 0x %X\n", tmp); |
| og | 0:eabefd4ea69c | 391 | |
| og | 0:eabefd4ea69c | 392 | // read and ignore creator bytes |
| og | 0:eabefd4ea69c | 393 | read32(f); |
| og | 0:eabefd4ea69c | 394 | |
| og | 0:eabefd4ea69c | 395 | bmpImageoffset = read32(f); |
| og | 0:eabefd4ea69c | 396 | pc.printf("offset %d\n", bmpImageoffset); |
| og | 0:eabefd4ea69c | 397 | |
| og | 0:eabefd4ea69c | 398 | // read DIB header |
| og | 0:eabefd4ea69c | 399 | tmp = read32(f); |
| og | 0:eabefd4ea69c | 400 | pc.printf("header size %d\n", tmp); |
| og | 0:eabefd4ea69c | 401 | bmpWidth = read32(f); |
| og | 0:eabefd4ea69c | 402 | bmpHeight = read32(f); |
| og | 0:eabefd4ea69c | 403 | |
| og | 0:eabefd4ea69c | 404 | |
| og | 0:eabefd4ea69c | 405 | if (read16(f) != 1) |
| og | 0:eabefd4ea69c | 406 | return false; |
| og | 0:eabefd4ea69c | 407 | |
| og | 0:eabefd4ea69c | 408 | bmpDepth = read16(f); |
| og | 0:eabefd4ea69c | 409 | pc.printf("bitdepth %d\n", bmpDepth); |
| og | 0:eabefd4ea69c | 410 | |
| og | 0:eabefd4ea69c | 411 | |
| og | 0:eabefd4ea69c | 412 | pc.printf("compression %d\n", tmp); |
| og | 0:eabefd4ea69c | 413 | |
| og | 0:eabefd4ea69c | 414 | return true; |
| og | 0:eabefd4ea69c | 415 | } |
| og | 0:eabefd4ea69c | 416 | |
| og | 0:eabefd4ea69c | 417 | /* |
| og | 0:eabefd4ea69c | 418 | Slightly modified routine for drawing bitmaps (From original samples). |
| og | 0:eabefd4ea69c | 419 | |
| og | 0:eabefd4ea69c | 420 | Watch out, as this one uses some global variables |
| og | 0:eabefd4ea69c | 421 | */ |
| og | 0:eabefd4ea69c | 422 | void bmpdraw(FILE *f, int x, int y) { |
| og | 0:eabefd4ea69c | 423 | fseek(f, bmpImageoffset, SEEK_SET); |
| og | 0:eabefd4ea69c | 424 | |
| og | 0:eabefd4ea69c | 425 | uint16_t p; |
| og | 0:eabefd4ea69c | 426 | int i, j; |
| og | 0:eabefd4ea69c | 427 | |
| og | 0:eabefd4ea69c | 428 | pc.printf("rotation = %d\n", tft.getRotation()); |
| og | 0:eabefd4ea69c | 429 | |
| og | 0:eabefd4ea69c | 430 | tft.goTo(0,0); |
| og | 0:eabefd4ea69c | 431 | for (i=0; i< bmpHeight; i++) { |
| og | 0:eabefd4ea69c | 432 | // bitmaps are stored with the BOTTOM line first so we have to move 'up' |
| og | 0:eabefd4ea69c | 433 | tft.goTo(0, bmpHeight - i - 1); |
| og | 0:eabefd4ea69c | 434 | |
| og | 0:eabefd4ea69c | 435 | for (j=0; j<bmpWidth; j++) { |
| og | 0:eabefd4ea69c | 436 | // read more pixels |
| og | 0:eabefd4ea69c | 437 | |
| og | 0:eabefd4ea69c | 438 | if (bufferIndex >= BYTES_PER_PIXEL * BUFFPIXEL) { |
| og | 0:eabefd4ea69c | 439 | fread(&picBuffer, sizeof(uint8_t), BYTES_PER_PIXEL * BUFFPIXEL, f); |
| og | 0:eabefd4ea69c | 440 | bufferIndex= 0; |
| og | 0:eabefd4ea69c | 441 | } |
| og | 0:eabefd4ea69c | 442 | |
| og | 0:eabefd4ea69c | 443 | p = tft.Color565( picBuffer[bufferIndex+2], picBuffer[bufferIndex+1], picBuffer[bufferIndex]); |
| og | 0:eabefd4ea69c | 444 | bufferIndex += 3; |
| og | 0:eabefd4ea69c | 445 | |
| og | 0:eabefd4ea69c | 446 | tft.writeData(p); |
| og | 0:eabefd4ea69c | 447 | } |
| og | 0:eabefd4ea69c | 448 | } |
| og | 0:eabefd4ea69c | 449 | } |
| og | 0:eabefd4ea69c | 450 | |
| og | 0:eabefd4ea69c | 451 | |
| og | 0:eabefd4ea69c | 452 | FILE *fp; |
| og | 0:eabefd4ea69c | 453 | |
| og | 0:eabefd4ea69c | 454 | void testbmp() { |
| og | 0:eabefd4ea69c | 455 | tft.setRotation(0); |
| og | 0:eabefd4ea69c | 456 | tft.fillScreen(0); |
| og | 0:eabefd4ea69c | 457 | bmpdraw(fp, 50, 50); |
| og | 0:eabefd4ea69c | 458 | wait(1); |
| og | 0:eabefd4ea69c | 459 | |
| og | 0:eabefd4ea69c | 460 | tft.setRotation(1); |
| og | 0:eabefd4ea69c | 461 | tft.fillScreen(0); |
| og | 0:eabefd4ea69c | 462 | bmpdraw(fp, 50, 50); |
| og | 0:eabefd4ea69c | 463 | wait(1); |
| og | 0:eabefd4ea69c | 464 | |
| og | 0:eabefd4ea69c | 465 | tft.setRotation(2); |
| og | 0:eabefd4ea69c | 466 | tft.fillScreen(0); |
| og | 0:eabefd4ea69c | 467 | bmpdraw(fp, 50, 50); |
| og | 0:eabefd4ea69c | 468 | wait(1); |
| og | 0:eabefd4ea69c | 469 | |
| og | 0:eabefd4ea69c | 470 | tft.setRotation(3); |
| og | 0:eabefd4ea69c | 471 | tft.fillScreen(0); |
| og | 0:eabefd4ea69c | 472 | bmpdraw(fp, 50, 50); |
| og | 0:eabefd4ea69c | 473 | wait(1); |
| og | 0:eabefd4ea69c | 474 | } |
| og | 0:eabefd4ea69c | 475 | |
| og | 0:eabefd4ea69c | 476 | |
| og | 0:eabefd4ea69c | 477 | main() |
| og | 0:eabefd4ea69c | 478 | { |
| og | 0:eabefd4ea69c | 479 | //char bmpFile[80]; |
| og | 0:eabefd4ea69c | 480 | DIR *dir; |
| og | 0:eabefd4ea69c | 481 | |
| og | 0:eabefd4ea69c | 482 | tft.reset(); |
| og | 0:eabefd4ea69c | 483 | wait(1); |
| og | 0:eabefd4ea69c | 484 | |
| og | 0:eabefd4ea69c | 485 | // find the TFT display |
| og | 0:eabefd4ea69c | 486 | uint16_t identifier = tft.readRegister(0x0); |
| og | 0:eabefd4ea69c | 487 | if (identifier == 0x4747) { |
| og | 0:eabefd4ea69c | 488 | pc.printf("Found HX8347D\n"); |
| og | 0:eabefd4ea69c | 489 | } else { |
| og | 0:eabefd4ea69c | 490 | pc.printf("Unknown driver chip %X\n",identifier); |
| og | 0:eabefd4ea69c | 491 | while (1); |
| og | 0:eabefd4ea69c | 492 | } |
| og | 0:eabefd4ea69c | 493 | |
| og | 0:eabefd4ea69c | 494 | tft.initDisplay(); |
| og | 0:eabefd4ea69c | 495 | |
| og | 0:eabefd4ea69c | 496 | pc.printf("Initializing SD card...\n"); |
| og | 0:eabefd4ea69c | 497 | |
| og | 0:eabefd4ea69c | 498 | dir = opendir("/sd"); |
| og | 0:eabefd4ea69c | 499 | if ( dir == NULL ) { |
| og | 0:eabefd4ea69c | 500 | pc.printf("failed!\n"); |
| og | 0:eabefd4ea69c | 501 | while(1); |
| og | 0:eabefd4ea69c | 502 | } |
| og | 0:eabefd4ea69c | 503 | closedir(dir); |
| og | 0:eabefd4ea69c | 504 | pc.printf("SD OK!\n"); |
| og | 0:eabefd4ea69c | 505 | |
| og | 0:eabefd4ea69c | 506 | fp = fopen("/sd/woof.bmp", "r"); |
| og | 0:eabefd4ea69c | 507 | if (fp==NULL) { |
| og | 0:eabefd4ea69c | 508 | pc.printf("didnt find image\n"); |
| og | 0:eabefd4ea69c | 509 | while (1); |
| og | 0:eabefd4ea69c | 510 | } |
| og | 0:eabefd4ea69c | 511 | |
| og | 0:eabefd4ea69c | 512 | if (! bmpReadHeader(fp)) { |
| og | 0:eabefd4ea69c | 513 | pc.printf("bad bmp\n"); |
| og | 0:eabefd4ea69c | 514 | while(1); |
| og | 0:eabefd4ea69c | 515 | } |
| og | 0:eabefd4ea69c | 516 | |
| og | 0:eabefd4ea69c | 517 | pc.printf("image size %d, %d\n", bmpWidth, bmpHeight); |
| og | 0:eabefd4ea69c | 518 | |
| og | 0:eabefd4ea69c | 519 | bmpdraw(fp, 0, 0); |
| og | 0:eabefd4ea69c | 520 | wait(1); |
| og | 0:eabefd4ea69c | 521 | fclose(fp); |
| og | 0:eabefd4ea69c | 522 | |
| og | 0:eabefd4ea69c | 523 | |
| og | 0:eabefd4ea69c | 524 | |
| og | 0:eabefd4ea69c | 525 | |
| og | 0:eabefd4ea69c | 526 | |
| og | 0:eabefd4ea69c | 527 | //LCD_Init(); |
| og | 0:eabefd4ea69c | 528 | tft.initDisplay(); |
| og | 0:eabefd4ea69c | 529 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 530 | wait_ms(1); |
| og | 0:eabefd4ea69c | 531 | while(1) |
| og | 0:eabefd4ea69c | 532 | { |
| og | 0:eabefd4ea69c | 533 | tft.fillScreen(0); |
| og | 0:eabefd4ea69c | 534 | tft.setRotation(0); |
| og | 0:eabefd4ea69c | 535 | bmpdraw(fp, 0, 0); |
| og | 0:eabefd4ea69c | 536 | wait(1); |
| og | 0:eabefd4ea69c | 537 | |
| og | 0:eabefd4ea69c | 538 | tft.fillScreen(0); |
| og | 0:eabefd4ea69c | 539 | tft.setRotation(1); |
| og | 0:eabefd4ea69c | 540 | bmpdraw(fp, 0, 0); |
| og | 0:eabefd4ea69c | 541 | wait(1); |
| og | 0:eabefd4ea69c | 542 | |
| og | 0:eabefd4ea69c | 543 | tft.fillScreen(0); |
| og | 0:eabefd4ea69c | 544 | tft.setRotation(2); |
| og | 0:eabefd4ea69c | 545 | bmpdraw(fp, 0, 0); |
| og | 0:eabefd4ea69c | 546 | wait(1); |
| og | 0:eabefd4ea69c | 547 | |
| og | 0:eabefd4ea69c | 548 | tft.fillScreen(0); |
| og | 0:eabefd4ea69c | 549 | tft.setRotation(3); |
| og | 0:eabefd4ea69c | 550 | bmpdraw(fp, 0, 0); |
| og | 0:eabefd4ea69c | 551 | wait(1); |
| og | 0:eabefd4ea69c | 552 | |
| og | 0:eabefd4ea69c | 553 | testbmp(); |
| og | 0:eabefd4ea69c | 554 | rotateText(); |
| og | 0:eabefd4ea69c | 555 | //rotateTest(); |
| og | 0:eabefd4ea69c | 556 | |
| og | 0:eabefd4ea69c | 557 | testlinerotate(); |
| og | 0:eabefd4ea69c | 558 | |
| og | 0:eabefd4ea69c | 559 | testtext(WHITE); |
| og | 0:eabefd4ea69c | 560 | |
| og | 0:eabefd4ea69c | 561 | |
| og | 0:eabefd4ea69c | 562 | testBars(); |
| og | 0:eabefd4ea69c | 563 | testfastlines(CYAN, MAGENTA); |
| og | 0:eabefd4ea69c | 564 | testtriangles(); |
| og | 0:eabefd4ea69c | 565 | testfilltriangles(); |
| og | 0:eabefd4ea69c | 566 | testfillcircles(50, RED); |
| og | 0:eabefd4ea69c | 567 | tft.fillScreen(BLACK); |
| og | 0:eabefd4ea69c | 568 | testdrawcircles(10, YELLOW); |
| og | 0:eabefd4ea69c | 569 | testdrawrects(GREEN); |
| og | 0:eabefd4ea69c | 570 | testlines(BLUE); |
| og | 0:eabefd4ea69c | 571 | testfillrects(RED, WHITE); |
| og | 0:eabefd4ea69c | 572 | testFillRoundRect(); |
| og | 0:eabefd4ea69c | 573 | |
| og | 0:eabefd4ea69c | 574 | testdrawrects(GREEN); |
| og | 0:eabefd4ea69c | 575 | |
| og | 0:eabefd4ea69c | 576 | tft.DispColor(RED); //RED |
| og | 0:eabefd4ea69c | 577 | wait_us(10); |
| og | 0:eabefd4ea69c | 578 | |
| og | 0:eabefd4ea69c | 579 | tft.DispColor(GREEN); //GREEN |
| og | 0:eabefd4ea69c | 580 | wait_us(10); |
| og | 0:eabefd4ea69c | 581 | |
| og | 0:eabefd4ea69c | 582 | tft.DispColor(BLUE);//BLUE |
| og | 0:eabefd4ea69c | 583 | wait_us(10); |
| og | 0:eabefd4ea69c | 584 | |
| og | 0:eabefd4ea69c | 585 | tft.DispColor(WHITE); //WHITE |
| og | 0:eabefd4ea69c | 586 | //MYMXMV++; |
| og | 0:eabefd4ea69c | 587 | |
| og | 0:eabefd4ea69c | 588 | } |
| og | 0:eabefd4ea69c | 589 | } |
