Lib for the new LCD Display with ILI9341 controller

Dependents:   TFT_Test_ILI9341 touch_piirto TFT_banggood TFT_Test_ILI9341-a-fish ... more

Lib for 320*240 Pixel Color LCD with ILI9341 controller. Based on MI0283QT-9 datasheet. The lib is based on the http://mbed.org/cookbook/SPI-driven-QVGA-TFT code for the older LCD board.

The lib is using the 4 line serial data interface. The IM pins have to be set to 1110 (IM3-IM0) to use this mode. It use the SPI hardware.

I have started to speed up the lib with using DMA and direct SPI programming. To do this I have to split the code for the different platforms. To prevent unreadable code with a lot of #ifdef... I have create a new file. The #ifdef definition around is switching between the platforms. I will add the other Nucleo platforms. If you want to support others - see ..._NUCLEO.cpp , port and send me the code to add.

Display 1

If you use the TFT Proto from MikroElektronika http://www.mikroe.com/eng/products/view/474/tft-proto-board/ you have to connect : /media/uploads/dreschpe/tft_proto.png

MBEDDisplay
+ 3,3V3,3V
GNDGND
mosiSDI
misoSDO
sckRS
csCS
resetRST
dcWR/SCL
GNDIM0
+3,3VIM1 IM2 IM3
GNDDB0 - DB17
GNDRD

The backlite LED need a resistor to limit the current. You can use two 10R resistors parallel to get 5R driven by 3.3V.

Display 2

Watterott is also selling a ILI9341 based QVGA TFT : http://www.watterott.com/de/MI0283QT-2-Adapter

Unfortunately this adapter is set to 9 bit SPI mode via the mode pins IM0-IM3. If you want to patch this - like I have done - you have to desolder the TFT from the pcb to cut some traces. This is a flexible print. Only for people with soldering skills ! You also have to get access to pin 36 for the dc signal. Cut the GND connection. You can use the level converter used for the LCD_LED signal. Mosfet Q1 can be driven with a logic signal without converter. Watterott will change this in a future revision.

/media/uploads/dreschpe/mi0283qt_v12_patch.pdf

Display 3

There are inexpensive displays from china. You can get them at: http://www.banggood.com/2_2-Inch-Serial-TFT-SPI-LCD-Screen-Module-HD-240-X-320-5110-Compatible-p-912854.html The board has also a SD card connector at the backside, but no touch.

/media/uploads/dreschpe/tft3_1.jpg /media/uploads/dreschpe/tft3_2.jpg

The board can be used without modification. Connect VCC with 5V USB out. There is a voltage regulator on board. To use the SD card simply import the SDFileSystem and connect it to the second SPI.

Fonts

How to get nice looking fonts ?

To print characters to a graphic screen we need a font. To code a font by paper is ok for a small lcd, but for a 320*240 pixel display we need bigger fonts. A 12*12 pixel font is readable, but a lot of work to construct.

Fonts can be made with the GLCD Font Creator also from http://www.mikroe.com .

With this program you can load a window font and convert it into a c-array. To use this Font with my lib you have to add 4 parameter at the beginning of the font array. - the number of byte / char - the vertial size in pixel - the horizontal size in pixel - the number of byte per vertical line (it is vertical size / 8 ) You also have to change the array to char[]. After that you can switch between different fonts with set_font(unsigned char* font); The horizontal size of each character is also stored in the font. It look better if you use bigger fonts or italic. The letter M is wider than a l.

Here are some Fonts from me : http://mbed.org/users/dreschpe/code/TFT_fonts/

The small made for the mbed lab board : http://mbed.org/users/dreschpe/code/LCD_fonts/

And from Peter Holzleitner : http://mbed.org/users/pholzleitner/code/SourceCodePro31-SB/

Text commands :

You can use the claim() function to redirect the output to stdout or stderr to the TFT. After claim(stdout) you can simply use the printf function to print to the TFT.

  • locate(x,y); function is used to setup the cursor position. x,y are the pixel position. This was changed from row,column in older lib !

There are two parameter to setup the color of the text :

  • background(color);
  • foreground(color); All color are 16bit: R5 G6 B5.
  • set_orientation(); This command select one of the 4 directions to use the display. This command is also working on the graphical commands.

Graphics

Graphic commands :

  • cls(); Fill the screen with background color
  • pixel(x,y,color); set a single pixel at x,y with color
  • line(x0,y0,x1,y1,color); draw a line from x0,y0 to x1,y1 with color
  • rect(x0,y0,x1,y1,color); draw a rectangle x0,y0 to x1,y1 with color
  • fillrect(x0,y0,x1,y1,color); draw a filled rectangle
  • circle( x0,y0,radius ,color); draw a circle around x0,y0 with radius
  • fillcircle(x0,y0,radius ,color); draw a filled circle around x0,y0 with radius
  • Bitmap(x0,y0,w,h,*bitmap); paint a bitmap with width w and high h starting at x0,y0 (upper left corner)
  • BMP_16(x0,y0,*bmp); paint a bmp file out of the internal drive or a SD-card

How to transfer a grafic to the mbed ?

The hard way - but fast to load :

Load from mbed flash. It consume a lot of flash memory. To construct a bitmap array we can use gimp. http://www.gimp.org/ Load a image (edit and resize) and export it as BMP. You have to select the option 16 bit R5 G6 B5 !

To convert this file into a c-array you can use the hex-editor winhex. (http://www.x-ways.net/winhex/index-m.html) The eval version can handle the small files. We don`t need the bmp header. Mark the data starting at offset 0x46 to the end of file. Use "edit -> copy block -> C Source" to export this data as C array. Paste the data into a C file into the mbed compiler. The editor will generate a array of char[]. To use 16 bit DMA on this we have to put a __align(2) in front of the definition. To put it into Flash we change it to static const unsigned char bmp[]{...}

__align(2)
static const unsigned char bmp[]{
      0xCB, 0x5A, 0x5C, 0xE7,....

};

The easy way - but slower to load:

With the BMP_16 command we can load a picture out of the internal drive or a SD-card to the display.

  • BMP_16(x0,y0,"/local/test.bmp"); paint test.bmp out of the internal drive to x0, y0
  • BMP_16(x0,y0,"/sd/test.bmp"); paint test.bmp out of a external SD-card to x0, y0

simply copy test.bmp to the mbed usb drive or the SD-card. The bmp has to be saved with the options 16 bit R5 G6 B5 ! You can use the program gimp to convert pictures into the 16 bit bmp format.

sample code

http://mbed.org/users/dreschpe/code/TFT_Test_ILI9341/

// example to test the TFT Display
// Thanks to the GraphicsDisplay and TextDisplay classes
// test2.bmp has to be on the mbed file system

#include "stdio.h"
#include "mbed.h"
#include "SPI_TFT_ILI9341.h"
#include "string"
#include "Arial12x12.h"
#include "Arial24x23.h"
#include "Arial28x28.h"
#include "font_big.h"

extern unsigned char p1[];  // the mbed logo

DigitalOut LCD_LED(p21); // the Watterott display has a backlight switch
DigitalOut CS_Touch(p15); // disable the touch controller on the Watterott display

// the TFT is connected to SPI pin 5-7
SPI_TFT_ILI9341 TFT(p5, p6, p7, p8, p9, p10,"TFT"); // mosi, miso, sclk, cs, reset, dc

int main()
{
    int i;
    LCD_LED = 1;  // backlight on
    CS_Touch = 1; 
   
    TFT.claim(stdout);      // send stdout to the TFT display
    //TFT.claim(stderr);      // send stderr to the TFT display
    TFT.set_orientation(1);
    TFT.background(Black);    // set background to black
    TFT.foreground(White);    // set chars to white
    TFT.cls();                // clear the screen

    //first show the 4 directions
    TFT.set_orientation(0);
    TFT.background(Black);
    TFT.cls();

    TFT.set_font((unsigned char*) Arial12x12);
    TFT.locate(0,0);
    printf("  Hello Mbed 0");

    TFT.set_orientation(1);
    TFT.locate(0,0);
    printf("  Hello Mbed 1");
    TFT.set_orientation(2);
    TFT.locate(0,0);
    printf("  Hello Mbed 2");
    TFT.set_orientation(3);
    TFT.locate(0,0);
    printf("  Hello Mbed 3");
    TFT.set_orientation(1);
    TFT.set_font((unsigned char*) Arial24x23);
    TFT.locate(50,100);
    TFT.printf("TFT orientation");

/media/uploads/dreschpe/orient.jpg

// draw some graphics
    TFT.cls();
    TFT.set_font((unsigned char*) Arial24x23);
    TFT.locate(100,100);
    TFT.printf("Graphic");

    TFT.line(0,0,100,0,Green);
    TFT.line(0,0,0,200,Green);
    TFT.line(0,0,100,200,Green);

    TFT.rect(100,50,150,100,Red);
    TFT.fillrect(180,25,220,70,Blue);

    TFT.circle(80,150,33,White);
    TFT.fillcircle(160,190,20,Yellow);

    double s;

    for (i=0; i<320; i++) {
        s =20 * sin((long double) i / 10 );
        TFT.pixel(i,100 + (int)s ,Red);
    }

/media/uploads/dreschpe/grafik.jpg

   // bigger text
    TFT.foreground(White);
    TFT.background(Blue);
    TFT.cls();
    TFT.set_font((unsigned char*) Arial24x23);
    TFT.locate(0,0);
    TFT.printf("Different Fonts :");

    TFT.set_font((unsigned char*) Neu42x35);
    TFT.locate(0,30);
    TFT.printf("Hello Mbed 1");
    TFT.set_font((unsigned char*) Arial24x23);
    TFT.locate(20,80);
    TFT.printf("Hello Mbed 2");
    TFT.set_font((unsigned char*) Arial12x12);
    TFT.locate(35,120);
    TFT.printf("Hello Mbed 3");

/media/uploads/dreschpe/fonts2.jpg

    // mbed logo from flash
    // defined in graphics.c
    //__align(4)
    //unsigned char p1[18920] = {
    //0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, ....
    // 
    TFT.background(Black);
    TFT.cls();

    TFT.locate(10,10);
    TFT.printf("Graphic from Flash");

    TFT.Bitmap(90,90,172,55,p1);

/media/uploads/dreschpe/mbed.jpg

  
  #include "SDFileSystem.h"
  // connect a sd-card to the second spi or use the local filesystem of the LPC   
  SDFileSystem sd(p11, p12, p13, p14, "sd"); // mosi,miso,sck,cs
  TFT.cls();
  TFT.locate(10,110);
  TFT.printf("Graphic from external SD-card");
  int err = TFT.BMP_16(1,140,"/sd/test.bmp");  // load test.bmp from external SD-card
  TFT.locate(10,120);
  if (err != 1) TFT.printf(" - Err: %d",err);

/media/uploads/dreschpe/bmp16.jpg

Committer:
dreschpe
Date:
Tue Jun 24 15:37:52 2014 +0000
Revision:
11:59eca2723ec5
Parent:
10:50f88bd5557f
Child:
12:98cc5c193ecd
Add fast Version for NUCLEO L152RE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dreschpe 0:da1bf437cbc1 1 /* mbed library for 240*320 pixel display TFT based on ILI9341 LCD Controller
dreschpe 0:da1bf437cbc1 2 * Copyright (c) 2013 Peter Drescher - DC2PD
dreschpe 0:da1bf437cbc1 3 *
dreschpe 0:da1bf437cbc1 4 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
dreschpe 0:da1bf437cbc1 5 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
dreschpe 0:da1bf437cbc1 6 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
dreschpe 0:da1bf437cbc1 7 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
dreschpe 0:da1bf437cbc1 8 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
dreschpe 0:da1bf437cbc1 9 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
dreschpe 0:da1bf437cbc1 10 * THE SOFTWARE.
dreschpe 0:da1bf437cbc1 11 */
dreschpe 0:da1bf437cbc1 12
dreschpe 0:da1bf437cbc1 13 // 12.06.13 fork from SPI_TFT code because controller is different ...
dreschpe 2:0a16083193a4 14 // 14.07.13 Test with real display and bugfix
dreschpe 4:f018e272220b 15 // 18.10.13 Better Circle function from Michael Ammann
dreschpe 5:55aed13f2630 16 // 22.10.13 Fixes for Kinetis Board - 8 bit spi
dreschpe 6:fe07ae8329f7 17 // 26.01.14 Change interface for BMP_16 to also use SD-cards
dreschpe 9:423e6a952472 18 // 23.06.14 switch back to old Version - fork for L152
dreschpe 11:59eca2723ec5 19 // 24.06.14 Add compiler flag for optimized L152 version
dreschpe 11:59eca2723ec5 20
dreschpe 11:59eca2723ec5 21 // exclude this file for platforms with optimized version
dreschpe 11:59eca2723ec5 22 #ifndef TARGET_NUCLEO_L152RE
dreschpe 0:da1bf437cbc1 23
dreschpe 0:da1bf437cbc1 24 #include "SPI_TFT_ILI9341.h"
dreschpe 0:da1bf437cbc1 25 #include "mbed.h"
dreschpe 0:da1bf437cbc1 26
dreschpe 0:da1bf437cbc1 27 #define BPP 16 // Bits per pixel
dreschpe 6:fe07ae8329f7 28
dreschpe 0:da1bf437cbc1 29 //extern Serial pc;
dreschpe 0:da1bf437cbc1 30 //extern DigitalOut xx; // debug !!
dreschpe 0:da1bf437cbc1 31
dreschpe 0:da1bf437cbc1 32 SPI_TFT_ILI9341::SPI_TFT_ILI9341(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset, PinName dc, const char *name)
dreschpe 11:59eca2723ec5 33 : GraphicsDisplay(name), SPI(mosi, miso, sclk,NC), _cs(cs), _reset(reset), _dc(dc)
dreschpe 0:da1bf437cbc1 34 {
dreschpe 11:59eca2723ec5 35
dreschpe 0:da1bf437cbc1 36 orientation = 0;
dreschpe 0:da1bf437cbc1 37 char_x = 0;
dreschpe 11:59eca2723ec5 38 SPI::format(8,3); // 8 bit spi mode 3
dreschpe 11:59eca2723ec5 39 SPI::frequency(10000000); // 10 Mhz SPI clock
dreschpe 0:da1bf437cbc1 40 tft_reset();
dreschpe 0:da1bf437cbc1 41 }
dreschpe 0:da1bf437cbc1 42
dreschpe 0:da1bf437cbc1 43 int SPI_TFT_ILI9341::width()
dreschpe 0:da1bf437cbc1 44 {
dreschpe 0:da1bf437cbc1 45 if (orientation == 0 || orientation == 2) return 240;
dreschpe 0:da1bf437cbc1 46 else return 320;
dreschpe 0:da1bf437cbc1 47 }
dreschpe 0:da1bf437cbc1 48
dreschpe 0:da1bf437cbc1 49
dreschpe 0:da1bf437cbc1 50 int SPI_TFT_ILI9341::height()
dreschpe 0:da1bf437cbc1 51 {
dreschpe 0:da1bf437cbc1 52 if (orientation == 0 || orientation == 2) return 320;
dreschpe 0:da1bf437cbc1 53 else return 240;
dreschpe 0:da1bf437cbc1 54 }
dreschpe 0:da1bf437cbc1 55
dreschpe 0:da1bf437cbc1 56
dreschpe 2:0a16083193a4 57 void SPI_TFT_ILI9341::set_orientation(unsigned int o)
dreschpe 0:da1bf437cbc1 58 {
dreschpe 0:da1bf437cbc1 59 orientation = o;
dreschpe 2:0a16083193a4 60 wr_cmd(0x36); // MEMORY_ACCESS_CONTROL
dreschpe 0:da1bf437cbc1 61 switch (orientation) {
dreschpe 0:da1bf437cbc1 62 case 0:
dreschpe 11:59eca2723ec5 63 SPI::write(0x48);
dreschpe 0:da1bf437cbc1 64 break;
dreschpe 0:da1bf437cbc1 65 case 1:
dreschpe 11:59eca2723ec5 66 SPI::write(0x28);
dreschpe 0:da1bf437cbc1 67 break;
dreschpe 0:da1bf437cbc1 68 case 2:
dreschpe 11:59eca2723ec5 69 SPI::write(0x88);
dreschpe 0:da1bf437cbc1 70 break;
dreschpe 0:da1bf437cbc1 71 case 3:
dreschpe 11:59eca2723ec5 72 SPI::write(0xE8);
dreschpe 0:da1bf437cbc1 73 break;
dreschpe 0:da1bf437cbc1 74 }
dreschpe 2:0a16083193a4 75 _cs = 1;
dreschpe 0:da1bf437cbc1 76 WindowMax();
dreschpe 2:0a16083193a4 77 }
dreschpe 0:da1bf437cbc1 78
dreschpe 0:da1bf437cbc1 79
dreschpe 0:da1bf437cbc1 80 // write command to tft register
dreschpe 0:da1bf437cbc1 81
dreschpe 0:da1bf437cbc1 82 void SPI_TFT_ILI9341::wr_cmd(unsigned char cmd)
dreschpe 0:da1bf437cbc1 83 {
dreschpe 0:da1bf437cbc1 84 _dc = 0;
dreschpe 0:da1bf437cbc1 85 _cs = 0;
dreschpe 11:59eca2723ec5 86 SPI::write(cmd); // mbed lib
dreschpe 0:da1bf437cbc1 87 _dc = 1;
dreschpe 0:da1bf437cbc1 88 }
dreschpe 0:da1bf437cbc1 89
dreschpe 0:da1bf437cbc1 90
dreschpe 0:da1bf437cbc1 91
dreschpe 0:da1bf437cbc1 92 void SPI_TFT_ILI9341::wr_dat(unsigned char dat)
dreschpe 0:da1bf437cbc1 93 {
dreschpe 11:59eca2723ec5 94 SPI::write(dat); // mbed lib
dreschpe 0:da1bf437cbc1 95 }
dreschpe 0:da1bf437cbc1 96
dreschpe 0:da1bf437cbc1 97
dreschpe 0:da1bf437cbc1 98
dreschpe 6:fe07ae8329f7 99 // the ILI9341 can read
dreschpe 6:fe07ae8329f7 100
dreschpe 6:fe07ae8329f7 101 char SPI_TFT_ILI9341::rd_byte(unsigned char cmd)
dreschpe 6:fe07ae8329f7 102 {
dreschpe 6:fe07ae8329f7 103 char r;
dreschpe 6:fe07ae8329f7 104 _dc = 0;
dreschpe 6:fe07ae8329f7 105 _cs = 0;
dreschpe 11:59eca2723ec5 106 SPI::write(cmd); // mbed lib
dreschpe 6:fe07ae8329f7 107 _cs = 1;
dreschpe 11:59eca2723ec5 108 r = SPI::write(0xff);
dreschpe 6:fe07ae8329f7 109 _cs = 1;
dreschpe 6:fe07ae8329f7 110 return(r);
dreschpe 6:fe07ae8329f7 111 }
dreschpe 0:da1bf437cbc1 112
dreschpe 6:fe07ae8329f7 113 // read 32 bit
dreschpe 6:fe07ae8329f7 114 int SPI_TFT_ILI9341::rd_32(unsigned char cmd)
dreschpe 6:fe07ae8329f7 115 {
dreschpe 6:fe07ae8329f7 116 int d;
dreschpe 6:fe07ae8329f7 117 char r;
dreschpe 6:fe07ae8329f7 118 _dc = 0;
dreschpe 6:fe07ae8329f7 119 _cs = 0;
dreschpe 6:fe07ae8329f7 120 d = cmd;
dreschpe 6:fe07ae8329f7 121 d = d << 1;
dreschpe 11:59eca2723ec5 122 SPI::format(9,3); // we have to add a dummy clock cycle
dreschpe 11:59eca2723ec5 123 SPI::write(d);
dreschpe 11:59eca2723ec5 124 SPI::format(8,3);
dreschpe 6:fe07ae8329f7 125 _dc = 1;
dreschpe 11:59eca2723ec5 126 r = SPI::write(0xff);
dreschpe 6:fe07ae8329f7 127 d = r;
dreschpe 11:59eca2723ec5 128 r = SPI::write(0xff);
dreschpe 6:fe07ae8329f7 129 d = (d << 8) | r;
dreschpe 11:59eca2723ec5 130 r = SPI::write(0xff);
dreschpe 6:fe07ae8329f7 131 d = (d << 8) | r;
dreschpe 11:59eca2723ec5 132 r = SPI::write(0xff);
dreschpe 6:fe07ae8329f7 133 d = (d << 8) | r;
dreschpe 6:fe07ae8329f7 134 _cs = 1;
dreschpe 6:fe07ae8329f7 135 return(d);
dreschpe 6:fe07ae8329f7 136 }
dreschpe 0:da1bf437cbc1 137
dreschpe 6:fe07ae8329f7 138 int SPI_TFT_ILI9341::Read_ID(void){
dreschpe 6:fe07ae8329f7 139 int r;
dreschpe 6:fe07ae8329f7 140 r = rd_byte(0x0A);
dreschpe 6:fe07ae8329f7 141 r = rd_byte(0x0A);
dreschpe 6:fe07ae8329f7 142 r = rd_byte(0x0A);
dreschpe 6:fe07ae8329f7 143 r = rd_byte(0x0A);
dreschpe 6:fe07ae8329f7 144 return(r);
dreschpe 6:fe07ae8329f7 145 }
dreschpe 0:da1bf437cbc1 146
dreschpe 0:da1bf437cbc1 147
dreschpe 1:6d6125e88de7 148 // Init code based on MI0283QT datasheet
dreschpe 1:6d6125e88de7 149
dreschpe 0:da1bf437cbc1 150 void SPI_TFT_ILI9341::tft_reset()
dreschpe 0:da1bf437cbc1 151 {
dreschpe 0:da1bf437cbc1 152 _cs = 1; // cs high
dreschpe 0:da1bf437cbc1 153 _dc = 1; // dc high
dreschpe 0:da1bf437cbc1 154 _reset = 0; // display reset
dreschpe 0:da1bf437cbc1 155
dreschpe 0:da1bf437cbc1 156 wait_us(50);
dreschpe 1:6d6125e88de7 157 _reset = 1; // end hardware reset
dreschpe 0:da1bf437cbc1 158 wait_ms(5);
dreschpe 1:6d6125e88de7 159
dreschpe 1:6d6125e88de7 160 wr_cmd(0x01); // SW reset
dreschpe 1:6d6125e88de7 161 wait_ms(5);
dreschpe 1:6d6125e88de7 162 wr_cmd(0x28); // display off
dreschpe 0:da1bf437cbc1 163
dreschpe 0:da1bf437cbc1 164 /* Start Initial Sequence ----------------------------------------------------*/
dreschpe 1:6d6125e88de7 165 wr_cmd(0xCF);
dreschpe 11:59eca2723ec5 166 SPI::write(0x00);
dreschpe 11:59eca2723ec5 167 SPI::write(0x83);
dreschpe 11:59eca2723ec5 168 SPI::write(0x30);
dreschpe 1:6d6125e88de7 169 _cs = 1;
dreschpe 1:6d6125e88de7 170
dreschpe 1:6d6125e88de7 171 wr_cmd(0xED);
dreschpe 11:59eca2723ec5 172 SPI::write(0x64);
dreschpe 11:59eca2723ec5 173 SPI::write(0x03);
dreschpe 11:59eca2723ec5 174 SPI::write(0x12);
dreschpe 11:59eca2723ec5 175 SPI::write(0x81);
dreschpe 1:6d6125e88de7 176 _cs = 1;
dreschpe 1:6d6125e88de7 177
dreschpe 1:6d6125e88de7 178 wr_cmd(0xE8);
dreschpe 11:59eca2723ec5 179 SPI::write(0x85);
dreschpe 11:59eca2723ec5 180 SPI::write(0x01);
dreschpe 11:59eca2723ec5 181 SPI::write(0x79);
dreschpe 1:6d6125e88de7 182 _cs = 1;
dreschpe 1:6d6125e88de7 183
dreschpe 1:6d6125e88de7 184 wr_cmd(0xCB);
dreschpe 11:59eca2723ec5 185 SPI::write(0x39);
dreschpe 11:59eca2723ec5 186 SPI::write(0x2C);
dreschpe 11:59eca2723ec5 187 SPI::write(0x00);
dreschpe 11:59eca2723ec5 188 SPI::write(0x34);
dreschpe 11:59eca2723ec5 189 SPI::write(0x02);
dreschpe 0:da1bf437cbc1 190 _cs = 1;
dreschpe 1:6d6125e88de7 191
dreschpe 1:6d6125e88de7 192 wr_cmd(0xF7);
dreschpe 11:59eca2723ec5 193 SPI::write(0x20);
dreschpe 0:da1bf437cbc1 194 _cs = 1;
dreschpe 1:6d6125e88de7 195
dreschpe 1:6d6125e88de7 196 wr_cmd(0xEA);
dreschpe 11:59eca2723ec5 197 SPI::write(0x00);
dreschpe 11:59eca2723ec5 198 SPI::write(0x00);
dreschpe 0:da1bf437cbc1 199 _cs = 1;
dreschpe 1:6d6125e88de7 200
dreschpe 0:da1bf437cbc1 201 wr_cmd(0xC0); // POWER_CONTROL_1
dreschpe 11:59eca2723ec5 202 SPI::write(0x26);
dreschpe 0:da1bf437cbc1 203 _cs = 1;
dreschpe 1:6d6125e88de7 204
dreschpe 0:da1bf437cbc1 205 wr_cmd(0xC1); // POWER_CONTROL_2
dreschpe 11:59eca2723ec5 206 SPI::write(0x11);
dreschpe 0:da1bf437cbc1 207 _cs = 1;
dreschpe 1:6d6125e88de7 208
dreschpe 0:da1bf437cbc1 209 wr_cmd(0xC5); // VCOM_CONTROL_1
dreschpe 11:59eca2723ec5 210 SPI::write(0x35);
dreschpe 11:59eca2723ec5 211 SPI::write(0x3E);
dreschpe 0:da1bf437cbc1 212 _cs = 1;
dreschpe 1:6d6125e88de7 213
dreschpe 0:da1bf437cbc1 214 wr_cmd(0xC7); // VCOM_CONTROL_2
dreschpe 11:59eca2723ec5 215 SPI::write(0xBE);
dreschpe 0:da1bf437cbc1 216 _cs = 1;
dreschpe 1:6d6125e88de7 217
dreschpe 0:da1bf437cbc1 218 wr_cmd(0x36); // MEMORY_ACCESS_CONTROL
dreschpe 11:59eca2723ec5 219 SPI::write(0x48);
dreschpe 0:da1bf437cbc1 220 _cs = 1;
dreschpe 1:6d6125e88de7 221
dreschpe 1:6d6125e88de7 222 wr_cmd(0x3A); // COLMOD_PIXEL_FORMAT_SET
dreschpe 11:59eca2723ec5 223 SPI::write(0x55); // 16 bit pixel
dreschpe 1:6d6125e88de7 224 _cs = 1;
dreschpe 1:6d6125e88de7 225
dreschpe 1:6d6125e88de7 226 wr_cmd(0xB1); // Frame Rate
dreschpe 11:59eca2723ec5 227 SPI::write(0x00);
dreschpe 11:59eca2723ec5 228 SPI::write(0x1B);
dreschpe 1:6d6125e88de7 229 _cs = 1;
dreschpe 1:6d6125e88de7 230
dreschpe 1:6d6125e88de7 231 wr_cmd(0xF2); // Gamma Function Disable
dreschpe 11:59eca2723ec5 232 SPI::write(0x08);
dreschpe 1:6d6125e88de7 233 _cs = 1;
dreschpe 1:6d6125e88de7 234
dreschpe 1:6d6125e88de7 235 wr_cmd(0x26);
dreschpe 11:59eca2723ec5 236 SPI::write(0x01); // gamma set for curve 01/2/04/08
dreschpe 1:6d6125e88de7 237 _cs = 1;
dreschpe 1:6d6125e88de7 238
dreschpe 1:6d6125e88de7 239 wr_cmd(0xE0); // positive gamma correction
dreschpe 11:59eca2723ec5 240 SPI::write(0x1F);
dreschpe 11:59eca2723ec5 241 SPI::write(0x1A);
dreschpe 11:59eca2723ec5 242 SPI::write(0x18);
dreschpe 11:59eca2723ec5 243 SPI::write(0x0A);
dreschpe 11:59eca2723ec5 244 SPI::write(0x0F);
dreschpe 11:59eca2723ec5 245 SPI::write(0x06);
dreschpe 11:59eca2723ec5 246 SPI::write(0x45);
dreschpe 11:59eca2723ec5 247 SPI::write(0x87);
dreschpe 11:59eca2723ec5 248 SPI::write(0x32);
dreschpe 11:59eca2723ec5 249 SPI::write(0x0A);
dreschpe 11:59eca2723ec5 250 SPI::write(0x07);
dreschpe 11:59eca2723ec5 251 SPI::write(0x02);
dreschpe 11:59eca2723ec5 252 SPI::write(0x07);
dreschpe 11:59eca2723ec5 253 SPI::write(0x05);
dreschpe 11:59eca2723ec5 254 SPI::write(0x00);
dreschpe 1:6d6125e88de7 255 _cs = 1;
dreschpe 1:6d6125e88de7 256
dreschpe 1:6d6125e88de7 257 wr_cmd(0xE1); // negativ gamma correction
dreschpe 11:59eca2723ec5 258 SPI::write(0x00);
dreschpe 11:59eca2723ec5 259 SPI::write(0x25);
dreschpe 11:59eca2723ec5 260 SPI::write(0x27);
dreschpe 11:59eca2723ec5 261 SPI::write(0x05);
dreschpe 11:59eca2723ec5 262 SPI::write(0x10);
dreschpe 11:59eca2723ec5 263 SPI::write(0x09);
dreschpe 11:59eca2723ec5 264 SPI::write(0x3A);
dreschpe 11:59eca2723ec5 265 SPI::write(0x78);
dreschpe 11:59eca2723ec5 266 SPI::write(0x4D);
dreschpe 11:59eca2723ec5 267 SPI::write(0x05);
dreschpe 11:59eca2723ec5 268 SPI::write(0x18);
dreschpe 11:59eca2723ec5 269 SPI::write(0x0D);
dreschpe 11:59eca2723ec5 270 SPI::write(0x38);
dreschpe 11:59eca2723ec5 271 SPI::write(0x3A);
dreschpe 11:59eca2723ec5 272 SPI::write(0x1F);
dreschpe 1:6d6125e88de7 273 _cs = 1;
dreschpe 1:6d6125e88de7 274
dreschpe 1:6d6125e88de7 275 WindowMax ();
dreschpe 1:6d6125e88de7 276
dreschpe 1:6d6125e88de7 277 //wr_cmd(0x34); // tearing effect off
dreschpe 1:6d6125e88de7 278 //_cs = 1;
dreschpe 1:6d6125e88de7 279
dreschpe 1:6d6125e88de7 280 //wr_cmd(0x35); // tearing effect on
dreschpe 1:6d6125e88de7 281 //_cs = 1;
dreschpe 1:6d6125e88de7 282
dreschpe 1:6d6125e88de7 283 wr_cmd(0xB7); // entry mode
dreschpe 11:59eca2723ec5 284 SPI::write(0x07);
dreschpe 1:6d6125e88de7 285 _cs = 1;
dreschpe 1:6d6125e88de7 286
dreschpe 1:6d6125e88de7 287 wr_cmd(0xB6); // display function control
dreschpe 11:59eca2723ec5 288 SPI::write(0x0A);
dreschpe 11:59eca2723ec5 289 SPI::write(0x82);
dreschpe 11:59eca2723ec5 290 SPI::write(0x27);
dreschpe 11:59eca2723ec5 291 SPI::write(0x00);
dreschpe 1:6d6125e88de7 292 _cs = 1;
dreschpe 1:6d6125e88de7 293
dreschpe 1:6d6125e88de7 294 wr_cmd(0x11); // sleep out
dreschpe 1:6d6125e88de7 295 _cs = 1;
dreschpe 1:6d6125e88de7 296
dreschpe 1:6d6125e88de7 297 wait_ms(100);
dreschpe 1:6d6125e88de7 298
dreschpe 1:6d6125e88de7 299 wr_cmd(0x29); // display on
dreschpe 1:6d6125e88de7 300 _cs = 1;
dreschpe 1:6d6125e88de7 301
dreschpe 1:6d6125e88de7 302 wait_ms(100);
dreschpe 1:6d6125e88de7 303
dreschpe 1:6d6125e88de7 304 }
dreschpe 0:da1bf437cbc1 305
dreschpe 0:da1bf437cbc1 306
dreschpe 0:da1bf437cbc1 307 void SPI_TFT_ILI9341::pixel(int x, int y, int color)
dreschpe 0:da1bf437cbc1 308 {
dreschpe 0:da1bf437cbc1 309 wr_cmd(0x2A);
dreschpe 11:59eca2723ec5 310 SPI::write(x >> 8);
dreschpe 11:59eca2723ec5 311 SPI::write(x);
dreschpe 0:da1bf437cbc1 312 _cs = 1;
dreschpe 0:da1bf437cbc1 313 wr_cmd(0x2B);
dreschpe 11:59eca2723ec5 314 SPI::write(y >> 8);
dreschpe 11:59eca2723ec5 315 SPI::write(y);
dreschpe 0:da1bf437cbc1 316 _cs = 1;
dreschpe 5:55aed13f2630 317 wr_cmd(0x2C); // send pixel
dreschpe 5:55aed13f2630 318 #if defined TARGET_KL25Z // 8 Bit SPI
dreschpe 11:59eca2723ec5 319 SPI::write(color >> 8);
dreschpe 11:59eca2723ec5 320 SPI::write(color & 0xff);
dreschpe 5:55aed13f2630 321 #else
dreschpe 11:59eca2723ec5 322 SPI::format(16,3); // switch to 16 bit Mode 3
dreschpe 11:59eca2723ec5 323 SPI::write(color); // Write D0..D15
dreschpe 11:59eca2723ec5 324 SPI::format(8,3);
dreschpe 5:55aed13f2630 325 #endif
dreschpe 0:da1bf437cbc1 326 _cs = 1;
dreschpe 0:da1bf437cbc1 327 }
dreschpe 0:da1bf437cbc1 328
dreschpe 0:da1bf437cbc1 329
dreschpe 0:da1bf437cbc1 330 void SPI_TFT_ILI9341::window (unsigned int x, unsigned int y, unsigned int w, unsigned int h)
dreschpe 0:da1bf437cbc1 331 {
dreschpe 0:da1bf437cbc1 332 wr_cmd(0x2A);
dreschpe 11:59eca2723ec5 333 SPI::write(x >> 8);
dreschpe 11:59eca2723ec5 334 SPI::write(x);
dreschpe 11:59eca2723ec5 335 SPI::write((x+w-1) >> 8);
dreschpe 11:59eca2723ec5 336 SPI::write(x+w-1);
dreschpe 0:da1bf437cbc1 337
dreschpe 0:da1bf437cbc1 338 _cs = 1;
dreschpe 0:da1bf437cbc1 339 wr_cmd(0x2B);
dreschpe 11:59eca2723ec5 340 SPI::write(y >> 8);
dreschpe 11:59eca2723ec5 341 SPI::write(y);
dreschpe 11:59eca2723ec5 342 SPI::write((y+h-1) >> 8);
dreschpe 11:59eca2723ec5 343 SPI::write(y+h-1);
dreschpe 0:da1bf437cbc1 344 _cs = 1;
dreschpe 0:da1bf437cbc1 345 }
dreschpe 0:da1bf437cbc1 346
dreschpe 0:da1bf437cbc1 347
dreschpe 0:da1bf437cbc1 348 void SPI_TFT_ILI9341::WindowMax (void)
dreschpe 0:da1bf437cbc1 349 {
dreschpe 0:da1bf437cbc1 350 window (0, 0, width(), height());
dreschpe 0:da1bf437cbc1 351 }
dreschpe 0:da1bf437cbc1 352
dreschpe 0:da1bf437cbc1 353
dreschpe 0:da1bf437cbc1 354
dreschpe 0:da1bf437cbc1 355 void SPI_TFT_ILI9341::cls (void)
dreschpe 0:da1bf437cbc1 356 {
dreschpe 0:da1bf437cbc1 357 int pixel = ( width() * height());
dreschpe 0:da1bf437cbc1 358 WindowMax();
dreschpe 5:55aed13f2630 359 wr_cmd(0x2C); // send pixel
dreschpe 5:55aed13f2630 360 #if defined TARGET_KL25Z // 8 Bit SPI
dreschpe 5:55aed13f2630 361 unsigned int i;
dreschpe 5:55aed13f2630 362 for (i = 0; i < ( width() * height()); i++){
dreschpe 11:59eca2723ec5 363 SPI::write(_background >> 8);
dreschpe 11:59eca2723ec5 364 SPI::write(_background & 0xff);
dreschpe 5:55aed13f2630 365 }
dreschpe 5:55aed13f2630 366
dreschpe 5:55aed13f2630 367 #else
dreschpe 11:59eca2723ec5 368 SPI::format(16,3); // switch to 16 bit Mode 3
dreschpe 0:da1bf437cbc1 369 unsigned int i;
dreschpe 0:da1bf437cbc1 370 for (i = 0; i < ( width() * height()); i++)
dreschpe 11:59eca2723ec5 371 SPI::write(_background);
dreschpe 11:59eca2723ec5 372 SPI::format(8,3);
dreschpe 5:55aed13f2630 373 #endif
dreschpe 5:55aed13f2630 374 _cs = 1;
dreschpe 0:da1bf437cbc1 375 }
dreschpe 0:da1bf437cbc1 376
dreschpe 0:da1bf437cbc1 377
dreschpe 0:da1bf437cbc1 378 void SPI_TFT_ILI9341::circle(int x0, int y0, int r, int color)
dreschpe 0:da1bf437cbc1 379 {
dreschpe 0:da1bf437cbc1 380
mazgch 3:3d7298360e45 381 int x = -r, y = 0, err = 2-2*r, e2;
mazgch 3:3d7298360e45 382 do {
mazgch 3:3d7298360e45 383 pixel(x0-x, y0+y,color);
mazgch 3:3d7298360e45 384 pixel(x0+x, y0+y,color);
mazgch 3:3d7298360e45 385 pixel(x0+x, y0-y,color);
mazgch 3:3d7298360e45 386 pixel(x0-x, y0-y,color);
mazgch 3:3d7298360e45 387 e2 = err;
mazgch 3:3d7298360e45 388 if (e2 <= y) {
mazgch 3:3d7298360e45 389 err += ++y*2+1;
mazgch 3:3d7298360e45 390 if (-x == y && e2 <= x) e2 = 0;
mazgch 3:3d7298360e45 391 }
mazgch 3:3d7298360e45 392 if (e2 > x) err += ++x*2+1;
mazgch 3:3d7298360e45 393 } while (x <= 0);
dreschpe 4:f018e272220b 394
dreschpe 0:da1bf437cbc1 395 }
dreschpe 0:da1bf437cbc1 396
mazgch 3:3d7298360e45 397 void SPI_TFT_ILI9341::fillcircle(int x0, int y0, int r, int color)
dreschpe 0:da1bf437cbc1 398 {
mazgch 3:3d7298360e45 399 int x = -r, y = 0, err = 2-2*r, e2;
mazgch 3:3d7298360e45 400 do {
mazgch 3:3d7298360e45 401 vline(x0-x, y0-y, y0+y, color);
mazgch 3:3d7298360e45 402 vline(x0+x, y0-y, y0+y, color);
mazgch 3:3d7298360e45 403 e2 = err;
mazgch 3:3d7298360e45 404 if (e2 <= y) {
mazgch 3:3d7298360e45 405 err += ++y*2+1;
mazgch 3:3d7298360e45 406 if (-x == y && e2 <= x) e2 = 0;
mazgch 3:3d7298360e45 407 }
mazgch 3:3d7298360e45 408 if (e2 > x) err += ++x*2+1;
mazgch 3:3d7298360e45 409 } while (x <= 0);
dreschpe 0:da1bf437cbc1 410 }
dreschpe 0:da1bf437cbc1 411
dreschpe 0:da1bf437cbc1 412
dreschpe 0:da1bf437cbc1 413 void SPI_TFT_ILI9341::hline(int x0, int x1, int y, int color)
dreschpe 0:da1bf437cbc1 414 {
dreschpe 0:da1bf437cbc1 415 int w;
dreschpe 0:da1bf437cbc1 416 w = x1 - x0 + 1;
dreschpe 0:da1bf437cbc1 417 window(x0,y,w,1);
dreschpe 5:55aed13f2630 418 wr_cmd(0x2C); // send pixel
dreschpe 5:55aed13f2630 419 #if defined TARGET_KL25Z // 8 Bit SPI
dreschpe 5:55aed13f2630 420 int j;
dreschpe 5:55aed13f2630 421 for (j=0; j<w; j++) {
dreschpe 11:59eca2723ec5 422 SPI::write(color >> 8);
dreschpe 11:59eca2723ec5 423 SPI::write(color & 0xff);
dreschpe 5:55aed13f2630 424 }
dreschpe 5:55aed13f2630 425 #else
dreschpe 11:59eca2723ec5 426 SPI::format(16,3); // switch to 16 bit Mode 3
dreschpe 0:da1bf437cbc1 427 int j;
dreschpe 0:da1bf437cbc1 428 for (j=0; j<w; j++) {
dreschpe 11:59eca2723ec5 429 SPI::write(color);
dreschpe 0:da1bf437cbc1 430 }
dreschpe 11:59eca2723ec5 431 SPI::format(8,3);
dreschpe 5:55aed13f2630 432 #endif
dreschpe 0:da1bf437cbc1 433 _cs = 1;
dreschpe 0:da1bf437cbc1 434 WindowMax();
dreschpe 0:da1bf437cbc1 435 return;
dreschpe 0:da1bf437cbc1 436 }
dreschpe 0:da1bf437cbc1 437
dreschpe 0:da1bf437cbc1 438 void SPI_TFT_ILI9341::vline(int x, int y0, int y1, int color)
dreschpe 0:da1bf437cbc1 439 {
dreschpe 0:da1bf437cbc1 440 int h;
dreschpe 0:da1bf437cbc1 441 h = y1 - y0 + 1;
dreschpe 0:da1bf437cbc1 442 window(x,y0,1,h);
dreschpe 5:55aed13f2630 443 wr_cmd(0x2C); // send pixel
dreschpe 5:55aed13f2630 444 #if defined TARGET_KL25Z // 8 Bit SPI
dreschpe 5:55aed13f2630 445 for (int y=0; y<h; y++) {
dreschpe 11:59eca2723ec5 446 SPI::write(color >> 8);
dreschpe 11:59eca2723ec5 447 SPI::write(color & 0xff);
dreschpe 5:55aed13f2630 448 }
dreschpe 5:55aed13f2630 449 #else
dreschpe 11:59eca2723ec5 450 SPI::format(16,3); // switch to 16 bit Mode 3
dreschpe 0:da1bf437cbc1 451 for (int y=0; y<h; y++) {
dreschpe 11:59eca2723ec5 452 SPI::write(color);
dreschpe 0:da1bf437cbc1 453 }
dreschpe 11:59eca2723ec5 454 SPI::format(8,3);
dreschpe 5:55aed13f2630 455 #endif
dreschpe 0:da1bf437cbc1 456 _cs = 1;
dreschpe 0:da1bf437cbc1 457 WindowMax();
dreschpe 0:da1bf437cbc1 458 return;
dreschpe 0:da1bf437cbc1 459 }
dreschpe 0:da1bf437cbc1 460
dreschpe 0:da1bf437cbc1 461
dreschpe 0:da1bf437cbc1 462
dreschpe 0:da1bf437cbc1 463 void SPI_TFT_ILI9341::line(int x0, int y0, int x1, int y1, int color)
dreschpe 0:da1bf437cbc1 464 {
dreschpe 0:da1bf437cbc1 465 //WindowMax();
dreschpe 0:da1bf437cbc1 466 int dx = 0, dy = 0;
dreschpe 0:da1bf437cbc1 467 int dx_sym = 0, dy_sym = 0;
dreschpe 0:da1bf437cbc1 468 int dx_x2 = 0, dy_x2 = 0;
dreschpe 0:da1bf437cbc1 469 int di = 0;
dreschpe 0:da1bf437cbc1 470
dreschpe 0:da1bf437cbc1 471 dx = x1-x0;
dreschpe 0:da1bf437cbc1 472 dy = y1-y0;
dreschpe 0:da1bf437cbc1 473
dreschpe 0:da1bf437cbc1 474 if (dx == 0) { /* vertical line */
dreschpe 0:da1bf437cbc1 475 if (y1 > y0) vline(x0,y0,y1,color);
dreschpe 0:da1bf437cbc1 476 else vline(x0,y1,y0,color);
dreschpe 0:da1bf437cbc1 477 return;
dreschpe 0:da1bf437cbc1 478 }
dreschpe 0:da1bf437cbc1 479
dreschpe 0:da1bf437cbc1 480 if (dx > 0) {
dreschpe 0:da1bf437cbc1 481 dx_sym = 1;
dreschpe 0:da1bf437cbc1 482 } else {
dreschpe 0:da1bf437cbc1 483 dx_sym = -1;
dreschpe 0:da1bf437cbc1 484 }
dreschpe 0:da1bf437cbc1 485 if (dy == 0) { /* horizontal line */
dreschpe 0:da1bf437cbc1 486 if (x1 > x0) hline(x0,x1,y0,color);
dreschpe 0:da1bf437cbc1 487 else hline(x1,x0,y0,color);
dreschpe 0:da1bf437cbc1 488 return;
dreschpe 0:da1bf437cbc1 489 }
dreschpe 0:da1bf437cbc1 490
dreschpe 0:da1bf437cbc1 491 if (dy > 0) {
dreschpe 0:da1bf437cbc1 492 dy_sym = 1;
dreschpe 0:da1bf437cbc1 493 } else {
dreschpe 0:da1bf437cbc1 494 dy_sym = -1;
dreschpe 0:da1bf437cbc1 495 }
dreschpe 0:da1bf437cbc1 496
dreschpe 0:da1bf437cbc1 497 dx = dx_sym*dx;
dreschpe 0:da1bf437cbc1 498 dy = dy_sym*dy;
dreschpe 0:da1bf437cbc1 499
dreschpe 0:da1bf437cbc1 500 dx_x2 = dx*2;
dreschpe 0:da1bf437cbc1 501 dy_x2 = dy*2;
dreschpe 0:da1bf437cbc1 502
dreschpe 0:da1bf437cbc1 503 if (dx >= dy) {
dreschpe 0:da1bf437cbc1 504 di = dy_x2 - dx;
dreschpe 0:da1bf437cbc1 505 while (x0 != x1) {
dreschpe 0:da1bf437cbc1 506
dreschpe 0:da1bf437cbc1 507 pixel(x0, y0, color);
dreschpe 0:da1bf437cbc1 508 x0 += dx_sym;
dreschpe 0:da1bf437cbc1 509 if (di<0) {
dreschpe 0:da1bf437cbc1 510 di += dy_x2;
dreschpe 0:da1bf437cbc1 511 } else {
dreschpe 0:da1bf437cbc1 512 di += dy_x2 - dx_x2;
dreschpe 0:da1bf437cbc1 513 y0 += dy_sym;
dreschpe 0:da1bf437cbc1 514 }
dreschpe 0:da1bf437cbc1 515 }
dreschpe 0:da1bf437cbc1 516 pixel(x0, y0, color);
dreschpe 0:da1bf437cbc1 517 } else {
dreschpe 0:da1bf437cbc1 518 di = dx_x2 - dy;
dreschpe 0:da1bf437cbc1 519 while (y0 != y1) {
dreschpe 0:da1bf437cbc1 520 pixel(x0, y0, color);
dreschpe 0:da1bf437cbc1 521 y0 += dy_sym;
dreschpe 0:da1bf437cbc1 522 if (di < 0) {
dreschpe 0:da1bf437cbc1 523 di += dx_x2;
dreschpe 0:da1bf437cbc1 524 } else {
dreschpe 0:da1bf437cbc1 525 di += dx_x2 - dy_x2;
dreschpe 0:da1bf437cbc1 526 x0 += dx_sym;
dreschpe 0:da1bf437cbc1 527 }
dreschpe 0:da1bf437cbc1 528 }
dreschpe 0:da1bf437cbc1 529 pixel(x0, y0, color);
dreschpe 0:da1bf437cbc1 530 }
dreschpe 0:da1bf437cbc1 531 return;
dreschpe 0:da1bf437cbc1 532 }
dreschpe 0:da1bf437cbc1 533
dreschpe 0:da1bf437cbc1 534
dreschpe 0:da1bf437cbc1 535 void SPI_TFT_ILI9341::rect(int x0, int y0, int x1, int y1, int color)
dreschpe 0:da1bf437cbc1 536 {
dreschpe 0:da1bf437cbc1 537
dreschpe 0:da1bf437cbc1 538 if (x1 > x0) hline(x0,x1,y0,color);
dreschpe 0:da1bf437cbc1 539 else hline(x1,x0,y0,color);
dreschpe 0:da1bf437cbc1 540
dreschpe 0:da1bf437cbc1 541 if (y1 > y0) vline(x0,y0,y1,color);
dreschpe 0:da1bf437cbc1 542 else vline(x0,y1,y0,color);
dreschpe 0:da1bf437cbc1 543
dreschpe 0:da1bf437cbc1 544 if (x1 > x0) hline(x0,x1,y1,color);
dreschpe 0:da1bf437cbc1 545 else hline(x1,x0,y1,color);
dreschpe 0:da1bf437cbc1 546
dreschpe 0:da1bf437cbc1 547 if (y1 > y0) vline(x1,y0,y1,color);
dreschpe 0:da1bf437cbc1 548 else vline(x1,y1,y0,color);
dreschpe 0:da1bf437cbc1 549
dreschpe 0:da1bf437cbc1 550 return;
dreschpe 0:da1bf437cbc1 551 }
dreschpe 0:da1bf437cbc1 552
dreschpe 0:da1bf437cbc1 553
dreschpe 0:da1bf437cbc1 554
dreschpe 0:da1bf437cbc1 555 void SPI_TFT_ILI9341::fillrect(int x0, int y0, int x1, int y1, int color)
dreschpe 0:da1bf437cbc1 556 {
dreschpe 0:da1bf437cbc1 557
dreschpe 0:da1bf437cbc1 558 int h = y1 - y0 + 1;
dreschpe 0:da1bf437cbc1 559 int w = x1 - x0 + 1;
dreschpe 0:da1bf437cbc1 560 int pixel = h * w;
dreschpe 0:da1bf437cbc1 561 window(x0,y0,w,h);
dreschpe 0:da1bf437cbc1 562 wr_cmd(0x2C); // send pixel
dreschpe 5:55aed13f2630 563 #if defined TARGET_KL25Z // 8 Bit SPI
dreschpe 5:55aed13f2630 564 for (int p=0; p<pixel; p++) {
dreschpe 11:59eca2723ec5 565 SPI::write(color >> 8);
dreschpe 11:59eca2723ec5 566 SPI::write(color & 0xff);
dreschpe 5:55aed13f2630 567 }
dreschpe 5:55aed13f2630 568 #else
dreschpe 11:59eca2723ec5 569 SPI::format(16,3); // switch to 16 bit Mode 3
dreschpe 0:da1bf437cbc1 570 for (int p=0; p<pixel; p++) {
dreschpe 11:59eca2723ec5 571 SPI::write(color);
dreschpe 0:da1bf437cbc1 572 }
dreschpe 11:59eca2723ec5 573 SPI::format(8,3);
dreschpe 5:55aed13f2630 574 #endif
dreschpe 0:da1bf437cbc1 575 _cs = 1;
dreschpe 0:da1bf437cbc1 576 WindowMax();
dreschpe 0:da1bf437cbc1 577 return;
dreschpe 0:da1bf437cbc1 578 }
dreschpe 0:da1bf437cbc1 579
dreschpe 0:da1bf437cbc1 580
dreschpe 0:da1bf437cbc1 581 void SPI_TFT_ILI9341::locate(int x, int y)
dreschpe 0:da1bf437cbc1 582 {
dreschpe 0:da1bf437cbc1 583 char_x = x;
dreschpe 0:da1bf437cbc1 584 char_y = y;
dreschpe 0:da1bf437cbc1 585 }
dreschpe 0:da1bf437cbc1 586
dreschpe 0:da1bf437cbc1 587
dreschpe 0:da1bf437cbc1 588
dreschpe 0:da1bf437cbc1 589 int SPI_TFT_ILI9341::columns()
dreschpe 0:da1bf437cbc1 590 {
dreschpe 0:da1bf437cbc1 591 return width() / font[1];
dreschpe 0:da1bf437cbc1 592 }
dreschpe 0:da1bf437cbc1 593
dreschpe 0:da1bf437cbc1 594
dreschpe 0:da1bf437cbc1 595
dreschpe 0:da1bf437cbc1 596 int SPI_TFT_ILI9341::rows()
dreschpe 0:da1bf437cbc1 597 {
dreschpe 0:da1bf437cbc1 598 return height() / font[2];
dreschpe 0:da1bf437cbc1 599 }
dreschpe 0:da1bf437cbc1 600
dreschpe 0:da1bf437cbc1 601
dreschpe 0:da1bf437cbc1 602
dreschpe 0:da1bf437cbc1 603 int SPI_TFT_ILI9341::_putc(int value)
dreschpe 0:da1bf437cbc1 604 {
dreschpe 0:da1bf437cbc1 605 if (value == '\n') { // new line
dreschpe 0:da1bf437cbc1 606 char_x = 0;
dreschpe 0:da1bf437cbc1 607 char_y = char_y + font[2];
dreschpe 0:da1bf437cbc1 608 if (char_y >= height() - font[2]) {
dreschpe 0:da1bf437cbc1 609 char_y = 0;
dreschpe 0:da1bf437cbc1 610 }
dreschpe 0:da1bf437cbc1 611 } else {
dreschpe 0:da1bf437cbc1 612 character(char_x, char_y, value);
dreschpe 0:da1bf437cbc1 613 }
dreschpe 0:da1bf437cbc1 614 return value;
dreschpe 0:da1bf437cbc1 615 }
dreschpe 0:da1bf437cbc1 616
dreschpe 0:da1bf437cbc1 617
dreschpe 0:da1bf437cbc1 618 void SPI_TFT_ILI9341::character(int x, int y, int c)
dreschpe 0:da1bf437cbc1 619 {
dreschpe 0:da1bf437cbc1 620 unsigned int hor,vert,offset,bpl,j,i,b;
dreschpe 0:da1bf437cbc1 621 unsigned char* zeichen;
dreschpe 0:da1bf437cbc1 622 unsigned char z,w;
dreschpe 0:da1bf437cbc1 623
dreschpe 0:da1bf437cbc1 624 if ((c < 31) || (c > 127)) return; // test char range
dreschpe 0:da1bf437cbc1 625
dreschpe 0:da1bf437cbc1 626 // read font parameter from start of array
dreschpe 0:da1bf437cbc1 627 offset = font[0]; // bytes / char
dreschpe 0:da1bf437cbc1 628 hor = font[1]; // get hor size of font
dreschpe 0:da1bf437cbc1 629 vert = font[2]; // get vert size of font
dreschpe 0:da1bf437cbc1 630 bpl = font[3]; // bytes per line
dreschpe 0:da1bf437cbc1 631
dreschpe 0:da1bf437cbc1 632 if (char_x + hor > width()) {
dreschpe 0:da1bf437cbc1 633 char_x = 0;
dreschpe 0:da1bf437cbc1 634 char_y = char_y + vert;
dreschpe 0:da1bf437cbc1 635 if (char_y >= height() - font[2]) {
dreschpe 0:da1bf437cbc1 636 char_y = 0;
dreschpe 0:da1bf437cbc1 637 }
dreschpe 0:da1bf437cbc1 638 }
dreschpe 0:da1bf437cbc1 639 window(char_x, char_y,hor,vert); // char box
dreschpe 5:55aed13f2630 640 wr_cmd(0x2C); // send pixel
dreschpe 5:55aed13f2630 641 #ifndef TARGET_KL25Z // 16 Bit SPI
dreschpe 11:59eca2723ec5 642 SPI::format(16,3);
dreschpe 5:55aed13f2630 643 #endif // switch to 16 bit Mode 3
dreschpe 0:da1bf437cbc1 644 zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap
dreschpe 0:da1bf437cbc1 645 w = zeichen[0]; // width of actual char
dreschpe 0:da1bf437cbc1 646 for (j=0; j<vert; j++) { // vert line
dreschpe 0:da1bf437cbc1 647 for (i=0; i<hor; i++) { // horz line
dreschpe 0:da1bf437cbc1 648 z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
dreschpe 0:da1bf437cbc1 649 b = 1 << (j & 0x07);
dreschpe 0:da1bf437cbc1 650 if (( z & b ) == 0x00) {
dreschpe 5:55aed13f2630 651 #ifndef TARGET_KL25Z // 16 Bit SPI
dreschpe 11:59eca2723ec5 652 SPI::write(_background);
dreschpe 5:55aed13f2630 653 #else
dreschpe 11:59eca2723ec5 654 SPI::write(_background >> 8);
dreschpe 11:59eca2723ec5 655 SPI::write(_background & 0xff);
dreschpe 5:55aed13f2630 656 #endif
dreschpe 0:da1bf437cbc1 657 } else {
dreschpe 5:55aed13f2630 658 #ifndef TARGET_KL25Z // 16 Bit SPI
dreschpe 11:59eca2723ec5 659 SPI::write(_foreground);
dreschpe 5:55aed13f2630 660 #else
dreschpe 11:59eca2723ec5 661 SPI::write(_foreground >> 8);
dreschpe 11:59eca2723ec5 662 SPI::write(_foreground & 0xff);
dreschpe 5:55aed13f2630 663 #endif
dreschpe 0:da1bf437cbc1 664 }
dreschpe 0:da1bf437cbc1 665 }
dreschpe 0:da1bf437cbc1 666 }
dreschpe 0:da1bf437cbc1 667 _cs = 1;
dreschpe 5:55aed13f2630 668 #ifndef TARGET_KL25Z // 16 Bit SPI
dreschpe 11:59eca2723ec5 669 SPI::format(8,3);
dreschpe 5:55aed13f2630 670 #endif
dreschpe 0:da1bf437cbc1 671 WindowMax();
dreschpe 0:da1bf437cbc1 672 if ((w + 2) < hor) { // x offset to next char
dreschpe 0:da1bf437cbc1 673 char_x += w + 2;
dreschpe 0:da1bf437cbc1 674 } else char_x += hor;
dreschpe 0:da1bf437cbc1 675 }
dreschpe 0:da1bf437cbc1 676
dreschpe 0:da1bf437cbc1 677
dreschpe 0:da1bf437cbc1 678 void SPI_TFT_ILI9341::set_font(unsigned char* f)
dreschpe 0:da1bf437cbc1 679 {
dreschpe 0:da1bf437cbc1 680 font = f;
dreschpe 0:da1bf437cbc1 681 }
dreschpe 0:da1bf437cbc1 682
dreschpe 0:da1bf437cbc1 683
dreschpe 0:da1bf437cbc1 684
dreschpe 0:da1bf437cbc1 685 void SPI_TFT_ILI9341::Bitmap(unsigned int x, unsigned int y, unsigned int w, unsigned int h,unsigned char *bitmap)
dreschpe 0:da1bf437cbc1 686 {
dreschpe 0:da1bf437cbc1 687 unsigned int j;
dreschpe 0:da1bf437cbc1 688 int padd;
dreschpe 0:da1bf437cbc1 689 unsigned short *bitmap_ptr = (unsigned short *)bitmap;
dreschpe 5:55aed13f2630 690 #if defined TARGET_KL25Z // 8 Bit SPI
dreschpe 5:55aed13f2630 691 unsigned short pix_temp;
dreschpe 5:55aed13f2630 692 #endif
dreschpe 5:55aed13f2630 693
dreschpe 2:0a16083193a4 694 unsigned int i;
dreschpe 2:0a16083193a4 695
dreschpe 0:da1bf437cbc1 696 // the lines are padded to multiple of 4 bytes in a bitmap
dreschpe 0:da1bf437cbc1 697 padd = -1;
dreschpe 0:da1bf437cbc1 698 do {
dreschpe 0:da1bf437cbc1 699 padd ++;
dreschpe 0:da1bf437cbc1 700 } while (2*(w + padd)%4 != 0);
dreschpe 0:da1bf437cbc1 701 window(x, y, w, h);
dreschpe 2:0a16083193a4 702 bitmap_ptr += ((h - 1)* (w + padd));
dreschpe 5:55aed13f2630 703 wr_cmd(0x2C); // send pixel
dreschpe 5:55aed13f2630 704 #ifndef TARGET_KL25Z // 16 Bit SPI
dreschpe 11:59eca2723ec5 705 SPI::format(16,3);
dreschpe 5:55aed13f2630 706 #endif // switch to 16 bit Mode 3
dreschpe 2:0a16083193a4 707 for (j = 0; j < h; j++) { //Lines
dreschpe 2:0a16083193a4 708 for (i = 0; i < w; i++) { // one line
dreschpe 5:55aed13f2630 709 #if defined TARGET_KL25Z // 8 Bit SPI
dreschpe 5:55aed13f2630 710 pix_temp = *bitmap_ptr;
dreschpe 11:59eca2723ec5 711 SPI::write(pix_temp >> 8);
dreschpe 11:59eca2723ec5 712 SPI::write(pix_temp);
dreschpe 5:55aed13f2630 713 bitmap_ptr++;
dreschpe 5:55aed13f2630 714 #else
dreschpe 11:59eca2723ec5 715 SPI::write(*bitmap_ptr); // one line
dreschpe 5:55aed13f2630 716 bitmap_ptr++;
dreschpe 5:55aed13f2630 717 #endif
dreschpe 0:da1bf437cbc1 718 }
dreschpe 0:da1bf437cbc1 719 bitmap_ptr -= 2*w;
dreschpe 0:da1bf437cbc1 720 bitmap_ptr -= padd;
dreschpe 0:da1bf437cbc1 721 }
dreschpe 0:da1bf437cbc1 722 _cs = 1;
dreschpe 5:55aed13f2630 723 #ifndef TARGET_KL25Z // 16 Bit SPI
dreschpe 11:59eca2723ec5 724 SPI::format(8,3);
dreschpe 5:55aed13f2630 725 #endif
dreschpe 0:da1bf437cbc1 726 WindowMax();
dreschpe 0:da1bf437cbc1 727 }
dreschpe 0:da1bf437cbc1 728
dreschpe 0:da1bf437cbc1 729
dreschpe 6:fe07ae8329f7 730 // local filesystem is not implemented in kinetis board , but you can add a SD card
dreschpe 5:55aed13f2630 731
dreschpe 0:da1bf437cbc1 732 int SPI_TFT_ILI9341::BMP_16(unsigned int x, unsigned int y, const char *Name_BMP)
dreschpe 0:da1bf437cbc1 733 {
dreschpe 0:da1bf437cbc1 734
dreschpe 0:da1bf437cbc1 735 #define OffsetPixelWidth 18
dreschpe 0:da1bf437cbc1 736 #define OffsetPixelHeigh 22
dreschpe 0:da1bf437cbc1 737 #define OffsetFileSize 34
dreschpe 0:da1bf437cbc1 738 #define OffsetPixData 10
dreschpe 0:da1bf437cbc1 739 #define OffsetBPP 28
dreschpe 0:da1bf437cbc1 740
dreschpe 0:da1bf437cbc1 741 char filename[50];
dreschpe 0:da1bf437cbc1 742 unsigned char BMP_Header[54];
dreschpe 0:da1bf437cbc1 743 unsigned short BPP_t;
dreschpe 0:da1bf437cbc1 744 unsigned int PixelWidth,PixelHeigh,start_data;
dreschpe 0:da1bf437cbc1 745 unsigned int i,off;
dreschpe 0:da1bf437cbc1 746 int padd,j;
dreschpe 0:da1bf437cbc1 747 unsigned short *line;
dreschpe 0:da1bf437cbc1 748
dreschpe 0:da1bf437cbc1 749 // get the filename
dreschpe 6:fe07ae8329f7 750 i=0;
dreschpe 0:da1bf437cbc1 751 while (*Name_BMP!='\0') {
dreschpe 0:da1bf437cbc1 752 filename[i++]=*Name_BMP++;
dreschpe 0:da1bf437cbc1 753 }
dreschpe 6:fe07ae8329f7 754 filename[i] = 0;
dreschpe 6:fe07ae8329f7 755
dreschpe 0:da1bf437cbc1 756 FILE *Image = fopen((const char *)&filename[0], "rb"); // open the bmp file
dreschpe 0:da1bf437cbc1 757 if (!Image) {
dreschpe 0:da1bf437cbc1 758 return(0); // error file not found !
dreschpe 0:da1bf437cbc1 759 }
dreschpe 0:da1bf437cbc1 760
dreschpe 0:da1bf437cbc1 761 fread(&BMP_Header[0],1,54,Image); // get the BMP Header
dreschpe 0:da1bf437cbc1 762
dreschpe 0:da1bf437cbc1 763 if (BMP_Header[0] != 0x42 || BMP_Header[1] != 0x4D) { // check magic byte
dreschpe 0:da1bf437cbc1 764 fclose(Image);
dreschpe 0:da1bf437cbc1 765 return(-1); // error no BMP file
dreschpe 0:da1bf437cbc1 766 }
dreschpe 0:da1bf437cbc1 767
dreschpe 0:da1bf437cbc1 768 BPP_t = BMP_Header[OffsetBPP] + (BMP_Header[OffsetBPP + 1] << 8);
dreschpe 0:da1bf437cbc1 769 if (BPP_t != 0x0010) {
dreschpe 0:da1bf437cbc1 770 fclose(Image);
dreschpe 0:da1bf437cbc1 771 return(-2); // error no 16 bit BMP
dreschpe 0:da1bf437cbc1 772 }
dreschpe 0:da1bf437cbc1 773
dreschpe 0:da1bf437cbc1 774 PixelHeigh = BMP_Header[OffsetPixelHeigh] + (BMP_Header[OffsetPixelHeigh + 1] << 8) + (BMP_Header[OffsetPixelHeigh + 2] << 16) + (BMP_Header[OffsetPixelHeigh + 3] << 24);
dreschpe 0:da1bf437cbc1 775 PixelWidth = BMP_Header[OffsetPixelWidth] + (BMP_Header[OffsetPixelWidth + 1] << 8) + (BMP_Header[OffsetPixelWidth + 2] << 16) + (BMP_Header[OffsetPixelWidth + 3] << 24);
dreschpe 0:da1bf437cbc1 776 if (PixelHeigh > height() + y || PixelWidth > width() + x) {
dreschpe 0:da1bf437cbc1 777 fclose(Image);
dreschpe 0:da1bf437cbc1 778 return(-3); // to big
dreschpe 0:da1bf437cbc1 779 }
dreschpe 0:da1bf437cbc1 780
dreschpe 0:da1bf437cbc1 781 start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24);
dreschpe 0:da1bf437cbc1 782
dreschpe 0:da1bf437cbc1 783 line = (unsigned short *) malloc (2 * PixelWidth); // we need a buffer for a line
dreschpe 0:da1bf437cbc1 784 if (line == NULL) {
dreschpe 0:da1bf437cbc1 785 return(-4); // error no memory
dreschpe 0:da1bf437cbc1 786 }
dreschpe 0:da1bf437cbc1 787
dreschpe 0:da1bf437cbc1 788 // the bmp lines are padded to multiple of 4 bytes
dreschpe 0:da1bf437cbc1 789 padd = -1;
dreschpe 0:da1bf437cbc1 790 do {
dreschpe 0:da1bf437cbc1 791 padd ++;
dreschpe 0:da1bf437cbc1 792 } while ((PixelWidth * 2 + padd)%4 != 0);
dreschpe 0:da1bf437cbc1 793
dreschpe 0:da1bf437cbc1 794 window(x, y,PixelWidth ,PixelHeigh);
dreschpe 6:fe07ae8329f7 795 wr_cmd(0x2C); // send pixel
dreschpe 6:fe07ae8329f7 796 #ifndef TARGET_KL25Z // only 8 Bit SPI
dreschpe 11:59eca2723ec5 797 SPI::format(16,3);
dreschpe 6:fe07ae8329f7 798 #endif // switch to 16 bit Mode 3
dreschpe 0:da1bf437cbc1 799 for (j = PixelHeigh - 1; j >= 0; j--) { //Lines bottom up
dreschpe 0:da1bf437cbc1 800 off = j * (PixelWidth * 2 + padd) + start_data; // start of line
dreschpe 0:da1bf437cbc1 801 fseek(Image, off ,SEEK_SET);
dreschpe 6:fe07ae8329f7 802 fread(line,1,PixelWidth * 2,Image); // read a line - slow
dreschpe 0:da1bf437cbc1 803 for (i = 0; i < PixelWidth; i++) { // copy pixel data to TFT
dreschpe 6:fe07ae8329f7 804 #ifndef TARGET_KL25Z // only 8 Bit SPI
dreschpe 11:59eca2723ec5 805 SPI::write(line[i]); // one 16 bit pixel
dreschpe 6:fe07ae8329f7 806 #else
dreschpe 11:59eca2723ec5 807 SPI::write(line[i] >> 8);
dreschpe 11:59eca2723ec5 808 SPI::write(line[i]);
dreschpe 6:fe07ae8329f7 809 #endif
dreschpe 0:da1bf437cbc1 810 }
dreschpe 0:da1bf437cbc1 811 }
dreschpe 0:da1bf437cbc1 812 _cs = 1;
dreschpe 11:59eca2723ec5 813 SPI::format(8,3);
dreschpe 0:da1bf437cbc1 814 free (line);
dreschpe 0:da1bf437cbc1 815 fclose(Image);
dreschpe 0:da1bf437cbc1 816 WindowMax();
dreschpe 0:da1bf437cbc1 817 return(1);
dreschpe 5:55aed13f2630 818 }
dreschpe 11:59eca2723ec5 819
dreschpe 11:59eca2723ec5 820 #endif