Arduino style GUI

Committer:
jonebuckman
Date:
Wed Feb 27 22:34:06 2019 +0000
Revision:
4:d353b314d244
Parent:
0:90962b684403
Updated writeCommand and writeData.

Who changed what in which revision?

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