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 Oct 22 20:55:39 2013 +0000
Revision:
5:55aed13f2630
Parent:
4:f018e272220b
Child:
6:fe07ae8329f7
Fixes for Kinetis Board

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