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:
Fri Oct 18 09:04:42 2013 +0000
Revision:
4:f018e272220b
Parent:
3:3d7298360e45
Child:
5:55aed13f2630
remove old circle code

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