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:
Sun Jan 06 12:32:20 2013 +0000
Revision:
10:d43a2f5e661c
Parent:
9:742d15898b2b
Bug fix in bitmap

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