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:
3:a016fe71ed72
Added  ILI9325 and ILI9328 initialization

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 0:630b4da97968 1 /**************************************************************************************************
frankvnk 0:630b4da97968 2 ***** *****
frankvnk 0:630b4da97968 3 ***** Name: SPI_TFT.cpp *****
frankvnk 0:630b4da97968 4 ***** Ver.: 1.0 *****
frankvnk 0:630b4da97968 5 ***** Date: 04/01/2013 *****
frankvnk 0:630b4da97968 6 ***** Auth: Frank Vannieuwkerke *****
frankvnk 0:630b4da97968 7 ***** Erik Olieman *****
frankvnk 0:630b4da97968 8 ***** Func: library for 240*320 pixel TFT with ILI9320 LCD Controller *****
frankvnk 0:630b4da97968 9 ***** *****
frankvnk 0:630b4da97968 10 ***** Rewrite from Peter Drescher code - http://mbed.org/cookbook/SPI-driven-QVGA-TFT *****
frankvnk 0:630b4da97968 11 ***** *****
frankvnk 0:630b4da97968 12 **************************************************************************************************/
frankvnk 0:630b4da97968 13
frankvnk 0:630b4da97968 14 #include "SPI_TFT_ILI9320.h"
frankvnk 0:630b4da97968 15 #include "mbed.h"
frankvnk 0:630b4da97968 16
frankvnk 0:630b4da97968 17
frankvnk 0:630b4da97968 18 #define BPP 16 // Bits per pixel
frankvnk 0:630b4da97968 19
frankvnk 0:630b4da97968 20
frankvnk 0:630b4da97968 21 SPI_TFT::SPI_TFT(PinName mosi, PinName miso, PinName sclk, PinName cs, const char *name)
frankvnk 0:630b4da97968 22 : GraphicsDisplay(name), _spi(mosi, miso, sclk), _cs(cs)
frankvnk 0:630b4da97968 23 {
frankvnk 0:630b4da97968 24 char_x = 0;
frankvnk 0:630b4da97968 25 tft_reset();
frankvnk 0:630b4da97968 26 set_orientation(0);
frankvnk 0:630b4da97968 27 backgroundimage = false;
frankvnk 0:630b4da97968 28 #ifndef NO_FLASH_BUFFER
frankvnk 0:630b4da97968 29 backgroundOrientation = 0;
frankvnk 0:630b4da97968 30 #endif
frankvnk 0:630b4da97968 31 }
frankvnk 0:630b4da97968 32
frankvnk 0:630b4da97968 33 int SPI_TFT::width()
frankvnk 0:630b4da97968 34 {
frankvnk 0:630b4da97968 35 if (orientation == 0 || orientation == 2) return 240;
frankvnk 0:630b4da97968 36 else return 320;
frankvnk 0:630b4da97968 37 }
frankvnk 0:630b4da97968 38
frankvnk 0:630b4da97968 39 int SPI_TFT::height()
frankvnk 0:630b4da97968 40 {
frankvnk 0:630b4da97968 41 if (orientation == 0 || orientation == 2) return 320;
frankvnk 0:630b4da97968 42 else return 240;
frankvnk 0:630b4da97968 43 }
frankvnk 0:630b4da97968 44
frankvnk 0:630b4da97968 45 void SPI_TFT::set_orientation(unsigned int o)
frankvnk 0:630b4da97968 46 {
frankvnk 0:630b4da97968 47 orientation = o;
frankvnk 0:630b4da97968 48 WindowMax();
frankvnk 0:630b4da97968 49 }
frankvnk 0:630b4da97968 50
frankvnk 0:630b4da97968 51 void SPI_TFT::mod_orientation(void)
frankvnk 0:630b4da97968 52 {
frankvnk 0:630b4da97968 53 switch (orientation) {
frankvnk 0:630b4da97968 54 case 0:
frankvnk 0:630b4da97968 55 wr_reg(0x03, 0x10b0); // ID1 = 1, ID0 = 1, AM = 0 - Portrait
frankvnk 0:630b4da97968 56 break;
frankvnk 0:630b4da97968 57 case 1:
frankvnk 0:630b4da97968 58 wr_reg(0x03, 0x10a8); // ID1 = 1, ID0 = 0, AM = 0 - Landscape
frankvnk 0:630b4da97968 59 break;
frankvnk 0:630b4da97968 60 case 2:
frankvnk 0:630b4da97968 61 wr_reg(0x03, 0x1080); // ID1 = 0, ID0 = 0, AM = 1 - Portrait upside down
frankvnk 0:630b4da97968 62 break;
frankvnk 0:630b4da97968 63 case 3:
frankvnk 0:630b4da97968 64 wr_reg(0x03, 0x1098); // ID1 = 0, ID0 = 1, AM = 1 - Landscape upside down
frankvnk 0:630b4da97968 65 break;
frankvnk 0:630b4da97968 66 }
frankvnk 0:630b4da97968 67 }
frankvnk 0:630b4da97968 68
frankvnk 0:630b4da97968 69 void SPI_TFT::wr_cmd(unsigned char cmd)
frankvnk 0:630b4da97968 70 {
frankvnk 0:630b4da97968 71 _cs = 0;
frankvnk 0:630b4da97968 72 _spi.write(0x70);
frankvnk 0:630b4da97968 73 _spi.write(0x00);
frankvnk 0:630b4da97968 74 _spi.write(cmd);
frankvnk 0:630b4da97968 75 _cs = 1;
frankvnk 0:630b4da97968 76 }
frankvnk 0:630b4da97968 77
frankvnk 0:630b4da97968 78 void SPI_TFT::wr_dat(unsigned short dat)
frankvnk 0:630b4da97968 79 {
frankvnk 0:630b4da97968 80 unsigned char u,l;
frankvnk 0:630b4da97968 81 u = (dat >> 0x08);
frankvnk 0:630b4da97968 82 l = (dat & 0xff);
frankvnk 0:630b4da97968 83 _cs = 0;
frankvnk 0:630b4da97968 84 _spi.write(0x72);
frankvnk 0:630b4da97968 85 _spi.write(u);
frankvnk 0:630b4da97968 86 _spi.write(l);
frankvnk 0:630b4da97968 87 _cs = 1;
frankvnk 0:630b4da97968 88 }
frankvnk 0:630b4da97968 89
frankvnk 0:630b4da97968 90 void SPI_TFT::wr_dat_start(void)
frankvnk 0:630b4da97968 91 {
frankvnk 0:630b4da97968 92 _spi.write(0x72);
frankvnk 0:630b4da97968 93 }
frankvnk 0:630b4da97968 94
frankvnk 0:630b4da97968 95 unsigned short SPI_TFT::rd_dat(void) // IMPORTANT : SPI frequency needs to be lowered when reading
frankvnk 0:630b4da97968 96 {
frankvnk 0:630b4da97968 97 unsigned short val = 0;
frankvnk 0:630b4da97968 98 _cs = 0;
frankvnk 0:630b4da97968 99 _spi.frequency(SPI_F_LO);
frankvnk 0:630b4da97968 100 _spi.write(0x73);
frankvnk 0:630b4da97968 101 _spi.write(0x00);
frankvnk 0:630b4da97968 102 val = _spi.write(0x00); // Dummy read
frankvnk 0:630b4da97968 103 val = _spi.write(0x00); // Read D8..D15
frankvnk 0:630b4da97968 104 val <<= 8;
frankvnk 0:630b4da97968 105 val |= _spi.write(0x00); // Read D0..D7
frankvnk 0:630b4da97968 106 _cs = 1;
frankvnk 0:630b4da97968 107 _spi.frequency(SPI_F_HI);
frankvnk 0:630b4da97968 108 return (val);
frankvnk 0:630b4da97968 109 }
frankvnk 0:630b4da97968 110
frankvnk 0:630b4da97968 111 void SPI_TFT::wr_reg(unsigned char reg, unsigned short val)
frankvnk 0:630b4da97968 112 {
frankvnk 0:630b4da97968 113 wr_cmd(reg);
frankvnk 0:630b4da97968 114 wr_dat(val);
frankvnk 0:630b4da97968 115 }
frankvnk 0:630b4da97968 116
frankvnk 0:630b4da97968 117 unsigned short SPI_TFT::rd_reg(unsigned char reg)
frankvnk 0:630b4da97968 118 {
frankvnk 0:630b4da97968 119 wr_cmd(reg);
frankvnk 0:630b4da97968 120 return(rd_dat());
frankvnk 0:630b4da97968 121 }
frankvnk 0:630b4da97968 122
frankvnk 0:630b4da97968 123 unsigned short SPI_TFT::Read_ID(void) // IMPORTANT : SPI frequency needs to be lowered when reading
frankvnk 0:630b4da97968 124 {
frankvnk 0:630b4da97968 125 unsigned short val = 0;
frankvnk 0:630b4da97968 126 _cs = 0;
frankvnk 0:630b4da97968 127 _spi.write(0x70);
frankvnk 0:630b4da97968 128 _spi.write(0x00);
frankvnk 0:630b4da97968 129 _spi.write(0x00);
frankvnk 0:630b4da97968 130 _cs = 1;
frankvnk 0:630b4da97968 131 _spi.frequency(SPI_F_LO);
frankvnk 0:630b4da97968 132 _cs = 0;
frankvnk 0:630b4da97968 133 _spi.write(0x73);
frankvnk 0:630b4da97968 134 val = _spi.write(0x00); // Dummy read
frankvnk 0:630b4da97968 135 val = _spi.write(0x00); // Read D8..D15
frankvnk 0:630b4da97968 136 val <<= 8;
frankvnk 0:630b4da97968 137 val |= _spi.write(0x00); // Read D0..D7
frankvnk 0:630b4da97968 138 _cs = 1;
frankvnk 0:630b4da97968 139 _spi.frequency(SPI_F_HI);
frankvnk 0:630b4da97968 140 return (val);
frankvnk 0:630b4da97968 141 }
frankvnk 0:630b4da97968 142
frankvnk 0:630b4da97968 143 void SPI_TFT::SetCursor( unsigned short Xpos, unsigned short Ypos )
frankvnk 0:630b4da97968 144 {
frankvnk 0:630b4da97968 145 wr_reg(0x20, Xpos );
frankvnk 0:630b4da97968 146 wr_reg(0x21, Ypos );
frankvnk 0:630b4da97968 147 }
frankvnk 0:630b4da97968 148
frankvnk 0:630b4da97968 149 void SPI_TFT::tft_reset()
frankvnk 0:630b4da97968 150 {
frankvnk 4:2519f2e680af 151 uint16_t DeviceID;
frankvnk 0:630b4da97968 152 _spi.format(8,3); // 8 bit spi mode 3
frankvnk 4:2519f2e680af 153 DeviceID = Read_ID();
frankvnk 0:630b4da97968 154 _spi.frequency(SPI_F_HI); // 48 Mhz SPI clock
frankvnk 4:2519f2e680af 155 if(DeviceID == 0x9320 || DeviceID == 0x9300)
frankvnk 4:2519f2e680af 156 {
frankvnk 4:2519f2e680af 157 wr_reg(0x00,0x0000);
frankvnk 4:2519f2e680af 158 wr_reg(0x01,0x0100); // Driver Output Control
frankvnk 4:2519f2e680af 159 wr_reg(0x02,0x0700); // LCD Driver Waveform Control
frankvnk 4:2519f2e680af 160 wr_reg(0x03,0x1030); // Set the scan mode
frankvnk 4:2519f2e680af 161 wr_reg(0x04,0x0000); // Scaling Control
frankvnk 4:2519f2e680af 162 wr_reg(0x08,0x0202); // Display Control 2
frankvnk 4:2519f2e680af 163 wr_reg(0x09,0x0000); // Display Control 3
frankvnk 4:2519f2e680af 164 wr_reg(0x0a,0x0000); // Frame Cycle Contal
frankvnk 4:2519f2e680af 165 wr_reg(0x0c,(1<<0)); // Extern Display Interface Control 1
frankvnk 4:2519f2e680af 166 wr_reg(0x0d,0x0000); // Frame Maker Position
frankvnk 4:2519f2e680af 167 wr_reg(0x0f,0x0000); // Extern Display Interface Control 2
frankvnk 4:2519f2e680af 168
frankvnk 4:2519f2e680af 169 wait_ms(50);
frankvnk 4:2519f2e680af 170
frankvnk 4:2519f2e680af 171 wr_reg(0x07,0x0101); // Display Control
frankvnk 4:2519f2e680af 172
frankvnk 4:2519f2e680af 173 wait_ms(50);
frankvnk 0:630b4da97968 174
frankvnk 4:2519f2e680af 175 wr_reg(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4)); // Power Control 1
frankvnk 4:2519f2e680af 176 wr_reg(0x11,0x0007); // Power Control 2
frankvnk 4:2519f2e680af 177 wr_reg(0x12,(1<<8)|(1<<4)|(0<<0)); // Power Control 3
frankvnk 4:2519f2e680af 178 wr_reg(0x13,0x0b00); // Power Control 4
frankvnk 4:2519f2e680af 179 wr_reg(0x29,0x0000); // Power Control 7
frankvnk 4:2519f2e680af 180 wr_reg(0x2b,(1<<14)|(1<<4));
frankvnk 4:2519f2e680af 181
frankvnk 4:2519f2e680af 182 wr_reg(0x50,0); // Set X Start
frankvnk 4:2519f2e680af 183 wr_reg(0x51,239); // Set X End
frankvnk 4:2519f2e680af 184 wr_reg(0x52,0); // Set Y Start
frankvnk 4:2519f2e680af 185 wr_reg(0x53,319); // Set Y End
frankvnk 0:630b4da97968 186
frankvnk 4:2519f2e680af 187 wait_ms(50);
frankvnk 4:2519f2e680af 188
frankvnk 4:2519f2e680af 189 wr_reg(0x60,0x2700); // Driver Output Control
frankvnk 4:2519f2e680af 190 wr_reg(0x61,0x0001); // Driver Output Control
frankvnk 4:2519f2e680af 191 wr_reg(0x6a,0x0000); // Vertical Srcoll Control
frankvnk 0:630b4da97968 192
frankvnk 4:2519f2e680af 193 wr_reg(0x80,0x0000); // Display Position Partial Display 1
frankvnk 4:2519f2e680af 194 wr_reg(0x81,0x0000); // RAM Address Start Partial Display 1
frankvnk 4:2519f2e680af 195 wr_reg(0x82,0x0000); // RAM Address End-Partial Display 1
frankvnk 4:2519f2e680af 196 wr_reg(0x83,0x0000); // Displsy Position Partial Display 2
frankvnk 4:2519f2e680af 197 wr_reg(0x84,0x0000); // RAM Address Start Partial Display 2
frankvnk 4:2519f2e680af 198 wr_reg(0x85,0x0000); // RAM Address End Partial Display 2
frankvnk 0:630b4da97968 199
frankvnk 4:2519f2e680af 200 wr_reg(0x90,(0<<7)|(16<<0)); // Frame Cycle Control
frankvnk 4:2519f2e680af 201 wr_reg(0x92,0x0000); // Panel Interface Control 2
frankvnk 4:2519f2e680af 202 wr_reg(0x93,0x0001); // Panel Interface Control 3
frankvnk 4:2519f2e680af 203 wr_reg(0x95,0x0110); // Frame Cycle Control
frankvnk 4:2519f2e680af 204 wr_reg(0x97,(0<<8));
frankvnk 4:2519f2e680af 205 wr_reg(0x98,0x0000); // Frame Cycle Control
frankvnk 4:2519f2e680af 206 wr_reg(0x07,0x0133);
frankvnk 4:2519f2e680af 207 }
frankvnk 4:2519f2e680af 208 if(DeviceID == 0x9325 || DeviceID == 0x9328)
frankvnk 4:2519f2e680af 209 {
frankvnk 4:2519f2e680af 210 wr_reg(0xe7,0x0010);
frankvnk 4:2519f2e680af 211 wr_reg(0x00,0x0001); // start internal osc
frankvnk 4:2519f2e680af 212 wr_reg(0x01,0x0100);
frankvnk 4:2519f2e680af 213 wr_reg(0x02,0x0700); // power on sequence
frankvnk 4:2519f2e680af 214 wr_reg(0x03,(1<<12)|(1<<5)|(1<<4)|(0<<3) ); // importance
frankvnk 4:2519f2e680af 215 wr_reg(0x04,0x0000);
frankvnk 4:2519f2e680af 216 wr_reg(0x08,0x0207);
frankvnk 4:2519f2e680af 217 wr_reg(0x09,0x0000);
frankvnk 4:2519f2e680af 218 wr_reg(0x0a,0x0000); // display setting
frankvnk 4:2519f2e680af 219 wr_reg(0x0c,0x0001); // display setting
frankvnk 4:2519f2e680af 220 wr_reg(0x0d,0x0000);
frankvnk 4:2519f2e680af 221 wr_reg(0x0f,0x0000);
frankvnk 4:2519f2e680af 222 wr_reg(0x10,0x0000); // Power On sequence
frankvnk 4:2519f2e680af 223 wr_reg(0x11,0x0007);
frankvnk 4:2519f2e680af 224 wr_reg(0x12,0x0000);
frankvnk 4:2519f2e680af 225 wr_reg(0x13,0x0000);
frankvnk 0:630b4da97968 226
frankvnk 4:2519f2e680af 227 wait_ms(50);
frankvnk 4:2519f2e680af 228
frankvnk 4:2519f2e680af 229 wr_reg(0x10,0x1590);
frankvnk 4:2519f2e680af 230 wr_reg(0x11,0x0227);
frankvnk 4:2519f2e680af 231
frankvnk 4:2519f2e680af 232 wait_ms(50);
frankvnk 0:630b4da97968 233
frankvnk 4:2519f2e680af 234 wr_reg(0x12,0x009c);
frankvnk 4:2519f2e680af 235
frankvnk 4:2519f2e680af 236 wait_ms(50);
frankvnk 4:2519f2e680af 237
frankvnk 4:2519f2e680af 238 wr_reg(0x13,0x1900);
frankvnk 4:2519f2e680af 239 wr_reg(0x29,0x0023);
frankvnk 4:2519f2e680af 240 wr_reg(0x2b,0x000e);
frankvnk 4:2519f2e680af 241
frankvnk 4:2519f2e680af 242 wait_ms(50);
frankvnk 0:630b4da97968 243
frankvnk 4:2519f2e680af 244 wr_reg(0x20,0x0000);
frankvnk 4:2519f2e680af 245 wr_reg(0x21,0x0000);
frankvnk 4:2519f2e680af 246
frankvnk 4:2519f2e680af 247 wait_ms(50);
frankvnk 4:2519f2e680af 248
frankvnk 4:2519f2e680af 249 wr_reg(0x30,0x0007);
frankvnk 4:2519f2e680af 250 wr_reg(0x31,0x0707);
frankvnk 4:2519f2e680af 251 wr_reg(0x32,0x0006);
frankvnk 4:2519f2e680af 252 wr_reg(0x35,0x0704);
frankvnk 4:2519f2e680af 253 wr_reg(0x36,0x1f04);
frankvnk 4:2519f2e680af 254 wr_reg(0x37,0x0004);
frankvnk 4:2519f2e680af 255 wr_reg(0x38,0x0000);
frankvnk 4:2519f2e680af 256 wr_reg(0x39,0x0706);
frankvnk 4:2519f2e680af 257 wr_reg(0x3c,0x0701);
frankvnk 4:2519f2e680af 258 wr_reg(0x3d,0x000f);
frankvnk 4:2519f2e680af 259
frankvnk 4:2519f2e680af 260 wait_ms(50);
frankvnk 0:630b4da97968 261
frankvnk 4:2519f2e680af 262 wr_reg(0x50,0x0000);
frankvnk 4:2519f2e680af 263 wr_reg(0x51,0x00ef);
frankvnk 4:2519f2e680af 264 wr_reg(0x52,0x0000);
frankvnk 4:2519f2e680af 265 wr_reg(0x53,0x013f);
frankvnk 4:2519f2e680af 266 wr_reg(0x60,0xa700);
frankvnk 4:2519f2e680af 267 wr_reg(0x61,0x0001);
frankvnk 4:2519f2e680af 268 wr_reg(0x6a,0x0000);
frankvnk 4:2519f2e680af 269 wr_reg(0x80,0x0000);
frankvnk 4:2519f2e680af 270 wr_reg(0x81,0x0000);
frankvnk 4:2519f2e680af 271 wr_reg(0x82,0x0000);
frankvnk 4:2519f2e680af 272 wr_reg(0x83,0x0000);
frankvnk 4:2519f2e680af 273 wr_reg(0x84,0x0000);
frankvnk 4:2519f2e680af 274 wr_reg(0x85,0x0000);
frankvnk 4:2519f2e680af 275
frankvnk 4:2519f2e680af 276 wr_reg(0x90,0x0010);
frankvnk 4:2519f2e680af 277 wr_reg(0x92,0x0000);
frankvnk 4:2519f2e680af 278 wr_reg(0x93,0x0003);
frankvnk 4:2519f2e680af 279 wr_reg(0x95,0x0110);
frankvnk 4:2519f2e680af 280 wr_reg(0x97,0x0000);
frankvnk 4:2519f2e680af 281 wr_reg(0x98,0x0000);
frankvnk 4:2519f2e680af 282
frankvnk 4:2519f2e680af 283 wr_reg(0x07,0x0133); // display on sequence
frankvnk 4:2519f2e680af 284
frankvnk 4:2519f2e680af 285 wr_reg(0x20,0x0000);
frankvnk 4:2519f2e680af 286 wr_reg(0x21,0x0000);
frankvnk 4:2519f2e680af 287 }
frankvnk 0:630b4da97968 288 wait_ms(100);
frankvnk 0:630b4da97968 289 WindowMax();
frankvnk 0:630b4da97968 290 }
frankvnk 0:630b4da97968 291
frankvnk 0:630b4da97968 292
frankvnk 0:630b4da97968 293 void SPI_TFT::pixel(int x, int y, int color)
frankvnk 0:630b4da97968 294 {
frankvnk 0:630b4da97968 295 switch (orientation) {
frankvnk 0:630b4da97968 296 case 0:
frankvnk 0:630b4da97968 297 wr_reg(0x20, x);
frankvnk 0:630b4da97968 298 wr_reg(0x21, y);
frankvnk 0:630b4da97968 299 break;
frankvnk 0:630b4da97968 300 case 1:
frankvnk 0:630b4da97968 301 wr_reg(0x20, 239-y);
frankvnk 0:630b4da97968 302 wr_reg(0x21, x);
frankvnk 0:630b4da97968 303 break;
frankvnk 0:630b4da97968 304 case 2:
frankvnk 0:630b4da97968 305 wr_reg(0x20, 239-x);
frankvnk 0:630b4da97968 306 wr_reg(0x21, 319-y);
frankvnk 0:630b4da97968 307 break;
frankvnk 0:630b4da97968 308 case 3:
frankvnk 0:630b4da97968 309 wr_reg(0x20, y);
frankvnk 0:630b4da97968 310 wr_reg(0x21, 319-x);
frankvnk 0:630b4da97968 311 break;
frankvnk 0:630b4da97968 312 }
frankvnk 0:630b4da97968 313 wr_cmd(0x22);
frankvnk 0:630b4da97968 314 wr_dat(color);
frankvnk 0:630b4da97968 315 }
frankvnk 0:630b4da97968 316
frankvnk 0:630b4da97968 317
frankvnk 0:630b4da97968 318 void SPI_TFT::window(int x, int y, int w, int h)
frankvnk 0:630b4da97968 319 {
frankvnk 0:630b4da97968 320 unsigned int xw1, yh1;
frankvnk 0:630b4da97968 321 xw1 = x + w - 1;
frankvnk 0:630b4da97968 322 yh1 = y + h - 1;
frankvnk 0:630b4da97968 323 wr_reg(0x20, x);
frankvnk 0:630b4da97968 324 wr_reg(0x21, y);
frankvnk 0:630b4da97968 325 switch (orientation) {
frankvnk 0:630b4da97968 326 case 0:
frankvnk 0:630b4da97968 327 wr_reg(0x50, x);
frankvnk 0:630b4da97968 328 wr_reg(0x51, xw1);
frankvnk 0:630b4da97968 329 wr_reg(0x52, y);
frankvnk 0:630b4da97968 330 wr_reg(0x53, yh1);
frankvnk 0:630b4da97968 331 break;
frankvnk 0:630b4da97968 332 case 1:
frankvnk 0:630b4da97968 333 wr_reg(0x50, 239 - yh1);
frankvnk 0:630b4da97968 334 wr_reg(0x51, 239 - y);
frankvnk 0:630b4da97968 335 wr_reg(0x52, x);
frankvnk 0:630b4da97968 336 wr_reg(0x53, xw1);
frankvnk 0:630b4da97968 337 break;
frankvnk 0:630b4da97968 338 case 2:
frankvnk 0:630b4da97968 339 wr_reg(0x50, 239 - xw1);
frankvnk 0:630b4da97968 340 wr_reg(0x51, 239 - x);
frankvnk 0:630b4da97968 341 wr_reg(0x52, 319 - yh1);
frankvnk 0:630b4da97968 342 wr_reg(0x53, 319 - y);
frankvnk 0:630b4da97968 343 break;
frankvnk 0:630b4da97968 344 case 3:
frankvnk 0:630b4da97968 345 wr_reg(0x50, y);
frankvnk 0:630b4da97968 346 wr_reg(0x51, yh1);
frankvnk 0:630b4da97968 347 wr_reg(0x52, 319 - xw1);
frankvnk 0:630b4da97968 348 wr_reg(0x53, 319 - x);
frankvnk 0:630b4da97968 349 break;
frankvnk 0:630b4da97968 350 }
frankvnk 0:630b4da97968 351 }
frankvnk 0:630b4da97968 352
frankvnk 0:630b4da97968 353
frankvnk 0:630b4da97968 354 void SPI_TFT::WindowMax(void)
frankvnk 0:630b4da97968 355 {
frankvnk 0:630b4da97968 356 window(0, 0, width(), height());
frankvnk 0:630b4da97968 357 }
frankvnk 0:630b4da97968 358
frankvnk 0:630b4da97968 359
frankvnk 0:630b4da97968 360 void SPI_TFT::cls (void)
frankvnk 0:630b4da97968 361 {
frankvnk 0:630b4da97968 362 if (backgroundimage == false) {
frankvnk 0:630b4da97968 363 unsigned long int index=0;
frankvnk 0:630b4da97968 364 wr_reg(0x03, 0x1030);
frankvnk 0:630b4da97968 365 WindowMax();
frankvnk 0:630b4da97968 366 SetCursor(0,0);
frankvnk 0:630b4da97968 367 wr_cmd(0x22);
frankvnk 0:630b4da97968 368 _cs = 0;
frankvnk 0:630b4da97968 369 wr_dat_start();
frankvnk 3:a016fe71ed72 370 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 371 _spi.format(16,3);
frankvnk 3:a016fe71ed72 372 #endif
frankvnk 0:630b4da97968 373 int num = width()*height();
frankvnk 0:630b4da97968 374
frankvnk 0:630b4da97968 375 for( index = 0; index<num; index++ ) {
frankvnk 3:a016fe71ed72 376 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 377 _spi.fastWrite(_background);
frankvnk 3:a016fe71ed72 378 #else
frankvnk 3:a016fe71ed72 379 _spi.fastWrite(_background >> 8);
frankvnk 3:a016fe71ed72 380 _spi.fastWrite(_background & 0xFF);
frankvnk 3:a016fe71ed72 381 #endif
frankvnk 0:630b4da97968 382 }
frankvnk 0:630b4da97968 383 _spi.clearRX();
frankvnk 0:630b4da97968 384
frankvnk 3:a016fe71ed72 385 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 386 _spi.format(8,3);
frankvnk 3:a016fe71ed72 387 #endif
frankvnk 0:630b4da97968 388 _cs = 1;
frankvnk 0:630b4da97968 389 }
frankvnk 0:630b4da97968 390 #ifndef NO_FLASH_BUFFER
frankvnk 0:630b4da97968 391 else {
frankvnk 0:630b4da97968 392 int _orientation=orientation;
frankvnk 0:630b4da97968 393 set_orientation(backgroundOrientation);
frankvnk 0:630b4da97968 394 Bitmap(0,0,width(),height(),(unsigned char*) sector_start_adress[ 25 ]);
frankvnk 0:630b4da97968 395 set_orientation(_orientation);
frankvnk 0:630b4da97968 396 }
frankvnk 0:630b4da97968 397 #endif
frankvnk 0:630b4da97968 398 }
frankvnk 0:630b4da97968 399
frankvnk 0:630b4da97968 400 void SPI_TFT::hline(int x0, int x1, int y, int color)
frankvnk 0:630b4da97968 401 {
frankvnk 0:630b4da97968 402 unsigned int index=0;
frankvnk 0:630b4da97968 403 int w;
frankvnk 0:630b4da97968 404 w = x1 - x0 + 1;
frankvnk 0:630b4da97968 405 mod_orientation();
frankvnk 0:630b4da97968 406 window(x0,y,w,1);
frankvnk 0:630b4da97968 407 wr_cmd(0x22);
frankvnk 0:630b4da97968 408 _cs = 0;
frankvnk 0:630b4da97968 409 wr_dat_start();
frankvnk 0:630b4da97968 410
frankvnk 3:a016fe71ed72 411 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 412 _spi.format(16,3);
frankvnk 3:a016fe71ed72 413 #endif
frankvnk 0:630b4da97968 414 int num = x1-x0;
frankvnk 0:630b4da97968 415 for( index = 0; index<num; index++ ) {
frankvnk 3:a016fe71ed72 416 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 417 _spi.fastWrite(color);
frankvnk 3:a016fe71ed72 418 #else
frankvnk 3:a016fe71ed72 419 _spi.fastWrite(color >> 8);
frankvnk 3:a016fe71ed72 420 _spi.fastWrite(color & 0xFF);
frankvnk 3:a016fe71ed72 421 #endif
frankvnk 0:630b4da97968 422 }
frankvnk 0:630b4da97968 423 _spi.clearRX();
frankvnk 0:630b4da97968 424
frankvnk 3:a016fe71ed72 425 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 426 _spi.format(8,3);
frankvnk 3:a016fe71ed72 427 #endif
frankvnk 0:630b4da97968 428 _cs = 1;
frankvnk 0:630b4da97968 429 return;
frankvnk 0:630b4da97968 430 }
frankvnk 0:630b4da97968 431
frankvnk 0:630b4da97968 432 void SPI_TFT::vline(int x, int y0, int y1, int color)
frankvnk 0:630b4da97968 433 {
frankvnk 0:630b4da97968 434 unsigned int index=0;
frankvnk 0:630b4da97968 435 int h;
frankvnk 0:630b4da97968 436 h = y1 - y0 + 1;
frankvnk 0:630b4da97968 437 mod_orientation();
frankvnk 0:630b4da97968 438 window(x,y0,1,h);
frankvnk 0:630b4da97968 439 wr_cmd(0x22);
frankvnk 0:630b4da97968 440 _cs = 0;
frankvnk 0:630b4da97968 441 wr_dat_start();
frankvnk 3:a016fe71ed72 442 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 443 _spi.format(16,3);
frankvnk 3:a016fe71ed72 444 #endif
frankvnk 0:630b4da97968 445 int num = y1-y0;
frankvnk 0:630b4da97968 446 for( index = 0; index<num; index++ ) {
frankvnk 3:a016fe71ed72 447 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 448 _spi.fastWrite(color);
frankvnk 3:a016fe71ed72 449 #else
frankvnk 3:a016fe71ed72 450 _spi.fastWrite(color >> 8);
frankvnk 3:a016fe71ed72 451 _spi.fastWrite(color & 0xFF);
frankvnk 3:a016fe71ed72 452 #endif
frankvnk 0:630b4da97968 453 }
frankvnk 0:630b4da97968 454 _spi.clearRX();
frankvnk 3:a016fe71ed72 455 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 456 _spi.format(8,3);
frankvnk 3:a016fe71ed72 457 #endif
frankvnk 0:630b4da97968 458 _cs = 1;
frankvnk 0:630b4da97968 459 return;
frankvnk 0:630b4da97968 460 }
frankvnk 0:630b4da97968 461
frankvnk 0:630b4da97968 462 void SPI_TFT::line(int x0, int y0, int x1, int y1, int color)
frankvnk 0:630b4da97968 463 {
frankvnk 0:630b4da97968 464 wr_reg(0x03, 0x1030);
frankvnk 0:630b4da97968 465 WindowMax();
frankvnk 0:630b4da97968 466 int dx = 0, dy = 0;
frankvnk 0:630b4da97968 467 int dx_sym = 0, dy_sym = 0;
frankvnk 0:630b4da97968 468 int dx_x2 = 0, dy_x2 = 0;
frankvnk 0:630b4da97968 469 int di = 0;
frankvnk 0:630b4da97968 470
frankvnk 0:630b4da97968 471 dx = x1-x0;
frankvnk 0:630b4da97968 472 dy = y1-y0;
frankvnk 0:630b4da97968 473
frankvnk 0:630b4da97968 474 if (dx == 0) { // vertical line
frankvnk 0:630b4da97968 475 if (y1 > y0) vline(x0,y0,y1,color);
frankvnk 0:630b4da97968 476 else vline(x0,y1,y0,color);
frankvnk 0:630b4da97968 477 return;
frankvnk 0:630b4da97968 478 }
frankvnk 0:630b4da97968 479
frankvnk 0:630b4da97968 480 if (dx > 0) {
frankvnk 0:630b4da97968 481 dx_sym = 1;
frankvnk 0:630b4da97968 482 } else {
frankvnk 0:630b4da97968 483 dx_sym = -1;
frankvnk 0:630b4da97968 484 }
frankvnk 0:630b4da97968 485 if (dy == 0) { // horizontal line
frankvnk 0:630b4da97968 486 if (x1 > x0) hline(x0,x1,y0,color);
frankvnk 0:630b4da97968 487 else hline(x1,x0,y0,color);
frankvnk 0:630b4da97968 488 return;
frankvnk 0:630b4da97968 489 }
frankvnk 0:630b4da97968 490
frankvnk 0:630b4da97968 491 if (dy > 0) {
frankvnk 0:630b4da97968 492 dy_sym = 1;
frankvnk 0:630b4da97968 493 } else {
frankvnk 0:630b4da97968 494 dy_sym = -1;
frankvnk 0:630b4da97968 495 }
frankvnk 0:630b4da97968 496
frankvnk 0:630b4da97968 497 dx = dx_sym*dx;
frankvnk 0:630b4da97968 498 dy = dy_sym*dy;
frankvnk 0:630b4da97968 499
frankvnk 0:630b4da97968 500 dx_x2 = dx*2;
frankvnk 0:630b4da97968 501 dy_x2 = dy*2;
frankvnk 0:630b4da97968 502
frankvnk 0:630b4da97968 503 if (dx >= dy) {
frankvnk 0:630b4da97968 504 di = dy_x2 - dx;
frankvnk 0:630b4da97968 505 while (x0 != x1) {
frankvnk 0:630b4da97968 506
frankvnk 0:630b4da97968 507 pixel(x0, y0, color);
frankvnk 0:630b4da97968 508 x0 += dx_sym;
frankvnk 0:630b4da97968 509 if (di<0) {
frankvnk 0:630b4da97968 510 di += dy_x2;
frankvnk 0:630b4da97968 511 } else {
frankvnk 0:630b4da97968 512 di += dy_x2 - dx_x2;
frankvnk 0:630b4da97968 513 y0 += dy_sym;
frankvnk 0:630b4da97968 514 }
frankvnk 0:630b4da97968 515 }
frankvnk 0:630b4da97968 516 pixel(x0, y0, color);
frankvnk 0:630b4da97968 517 } else {
frankvnk 0:630b4da97968 518 di = dx_x2 - dy;
frankvnk 0:630b4da97968 519 while (y0 != y1) {
frankvnk 0:630b4da97968 520 pixel(x0, y0, color);
frankvnk 0:630b4da97968 521 y0 += dy_sym;
frankvnk 0:630b4da97968 522 if (di < 0) {
frankvnk 0:630b4da97968 523 di += dx_x2;
frankvnk 0:630b4da97968 524 } else {
frankvnk 0:630b4da97968 525 di += dx_x2 - dy_x2;
frankvnk 0:630b4da97968 526 x0 += dx_sym;
frankvnk 0:630b4da97968 527 }
frankvnk 0:630b4da97968 528 }
frankvnk 0:630b4da97968 529 pixel(x0, y0, color);
frankvnk 0:630b4da97968 530 }
frankvnk 0:630b4da97968 531 return;
frankvnk 0:630b4da97968 532 }
frankvnk 0:630b4da97968 533
frankvnk 0:630b4da97968 534
frankvnk 0:630b4da97968 535 void SPI_TFT::rect(int x0, int y0, int w, int h, int color)
frankvnk 0:630b4da97968 536 {
frankvnk 0:630b4da97968 537 hline(x0,x0+w,y0,color);
frankvnk 0:630b4da97968 538 vline(x0,y0,y0+h,color);
frankvnk 0:630b4da97968 539 hline(x0,x0+w,y0+h,color);
frankvnk 0:630b4da97968 540 vline(x0+w,y0,y0+h,color);
frankvnk 0:630b4da97968 541
frankvnk 0:630b4da97968 542 return;
frankvnk 0:630b4da97968 543 }
frankvnk 0:630b4da97968 544
frankvnk 0:630b4da97968 545 void SPI_TFT::fillrect(int x0, int y0, int w, int h, int color)
frankvnk 0:630b4da97968 546 {
frankvnk 0:630b4da97968 547 unsigned long int index=0;
frankvnk 0:630b4da97968 548 if (w < 0) {
frankvnk 0:630b4da97968 549 x0 = x0 + w;
frankvnk 0:630b4da97968 550 w = -w;
frankvnk 0:630b4da97968 551 }
frankvnk 0:630b4da97968 552 if (h < 0) {
frankvnk 0:630b4da97968 553 y0 = y0 + h;
frankvnk 0:630b4da97968 554 h = -h;
frankvnk 0:630b4da97968 555 }
frankvnk 0:630b4da97968 556 mod_orientation();
frankvnk 0:630b4da97968 557 window(x0,y0,w,h);
frankvnk 0:630b4da97968 558 wr_cmd(0x22);
frankvnk 0:630b4da97968 559 _cs = 0;
frankvnk 0:630b4da97968 560 wr_dat_start();
frankvnk 3:a016fe71ed72 561 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 562 _spi.format(16,3);
frankvnk 3:a016fe71ed72 563 #endif
frankvnk 0:630b4da97968 564 int num = h*w;
frankvnk 0:630b4da97968 565 for( index = 0; index<num; index++ ) {
frankvnk 3:a016fe71ed72 566 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 567 _spi.fastWrite(color);
frankvnk 3:a016fe71ed72 568 #else
frankvnk 3:a016fe71ed72 569 _spi.fastWrite(color >> 8);
frankvnk 3:a016fe71ed72 570 _spi.fastWrite(color & 0xFF);
frankvnk 3:a016fe71ed72 571 #endif
frankvnk 0:630b4da97968 572 }
frankvnk 0:630b4da97968 573 _spi.clearRX();
frankvnk 3:a016fe71ed72 574 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 575 _spi.format(8,3);
frankvnk 3:a016fe71ed72 576 #endif
frankvnk 0:630b4da97968 577 _cs = 1;
frankvnk 0:630b4da97968 578 return;
frankvnk 0:630b4da97968 579 }
frankvnk 0:630b4da97968 580
frankvnk 0:630b4da97968 581 void SPI_TFT::draw_ellipse(int xc, int yc, int a, int b, unsigned int color)
frankvnk 0:630b4da97968 582 {
frankvnk 0:630b4da97968 583 /* e(x,y) = b^2*x^2 + a^2*y^2 - a^2*b^2 */
frankvnk 0:630b4da97968 584 wr_reg(0x03, 0x1030);
frankvnk 0:630b4da97968 585 WindowMax();
frankvnk 0:630b4da97968 586 int x = 0, y = b;
frankvnk 0:630b4da97968 587 long a2 = (long)a*a, b2 = (long)b*b;
frankvnk 0:630b4da97968 588 long crit1 = -(a2/4 + a%2 + b2);
frankvnk 0:630b4da97968 589 long crit2 = -(b2/4 + b%2 + a2);
frankvnk 0:630b4da97968 590 long crit3 = -(b2/4 + b%2);
frankvnk 0:630b4da97968 591 long t = -a2*y; // e(x+1/2,y-1/2) - (a^2+b^2)/4
frankvnk 0:630b4da97968 592 long dxt = 2*b2*x, dyt = -2*a2*y;
frankvnk 0:630b4da97968 593 long d2xt = 2*b2, d2yt = 2*a2;
frankvnk 0:630b4da97968 594
frankvnk 0:630b4da97968 595 while (y>=0 && x<=a) {
frankvnk 0:630b4da97968 596 pixel(xc+x, yc+y, color);
frankvnk 0:630b4da97968 597 if (x!=0 || y!=0)
frankvnk 0:630b4da97968 598 pixel(xc-x, yc-y, color);
frankvnk 0:630b4da97968 599 if (x!=0 && y!=0) {
frankvnk 0:630b4da97968 600 pixel(xc+x, yc-y, color);
frankvnk 0:630b4da97968 601 pixel(xc-x, yc+y, color);
frankvnk 0:630b4da97968 602 }
frankvnk 0:630b4da97968 603 if (t + b2*x <= crit1 || // e(x+1,y-1/2) <= 0
frankvnk 0:630b4da97968 604 t + a2*y <= crit3) // e(x+1/2,y) <= 0
frankvnk 0:630b4da97968 605 incx();
frankvnk 0:630b4da97968 606 else if (t - a2*y > crit2) // e(x+1/2,y-1) > 0
frankvnk 0:630b4da97968 607 incy();
frankvnk 0:630b4da97968 608 else {
frankvnk 0:630b4da97968 609 incx();
frankvnk 0:630b4da97968 610 incy();
frankvnk 0:630b4da97968 611 }
frankvnk 0:630b4da97968 612 }
frankvnk 0:630b4da97968 613 }
frankvnk 0:630b4da97968 614
frankvnk 0:630b4da97968 615 void SPI_TFT::fill_ellipse(int xc, int yc, int a, int b, unsigned int color)
frankvnk 0:630b4da97968 616 {
frankvnk 0:630b4da97968 617 /* e(x,y) = b^2*x^2 + a^2*y^2 - a^2*b^2 */
frankvnk 0:630b4da97968 618 int x = 0, y = b;
frankvnk 0:630b4da97968 619 int rx = x, ry = y;
frankvnk 0:630b4da97968 620 unsigned int width = 1;
frankvnk 0:630b4da97968 621 unsigned int height = 1;
frankvnk 0:630b4da97968 622 long a2 = (long)a*a, b2 = (long)b*b;
frankvnk 0:630b4da97968 623 long crit1 = -(a2/4 + a%2 + b2);
frankvnk 0:630b4da97968 624 long crit2 = -(b2/4 + b%2 + a2);
frankvnk 0:630b4da97968 625 long crit3 = -(b2/4 + b%2);
frankvnk 0:630b4da97968 626 long t = -a2*y; // e(x+1/2,y-1/2) - (a^2+b^2)/4
frankvnk 0:630b4da97968 627 long dxt = 2*b2*x, dyt = -2*a2*y;
frankvnk 0:630b4da97968 628 long d2xt = 2*b2, d2yt = 2*a2;
frankvnk 0:630b4da97968 629
frankvnk 0:630b4da97968 630 if (b == 0) {
frankvnk 0:630b4da97968 631 fillrect(xc-a, yc, 2*a+1, 1, color);
frankvnk 0:630b4da97968 632 return;
frankvnk 0:630b4da97968 633 }
frankvnk 0:630b4da97968 634
frankvnk 0:630b4da97968 635 while (y>=0 && x<=a) {
frankvnk 0:630b4da97968 636 if (t + b2*x <= crit1 || // e(x+1,y-1/2) <= 0
frankvnk 0:630b4da97968 637 t + a2*y <= crit3) { // e(x+1/2,y) <= 0
frankvnk 0:630b4da97968 638 if (height == 1)
frankvnk 0:630b4da97968 639 ; // draw nothing
frankvnk 0:630b4da97968 640 else if (ry*2+1 > (height-1)*2) {
frankvnk 0:630b4da97968 641 fillrect(xc-rx, yc-ry, width, height-1, color);
frankvnk 0:630b4da97968 642 fillrect(xc-rx, yc+ry+1, width, 1-height, color);
frankvnk 0:630b4da97968 643 ry -= height-1;
frankvnk 0:630b4da97968 644 height = 1;
frankvnk 0:630b4da97968 645 } else {
frankvnk 0:630b4da97968 646 fillrect(xc-rx, yc-ry, width, ry*2+1, color);
frankvnk 0:630b4da97968 647 ry -= ry;
frankvnk 0:630b4da97968 648 height = 1;
frankvnk 0:630b4da97968 649 }
frankvnk 0:630b4da97968 650 incx();
frankvnk 0:630b4da97968 651 rx++;
frankvnk 0:630b4da97968 652 width += 2;
frankvnk 0:630b4da97968 653 } else if (t - a2*y > crit2) { // e(x+1/2,y-1) > 0
frankvnk 0:630b4da97968 654 incy();
frankvnk 0:630b4da97968 655 height++;
frankvnk 0:630b4da97968 656 } else {
frankvnk 0:630b4da97968 657 if (ry*2+1 > height*2) {
frankvnk 0:630b4da97968 658 fillrect(xc-rx, yc-ry, width, height, color);
frankvnk 0:630b4da97968 659 fillrect(xc-rx, yc+ry+1, width, -height, color);
frankvnk 0:630b4da97968 660 } else {
frankvnk 0:630b4da97968 661 fillrect(xc-rx, yc-ry, width, ry*2+1, color);
frankvnk 0:630b4da97968 662 }
frankvnk 0:630b4da97968 663 incx();
frankvnk 0:630b4da97968 664 incy();
frankvnk 0:630b4da97968 665 rx++;
frankvnk 0:630b4da97968 666 width += 2;
frankvnk 0:630b4da97968 667 ry -= height;
frankvnk 0:630b4da97968 668 height = 1;
frankvnk 0:630b4da97968 669 }
frankvnk 0:630b4da97968 670 }
frankvnk 0:630b4da97968 671
frankvnk 0:630b4da97968 672 if (ry > height) {
frankvnk 0:630b4da97968 673 fillrect(xc-rx, yc-ry, width, height, color);
frankvnk 0:630b4da97968 674 fillrect(xc-rx, yc+ry+1, width, -height, color);
frankvnk 0:630b4da97968 675 } else {
frankvnk 0:630b4da97968 676 fillrect(xc-rx, yc-ry, width, ry*2+1, color);
frankvnk 0:630b4da97968 677 }
frankvnk 0:630b4da97968 678 }
frankvnk 0:630b4da97968 679
frankvnk 0:630b4da97968 680
frankvnk 0:630b4da97968 681 void SPI_TFT::locate(int x, int y)
frankvnk 0:630b4da97968 682 {
frankvnk 0:630b4da97968 683 char_x = x;
frankvnk 0:630b4da97968 684 char_y = y;
frankvnk 0:630b4da97968 685 }
frankvnk 0:630b4da97968 686
frankvnk 0:630b4da97968 687 int SPI_TFT::columns()
frankvnk 0:630b4da97968 688 {
frankvnk 0:630b4da97968 689 return width() / font[1];
frankvnk 0:630b4da97968 690 }
frankvnk 0:630b4da97968 691
frankvnk 0:630b4da97968 692 int SPI_TFT::rows()
frankvnk 0:630b4da97968 693 {
frankvnk 0:630b4da97968 694 return height() / font[2];
frankvnk 0:630b4da97968 695 }
frankvnk 0:630b4da97968 696
frankvnk 0:630b4da97968 697 int SPI_TFT::_putc(int value)
frankvnk 0:630b4da97968 698 {
frankvnk 0:630b4da97968 699 if (value == '\n') { // new line
frankvnk 0:630b4da97968 700 char_x = 0;
frankvnk 0:630b4da97968 701 char_y = char_y + font[2];
frankvnk 0:630b4da97968 702 if (char_y >= height() - font[2]) {
frankvnk 0:630b4da97968 703 char_y = 0;
frankvnk 0:630b4da97968 704 }
frankvnk 0:630b4da97968 705 } else {
frankvnk 0:630b4da97968 706 character(char_x, char_y, value);
frankvnk 0:630b4da97968 707 }
frankvnk 0:630b4da97968 708 return value;
frankvnk 0:630b4da97968 709 }
frankvnk 0:630b4da97968 710
frankvnk 0:630b4da97968 711 void SPI_TFT::character(int x, int y, int c)
frankvnk 0:630b4da97968 712 {
frankvnk 0:630b4da97968 713 unsigned int hor,vert,offset,bpl,j,i,b;
frankvnk 0:630b4da97968 714 unsigned char* bitmap_char;
frankvnk 0:630b4da97968 715 unsigned char z,w;
frankvnk 0:630b4da97968 716
frankvnk 0:630b4da97968 717 if ((c < 31) || (c > 127)) return; // test char range
frankvnk 0:630b4da97968 718
frankvnk 0:630b4da97968 719 // read font parameter from start of array
frankvnk 0:630b4da97968 720 offset = font[0]; // bytes / char
frankvnk 0:630b4da97968 721 hor = font[1]; // get hor size of font
frankvnk 0:630b4da97968 722 vert = font[2]; // get vert size of font
frankvnk 0:630b4da97968 723 bpl = font[3]; // bytes per line
frankvnk 0:630b4da97968 724
frankvnk 0:630b4da97968 725 if (char_x + hor > width()) {
frankvnk 0:630b4da97968 726 char_x = 0;
frankvnk 0:630b4da97968 727 char_y = char_y + vert;
frankvnk 0:630b4da97968 728 if (char_y >= height() - font[2]) {
frankvnk 0:630b4da97968 729 char_y = 0;
frankvnk 0:630b4da97968 730 }
frankvnk 0:630b4da97968 731 }
frankvnk 0:630b4da97968 732 mod_orientation();
frankvnk 0:630b4da97968 733
frankvnk 0:630b4da97968 734 bitmap_char = &font[((c -32) * offset) + 4]; // start of char bitmap
frankvnk 0:630b4da97968 735 w = bitmap_char[0]; // width of actual char
frankvnk 2:45a3c5aa99c3 736 window(char_x, char_y,hor,vert); // char box
frankvnk 0:630b4da97968 737 wr_cmd(0x22);
frankvnk 0:630b4da97968 738 _cs = 0;
frankvnk 0:630b4da97968 739 wr_dat_start();
frankvnk 3:a016fe71ed72 740 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 741 _spi.format(16,3);
frankvnk 3:a016fe71ed72 742 #endif
frankvnk 0:630b4da97968 743 for (j=0; j<vert; j++) { // vert line
frankvnk 2:45a3c5aa99c3 744 for (i=0; i<hor; i++) { // horz line
frankvnk 0:630b4da97968 745 z = bitmap_char[bpl * i + ((j & 0xF8) >> 3)+1];
frankvnk 0:630b4da97968 746 b = 1 << (j & 0x07);
frankvnk 0:630b4da97968 747 if (( z & b ) == 0x00) {
frankvnk 0:630b4da97968 748 #ifndef NO_FLASH_BUFFER
frankvnk 0:630b4da97968 749 if (backgroundimage==false)
frankvnk 3:a016fe71ed72 750 {
frankvnk 0:630b4da97968 751 #endif
frankvnk 3:a016fe71ed72 752 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 753 _spi.fastWrite(_background);
frankvnk 3:a016fe71ed72 754 #else
frankvnk 3:a016fe71ed72 755 _spi.fastWrite(_background >> 8);
frankvnk 3:a016fe71ed72 756 _spi.fastWrite(_background & 0xFF);
frankvnk 3:a016fe71ed72 757 #endif
frankvnk 0:630b4da97968 758 #ifndef NO_FLASH_BUFFER
frankvnk 3:a016fe71ed72 759 }
frankvnk 0:630b4da97968 760 else
frankvnk 0:630b4da97968 761 {
frankvnk 0:630b4da97968 762 unsigned short *bitmap_ptr = (unsigned short *)sector_start_adress[ 25 ];
frankvnk 0:630b4da97968 763 int angle = (orientation - backgroundOrientation)%4; //Get the difference in orientation between background and current
frankvnk 0:630b4da97968 764 switch (angle) {
frankvnk 0:630b4da97968 765 case 0: //Same orientation
frankvnk 0:630b4da97968 766 bitmap_ptr += width() * (height()-(y+j+1))+x+i;
frankvnk 0:630b4da97968 767 break;
frankvnk 0:630b4da97968 768 case 1: //Rotated 1 (don't ask me which direction)
frankvnk 0:630b4da97968 769 bitmap_ptr += height() * (width()-(x+i+1))+height()-(y+j + 1);
frankvnk 0:630b4da97968 770 break;
frankvnk 0:630b4da97968 771 case 2: //Upside down
frankvnk 0:630b4da97968 772 bitmap_ptr += width() * (y+j)+width() - (x+i + 1);
frankvnk 0:630b4da97968 773 break;
frankvnk 0:630b4da97968 774 case 3: //Rotated 3
frankvnk 0:630b4da97968 775 bitmap_ptr += height() * (x+i)+y+j;
frankvnk 0:630b4da97968 776 break;
frankvnk 0:630b4da97968 777 default:
frankvnk 0:630b4da97968 778 break;
frankvnk 0:630b4da97968 779 }
frankvnk 0:630b4da97968 780
frankvnk 3:a016fe71ed72 781 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 782 _spi.fastWrite(*bitmap_ptr);
frankvnk 3:a016fe71ed72 783 #else
frankvnk 3:a016fe71ed72 784 _spi.fastWrite((*bitmap_ptr) >> 8);
frankvnk 3:a016fe71ed72 785 _spi.fastWrite((*bitmap_ptr) & 0xFF);
frankvnk 3:a016fe71ed72 786 #endif
frankvnk 0:630b4da97968 787 }
frankvnk 0:630b4da97968 788 #endif
frankvnk 0:630b4da97968 789 } else {
frankvnk 3:a016fe71ed72 790 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 791 _spi.fastWrite(_foreground);
frankvnk 3:a016fe71ed72 792 #else
frankvnk 3:a016fe71ed72 793 _spi.fastWrite(_foreground >> 8);
frankvnk 3:a016fe71ed72 794 _spi.fastWrite(_foreground & 0xFF);
frankvnk 3:a016fe71ed72 795 #endif
frankvnk 0:630b4da97968 796 }
frankvnk 0:630b4da97968 797 }
frankvnk 0:630b4da97968 798 }
frankvnk 0:630b4da97968 799 _spi.clearRX();
frankvnk 3:a016fe71ed72 800 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 801 _spi.format(8,3);
frankvnk 3:a016fe71ed72 802 #endif
frankvnk 0:630b4da97968 803 _cs = 1;
frankvnk 0:630b4da97968 804 if ((w + 2) < hor) { // x offset to next char
frankvnk 0:630b4da97968 805 char_x += w + 2;
frankvnk 0:630b4da97968 806 } else char_x += hor;
frankvnk 0:630b4da97968 807 }
frankvnk 0:630b4da97968 808
frankvnk 0:630b4da97968 809 void SPI_TFT::set_font(unsigned char* f)
frankvnk 0:630b4da97968 810 {
frankvnk 0:630b4da97968 811 font = f;
frankvnk 0:630b4da97968 812 }
frankvnk 0:630b4da97968 813
frankvnk 0:630b4da97968 814
frankvnk 0:630b4da97968 815 void SPI_TFT::Bitmap(unsigned int x, unsigned int y, unsigned int w, unsigned int h,unsigned char *bitmap)
frankvnk 0:630b4da97968 816 {
frankvnk 0:630b4da97968 817 unsigned int i,j;
frankvnk 0:630b4da97968 818 unsigned short *bitmap_ptr = (unsigned short *)bitmap;
frankvnk 0:630b4da97968 819 mod_orientation();
frankvnk 0:630b4da97968 820 window(x, y, w, h);
frankvnk 0:630b4da97968 821 wr_cmd(0x22);
frankvnk 0:630b4da97968 822 _cs = 0;
frankvnk 0:630b4da97968 823 wr_dat_start();
frankvnk 3:a016fe71ed72 824 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 825 _spi.format(16,3);
frankvnk 3:a016fe71ed72 826 #endif
frankvnk 0:630b4da97968 827 bitmap_ptr += ((h - 1)*w);
frankvnk 0:630b4da97968 828 for (j = 0; j < h; j++) { //Lines
frankvnk 0:630b4da97968 829 for (i = 0; i < w; i++) { // copy pixel data to TFT
frankvnk 3:a016fe71ed72 830 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 831 _spi.fastWrite(*bitmap_ptr); // one line
frankvnk 3:a016fe71ed72 832 #else
frankvnk 3:a016fe71ed72 833 _spi.fastWrite((*bitmap_ptr) >> 8);
frankvnk 3:a016fe71ed72 834 _spi.fastWrite((*bitmap_ptr) & 0xFF);
frankvnk 3:a016fe71ed72 835 #endif
frankvnk 0:630b4da97968 836 bitmap_ptr++;
frankvnk 0:630b4da97968 837 }
frankvnk 0:630b4da97968 838 bitmap_ptr -= 2*w;
frankvnk 0:630b4da97968 839 }
frankvnk 0:630b4da97968 840 _spi.clearRX();
frankvnk 3:a016fe71ed72 841 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 842 _spi.format(8,3);
frankvnk 3:a016fe71ed72 843 #endif
frankvnk 0:630b4da97968 844 _cs = 1;
frankvnk 0:630b4da97968 845 }
frankvnk 0:630b4da97968 846
frankvnk 0:630b4da97968 847 int SPI_TFT::Bitmap(unsigned int x, unsigned int y, const char *Name_BMP)
frankvnk 0:630b4da97968 848 {
frankvnk 0:630b4da97968 849 #define RGB565CONVERT(red, green, blue) (uint16_t)( (( red >> 3 ) << 11 ) | (( green >> 2 ) << 5 ) | ( blue >> 3 ))
frankvnk 0:630b4da97968 850 mod_orientation();
frankvnk 0:630b4da97968 851
frankvnk 0:630b4da97968 852 bitmapData bmp = getBitmapData(Name_BMP);
frankvnk 0:630b4da97968 853 if (bmp.return_code != 1)
frankvnk 0:630b4da97968 854 return bmp.return_code;
frankvnk 0:630b4da97968 855
frankvnk 0:630b4da97968 856
frankvnk 0:630b4da97968 857 unsigned char *line = (unsigned char *) malloc (bmp.bits/8 * bmp.width); // we need a buffer for a line
frankvnk 0:630b4da97968 858 unsigned short *line_short = (unsigned short*) (line); // Same one, addressed as short
frankvnk 0:630b4da97968 859
frankvnk 0:630b4da97968 860
frankvnk 0:630b4da97968 861 if ((bmp.height > height()+y) || (bmp.width > width()+x))
frankvnk 0:630b4da97968 862 return -3; //Size mismatch
frankvnk 0:630b4da97968 863
frankvnk 0:630b4da97968 864 if (line == NULL)
frankvnk 0:630b4da97968 865 return(-4); // error no memory
frankvnk 0:630b4da97968 866
frankvnk 0:630b4da97968 867
frankvnk 0:630b4da97968 868 for (int j = bmp.height-1; j >= 0; j--) { //Lines bottom up
frankvnk 0:630b4da97968 869 int off = j * (bmp.width * bmp.bits/8 + bmp.pad) + bmp.start_data; // start of line
frankvnk 0:630b4da97968 870 fseek(bmp.file, off ,SEEK_SET);
frankvnk 0:630b4da97968 871 fread(line,1,bmp.width * bmp.bits/8,bmp.file); // read a line - slow !
frankvnk 0:630b4da97968 872
frankvnk 0:630b4da97968 873 //If 24 bit format, convert to 565
frankvnk 0:630b4da97968 874 if (bmp.bits == 24) {
frankvnk 0:630b4da97968 875 for (int i = 0; i<bmp.width; i++) {
frankvnk 0:630b4da97968 876 line_short[i] = RGB565CONVERT(line[3*i+2], line[3*i+1], line[3*i]);
frankvnk 0:630b4da97968 877 }
frankvnk 0:630b4da97968 878 }
frankvnk 0:630b4da97968 879
frankvnk 0:630b4da97968 880 window(x, y+bmp.height - 1 - j,bmp.width ,1);
frankvnk 0:630b4da97968 881 wr_cmd(0x22);
frankvnk 0:630b4da97968 882
frankvnk 0:630b4da97968 883 _cs = 0;
frankvnk 0:630b4da97968 884 wr_dat_start();
frankvnk 3:a016fe71ed72 885 #ifndef SPI_8BIT
frankvnk 3:a016fe71ed72 886 _spi.format(16,3);
frankvnk 3:a016fe71ed72 887 #endif
frankvnk 0:630b4da97968 888 _spi.setFormat();
frankvnk 0:630b4da97968 889
frankvnk 0:630b4da97968 890 for (int i = 0; i < bmp.width; i++) { // copy pixel data to TFT
frankvnk 3:a016fe71ed72 891 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 892 _spi.fastWrite(line_short[i]); // one line
frankvnk 3:a016fe71ed72 893 #else
frankvnk 3:a016fe71ed72 894 _spi.fastWrite(line_short[i] >> 8);
frankvnk 3:a016fe71ed72 895 _spi.fastWrite(line_short[i] & 0xFF);
frankvnk 3:a016fe71ed72 896 #endif
frankvnk 0:630b4da97968 897 }
frankvnk 0:630b4da97968 898
frankvnk 0:630b4da97968 899 _spi.clearRX();
frankvnk 3:a016fe71ed72 900 #ifndef SPI_8BIT
frankvnk 0:630b4da97968 901 _spi.format(8,3);
frankvnk 3:a016fe71ed72 902 #endif
frankvnk 0:630b4da97968 903 _cs = 1;
frankvnk 0:630b4da97968 904
frankvnk 0:630b4da97968 905 }
frankvnk 0:630b4da97968 906
frankvnk 0:630b4da97968 907
frankvnk 0:630b4da97968 908 free (line);
frankvnk 0:630b4da97968 909 fclose(bmp.file);
frankvnk 0:630b4da97968 910 WindowMax();
frankvnk 0:630b4da97968 911
frankvnk 0:630b4da97968 912 return(1);
frankvnk 0:630b4da97968 913 }
frankvnk 0:630b4da97968 914
frankvnk 0:630b4da97968 915 #ifndef NO_FLASH_BUFFER
frankvnk 0:630b4da97968 916
frankvnk 0:630b4da97968 917 int SPI_TFT::fileToFlash(const char *Name_BMP)
frankvnk 0:630b4da97968 918 {
frankvnk 0:630b4da97968 919 #define RGB565CONVERT(red, green, blue) (uint16_t)( (( red >> 3 ) << 11 ) | (( green >> 2 ) << 5 ) | ( blue >> 3 ))
frankvnk 0:630b4da97968 920
frankvnk 0:630b4da97968 921 mod_orientation();
frankvnk 0:630b4da97968 922
frankvnk 0:630b4da97968 923 bitmapData bmp = getBitmapData(Name_BMP);
frankvnk 0:630b4da97968 924 if (bmp.return_code != 1)
frankvnk 0:630b4da97968 925 return bmp.return_code;
frankvnk 0:630b4da97968 926
frankvnk 0:630b4da97968 927
frankvnk 0:630b4da97968 928 unsigned char *line = (unsigned char *) malloc (bmp.bits/8 * bmp.width); // we need a buffer for a line
frankvnk 0:630b4da97968 929 unsigned short *line_short = (unsigned short*) (line); // Same one, addressed as short
frankvnk 0:630b4da97968 930
frankvnk 0:630b4da97968 931 unsigned short *flashSector = (unsigned short *) malloc (256); //And one to send to flash
frankvnk 0:630b4da97968 932
frankvnk 0:630b4da97968 933 if ((bmp.height != height()) || (bmp.width != width()))
frankvnk 0:630b4da97968 934 return -3; //Size mismatch
frankvnk 0:630b4da97968 935
frankvnk 0:630b4da97968 936 if ((line == NULL) || (flashSector == NULL))
frankvnk 0:630b4da97968 937 return(-4); // error no memory
frankvnk 0:630b4da97968 938
frankvnk 0:630b4da97968 939
frankvnk 0:630b4da97968 940 int flashPointer = 0, flashWrites = 0;
frankvnk 0:630b4da97968 941
frankvnk 0:630b4da97968 942 //Erase Flash that will be used:
frankvnk 0:630b4da97968 943 if ( iap.blank_check( 25, 29 ) == SECTOR_NOT_BLANK ) {
frankvnk 0:630b4da97968 944 iap.prepare( 25, 29 );
frankvnk 0:630b4da97968 945 iap.erase( 25, 29 );
frankvnk 0:630b4da97968 946 }
frankvnk 0:630b4da97968 947
frankvnk 0:630b4da97968 948 for (int j = 0; j < bmp.height; j++) { //Lines bottom up
frankvnk 0:630b4da97968 949 int off = j * (bmp.width * bmp.bits/8 + bmp.pad) + bmp.start_data; // start of line
frankvnk 0:630b4da97968 950 fseek(bmp.file, off ,SEEK_SET);
frankvnk 0:630b4da97968 951 fread(line,1,bmp.width * bmp.bits/8,bmp.file); // read a line - slow !
frankvnk 0:630b4da97968 952
frankvnk 0:630b4da97968 953 //If 24 bit format, do some processing
frankvnk 0:630b4da97968 954 if (bmp.bits == 24) {
frankvnk 0:630b4da97968 955 for (int i = 0; i<bmp.width; i++) {
frankvnk 0:630b4da97968 956 line_short[i] = RGB565CONVERT(line[3*i+2], line[3*i+1], line[3*i]);
frankvnk 0:630b4da97968 957 }
frankvnk 0:630b4da97968 958 }
frankvnk 0:630b4da97968 959
frankvnk 0:630b4da97968 960
frankvnk 0:630b4da97968 961 for (int i = 0; i < bmp.width; i++) { // copy pixel data to TFT
frankvnk 0:630b4da97968 962 flashSector[flashPointer] = line_short[i]; // one line
frankvnk 0:630b4da97968 963 flashPointer++;
frankvnk 0:630b4da97968 964
frankvnk 0:630b4da97968 965 //If flashpointer reached the end, write to flash
frankvnk 0:630b4da97968 966 if (flashPointer == 128) {
frankvnk 0:630b4da97968 967 iap.prepare( 25, 29 );
frankvnk 0:630b4da97968 968 iap.write((char *)flashSector, sector_start_adress[ 25 ] + 256 * flashWrites, 256);
frankvnk 0:630b4da97968 969 flashPointer = 0;
frankvnk 0:630b4da97968 970 flashWrites++;
frankvnk 0:630b4da97968 971 if (flashWrites == 1000)
frankvnk 0:630b4da97968 972 error("Too many flashwrites");
frankvnk 0:630b4da97968 973 }
frankvnk 0:630b4da97968 974 }
frankvnk 0:630b4da97968 975 }
frankvnk 0:630b4da97968 976 //write remaining data
frankvnk 0:630b4da97968 977 if (flashPointer!=0) {
frankvnk 0:630b4da97968 978 iap.prepare( 25, 29 );
frankvnk 0:630b4da97968 979 iap.write((char*)flashSector, sector_start_adress[ 25 ] + 256 * flashWrites, 256);
frankvnk 0:630b4da97968 980 flashPointer = 0;
frankvnk 0:630b4da97968 981 flashWrites++;
frankvnk 0:630b4da97968 982 if (flashWrites == 1000)
frankvnk 0:630b4da97968 983 error("Too many flashwrites");
frankvnk 0:630b4da97968 984 }
frankvnk 0:630b4da97968 985
frankvnk 0:630b4da97968 986
frankvnk 0:630b4da97968 987
frankvnk 0:630b4da97968 988 free (line);
frankvnk 0:630b4da97968 989 fclose(bmp.file);
frankvnk 0:630b4da97968 990 backgroundImage(true);
frankvnk 0:630b4da97968 991 backgroundOrientation = orientation;
frankvnk 0:630b4da97968 992 return(1);
frankvnk 0:630b4da97968 993 }
frankvnk 0:630b4da97968 994
frankvnk 0:630b4da97968 995 void SPI_TFT::backgroundImage( bool active) {
frankvnk 0:630b4da97968 996 backgroundimage = active;
frankvnk 0:630b4da97968 997 }
frankvnk 0:630b4da97968 998 #endif
frankvnk 0:630b4da97968 999
frankvnk 0:630b4da97968 1000
frankvnk 0:630b4da97968 1001 SPI_TFT::bitmapData SPI_TFT::getBitmapData(const char *Name_BMP){
frankvnk 0:630b4da97968 1002 #define OffsetPixelWidth 18
frankvnk 0:630b4da97968 1003 #define OffsetPixelHeigh 22
frankvnk 0:630b4da97968 1004 #define OffsetFileSize 34
frankvnk 0:630b4da97968 1005 #define OffsetPixData 10
frankvnk 0:630b4da97968 1006 #define OffsetBPP 28
frankvnk 0:630b4da97968 1007
frankvnk 0:630b4da97968 1008
frankvnk 0:630b4da97968 1009 bitmapData retval;
frankvnk 0:630b4da97968 1010 retval.return_code = 1;
frankvnk 0:630b4da97968 1011 unsigned char BMP_Header[54];
frankvnk 0:630b4da97968 1012
frankvnk 0:630b4da97968 1013 retval.file = fopen(Name_BMP, "rb"); // open the bmp file
frankvnk 0:630b4da97968 1014 if (!retval.file) {
frankvnk 0:630b4da97968 1015 retval.return_code = 0;
frankvnk 0:630b4da97968 1016 return(retval); // error file not found !
frankvnk 0:630b4da97968 1017 }
frankvnk 0:630b4da97968 1018
frankvnk 0:630b4da97968 1019 fread(&BMP_Header[0],1,54,retval.file); // get the BMP Header
frankvnk 0:630b4da97968 1020
frankvnk 0:630b4da97968 1021 if (BMP_Header[0] != 0x42 || BMP_Header[1] != 0x4D) { // check magic byte
frankvnk 0:630b4da97968 1022 fclose(retval.file);
frankvnk 0:630b4da97968 1023 retval.return_code = -1;
frankvnk 0:630b4da97968 1024 return(retval); // error not a BMP file
frankvnk 0:630b4da97968 1025 }
frankvnk 0:630b4da97968 1026
frankvnk 0:630b4da97968 1027 int BPP_t = BMP_Header[OffsetBPP] + (BMP_Header[OffsetBPP + 1] << 8);
frankvnk 0:630b4da97968 1028 if (BPP_t == 0x0010)
frankvnk 0:630b4da97968 1029 retval.bits = 16;
frankvnk 0:630b4da97968 1030 else if (BPP_t == 0x0018)
frankvnk 0:630b4da97968 1031 retval.bits = 24;
frankvnk 0:630b4da97968 1032 else {
frankvnk 0:630b4da97968 1033 fclose(retval.file);
frankvnk 0:630b4da97968 1034 retval.return_code = -2;
frankvnk 0:630b4da97968 1035 return(retval); // error no 16/24 bit BMP
frankvnk 0:630b4da97968 1036 }
frankvnk 0:630b4da97968 1037
frankvnk 0:630b4da97968 1038 retval.height = BMP_Header[OffsetPixelHeigh] + (BMP_Header[OffsetPixelHeigh + 1] << 8) + (BMP_Header[OffsetPixelHeigh + 2] << 16) + (BMP_Header[OffsetPixelHeigh + 3] << 24);
frankvnk 0:630b4da97968 1039 retval.width = BMP_Header[OffsetPixelWidth] + (BMP_Header[OffsetPixelWidth + 1] << 8) + (BMP_Header[OffsetPixelWidth + 2] << 16) + (BMP_Header[OffsetPixelWidth + 3] << 24);
frankvnk 0:630b4da97968 1040 if (retval.height > height()|| retval.width > width()) {
frankvnk 0:630b4da97968 1041 fclose(retval.file);
frankvnk 0:630b4da97968 1042 retval.return_code = -3;
frankvnk 0:630b4da97968 1043 return(retval); // too big
frankvnk 0:630b4da97968 1044 }
frankvnk 0:630b4da97968 1045
frankvnk 0:630b4da97968 1046
frankvnk 0:630b4da97968 1047 retval.start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24);
frankvnk 0:630b4da97968 1048
frankvnk 0:630b4da97968 1049 // the bmp lines are padded to multiple of 4 bytes
frankvnk 0:630b4da97968 1050 retval.pad = -1;
frankvnk 0:630b4da97968 1051 do {
frankvnk 0:630b4da97968 1052 retval.pad ++;
frankvnk 0:630b4da97968 1053 } while ((retval.width * retval.bits/8 + retval.pad)%4 != 0);
frankvnk 0:630b4da97968 1054 return retval;
frankvnk 0:630b4da97968 1055
frankvnk 3:a016fe71ed72 1056 }