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