LPC1768 Mini-DK EasyWeb application with SPI TFT output. Started from EasyWebCR and modified for DM9161 PHY support.

Dependencies:   Mini-DK mbed

This is a very basic EasyWeb application.

No error checking is performed during initialisation.

Information

If the webpage is not reachable or the 'Webserver running' message does not appear, press the reset button on the Mini-DK and wait until the message 'Webserver running' appears.
This happens sometimes when powering up the Mini-DK because the DM9161 reset pin is NOT controlled by the LPC1768, it is directly connected to the reset button.

IP adress/mask/gateway in tcpip.h : 192.168.0.200 / 255.255.255.0 / 192.168.0.1

MAC address in ethmac.h : 6-5-4-3-2-1

Committer:
frankvnk
Date:
Fri Dec 21 15:41:54 2012 +0000
Revision:
0:636056c0b5e1
First version - rewrite from EasyWebCR

Who changed what in which revision?

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