Library for Mini-DK board

Dependencies:   SPI_TFT_ILI9320

Dependents:   LPC1768_Mini-DK_EasyWeb_DM9161 LPC1768_Mini-DK LPC1768_Mini-DK

Fork of Mini-DK by Frank Vannieuwkerke

Mini-DK board overview (Micro SD connector is at the bottom side)

One serial interface , uses CP2102 (USB to RS232 interface, support ISP download )

RJ45-10/100M Ethernet network interface (Ethernet PHY: DM9161)

2.8 inch TFT color LCD interface (SPI interface or 16Bit parallel interface)

Touch panel controller XPT2046 (ADS7843 compatible)

USB 2.0 interface, USB host and USB Device interface.

TF SD / MMC card (SPI) interface.

Two user buttons, One Reset button and ISP button , One INT0 button, two user-programmable LED lights

Serial ISP download, Standard 20-pin JTAG download simulation debugging interface.

Selection between external 5V power supply or USB 5V supply.

Board size: 95mm * 78mm

All IO available on extension connectors

/media/uploads/frankvnk/mini-dk_top.jpg

04/01/13

Erik Olieman (http://mbed.org/users/Sissors/) joined the code development for the Mini-DK board.

Thanks to his input, we were able to obtain a tremendous speed gain, remove warnings, ...

An overview of all modifications is stored in modifs.h

The old page (http://mbed.org/users/frankvnk/code/LPC1768_Mini-DK/) contains the demo code.

IMPORTANT : Due to a change in the mbed libraries (Stream()), we cannot use the printf instruction - we need to use <SPI_TFT>.printf (example - see main.cpp in http://mbed.org/users/frankvnk/code/LPC1768_Mini-DK/)

WARNING: filetoflash (SD to CPU flash)

The SPI_TFT library contains an option to copy an image from the SD card to the CPU flash memory. This 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 uncommenting the #define mentioned below in Mini_DK.h:

#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).

14/01/13

A newer version of the Mini-DK has been released by the manufacturer: Mini-DK2. They replaced the DM9161 PHY with a LAN8720A PHY and better buttons are fitted on the board. All other hardware remains the same. Code for this PHY is available from the NXP MCU SW application team. This allows us to use the mbed 'EthernetInterface' library with little modifications. Further info - see http://mbed.org/forum/mbed/topic/3684/?page=1#comment-18473.

Notes:

The code in 'lpc_phy_lan8720.c' uses 'msDelay' - needs to be replaced with 'osDelay'.

A custom MAC address can be defined using following code:

extern "C" void mbed_mac_address(char * mac) {
 
// define your own MAC Address
  mac[0] = 0x00;  
  mac[1] = 0x01;  
  mac[2] = 0x02;  
  mac[3] = 0x03;  
  mac[4] = 0x04;  
  mac[5] = 0x05;           
  
};
Committer:
Sissors
Date:
Tue Jan 08 17:39:50 2013 +0000
Revision:
16:be1a10246234
Parent:
14:0921b88fc6bc
Child:
17:66c4e84d8571
Added option to define NO_FLASH_BUFFER to disable flash buffer

Who changed what in which revision?

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