ILI9341_SPI
Dependents: ov7670_dma_nucleo_f4 NUCLEO-F446RE_testDCMI
Diff: ILI9341.cpp
- Revision:
- 0:2d4605aef62f
- Child:
- 1:2446b5e1a4fb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ILI9341.cpp Fri Apr 29 13:36:39 2016 +0000 @@ -0,0 +1,338 @@ + +#include <mbed.h> +#include "ILI9341.h" + +ili9341_spi::ili9341_spi(SPI& _spi, PinName _cs,PinName _dc,PinName _rs) : spi(_spi), cs(_cs),dc(_dc),rs(_rs) {} + + +void ili9341_spi::window (unsigned int x, unsigned int y, unsigned int w, unsigned int h) +{ + wr_cmd(0x2A); + spi.write(x >> 8); + spi.write(x); + spi.write((x+w-1) >> 8); + spi.write(x+w-1); + + cs = 1; + wr_cmd(0x2B); + spi.write(y >> 8); + spi.write(y); + spi.write((y+h-1) >> 8); + spi.write(y+h-1); + cs = 1; +} +void ili9341_spi::wr_cmd(unsigned char cmd) +{ + dc = 0; + cs = 0; + spi.write(cmd); // mbed lib + dc = 1; +} +void ili9341_spi::wr_dat(unsigned char dat) +{ + spi.write(dat); // mbed lib +} +char ili9341_spi::rd_byte(unsigned char cmd) +{ + char r; + dc = 0; + cs = 0; + spi.write(cmd); // mbed lib + cs = 1; + r = spi.write(0xff); + cs = 1; + return(r); +} +int ili9341_spi::rd_32(unsigned char cmd) +{ + int d; + char r; + dc = 0; + cs = 0; + d = cmd; + d = d << 1; + spi.format(9,3); // we have to add a dummy clock cycle + spi.write(d); + spi.format(8,3); + dc = 1; + r = spi.write(0xff); + d = r; + r = spi.write(0xff); + d = (d << 8) | r; + r = spi.write(0xff); + d = (d << 8) | r; + r = spi.write(0xff); + d = (d << 8) | r; + cs = 1; + return(d); +} +int ili9341_spi:: Read_ID(void){ + int r; + r = rd_byte(0x0A); + r = rd_byte(0x0A); + r = rd_byte(0x0A); + r = rd_byte(0x0A); + return(r); +} + +void ili9341_spi::tft_reset() +{ + cs = 1; // cs high + dc = 1; // dc high + rs = 0; // display reset + + wait_us(50); + rs = 1; // end hardware reset + wait_ms(5); + + wr_cmd(0x01); // SW reset + wait_ms(5); + wr_cmd(0x28); // display off + + /* Start Initial Sequence ----------------------------------------------------*/ + wr_cmd(0xCF); + spi.write(0x00); + spi.write(0x83); + spi.write(0x30); + cs = 1; + + wr_cmd(0xED); + spi.write(0x64); + spi.write(0x03); + spi.write(0x12); + spi.write(0x81); + cs = 1; + + wr_cmd(0xE8); + spi.write(0x85); + spi.write(0x01); + spi.write(0x79); + cs = 1; + + wr_cmd(0xCB); + spi.write(0x39); + spi.write(0x2C); + spi.write(0x00); + spi.write(0x34); + spi.write(0x02); + cs = 1; + + wr_cmd(0xF7); + spi.write(0x20); + cs = 1; + + wr_cmd(0xEA); + spi.write(0x00); + spi.write(0x00); + cs = 1; + + wr_cmd(0xC0); // POWER_CONTROL_1 + spi.write(0x26); + cs = 1; + + wr_cmd(0xC1); // POWER_CONTROL_2 + spi.write(0x11); + cs = 1; + + wr_cmd(0xC5); // VCOM_CONTROL_1 + spi.write(0x35); + spi.write(0x3E); + cs = 1; + + wr_cmd(0xC7); // VCOM_CONTROL_2 + spi.write(0xBE); + cs = 1; + + wr_cmd(0x36); // MEMORY_ACCESS_CONTROL + spi.write(0x48); + cs = 1; + + wr_cmd(0x3A); // COLMOD_PIXEL_FORMAT_SET + spi.write(0x55); // 16 bit pixel + cs = 1; + + wr_cmd(0xB1); // Frame Rate + spi.write(0x00); + spi.write(0x1B); + cs = 1; + + wr_cmd(0xF2); // Gamma Function Disable + spi.write(0x08); + cs = 1; + + wr_cmd(0x26); + spi.write(0x01); // gamma set for curve 01/2/04/08 + cs = 1; + + wr_cmd(0xE0); // positive gamma correction + spi.write(0x1F); + spi.write(0x1A); + spi.write(0x18); + spi.write(0x0A); + spi.write(0x0F); + spi.write(0x06); + spi.write(0x45); + spi.write(0x87); + spi.write(0x32); + spi.write(0x0A); + spi.write(0x07); + spi.write(0x02); + spi.write(0x07); + spi.write(0x05); + spi.write(0x00); + cs = 1; + + wr_cmd(0xE1); // negativ gamma correction + spi.write(0x00); + spi.write(0x25); + spi.write(0x27); + spi.write(0x05); + spi.write(0x10); + spi.write(0x09); + spi.write(0x3A); + spi.write(0x78); + spi.write(0x4D); + spi.write(0x05); + spi.write(0x18); + spi.write(0x0D); + spi.write(0x38); + spi.write(0x3A); + spi.write(0x1F); + cs = 1; + + wr_cmd(0x2A); + spi.write(0); + spi.write(0); + spi.write(0); + spi.write(0x95); + + cs = 1; + wr_cmd(0x2B); + spi.write(0); + spi.write(0); + spi.write(0x00); + spi.write(0x90); + cs = 1; + + //wr_cmd(0x34); // tearing effect off + //_cs = 1; + + //wr_cmd(0x35); // tearing effect on + //_cs = 1; + + wr_cmd(0xB7); // entry mode + spi.write(0x07); + cs = 1; + + wr_cmd(0xB6); // display function control + spi.write(0x0A); + spi.write(0x82); + spi.write(0x27); + spi.write(0x00); + cs = 1; + + wr_cmd(0x11); // sleep out + cs = 1; + + wait_ms(100); + + wr_cmd(0x29); // display on + cs = 1; + + wait_ms(100); + + } +void ili9341_spi::pixel(int x, int y, int color) +{ + wr_cmd(0x2A); + spi.write(x >> 8); + spi.write(x); + cs = 1; + wr_cmd(0x2B); + spi.write(y >> 8); + spi.write(y); + cs = 1; + wr_cmd(0x2C); // send pixel + //#if defined TARGET_KL25Z // 8 Bit SPI + spi.write(color >> 8); + spi.write(color & 0xff); + /*#else + SPI::format(16,3); // switch to 16 bit Mode 3 + SPI::write(color); // Write D0..D15 + SPI::format(8,3); + #endif*/ + cs = 1; +} +void ili9341_spi::vline(int x, int y0, int y1, int color) +{ + int h; + h = y1 - y0 + 1; + window(x,y0,1,h); + wr_cmd(0x2C); // send pixel + //#if defined TARGET_KL25Z // 8 Bit SPI + for (int y=0; y<h; y++) { + spi.write(color >> 8); + spi.write(color & 0xff); + } + /* #else + SPI::format(16,3); // switch to 16 bit Mode 3 + for (int y=0; y<h; y++) { + SPI::write(color); + } + SPI::format(8,3);*/ + //#endif + cs = 1; + //WindowMax(); + return; +} + +void ili9341_spi::circle(int x0, int y0, int r, int color) +{ + + int x = -r, y = 0, err = 2-2*r, e2; + do { + pixel(x0-x, y0+y,color); + pixel(x0+x, y0+y,color); + pixel(x0+x, y0-y,color); + pixel(x0-x, y0-y,color); + e2 = err; + if (e2 <= y) { + err += ++y*2+1; + if (-x == y && e2 <= x) e2 = 0; + } + if (e2 > x) err += ++x*2+1; + } while (x <= 0); + } + +void ili9341_spi::fillrect(int x0, int y0, int x1, int y1, int color) +{ + + int h = y1 - y0 + 1; + int w = x1 - x0 + 1; + int pixel = h * w; + //window(x0,y0,w,h); + wr_cmd(0x2C); // send pixel + //#if defined TARGET_KL25Z // 8 Bit SPI + for (int p=0; p<pixel; p++) { + spi.write(color >> 8); + spi.write(color & 0xff); + } + /*#else + SPI::format(16,3); // switch to 16 bit Mode 3 + for (int p=0; p<pixel; p++) { + SPI::write(color); + } + SPI::format(8,3); + #endif*/ + cs = 1; + //WindowMax(); + return; +} +void ili9341_spi::select() { + //Set CS low to start transmission (interrupts conversion) + cs = 0; +} +void ili9341_spi::deselect() { + //Set CS high to stop transmission (restarts conversion) + cs = 1; +} \ No newline at end of file