SPI Library for 240x320 TFT LCD with ILI9320, ILI9325 and ILI9328 chip

Dependencies:   BurstSPI

Dependents:   KL25Z_ILI9320_Demo Mini-DK

Other LCD drivers

05-30-2014
Device initialization for ILI9325 and ILI9328 has been added to the library.
The library will auto-detect what driver chip is connected (ILI9320, ILI9325 or ILI9328) and use the appropriate init sequence.
Please use the Issues tab to report any problems.

SPI TFT library for LPC1768, LPC11U24 and KL25Z

Loading fonts

When using this libary, don't forget to load the TFT_FONTS library from Peter Drescher at http://mbed.org/users/dreschpe/code/TFT_fonts/

KL25Z : limitations

The filetoflash function (see below) is not available.
Writing to the LCD is a little slower as the KL25Z only supports 8-bit SPI communication.

LPC1768 and LPC11U24 : filetoflash (SD to CPU flash)

This library contains a function to copy an image from the SD card to the CPU flash memory.
It allows you to use an image as background without speed loss when writing other text and graphics.
By default, this option is enabled.
It can be disabled by adding following instruction BEFORE you load the library:

#define NO_FLASH_BUFFER

Since the flash memory has limited write endurance, DO NOT use this feature when you intend to read multiple images from the SD card (eg: when used as a photo frame).

Sample code

#include "mbed.h"

// SPI TFT demo
// NOTES
// - Connect the LCD reset pin to the reset pin of the CPU board or connect a
//   separate reset circuit to the LCD reset pin (pull-up 10k to 3v3 + 100nf capacitor to GND).
// - When using the mbed LPC1768 board, following hardware modifications are needed:
//       Connect the LCD reset pin to the nR input.
//       Connect a 100nF capacitor between the nR input and GND.
//       Connect a pushbutton parallel to the 100nF capacitor.
//   Use the new pushbutton as the reset button (instead of the LPC1768 on-board reset button).
#define NO_FLASH_BUFFER         // Do not use CPU flash for storing bitmaps
#include "SPI_TFT_ILI9320.h"
#include "Arial12x12.h"
#include "Arial24x23.h"
#include "Arial28x28.h"
#include "font_big.h"
SPI_TFT TFT(p11, p12, p13, p14,"TFT");  //mosi, miso, clk, cs

int main (void)
{

    TFT.claim(stdout);        // send stdout to the TFT display
    // Disable stdout buffering, allows us to omit \n with printf.
    // More info at http://www.cplusplus.com/reference/cstdio/setvbuf/
    setvbuf ( stdout , NULL , _IONBF , NULL );
    TFT.background(Black);    // set background to black
    TFT.foreground(White);    // set chars to white
    TFT.cls();                // clear the screen
    TFT.set_font((unsigned char*) Arial12x12);  // select the font

    TFT.locate(0,0);
    printf("ILI9320 SPI TFT library\n");
    printf("Simple demo\n");
}



Demo code LPC1768 (Mini-DK board)

Import programLPC1768_Mini-DK

LPC1768 Mini-DK board with 2.8" SPI TFT and SPI touch


Demo code FRDM-KL25Z board

Import programKL25Z_ILI9320_Demo

KL25Z driving an ILI9320 LCD board with touch panel (HY28A-LCDB SPI)

Committer:
frankvnk
Date:
Fri May 30 13:35:24 2014 +0000
Revision:
4:2519f2e680af
Parent:
0:630b4da97968
Added  ILI9325 and ILI9328 initialization

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 0:630b4da97968 1 /* mbed GraphicsDisplay Display Library Base Class
frankvnk 0:630b4da97968 2 * Copyright (c) 2007-2009 sford
frankvnk 0:630b4da97968 3 * Released under the MIT License: http://mbed.org/license/mit
frankvnk 0:630b4da97968 4 */
frankvnk 0:630b4da97968 5
frankvnk 0:630b4da97968 6 #include "GraphicsDisplay.h"
frankvnk 0:630b4da97968 7
frankvnk 0:630b4da97968 8 const unsigned char FONT8x8[97][8] = {
frankvnk 0:630b4da97968 9 0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char
frankvnk 0:630b4da97968 10 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20
frankvnk 0:630b4da97968 11 0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00, // !
frankvnk 0:630b4da97968 12 0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00, // "
frankvnk 0:630b4da97968 13 0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00, // #
frankvnk 0:630b4da97968 14 0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00, // $
frankvnk 0:630b4da97968 15 0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00, // %
frankvnk 0:630b4da97968 16 0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00, // &
frankvnk 0:630b4da97968 17 0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00, // '
frankvnk 0:630b4da97968 18 0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00, // (
frankvnk 0:630b4da97968 19 0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00, // )
frankvnk 0:630b4da97968 20 0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, // *
frankvnk 0:630b4da97968 21 0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00, // +
frankvnk 0:630b4da97968 22 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, // ,
frankvnk 0:630b4da97968 23 0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, // -
frankvnk 0:630b4da97968 24 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, // .
frankvnk 0:630b4da97968 25 0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00, // / (forward slash)
frankvnk 0:630b4da97968 26 0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00, // 0 0x30
frankvnk 0:630b4da97968 27 0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00, // 1
frankvnk 0:630b4da97968 28 0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00, // 2
frankvnk 0:630b4da97968 29 0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00, // 3
frankvnk 0:630b4da97968 30 0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00, // 4
frankvnk 0:630b4da97968 31 0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00, // 5
frankvnk 0:630b4da97968 32 0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00, // 6
frankvnk 0:630b4da97968 33 0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00, // 7
frankvnk 0:630b4da97968 34 0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00, // 8
frankvnk 0:630b4da97968 35 0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00, // 9
frankvnk 0:630b4da97968 36 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00, // :
frankvnk 0:630b4da97968 37 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30, // ;
frankvnk 0:630b4da97968 38 0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00, // <
frankvnk 0:630b4da97968 39 0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00, // =
frankvnk 0:630b4da97968 40 0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00, // >
frankvnk 0:630b4da97968 41 0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00, // ?
frankvnk 0:630b4da97968 42 0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00, // @ 0x40
frankvnk 0:630b4da97968 43 0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00, // A
frankvnk 0:630b4da97968 44 0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00, // B
frankvnk 0:630b4da97968 45 0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00, // C
frankvnk 0:630b4da97968 46 0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00, // D
frankvnk 0:630b4da97968 47 0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00, // E
frankvnk 0:630b4da97968 48 0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00, // F
frankvnk 0:630b4da97968 49 0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00, // G
frankvnk 0:630b4da97968 50 0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00, // H
frankvnk 0:630b4da97968 51 0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // I
frankvnk 0:630b4da97968 52 0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, // J
frankvnk 0:630b4da97968 53 0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00, // K
frankvnk 0:630b4da97968 54 0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00, // L
frankvnk 0:630b4da97968 55 0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00, // M
frankvnk 0:630b4da97968 56 0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00, // N
frankvnk 0:630b4da97968 57 0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00, // O
frankvnk 0:630b4da97968 58 0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00, // P 0x50
frankvnk 0:630b4da97968 59 0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00, // Q
frankvnk 0:630b4da97968 60 0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00, // R
frankvnk 0:630b4da97968 61 0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00, // S
frankvnk 0:630b4da97968 62 0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00, // T
frankvnk 0:630b4da97968 63 0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00, // U
frankvnk 0:630b4da97968 64 0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00, // V
frankvnk 0:630b4da97968 65 0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00, // W
frankvnk 0:630b4da97968 66 0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00, // X
frankvnk 0:630b4da97968 67 0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00, // Y
frankvnk 0:630b4da97968 68 0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00, // Z
frankvnk 0:630b4da97968 69 0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00, // [
frankvnk 0:630b4da97968 70 0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00, // \ (back slash)
frankvnk 0:630b4da97968 71 0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00, // ]
frankvnk 0:630b4da97968 72 0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00, // ^
frankvnk 0:630b4da97968 73 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, // _
frankvnk 0:630b4da97968 74 0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00, // ` 0x60
frankvnk 0:630b4da97968 75 0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00, // a
frankvnk 0:630b4da97968 76 0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00, // b
frankvnk 0:630b4da97968 77 0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00, // c
frankvnk 0:630b4da97968 78 0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00, // d
frankvnk 0:630b4da97968 79 0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00, // e
frankvnk 0:630b4da97968 80 0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00, // f
frankvnk 0:630b4da97968 81 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C, // g
frankvnk 0:630b4da97968 82 0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00, // h
frankvnk 0:630b4da97968 83 0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00, // i
frankvnk 0:630b4da97968 84 0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C, // j
frankvnk 0:630b4da97968 85 0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00, // k
frankvnk 0:630b4da97968 86 0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // l
frankvnk 0:630b4da97968 87 0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00, // m
frankvnk 0:630b4da97968 88 0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00, // n
frankvnk 0:630b4da97968 89 0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00, // o
frankvnk 0:630b4da97968 90 0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78, // p
frankvnk 0:630b4da97968 91 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F, // q
frankvnk 0:630b4da97968 92 0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00, // r
frankvnk 0:630b4da97968 93 0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00, // s
frankvnk 0:630b4da97968 94 0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00, // t
frankvnk 0:630b4da97968 95 0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00, // u
frankvnk 0:630b4da97968 96 0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00, // v
frankvnk 0:630b4da97968 97 0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00, // w
frankvnk 0:630b4da97968 98 0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00, // x
frankvnk 0:630b4da97968 99 0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C, // y
frankvnk 0:630b4da97968 100 0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00, // z
frankvnk 0:630b4da97968 101 0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00, // {
frankvnk 0:630b4da97968 102 0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00, // |
frankvnk 0:630b4da97968 103 0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00, // }
frankvnk 0:630b4da97968 104 0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00, // ~
frankvnk 0:630b4da97968 105 0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00}; // DEL
frankvnk 0:630b4da97968 106
frankvnk 0:630b4da97968 107 GraphicsDisplay::GraphicsDisplay(const char *name):TextDisplay(name) {
frankvnk 0:630b4da97968 108 foreground(0xFFFF);
frankvnk 0:630b4da97968 109 background(0x0000);
frankvnk 0:630b4da97968 110 }
frankvnk 0:630b4da97968 111
frankvnk 0:630b4da97968 112 void GraphicsDisplay::character(int column, int row, int value) {
frankvnk 0:630b4da97968 113 blitbit(column * 8, row * 8, 8, 8, (char*)&(FONT8x8[value - 0x1F][0]));
frankvnk 0:630b4da97968 114 }
frankvnk 0:630b4da97968 115
frankvnk 0:630b4da97968 116 void GraphicsDisplay::window(int x, int y, int w, int h) {
frankvnk 0:630b4da97968 117 // current pixel location
frankvnk 0:630b4da97968 118 _x = x;
frankvnk 0:630b4da97968 119 _y = y;
frankvnk 0:630b4da97968 120 // window settings
frankvnk 0:630b4da97968 121 _x1 = x;
frankvnk 0:630b4da97968 122 _x2 = x + w - 1;
frankvnk 0:630b4da97968 123 _y1 = y;
frankvnk 0:630b4da97968 124 _y2 = y + h - 1;
frankvnk 0:630b4da97968 125 }
frankvnk 0:630b4da97968 126
frankvnk 0:630b4da97968 127 void GraphicsDisplay::putp(int colour) {
frankvnk 0:630b4da97968 128 // put pixel at current pixel location
frankvnk 0:630b4da97968 129 pixel(_x, _y, colour);
frankvnk 0:630b4da97968 130 // update pixel location based on window settings
frankvnk 0:630b4da97968 131 _x++;
frankvnk 0:630b4da97968 132 if(_x > _x2) {
frankvnk 0:630b4da97968 133 _x = _x1;
frankvnk 0:630b4da97968 134 _y++;
frankvnk 0:630b4da97968 135 if(_y > _y2) {
frankvnk 0:630b4da97968 136 _y = _y1;
frankvnk 0:630b4da97968 137 }
frankvnk 0:630b4da97968 138 }
frankvnk 0:630b4da97968 139 }
frankvnk 0:630b4da97968 140
frankvnk 0:630b4da97968 141 void GraphicsDisplay::fill(int x, int y, int w, int h, int colour) {
frankvnk 0:630b4da97968 142 window(x, y, w, h);
frankvnk 0:630b4da97968 143 for(int i=0; i<w*h; i++) {
frankvnk 0:630b4da97968 144 putp(colour);
frankvnk 0:630b4da97968 145 }
frankvnk 0:630b4da97968 146 }
frankvnk 0:630b4da97968 147
frankvnk 0:630b4da97968 148 void GraphicsDisplay::cls() {
frankvnk 0:630b4da97968 149 fill(0, 0, width(), height(), _background);
frankvnk 0:630b4da97968 150 }
frankvnk 0:630b4da97968 151
frankvnk 0:630b4da97968 152 void GraphicsDisplay::blit(int x, int y, int w, int h, const int *colour) {
frankvnk 0:630b4da97968 153 window(x, y, w, h);
frankvnk 0:630b4da97968 154 for(int i=0; i<w*h; i++) {
frankvnk 0:630b4da97968 155 putp(colour[i]);
frankvnk 0:630b4da97968 156 }
frankvnk 0:630b4da97968 157 }
frankvnk 0:630b4da97968 158
frankvnk 0:630b4da97968 159 void GraphicsDisplay::blitbit(int x, int y, int w, int h, const char* colour) {
frankvnk 0:630b4da97968 160 window(x, y, w, h);
frankvnk 0:630b4da97968 161 for(int i = 0; i < w*h; i++) {
frankvnk 0:630b4da97968 162 char byte = colour[i >> 3];
frankvnk 0:630b4da97968 163 int offset = i & 0x7;
frankvnk 0:630b4da97968 164 int c = ((byte << offset) & 0x80) ? _foreground : _background;
frankvnk 0:630b4da97968 165 putp(c);
frankvnk 0:630b4da97968 166 }
frankvnk 0:630b4da97968 167 }
frankvnk 0:630b4da97968 168
frankvnk 0:630b4da97968 169 int GraphicsDisplay::columns() {
frankvnk 0:630b4da97968 170 return width() / 8;
frankvnk 0:630b4da97968 171 }
frankvnk 0:630b4da97968 172
frankvnk 0:630b4da97968 173 int GraphicsDisplay::rows() {
frankvnk 0:630b4da97968 174 return height() / 8;
frankvnk 0:630b4da97968 175 }
frankvnk 0:630b4da97968 176