ili9488.ino 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. #include <EEPROM.h>
  2. #include <SPI.h>
  3. #include <GD2.h>
  4. #define CSX 6 // chip select, active low
  5. #define DCX 5 // data/command select
  6. #define SCL 13 // clock, rising edge
  7. #define SDA 11 // data in to ILI9488
  8. #define SDO 12 // data out from ILI9488
  9. #define ILI9488_CMD_READ_ID1 0xDA
  10. #define ILI9488_CMD_READ_ID2 0xDB
  11. #define ILI9488_CMD_READ_ID3 0xDC
  12. #define ILI9488_CMD_READ_DISPLAY_IDENTIFICATION 0x04
  13. #define ILI9488_CMD_READ_DISPLAY_POWERMODE 0x0A
  14. #define ILI9488_CMD_READ_MADCTRL 0x0B
  15. #define ILI9488_CMD_READ_PIXEL_FORMAT 0x0C
  16. #define ILI9488_CMD_READ_DISPLAY_SIGNALMODE 0x0E
  17. void setup()
  18. {
  19. Serial.begin(1000000);
  20. pinMode(CSX, OUTPUT);
  21. digitalWrite(CSX, HIGH);
  22. Serial.println("GD init");
  23. gd_ili9488_init();
  24. if (1) {
  25. GD.__end();
  26. SPI.end();
  27. pinMode(DCX, OUTPUT);
  28. pinMode(SCL, OUTPUT);
  29. pinMode(SDA, OUTPUT);
  30. pinMode(SDO, INPUT);
  31. delay(100);
  32. ili9488_report();
  33. ili9488_rgb_mode();
  34. ili9488_report();
  35. SPI.begin();
  36. GD.resume();
  37. }
  38. }
  39. unsigned long t;
  40. void loop()
  41. {
  42. GD.ClearColorRGB(0x103000);
  43. GD.Clear();
  44. GD.cmd_text(GD.w / 2, GD.h / 2, 31, OPT_CENTER, "Hello world");
  45. GD.cmd_number(GD.w / 2, 3 * GD.h / 4, 31, OPT_CENTER, t++);
  46. GD.swap();
  47. /*
  48. uint32_t f0 = GD.rd32(REG_FRAMES);
  49. delay(1000);
  50. uint32_t f1 = GD.rd32(REG_FRAMES);
  51. Serial.println(f1 - f0);
  52. GD.finish();
  53. GD.__end();
  54. SPI.end();
  55. pinMode(DCX, OUTPUT);
  56. pinMode(SCL, OUTPUT);
  57. pinMode(SDA, OUTPUT);
  58. pinMode(SDO, INPUT);
  59. ili9488_report();
  60. SPI.begin();
  61. GD.resume();
  62. */
  63. }
  64. // Initialize GD for the ILI9488
  65. void gd_ili9488_init()
  66. {
  67. GD.begin(~GD_STORAGE);
  68. Serial.println("Setting video timing for ILI9488");
  69. GD.wr16(REG_HCYCLE, 400 );
  70. GD.wr16(REG_HOFFSET, 40 );
  71. GD.wr16(REG_HSYNC0, 0 );
  72. GD.wr16(REG_HSYNC1, 10 );
  73. GD.wr16(REG_VCYCLE, 500 );
  74. GD.wr16(REG_VOFFSET, 10 );
  75. GD.wr16(REG_VSYNC0, 0 );
  76. GD.wr16(REG_VSYNC1, 5 );
  77. GD.wr16(REG_SWIZZLE, 2 );
  78. GD.wr16(REG_PCLK_POL, 1 );
  79. GD.wr16(REG_HSIZE, 320 );
  80. GD.wr16(REG_VSIZE, 480 );
  81. GD.wr16(REG_CSPREAD, 1 );
  82. GD.wr16(REG_DITHER, 1 );
  83. GD.wr16(REG_PCLK, 5 );
  84. GD.w = 320;
  85. GD.h = 480;
  86. Serial.print("ID: ");
  87. Serial.println(GD.rd(REG_ID), HEX);
  88. }
  89. void out_8(uint8_t b)
  90. {
  91. digitalWrite(CSX, LOW);
  92. for (int i = 0; i < 8; i++) {
  93. digitalWrite(SCL, LOW);
  94. digitalWrite(SDA, (b >> 7) & 1);
  95. digitalWrite(SCL, HIGH);
  96. b <<= 1;
  97. }
  98. digitalWrite(CSX, HIGH);
  99. }
  100. void write_command(uint8_t b)
  101. {
  102. digitalWrite(DCX, LOW);
  103. out_8(b);
  104. }
  105. void write_data(uint8_t b)
  106. {
  107. digitalWrite(DCX, HIGH);
  108. out_8(b);
  109. }
  110. uint8_t rdreg(uint8_t reg)
  111. {
  112. uint8_t r;
  113. write_command(reg);
  114. digitalWrite(DCX, HIGH);
  115. digitalWrite(CSX, LOW);
  116. for (int i = 0; i < 8; i++) {
  117. digitalWrite(SCL, LOW);
  118. digitalWrite(SCL, HIGH);
  119. r = (r << 1) | digitalRead(SDO);
  120. }
  121. digitalWrite(CSX, HIGH);
  122. return r;
  123. }
  124. static void ili9488_rgb_mode()
  125. {
  126. write_command(0xE0); // positive gamma control
  127. write_data(0x00);
  128. write_data(0x04);
  129. write_data(0x0E);
  130. write_data(0x08);
  131. write_data(0x17);
  132. write_data(0x0A);
  133. write_data(0x40);
  134. write_data(0x79);
  135. write_data(0x4D);
  136. write_data(0x07);
  137. write_data(0x0E);
  138. write_data(0x0A);
  139. write_data(0x1A);
  140. write_data(0x1D);
  141. write_data(0x0F);
  142. write_command(0xE1); // Negative gamma control
  143. write_data(0x00);
  144. write_data(0x1B);
  145. write_data(0x1F);
  146. write_data(0x02);
  147. write_data(0x10);
  148. write_data(0x05);
  149. write_data(0x32);
  150. write_data(0x34);
  151. write_data(0x43);
  152. write_data(0x02);
  153. write_data(0x0A);
  154. write_data(0x09);
  155. write_data(0x33);
  156. write_data(0x37);
  157. write_data(0x0F);
  158. write_command(0xC0); // power control 1
  159. write_data(0x18);
  160. write_data(0x16);
  161. write_command(0xC1); // power control 2
  162. write_data(0x41);
  163. write_command(0xC5); // vcom control
  164. write_data(0x00);
  165. write_data(0x1E); // VCOM
  166. write_data(0x80);
  167. write_command(0x36); // madctrl - memory access control
  168. write_data(0x48); // bgr connection and colomn address order
  169. write_command(0x3A); // Interface Mode Control
  170. write_data(0x66); // 18BIT
  171. write_command(0xB1); // Frame rate 60HZ
  172. write_data(0xB0);
  173. write_command(0xE9); // set image function
  174. write_data(0x00); // DB_EN off - 24 bit is off
  175. write_command(0xF7); // adjust control 3
  176. write_data(0xA9);
  177. write_data(0x51);
  178. write_data(0x2C);
  179. write_data(0x82);
  180. write_command(0xB0); // Interface Mode Control
  181. write_data(0x02); // set DE,HS,VS,PCLK polarity
  182. write_command(0xB6);
  183. write_data(0x30); // 30 set rgb
  184. write_data(0x02); // GS,SS 02£¬42
  185. write_data(0x3B);
  186. write_command(0x2A); // colomn address set
  187. write_data(0x00);
  188. write_data(0x00);
  189. write_data(0x01);
  190. write_data(0x3F);
  191. write_command(0x2B); // Display function control
  192. write_data(0x00);
  193. write_data(0x00);
  194. write_data(0x01);
  195. write_data(0xDF);
  196. write_command(0x11); // sleep out
  197. delay(120);
  198. write_command(0x29); // display on
  199. }
  200. void ili9488_report()
  201. {
  202. Serial.println();
  203. Serial.print("ID1: ");
  204. Serial.println(rdreg(ILI9488_CMD_READ_ID1), HEX);
  205. Serial.print("ID2: ");
  206. Serial.println(rdreg(ILI9488_CMD_READ_ID2), HEX);
  207. Serial.print("ID3: ");
  208. Serial.println(rdreg(ILI9488_CMD_READ_ID3), HEX);
  209. Serial.print("DISPLAY_IDENTIFICATION: ");
  210. Serial.println(rdreg(ILI9488_CMD_READ_DISPLAY_IDENTIFICATION), HEX);
  211. Serial.print("DISPLAY_POWERMODE: ");
  212. Serial.println(rdreg(ILI9488_CMD_READ_DISPLAY_POWERMODE), HEX);
  213. Serial.print("MADCTRL: ");
  214. Serial.println(rdreg(ILI9488_CMD_READ_MADCTRL), HEX);
  215. Serial.print("PIXEL_FORMAT: ");
  216. Serial.println(rdreg(ILI9488_CMD_READ_PIXEL_FORMAT), HEX);
  217. Serial.print("DISPLAY_SIGNALMODE: ");
  218. Serial.println(rdreg(ILI9488_CMD_READ_DISPLAY_SIGNALMODE), HEX);
  219. }