123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- #include <EEPROM.h>
- #include <SPI.h>
- #include <GD2.h>
- #define CSX 6 // chip select, active low
- #define DCX 5 // data/command select
- #define SCL 13 // clock, rising edge
- #define SDA 11 // data in to ILI9488
- #define SDO 12 // data out from ILI9488
- #define ILI9488_CMD_READ_ID1 0xDA
- #define ILI9488_CMD_READ_ID2 0xDB
- #define ILI9488_CMD_READ_ID3 0xDC
- #define ILI9488_CMD_READ_DISPLAY_IDENTIFICATION 0x04
- #define ILI9488_CMD_READ_DISPLAY_POWERMODE 0x0A
- #define ILI9488_CMD_READ_MADCTRL 0x0B
- #define ILI9488_CMD_READ_PIXEL_FORMAT 0x0C
- #define ILI9488_CMD_READ_DISPLAY_SIGNALMODE 0x0E
- void setup()
- {
- Serial.begin(1000000);
- pinMode(CSX, OUTPUT);
- digitalWrite(CSX, HIGH);
- Serial.println("GD init");
- gd_ili9488_init();
- if (1) {
- GD.__end();
- SPI.end();
- pinMode(DCX, OUTPUT);
- pinMode(SCL, OUTPUT);
- pinMode(SDA, OUTPUT);
- pinMode(SDO, INPUT);
- delay(100);
- ili9488_report();
- ili9488_rgb_mode();
- ili9488_report();
- SPI.begin();
- GD.resume();
- }
- }
- unsigned long t;
- void loop()
- {
- GD.ClearColorRGB(0x103000);
- GD.Clear();
- GD.cmd_text(GD.w / 2, GD.h / 2, 31, OPT_CENTER, "Hello world");
- GD.cmd_number(GD.w / 2, 3 * GD.h / 4, 31, OPT_CENTER, t++);
- GD.swap();
- /*
- uint32_t f0 = GD.rd32(REG_FRAMES);
- delay(1000);
- uint32_t f1 = GD.rd32(REG_FRAMES);
- Serial.println(f1 - f0);
- GD.finish();
- GD.__end();
- SPI.end();
- pinMode(DCX, OUTPUT);
- pinMode(SCL, OUTPUT);
- pinMode(SDA, OUTPUT);
- pinMode(SDO, INPUT);
- ili9488_report();
- SPI.begin();
- GD.resume();
- */
- }
- // Initialize GD for the ILI9488
- void gd_ili9488_init()
- {
- GD.begin(~GD_STORAGE);
- Serial.println("Setting video timing for ILI9488");
- GD.wr16(REG_HCYCLE, 400 );
- GD.wr16(REG_HOFFSET, 40 );
- GD.wr16(REG_HSYNC0, 0 );
- GD.wr16(REG_HSYNC1, 10 );
- GD.wr16(REG_VCYCLE, 500 );
- GD.wr16(REG_VOFFSET, 10 );
- GD.wr16(REG_VSYNC0, 0 );
- GD.wr16(REG_VSYNC1, 5 );
- GD.wr16(REG_SWIZZLE, 2 );
- GD.wr16(REG_PCLK_POL, 1 );
- GD.wr16(REG_HSIZE, 320 );
- GD.wr16(REG_VSIZE, 480 );
- GD.wr16(REG_CSPREAD, 1 );
- GD.wr16(REG_DITHER, 1 );
- GD.wr16(REG_PCLK, 5 );
- GD.w = 320;
- GD.h = 480;
- Serial.print("ID: ");
- Serial.println(GD.rd(REG_ID), HEX);
- }
- void out_8(uint8_t b)
- {
- digitalWrite(CSX, LOW);
- for (int i = 0; i < 8; i++) {
- digitalWrite(SCL, LOW);
- digitalWrite(SDA, (b >> 7) & 1);
- digitalWrite(SCL, HIGH);
- b <<= 1;
- }
- digitalWrite(CSX, HIGH);
- }
- void write_command(uint8_t b)
- {
- digitalWrite(DCX, LOW);
- out_8(b);
- }
- void write_data(uint8_t b)
- {
- digitalWrite(DCX, HIGH);
- out_8(b);
- }
- uint8_t rdreg(uint8_t reg)
- {
- uint8_t r;
- write_command(reg);
- digitalWrite(DCX, HIGH);
- digitalWrite(CSX, LOW);
- for (int i = 0; i < 8; i++) {
- digitalWrite(SCL, LOW);
- digitalWrite(SCL, HIGH);
- r = (r << 1) | digitalRead(SDO);
- }
- digitalWrite(CSX, HIGH);
- return r;
- }
- static void ili9488_rgb_mode()
- {
- write_command(0xE0); // positive gamma control
- write_data(0x00);
- write_data(0x04);
- write_data(0x0E);
- write_data(0x08);
- write_data(0x17);
- write_data(0x0A);
- write_data(0x40);
- write_data(0x79);
- write_data(0x4D);
- write_data(0x07);
- write_data(0x0E);
- write_data(0x0A);
- write_data(0x1A);
- write_data(0x1D);
- write_data(0x0F);
- write_command(0xE1); // Negative gamma control
- write_data(0x00);
- write_data(0x1B);
- write_data(0x1F);
- write_data(0x02);
- write_data(0x10);
- write_data(0x05);
- write_data(0x32);
- write_data(0x34);
- write_data(0x43);
- write_data(0x02);
- write_data(0x0A);
- write_data(0x09);
- write_data(0x33);
- write_data(0x37);
- write_data(0x0F);
- write_command(0xC0); // power control 1
- write_data(0x18);
- write_data(0x16);
- write_command(0xC1); // power control 2
- write_data(0x41);
- write_command(0xC5); // vcom control
- write_data(0x00);
- write_data(0x1E); // VCOM
- write_data(0x80);
- write_command(0x36); // madctrl - memory access control
- write_data(0x48); // bgr connection and colomn address order
- write_command(0x3A); // Interface Mode Control
- write_data(0x66); // 18BIT
- write_command(0xB1); // Frame rate 60HZ
- write_data(0xB0);
- write_command(0xE9); // set image function
- write_data(0x00); // DB_EN off - 24 bit is off
- write_command(0xF7); // adjust control 3
- write_data(0xA9);
- write_data(0x51);
- write_data(0x2C);
- write_data(0x82);
- write_command(0xB0); // Interface Mode Control
- write_data(0x02); // set DE,HS,VS,PCLK polarity
- write_command(0xB6);
- write_data(0x30); // 30 set rgb
- write_data(0x02); // GS,SS 02£¬42
- write_data(0x3B);
- write_command(0x2A); // colomn address set
- write_data(0x00);
- write_data(0x00);
- write_data(0x01);
- write_data(0x3F);
- write_command(0x2B); // Display function control
- write_data(0x00);
- write_data(0x00);
- write_data(0x01);
- write_data(0xDF);
- write_command(0x11); // sleep out
- delay(120);
- write_command(0x29); // display on
- }
- void ili9488_report()
- {
- Serial.println();
- Serial.print("ID1: ");
- Serial.println(rdreg(ILI9488_CMD_READ_ID1), HEX);
- Serial.print("ID2: ");
- Serial.println(rdreg(ILI9488_CMD_READ_ID2), HEX);
- Serial.print("ID3: ");
- Serial.println(rdreg(ILI9488_CMD_READ_ID3), HEX);
- Serial.print("DISPLAY_IDENTIFICATION: ");
- Serial.println(rdreg(ILI9488_CMD_READ_DISPLAY_IDENTIFICATION), HEX);
- Serial.print("DISPLAY_POWERMODE: ");
- Serial.println(rdreg(ILI9488_CMD_READ_DISPLAY_POWERMODE), HEX);
- Serial.print("MADCTRL: ");
- Serial.println(rdreg(ILI9488_CMD_READ_MADCTRL), HEX);
- Serial.print("PIXEL_FORMAT: ");
- Serial.println(rdreg(ILI9488_CMD_READ_PIXEL_FORMAT), HEX);
- Serial.print("DISPLAY_SIGNALMODE: ");
- Serial.println(rdreg(ILI9488_CMD_READ_DISPLAY_SIGNALMODE), HEX);
- }
|