Modified version of the DmTftLibrary, optimized for the LPC4088 Experiment Base Board

Dependents:   lpc4088_ebb_dm_calc lpc4088_ebb_dm_bubbles

Fork of DmTftLibrary by Display Module

Committer:
embeddedartists
Date:
Thu Sep 11 14:28:32 2014 +0000
Revision:
12:eb97ccfe7c3f
Parent:
7:6cd8c36cbdb3
Tweaked to get better/stable touch events

Who changed what in which revision?

UserRevisionLine numberNew contents of line
displaymodule 0:d6ff5fa503e8 1 /**********************************************************************************************
displaymodule 0:d6ff5fa503e8 2 Copyright (c) 2014 DisplayModule. All rights reserved.
displaymodule 0:d6ff5fa503e8 3
displaymodule 0:d6ff5fa503e8 4 Redistribution and use of this source code, part of this source code or any compiled binary
displaymodule 0:d6ff5fa503e8 5 based on this source code is permitted as long as the above copyright notice and following
displaymodule 0:d6ff5fa503e8 6 disclaimer is retained.
displaymodule 0:d6ff5fa503e8 7
displaymodule 0:d6ff5fa503e8 8 DISCLAIMER:
displaymodule 0:d6ff5fa503e8 9 THIS SOFTWARE IS SUPPLIED "AS IS" WITHOUT ANY WARRANTIES AND SUPPORT. DISPLAYMODULE ASSUMES
displaymodule 0:d6ff5fa503e8 10 NO RESPONSIBILITY OR LIABILITY FOR THE USE OF THE SOFTWARE.
displaymodule 0:d6ff5fa503e8 11 ********************************************************************************************/
displaymodule 0:d6ff5fa503e8 12
displaymodule 0:d6ff5fa503e8 13 #include "DmTftSsd2119.h"
displaymodule 0:d6ff5fa503e8 14 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 15 DmTftSsd2119::DmTftSsd2119(uint8_t cs, uint8_t dc)
displaymodule 0:d6ff5fa503e8 16 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 0:d6ff5fa503e8 17 DmTftSsd2119::DmTftSsd2119(uint8_t cs, uint8_t dc, uint8_t miso, uint8_t mosi, uint8_t clk)
displaymodule 0:d6ff5fa503e8 18 #endif
displaymodule 0:d6ff5fa503e8 19 : DmTftBase(320, 240){ // Display is in landscape mode by default width: 320, height: 240
displaymodule 0:d6ff5fa503e8 20 _cs = cs;
displaymodule 0:d6ff5fa503e8 21 _dc = dc;
displaymodule 0:d6ff5fa503e8 22 #if defined (DM_TOOLCHAIN_MBED)
displaymodule 0:d6ff5fa503e8 23 _miso = miso;
displaymodule 0:d6ff5fa503e8 24 _mosi = mosi;
displaymodule 0:d6ff5fa503e8 25 _clk = clk;
displaymodule 0:d6ff5fa503e8 26 #endif
displaymodule 0:d6ff5fa503e8 27 }
displaymodule 0:d6ff5fa503e8 28
displaymodule 0:d6ff5fa503e8 29 DmTftSsd2119::~DmTftSsd2119() {
displaymodule 0:d6ff5fa503e8 30 #if defined (DM_TOOLCHAIN_MBED)
displaymodule 0:d6ff5fa503e8 31 delete _pinCS;
displaymodule 0:d6ff5fa503e8 32 delete _pinDC;
displaymodule 0:d6ff5fa503e8 33 delete _spi;
displaymodule 0:d6ff5fa503e8 34
displaymodule 0:d6ff5fa503e8 35 _pinCS = NULL;
displaymodule 0:d6ff5fa503e8 36 _pinDC = NULL;
displaymodule 0:d6ff5fa503e8 37 _spi = NULL;
displaymodule 0:d6ff5fa503e8 38 #endif
displaymodule 0:d6ff5fa503e8 39 }
displaymodule 0:d6ff5fa503e8 40
displaymodule 0:d6ff5fa503e8 41 void DmTftSsd2119::writeBus(uint8_t data) {
displaymodule 0:d6ff5fa503e8 42 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 43 SPCR = _spiSettings; // SPI Control Register
displaymodule 0:d6ff5fa503e8 44 SPDR = data; // SPI Data Register
displaymodule 0:d6ff5fa503e8 45 while(!(SPSR & _BV(SPIF))); // SPI Status Register Wait for transmission to finish
displaymodule 0:d6ff5fa503e8 46 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 0:d6ff5fa503e8 47 _spi->write(data);
displaymodule 0:d6ff5fa503e8 48 #endif
displaymodule 0:d6ff5fa503e8 49 }
displaymodule 0:d6ff5fa503e8 50
displaymodule 0:d6ff5fa503e8 51 void DmTftSsd2119::sendCommand(uint8_t index) {
displaymodule 0:d6ff5fa503e8 52 cbi(_pinDC, _bitmaskDC);
displaymodule 0:d6ff5fa503e8 53
displaymodule 7:6cd8c36cbdb3 54 writeBus(0x00);
displaymodule 0:d6ff5fa503e8 55 writeBus(index);
displaymodule 0:d6ff5fa503e8 56 }
displaymodule 0:d6ff5fa503e8 57
displaymodule 0:d6ff5fa503e8 58 void DmTftSsd2119::send8BitData(uint8_t data) {
displaymodule 0:d6ff5fa503e8 59 sbi(_pinDC, _bitmaskDC);
displaymodule 0:d6ff5fa503e8 60 writeBus(data);
displaymodule 0:d6ff5fa503e8 61 }
displaymodule 0:d6ff5fa503e8 62
displaymodule 0:d6ff5fa503e8 63 void DmTftSsd2119::sendData(uint16_t data) {
displaymodule 0:d6ff5fa503e8 64 uint8_t dh = data>>8;
displaymodule 0:d6ff5fa503e8 65 uint8_t dl = data&0xff;
displaymodule 0:d6ff5fa503e8 66
displaymodule 0:d6ff5fa503e8 67 sbi(_pinDC, _bitmaskDC);
displaymodule 0:d6ff5fa503e8 68 writeBus(dh);
displaymodule 0:d6ff5fa503e8 69 writeBus(dl);
displaymodule 0:d6ff5fa503e8 70 }
displaymodule 0:d6ff5fa503e8 71
displaymodule 0:d6ff5fa503e8 72 void DmTftSsd2119::setAddress(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
displaymodule 0:d6ff5fa503e8 73 // Set Start and End Vertical RAM address position
displaymodule 0:d6ff5fa503e8 74 uint16_t verticalStartEndAddress;
displaymodule 0:d6ff5fa503e8 75 verticalStartEndAddress = y0&0xff; // Start vertical RAM address
displaymodule 0:d6ff5fa503e8 76 verticalStartEndAddress += (y1&0xff)<<8; // End vertical RAM address
displaymodule 0:d6ff5fa503e8 77
displaymodule 0:d6ff5fa503e8 78 sendCommand(0x44);
displaymodule 0:d6ff5fa503e8 79 sendData(verticalStartEndAddress);
displaymodule 0:d6ff5fa503e8 80
displaymodule 0:d6ff5fa503e8 81 sendCommand(0x45); // Set Start Horizontal RAM address position
displaymodule 0:d6ff5fa503e8 82 sendData(x0);
displaymodule 0:d6ff5fa503e8 83
displaymodule 0:d6ff5fa503e8 84 sendCommand(0x46); // Set End Horizontal RAM address position
displaymodule 0:d6ff5fa503e8 85 sendData(x1);
displaymodule 0:d6ff5fa503e8 86
displaymodule 0:d6ff5fa503e8 87 // Set start position
displaymodule 0:d6ff5fa503e8 88 sendCommand(0x4e); // Set Column, RAM address X (max 320)
displaymodule 0:d6ff5fa503e8 89 sendData(x0);
displaymodule 0:d6ff5fa503e8 90 sendCommand(0x4f); // Set Page, RAM address Y (max 240)
displaymodule 0:d6ff5fa503e8 91 sendData(y0);
displaymodule 0:d6ff5fa503e8 92 sendCommand(0x22); // RAM data write
displaymodule 0:d6ff5fa503e8 93 }
displaymodule 0:d6ff5fa503e8 94
displaymodule 0:d6ff5fa503e8 95 // Separate setPixel, because setAddress is to many instructions
displaymodule 0:d6ff5fa503e8 96 void DmTftSsd2119::setPixel(uint16_t x, uint16_t y, uint16_t color) {
displaymodule 0:d6ff5fa503e8 97 cbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 98
displaymodule 0:d6ff5fa503e8 99 // setAddress(x, y, x, y);
displaymodule 0:d6ff5fa503e8 100 sendCommand(0x4e); // Set Column, RAM address X (max 320)
displaymodule 0:d6ff5fa503e8 101 sendData(x);
displaymodule 0:d6ff5fa503e8 102
displaymodule 0:d6ff5fa503e8 103 sendCommand(0x4f); // Set Page, RAM address Y (max 240)
displaymodule 0:d6ff5fa503e8 104 sendData(y);
displaymodule 0:d6ff5fa503e8 105
displaymodule 0:d6ff5fa503e8 106 sendCommand(0x22);
displaymodule 0:d6ff5fa503e8 107 sendData(color);
displaymodule 0:d6ff5fa503e8 108
displaymodule 0:d6ff5fa503e8 109 sbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 110 }
displaymodule 0:d6ff5fa503e8 111
displaymodule 0:d6ff5fa503e8 112 void DmTftSsd2119::init(void) {
displaymodule 0:d6ff5fa503e8 113 setTextColor(BLACK, WHITE);
displaymodule 0:d6ff5fa503e8 114 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 115 _pinCS = portOutputRegister(digitalPinToPort(_cs));
displaymodule 0:d6ff5fa503e8 116 _bitmaskCS = digitalPinToBitMask(_cs);
displaymodule 0:d6ff5fa503e8 117 _pinDC = portOutputRegister(digitalPinToPort(_dc));
displaymodule 0:d6ff5fa503e8 118 _bitmaskDC = digitalPinToBitMask(_dc);
displaymodule 0:d6ff5fa503e8 119 pinMode(_cs,OUTPUT);
displaymodule 0:d6ff5fa503e8 120 pinMode(_dc,OUTPUT);
displaymodule 0:d6ff5fa503e8 121
displaymodule 0:d6ff5fa503e8 122 sbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 123
displaymodule 0:d6ff5fa503e8 124 SPI.begin();
displaymodule 0:d6ff5fa503e8 125 SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz (full! speed!)
displaymodule 0:d6ff5fa503e8 126 SPI.setBitOrder(MSBFIRST);
displaymodule 0:d6ff5fa503e8 127 SPI.setDataMode(SPI_MODE0);
displaymodule 0:d6ff5fa503e8 128 _spiSettings = SPCR;
displaymodule 0:d6ff5fa503e8 129 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 0:d6ff5fa503e8 130 _pinCS = new DigitalOut((PinName)_cs);
displaymodule 0:d6ff5fa503e8 131 _pinDC = new DigitalOut((PinName)_dc);
displaymodule 0:d6ff5fa503e8 132 sbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 133
displaymodule 0:d6ff5fa503e8 134 _spi = new SPI((PinName)_mosi, (PinName)_miso, (PinName)_clk);
displaymodule 0:d6ff5fa503e8 135 _spi->format(8,0);
displaymodule 0:d6ff5fa503e8 136 _spi->frequency(8000000); // Max SPI speed for display is 10 and for 17 for LPC15xx
displaymodule 0:d6ff5fa503e8 137 #endif
displaymodule 0:d6ff5fa503e8 138 cbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 139 delay(135); // This much delay needed??
displaymodule 0:d6ff5fa503e8 140
displaymodule 0:d6ff5fa503e8 141 delay(120);
displaymodule 0:d6ff5fa503e8 142
displaymodule 0:d6ff5fa503e8 143 sendCommand(0x28); // VCOM OTP
displaymodule 0:d6ff5fa503e8 144 sendData(0x0006);
displaymodule 0:d6ff5fa503e8 145
displaymodule 0:d6ff5fa503e8 146 sendCommand(0x00); // Start Oscillator
displaymodule 0:d6ff5fa503e8 147 sendData(0x0001);
displaymodule 0:d6ff5fa503e8 148
displaymodule 0:d6ff5fa503e8 149 sendCommand(0x10); // Set Sleep mode
displaymodule 0:d6ff5fa503e8 150 sendData(0x0000); // Sleep out
displaymodule 0:d6ff5fa503e8 151 delay(30);
displaymodule 0:d6ff5fa503e8 152
displaymodule 0:d6ff5fa503e8 153 sendCommand(0x11); // Entry Mode ,SET LCM interface Mode.
displaymodule 0:d6ff5fa503e8 154 sendData(0x6870); // SET 65K colors,MCU interface Mode.TypeB ,ID=11 AM=0 the address counter is updated in the horizontal direction.
displaymodule 0:d6ff5fa503e8 155
displaymodule 7:6cd8c36cbdb3 156 sendCommand(0x15); // Generic Interface Control. DOCLK,HSYNC,VSYNC,DE
displaymodule 0:d6ff5fa503e8 157 sendData(0x0000);
displaymodule 0:d6ff5fa503e8 158
displaymodule 0:d6ff5fa503e8 159 sendCommand(0x01); // Driver Output Control
displaymodule 0:d6ff5fa503e8 160 sendData(0x72EF); // Set REV,GD,BGR,SM,RL,TB
displaymodule 0:d6ff5fa503e8 161
displaymodule 0:d6ff5fa503e8 162 sendCommand(0x02); // LCD Driving Waveform Control,LCD
displaymodule 0:d6ff5fa503e8 163 sendData(0x0600);
displaymodule 0:d6ff5fa503e8 164
displaymodule 0:d6ff5fa503e8 165 sendCommand(0x08); // Set the scanning starting position of the gate driver.
displaymodule 0:d6ff5fa503e8 166 sendData(0x0000); // The valid range is from 1 to 240
displaymodule 0:d6ff5fa503e8 167
displaymodule 0:d6ff5fa503e8 168 // LCD POWER CONTROL
displaymodule 7:6cd8c36cbdb3 169 sendCommand(0x03); // Power Control 1, VGH,VGL
displaymodule 7:6cd8c36cbdb3 170 sendData(0x6A38); // Set dct=fline*4, VGH=2 x VCIX2 + VCI,VGL=-(VGH) + VCix2, DC=Fline × 8, AP=Medium to large
displaymodule 0:d6ff5fa503e8 171
displaymodule 0:d6ff5fa503e8 172 sendCommand(0X0B); // Frame Cycle Control.
displaymodule 0:d6ff5fa503e8 173 sendData(0x5308); // SET NO SDT=1 clock cycle (POR) ,Sets the equalizing period,
displaymodule 0:d6ff5fa503e8 174
displaymodule 7:6cd8c36cbdb3 175 sendCommand(0x0C); // Power Control 2 VCIX2
displaymodule 0:d6ff5fa503e8 176 sendData(0x0003); // Adjust VCIX2 output voltage=5.7V
displaymodule 0:d6ff5fa503e8 177
displaymodule 0:d6ff5fa503e8 178 sendCommand(0x0D); // Set amplitude magnification of VLCD63
displaymodule 0:d6ff5fa503e8 179 sendData(0x000A); // vlcd63=VREF(2.0V)* 2.335V
displaymodule 0:d6ff5fa503e8 180
displaymodule 7:6cd8c36cbdb3 181 sendCommand(0x0E); // SET VCOMG VDV .VCOM
displaymodule 0:d6ff5fa503e8 182 sendData(0x2B00); // SET VCOMG=1,VCOM=VLCD63* //2A
displaymodule 0:d6ff5fa503e8 183
displaymodule 0:d6ff5fa503e8 184 sendCommand(0X0F); // Gate Scan Position.
displaymodule 0:d6ff5fa503e8 185 sendData(0x0000); // The valid range is from 1 to 240.
displaymodule 0:d6ff5fa503e8 186
displaymodule 7:6cd8c36cbdb3 187 sendCommand(0x1E); // SET nOTP VCOMH ,VCOMH
displaymodule 0:d6ff5fa503e8 188 sendData(0x00B7); // SET nOTP=0, VCOMH=VLCD63* //B8
displaymodule 0:d6ff5fa503e8 189
displaymodule 0:d6ff5fa503e8 190 sendCommand(0x25); // Frame Frequency Control
displaymodule 0:d6ff5fa503e8 191 sendData(0x8000); // SET OSC 65Hz //0A-70hz
displaymodule 0:d6ff5fa503e8 192
displaymodule 0:d6ff5fa503e8 193 sendCommand(0x26); // Analog setting
displaymodule 0:d6ff5fa503e8 194 sendData(0x3800);
displaymodule 0:d6ff5fa503e8 195
displaymodule 0:d6ff5fa503e8 196 sendCommand(0x27); // Analog setting
displaymodule 0:d6ff5fa503e8 197 sendData(0x0078);
displaymodule 0:d6ff5fa503e8 198
displaymodule 7:6cd8c36cbdb3 199 // sendCommand(0x12); // Sleep mode
displaymodule 7:6cd8c36cbdb3 200 // sendData(0xD999);
displaymodule 0:d6ff5fa503e8 201
displaymodule 0:d6ff5fa503e8 202 // SET WINDOW
displaymodule 0:d6ff5fa503e8 203 sendCommand(0x4E); // Ram Address Set
displaymodule 0:d6ff5fa503e8 204 sendData(0x0000);
displaymodule 0:d6ff5fa503e8 205
displaymodule 0:d6ff5fa503e8 206 sendCommand(0x4F); // Ram Address Set
displaymodule 0:d6ff5fa503e8 207 sendData(0x0000);
displaymodule 0:d6ff5fa503e8 208
displaymodule 0:d6ff5fa503e8 209 // Gamma Control
displaymodule 0:d6ff5fa503e8 210 sendCommand(0x30);
displaymodule 0:d6ff5fa503e8 211 sendData(0x0000);//1
displaymodule 0:d6ff5fa503e8 212
displaymodule 0:d6ff5fa503e8 213 sendCommand(0x31);
displaymodule 0:d6ff5fa503e8 214 sendData(0x0104);//2
displaymodule 0:d6ff5fa503e8 215
displaymodule 0:d6ff5fa503e8 216 sendCommand(0x32);
displaymodule 0:d6ff5fa503e8 217 sendData(0x0100);//3
displaymodule 0:d6ff5fa503e8 218
displaymodule 0:d6ff5fa503e8 219 sendCommand(0x33);
displaymodule 0:d6ff5fa503e8 220 sendData(0x0305);//4
displaymodule 0:d6ff5fa503e8 221
displaymodule 0:d6ff5fa503e8 222 sendCommand(0x34);
displaymodule 0:d6ff5fa503e8 223 sendData(0x0505);//4
displaymodule 0:d6ff5fa503e8 224
displaymodule 0:d6ff5fa503e8 225 sendCommand(0x35);
displaymodule 0:d6ff5fa503e8 226 sendData(0x0305);//5
displaymodule 0:d6ff5fa503e8 227
displaymodule 0:d6ff5fa503e8 228 sendCommand(0x36);
displaymodule 0:d6ff5fa503e8 229 sendData(0x0707);//6
displaymodule 0:d6ff5fa503e8 230
displaymodule 0:d6ff5fa503e8 231 sendCommand(0x37);
displaymodule 0:d6ff5fa503e8 232 sendData(0x0300);//7
displaymodule 0:d6ff5fa503e8 233
displaymodule 0:d6ff5fa503e8 234 sendCommand(0x3A);
displaymodule 0:d6ff5fa503e8 235 sendData(0x1200);//8
displaymodule 0:d6ff5fa503e8 236
displaymodule 0:d6ff5fa503e8 237 sendCommand(0x3B);
displaymodule 0:d6ff5fa503e8 238 sendData(0x0800);//9
displaymodule 0:d6ff5fa503e8 239
displaymodule 0:d6ff5fa503e8 240 // Final init
displaymodule 0:d6ff5fa503e8 241 delay(300);
displaymodule 0:d6ff5fa503e8 242 sendCommand(0x07); // Display Control
displaymodule 0:d6ff5fa503e8 243
displaymodule 0:d6ff5fa503e8 244 sendData(0x0033); // Display on
displaymodule 0:d6ff5fa503e8 245 delay(100);
displaymodule 0:d6ff5fa503e8 246
displaymodule 0:d6ff5fa503e8 247 sendCommand(0x22); // RAM data write/read
displaymodule 0:d6ff5fa503e8 248
displaymodule 0:d6ff5fa503e8 249 delay(50);
displaymodule 0:d6ff5fa503e8 250 sbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 251 clearScreen();
displaymodule 0:d6ff5fa503e8 252 }
displaymodule 0:d6ff5fa503e8 253
displaymodule 0:d6ff5fa503e8 254 /*********************************************************************************************************
displaymodule 0:d6ff5fa503e8 255 END FILE
displaymodule 0:d6ff5fa503e8 256 *********************************************************************************************************/