A simple yet powerful library for controlling graphical displays. Multiple display controllers are supported using inheritance.

Dependents:   mbed_rifletool Hexi_Bubble_Game Hexi_Catch-the-dot_Game Hexi_Acceleromagnetic_Synth

NOTE: This library is in beta right now. As far as I know, everything here works, but there are many features that are lacking so far. Most notably containers, button handling, and display drivers other than the SSD1306.

Committer:
neilt6
Date:
Tue May 27 21:41:28 2014 +0000
Revision:
3:a8f72d4864e6
Parent:
2:bbfc18022ee5
Syntax improvements

Who changed what in which revision?

UserRevisionLine numberNew contents of line
neilt6 1:f7003ec66a51 1 /* NeatGUI Library
neilt6 1:f7003ec66a51 2 * Copyright (c) 2013 Neil Thiessen
neilt6 1:f7003ec66a51 3 *
neilt6 1:f7003ec66a51 4 * Licensed under the Apache License, Version 2.0 (the "License");
neilt6 1:f7003ec66a51 5 * you may not use this file except in compliance with the License.
neilt6 1:f7003ec66a51 6 * You may obtain a copy of the License at
neilt6 1:f7003ec66a51 7 *
neilt6 1:f7003ec66a51 8 * http://www.apache.org/licenses/LICENSE-2.0
neilt6 1:f7003ec66a51 9 *
neilt6 1:f7003ec66a51 10 * Unless required by applicable law or agreed to in writing, software
neilt6 1:f7003ec66a51 11 * distributed under the License is distributed on an "AS IS" BASIS,
neilt6 1:f7003ec66a51 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
neilt6 1:f7003ec66a51 13 * See the License for the specific language governing permissions and
neilt6 1:f7003ec66a51 14 * limitations under the License.
neilt6 1:f7003ec66a51 15 */
neilt6 1:f7003ec66a51 16
neilt6 1:f7003ec66a51 17 #include "ILI9341.h"
neilt6 1:f7003ec66a51 18
neilt6 1:f7003ec66a51 19 ILI9341::ILI9341(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName dc) : Display(240, 320), m_SPI(mosi, miso, sclk), m_CS(cs), m_DC(dc)
neilt6 1:f7003ec66a51 20 {
neilt6 1:f7003ec66a51 21 //Set the control pins to a known state
neilt6 1:f7003ec66a51 22 m_CS = 1;
neilt6 1:f7003ec66a51 23 m_DC = 1;
neilt6 1:f7003ec66a51 24
neilt6 1:f7003ec66a51 25 //Set the SPI format to 8-bit
neilt6 1:f7003ec66a51 26 m_SPI.format(8, 3);
neilt6 1:f7003ec66a51 27
neilt6 1:f7003ec66a51 28 //Set the SPI frequency to 10MHz
neilt6 1:f7003ec66a51 29 m_SPI.frequency(10000000);
neilt6 1:f7003ec66a51 30 }
neilt6 1:f7003ec66a51 31
neilt6 1:f7003ec66a51 32 bool ILI9341::open()
neilt6 1:f7003ec66a51 33 {
neilt6 1:f7003ec66a51 34 writeCommand(0x01);
neilt6 1:f7003ec66a51 35 wait_ms(5);
neilt6 1:f7003ec66a51 36
neilt6 1:f7003ec66a51 37 writeCommand(0xCF);
neilt6 1:f7003ec66a51 38 writeData8(0x00);
neilt6 1:f7003ec66a51 39 writeData8(0x8B);
neilt6 1:f7003ec66a51 40 writeData8(0X30);
neilt6 1:f7003ec66a51 41
neilt6 1:f7003ec66a51 42 writeCommand(0xED);
neilt6 1:f7003ec66a51 43 writeData8(0x67);
neilt6 1:f7003ec66a51 44 writeData8(0x03);
neilt6 1:f7003ec66a51 45 writeData8(0X12);
neilt6 1:f7003ec66a51 46 writeData8(0X81);
neilt6 1:f7003ec66a51 47
neilt6 1:f7003ec66a51 48 writeCommand(0xE8);
neilt6 1:f7003ec66a51 49 writeData8(0x85);
neilt6 1:f7003ec66a51 50 writeData8(0x10);
neilt6 1:f7003ec66a51 51 writeData8(0x7A);
neilt6 1:f7003ec66a51 52
neilt6 1:f7003ec66a51 53 writeCommand(0xCB);
neilt6 1:f7003ec66a51 54 writeData8(0x39);
neilt6 1:f7003ec66a51 55 writeData8(0x2C);
neilt6 1:f7003ec66a51 56 writeData8(0x00);
neilt6 1:f7003ec66a51 57 writeData8(0x34);
neilt6 1:f7003ec66a51 58 writeData8(0x02);
neilt6 1:f7003ec66a51 59
neilt6 1:f7003ec66a51 60 writeCommand(0xF7);
neilt6 1:f7003ec66a51 61 writeData8(0x20);
neilt6 1:f7003ec66a51 62
neilt6 1:f7003ec66a51 63 writeCommand(0xEA);
neilt6 1:f7003ec66a51 64 writeData8(0x00);
neilt6 1:f7003ec66a51 65 writeData8(0x00);
neilt6 1:f7003ec66a51 66
neilt6 1:f7003ec66a51 67 writeCommand(0xC0); /* Power control */
neilt6 1:f7003ec66a51 68 writeData8(0x1B); /* VRH[5:0] */
neilt6 1:f7003ec66a51 69
neilt6 1:f7003ec66a51 70 writeCommand(0xC1); /* Power control */
neilt6 1:f7003ec66a51 71 writeData8(0x10); /* SAP[2:0];BT[3:0] */
neilt6 1:f7003ec66a51 72
neilt6 1:f7003ec66a51 73 writeCommand(0xC5); /* VCM control */
neilt6 1:f7003ec66a51 74 writeData8(0x3F);
neilt6 1:f7003ec66a51 75 writeData8(0x3C);
neilt6 1:f7003ec66a51 76
neilt6 1:f7003ec66a51 77 writeCommand(0xC7); /* VCM control2 */
neilt6 1:f7003ec66a51 78 writeData8(0XB7);
neilt6 1:f7003ec66a51 79
neilt6 1:f7003ec66a51 80 writeCommand(0x36); /* Memory Access Control */
neilt6 1:f7003ec66a51 81 writeData8(0x08);
neilt6 1:f7003ec66a51 82
neilt6 1:f7003ec66a51 83 writeCommand(0x3A);
neilt6 1:f7003ec66a51 84 writeData8(0x55);
neilt6 1:f7003ec66a51 85
neilt6 1:f7003ec66a51 86 writeCommand(0xB1);
neilt6 1:f7003ec66a51 87 writeData8(0x00);
neilt6 1:f7003ec66a51 88 writeData8(0x1B);
neilt6 1:f7003ec66a51 89
neilt6 1:f7003ec66a51 90 writeCommand(0xB6); /* Display Function Control */
neilt6 1:f7003ec66a51 91 writeData8(0x0A);
neilt6 1:f7003ec66a51 92 writeData8(0xA2);
neilt6 1:f7003ec66a51 93
neilt6 1:f7003ec66a51 94
neilt6 1:f7003ec66a51 95 writeCommand(0xF2); /* 3Gamma Function Disable */
neilt6 1:f7003ec66a51 96 writeData8(0x00);
neilt6 1:f7003ec66a51 97
neilt6 1:f7003ec66a51 98 writeCommand(0x26); /* Gamma curve selected */
neilt6 1:f7003ec66a51 99 writeData8(0x01);
neilt6 1:f7003ec66a51 100
neilt6 1:f7003ec66a51 101 writeCommand(0xE0); /* Set Gamma */
neilt6 1:f7003ec66a51 102 writeData8(0x0F);
neilt6 1:f7003ec66a51 103 writeData8(0x2A);
neilt6 1:f7003ec66a51 104 writeData8(0x28);
neilt6 1:f7003ec66a51 105 writeData8(0x08);
neilt6 1:f7003ec66a51 106 writeData8(0x0E);
neilt6 1:f7003ec66a51 107 writeData8(0x08);
neilt6 1:f7003ec66a51 108 writeData8(0x54);
neilt6 1:f7003ec66a51 109 writeData8(0XA9);
neilt6 1:f7003ec66a51 110 writeData8(0x43);
neilt6 1:f7003ec66a51 111 writeData8(0x0A);
neilt6 1:f7003ec66a51 112 writeData8(0x0F);
neilt6 1:f7003ec66a51 113 writeData8(0x00);
neilt6 1:f7003ec66a51 114 writeData8(0x00);
neilt6 1:f7003ec66a51 115 writeData8(0x00);
neilt6 1:f7003ec66a51 116 writeData8(0x00);
neilt6 1:f7003ec66a51 117
neilt6 1:f7003ec66a51 118 writeCommand(0XE1); /* Set Gamma */
neilt6 1:f7003ec66a51 119 writeData8(0x00);
neilt6 1:f7003ec66a51 120 writeData8(0x15);
neilt6 1:f7003ec66a51 121 writeData8(0x17);
neilt6 1:f7003ec66a51 122 writeData8(0x07);
neilt6 1:f7003ec66a51 123 writeData8(0x11);
neilt6 1:f7003ec66a51 124 writeData8(0x06);
neilt6 1:f7003ec66a51 125 writeData8(0x2B);
neilt6 1:f7003ec66a51 126 writeData8(0x56);
neilt6 1:f7003ec66a51 127 writeData8(0x3C);
neilt6 1:f7003ec66a51 128 writeData8(0x05);
neilt6 1:f7003ec66a51 129 writeData8(0x10);
neilt6 1:f7003ec66a51 130 writeData8(0x0F);
neilt6 1:f7003ec66a51 131 writeData8(0x3F);
neilt6 1:f7003ec66a51 132 writeData8(0x3F);
neilt6 1:f7003ec66a51 133 writeData8(0x0F);
neilt6 1:f7003ec66a51 134
neilt6 1:f7003ec66a51 135 writeCommand(0x11); /* Exit Sleep */
neilt6 1:f7003ec66a51 136 wait_ms(120);
neilt6 1:f7003ec66a51 137 writeCommand(0x29); /* Display on */
neilt6 1:f7003ec66a51 138
neilt6 1:f7003ec66a51 139 //Probe for the ILI9341 using a Zero Length Transfer
neilt6 1:f7003ec66a51 140 /*if (!m_I2C.write(m_Addr, NULL, 0)) {
neilt6 1:f7003ec66a51 141 //Init sequence for 128x64 OLED module
neilt6 1:f7003ec66a51 142 writeCommand(CMD_DISPLAYOFF);
neilt6 1:f7003ec66a51 143 writeCommand(CMD_SETDISPLAYCLOCKDIV);
neilt6 1:f7003ec66a51 144 writeCommand(0x80);
neilt6 1:f7003ec66a51 145 writeCommand(CMD_SETMULTIPLEX);
neilt6 1:f7003ec66a51 146 writeCommand(0x3F);
neilt6 1:f7003ec66a51 147 writeCommand(CMD_SETDISPLAYOFFSET);
neilt6 1:f7003ec66a51 148 writeCommand(0x0);
neilt6 1:f7003ec66a51 149 writeCommand(CMD_SETSTARTLINE | 0x0);
neilt6 1:f7003ec66a51 150 writeCommand(CMD_CHARGEPUMP);
neilt6 1:f7003ec66a51 151 writeCommand(CMD_CHARGEPUMPON);
neilt6 1:f7003ec66a51 152 writeCommand(CMD_MEMORYMODE);
neilt6 1:f7003ec66a51 153 writeCommand(0x00);
neilt6 1:f7003ec66a51 154 writeCommand(CMD_SEGREMAP | 0x1);
neilt6 1:f7003ec66a51 155 writeCommand(CMD_COMSCANDEC);
neilt6 1:f7003ec66a51 156 writeCommand(CMD_SETCOMPINS);
neilt6 1:f7003ec66a51 157 writeCommand(0x12);
neilt6 1:f7003ec66a51 158 writeCommand(CMD_SETCONTRAST);
neilt6 1:f7003ec66a51 159 writeCommand(0xCF);
neilt6 1:f7003ec66a51 160 writeCommand(CMD_SETPRECHARGE);
neilt6 1:f7003ec66a51 161 writeCommand(0xF1);
neilt6 1:f7003ec66a51 162 writeCommand(CMD_SETVCOMDETECT);
neilt6 1:f7003ec66a51 163 writeCommand(0x40);
neilt6 1:f7003ec66a51 164 writeCommand(CMD_DISPLAYALLON_RESUME);
neilt6 1:f7003ec66a51 165 writeCommand(CMD_NORMALDISPLAY);
neilt6 1:f7003ec66a51 166
neilt6 1:f7003ec66a51 167 //Return success
neilt6 1:f7003ec66a51 168 return true;
neilt6 1:f7003ec66a51 169 } else {
neilt6 1:f7003ec66a51 170 //Return failure
neilt6 1:f7003ec66a51 171 return false;
neilt6 1:f7003ec66a51 172 }*/
neilt6 1:f7003ec66a51 173
neilt6 1:f7003ec66a51 174 return true;
neilt6 1:f7003ec66a51 175 }
neilt6 1:f7003ec66a51 176
neilt6 2:bbfc18022ee5 177 void ILI9341::flush()
neilt6 1:f7003ec66a51 178 {
neilt6 1:f7003ec66a51 179 //Select low col 0, hi col 0, line 0
neilt6 1:f7003ec66a51 180 //writeCommand(CMD_SETLOWCOLUMN | 0x0);
neilt6 1:f7003ec66a51 181 //writeCommand(CMD_SETHIGHCOLUMN | 0x0);
neilt6 1:f7003ec66a51 182 //writeCommand(CMD_SETSTARTLINE | 0x0);
neilt6 1:f7003ec66a51 183
neilt6 1:f7003ec66a51 184 //Make sure the first byte in the buffer is the control byte
neilt6 1:f7003ec66a51 185 //m_Buffer[0] = CONTROL_DATA;
neilt6 1:f7003ec66a51 186
neilt6 1:f7003ec66a51 187 //Write the buffer
neilt6 1:f7003ec66a51 188 //m_I2C.write(m_Addr, m_Buffer, 1025);
neilt6 1:f7003ec66a51 189 }
neilt6 1:f7003ec66a51 190
neilt6 1:f7003ec66a51 191 Display::State ILI9341::state()
neilt6 1:f7003ec66a51 192 {
neilt6 1:f7003ec66a51 193 //Return the base class's state
neilt6 1:f7003ec66a51 194 return Display::state();
neilt6 1:f7003ec66a51 195 }
neilt6 1:f7003ec66a51 196
neilt6 1:f7003ec66a51 197 void ILI9341::state(State s)
neilt6 1:f7003ec66a51 198 {
neilt6 1:f7003ec66a51 199 //Check what the requested state is
neilt6 1:f7003ec66a51 200 if (s == Display::DISPLAY_ON) {
neilt6 1:f7003ec66a51 201 //Turn the display on
neilt6 1:f7003ec66a51 202 //writeCommand(CMD_DISPLAYON);
neilt6 1:f7003ec66a51 203 } else if (s == Display::DISPLAY_OFF) {
neilt6 1:f7003ec66a51 204 //Turn the display off
neilt6 1:f7003ec66a51 205 //writeCommand(CMD_DISPLAYOFF);
neilt6 1:f7003ec66a51 206 }
neilt6 1:f7003ec66a51 207
neilt6 1:f7003ec66a51 208 //Update the base class
neilt6 1:f7003ec66a51 209 Display::state(s);
neilt6 1:f7003ec66a51 210 }
neilt6 1:f7003ec66a51 211
neilt6 1:f7003ec66a51 212 void ILI9341::drawPixel(int x, int y, unsigned int c)
neilt6 1:f7003ec66a51 213 {
neilt6 1:f7003ec66a51 214 //Range check the pixel
neilt6 1:f7003ec66a51 215 if ((x < 0) || (x >= width()) || (y < 0) || (y >= height()))
neilt6 1:f7003ec66a51 216 return;
neilt6 1:f7003ec66a51 217
neilt6 1:f7003ec66a51 218 //TODO: Clean up this code!!!
neilt6 1:f7003ec66a51 219
neilt6 1:f7003ec66a51 220 //Set the column
neilt6 1:f7003ec66a51 221 writeCommand(0x2A);
neilt6 1:f7003ec66a51 222 writeData16(x);
neilt6 1:f7003ec66a51 223 writeData16(x);
neilt6 1:f7003ec66a51 224
neilt6 1:f7003ec66a51 225 //Set the page
neilt6 1:f7003ec66a51 226 writeCommand(0x2B);
neilt6 1:f7003ec66a51 227 writeData16(y);
neilt6 1:f7003ec66a51 228 writeData16(y);
neilt6 1:f7003ec66a51 229
neilt6 1:f7003ec66a51 230 //Don't know what this does...
neilt6 1:f7003ec66a51 231 writeCommand(0x2C);
neilt6 1:f7003ec66a51 232
neilt6 1:f7003ec66a51 233 //Woohoo, send the pixel!!!
neilt6 1:f7003ec66a51 234 writeData16(c);
neilt6 1:f7003ec66a51 235
neilt6 1:f7003ec66a51 236 //TODO: Clean up this code!!!
neilt6 1:f7003ec66a51 237 }
neilt6 1:f7003ec66a51 238
neilt6 1:f7003ec66a51 239 void ILI9341::writeCommand(char command)
neilt6 1:f7003ec66a51 240 {
neilt6 1:f7003ec66a51 241 //Pull DC low for Command
neilt6 1:f7003ec66a51 242 m_DC = 0;
neilt6 1:f7003ec66a51 243
neilt6 1:f7003ec66a51 244 //Pull CS low to select the TFT
neilt6 1:f7003ec66a51 245 m_CS = 0;
neilt6 1:f7003ec66a51 246
neilt6 1:f7003ec66a51 247 //Write the command byte
neilt6 1:f7003ec66a51 248 m_SPI.write(command);
neilt6 1:f7003ec66a51 249
neilt6 1:f7003ec66a51 250 //Pull CS high to end the transfer
neilt6 1:f7003ec66a51 251 m_CS = 1;
neilt6 1:f7003ec66a51 252 }
neilt6 1:f7003ec66a51 253
neilt6 1:f7003ec66a51 254 void ILI9341::writeData8(char data)
neilt6 1:f7003ec66a51 255 {
neilt6 1:f7003ec66a51 256 //Pull DC high for Data
neilt6 1:f7003ec66a51 257 m_DC = 1;
neilt6 1:f7003ec66a51 258
neilt6 1:f7003ec66a51 259 //Pull CS low to select the TFT
neilt6 1:f7003ec66a51 260 m_CS = 0;
neilt6 1:f7003ec66a51 261
neilt6 1:f7003ec66a51 262 //Write the data byte
neilt6 1:f7003ec66a51 263 m_SPI.write(data);
neilt6 1:f7003ec66a51 264
neilt6 1:f7003ec66a51 265 //Pull CS high to end the transfer
neilt6 1:f7003ec66a51 266 m_CS = 1;
neilt6 1:f7003ec66a51 267 }
neilt6 1:f7003ec66a51 268
neilt6 1:f7003ec66a51 269 void ILI9341::writeData16(unsigned short data)
neilt6 1:f7003ec66a51 270 {
neilt6 1:f7003ec66a51 271 //Pull DC high for Data
neilt6 1:f7003ec66a51 272 m_DC = 1;
neilt6 1:f7003ec66a51 273
neilt6 1:f7003ec66a51 274 //Pull CS low to select the TFT
neilt6 1:f7003ec66a51 275 m_CS = 0;
neilt6 1:f7003ec66a51 276
neilt6 1:f7003ec66a51 277 //Write the 2 data bytes
neilt6 1:f7003ec66a51 278 m_SPI.write((char)(data >> 8));
neilt6 1:f7003ec66a51 279 m_SPI.write((char)data);
neilt6 1:f7003ec66a51 280
neilt6 1:f7003ec66a51 281 //Pull CS high to end the transfer
neilt6 1:f7003ec66a51 282 m_CS = 1;
neilt6 1:f7003ec66a51 283 }