Library for handling ILI9163 - based LCD displays.

Dependents:   TVZ_MU_Seminar

ILI9163 displays are typically 128*128 pixels with 15-bit color and controlled over 8-bit SPI.

This library is adapted from https://developer.mbed.org/teams/Temp/code/DL144128_LCD_b/, with some changes.

Committer:
jackmax
Date:
Wed Jan 25 23:46:47 2017 +0000
Revision:
0:06faf770a0c7
First commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jackmax 0:06faf770a0c7 1 /**
jackmax 0:06faf770a0c7 2 * @file ili9163lcd.c
jackmax 0:06faf770a0c7 3 * @brief ILI9163 128x128 LCD Driver
jackmax 0:06faf770a0c7 4 *
jackmax 0:06faf770a0c7 5 * This code has been ported from the ili9163lcd library for mbed
jackmax 0:06faf770a0c7 6 * made by Jun Morita.
jackmax 0:06faf770a0c7 7 * Source form <http://files.noccylabs.info/lib430/liblcd/ili9163lcd_8c.html>
jackmax 0:06faf770a0c7 8 *
jackmax 0:06faf770a0c7 9 * This code has been ported from the ili9163lcd library for avr made
jackmax 0:06faf770a0c7 10 * by Simon Inns, to run on a msp430.
jackmax 0:06faf770a0c7 11 *
jackmax 0:06faf770a0c7 12 * This program is free software: you can redistribute it and/or modify
jackmax 0:06faf770a0c7 13 * it under the terms of the GNU General Public License as published by
jackmax 0:06faf770a0c7 14 * the Free Software Foundation, either version 3 of the License, or
jackmax 0:06faf770a0c7 15 * (at your option) any later version.
jackmax 0:06faf770a0c7 16 *
jackmax 0:06faf770a0c7 17 * This program is distributed in the hope that it will be useful,
jackmax 0:06faf770a0c7 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jackmax 0:06faf770a0c7 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
jackmax 0:06faf770a0c7 20 * GNU General Public License for more details.
jackmax 0:06faf770a0c7 21 *
jackmax 0:06faf770a0c7 22 * You should have received a copy of the GNU General Public License
jackmax 0:06faf770a0c7 23 * along with this program. If not, see <http://www.gnu.org/licenses/>.
jackmax 0:06faf770a0c7 24 *
jackmax 0:06faf770a0c7 25 * @author Jun Morita (iccraft)
jackmax 0:06faf770a0c7 26 * @author Simon Inns <simon.inns@gmail.com>
jackmax 0:06faf770a0c7 27 * @author Christopher Vagnetoft (NoccyLabs)
jackmax 0:06faf770a0c7 28 * @copyright (C) 2012 Simon Inns
jackmax 0:06faf770a0c7 29 * @copyright parts (C) 2012 NoccyLabs
jackmax 0:06faf770a0c7 30 */
jackmax 0:06faf770a0c7 31
jackmax 0:06faf770a0c7 32 #include "ili9163lcd.h"
jackmax 0:06faf770a0c7 33 #include "mbed.h"
jackmax 0:06faf770a0c7 34
jackmax 0:06faf770a0c7 35 //--------------------------------------------------------------------------
jackmax 0:06faf770a0c7 36 // Initialize the object
jackmax 0:06faf770a0c7 37 //
jackmax 0:06faf770a0c7 38 ILI9163::ILI9163(PinName SCK, PinName SDA, PinName A0, PinName RESET, PinName CS, PinName LED)
jackmax 0:06faf770a0c7 39 : SPI_(SDA, NC, SCK), A0_(A0), RESET_(RESET), CS_(CS), LED_(LED)
jackmax 0:06faf770a0c7 40 {
jackmax 0:06faf770a0c7 41 SPI_.format(8);
jackmax 0:06faf770a0c7 42 //TODO: allow user to change interface frequency
jackmax 0:06faf770a0c7 43 SPI_.frequency(20000000);
jackmax 0:06faf770a0c7 44
jackmax 0:06faf770a0c7 45 setFont((unsigned char*)font5x8);
jackmax 0:06faf770a0c7 46 }
jackmax 0:06faf770a0c7 47
jackmax 0:06faf770a0c7 48 //--------------------------------------------------------------------------
jackmax 0:06faf770a0c7 49 // Low-level LCD driving functions
jackmax 0:06faf770a0c7 50
jackmax 0:06faf770a0c7 51 // Reset the LCD hardware
jackmax 0:06faf770a0c7 52 void ILI9163::reset(void)
jackmax 0:06faf770a0c7 53 {
jackmax 0:06faf770a0c7 54 // Reset pin is active low (0 = reset, 1 = ready)
jackmax 0:06faf770a0c7 55 RESET_ = 0;
jackmax 0:06faf770a0c7 56 wait_ms(50);
jackmax 0:06faf770a0c7 57
jackmax 0:06faf770a0c7 58 RESET_ = 1;
jackmax 0:06faf770a0c7 59 wait_ms(120);
jackmax 0:06faf770a0c7 60 }
jackmax 0:06faf770a0c7 61
jackmax 0:06faf770a0c7 62 void ILI9163::writeCommand(uint8_t address)
jackmax 0:06faf770a0c7 63 {
jackmax 0:06faf770a0c7 64 CS_ = 0;
jackmax 0:06faf770a0c7 65 A0_ = 0;
jackmax 0:06faf770a0c7 66 SPI_.write(address);
jackmax 0:06faf770a0c7 67 CS_ = 1;
jackmax 0:06faf770a0c7 68 }
jackmax 0:06faf770a0c7 69
jackmax 0:06faf770a0c7 70 void ILI9163::writeParameter(uint8_t parameter)
jackmax 0:06faf770a0c7 71 {
jackmax 0:06faf770a0c7 72 CS_ = 0;
jackmax 0:06faf770a0c7 73 A0_ = 1;
jackmax 0:06faf770a0c7 74 SPI_.write(parameter);
jackmax 0:06faf770a0c7 75 CS_ = 1;
jackmax 0:06faf770a0c7 76 }
jackmax 0:06faf770a0c7 77
jackmax 0:06faf770a0c7 78 void ILI9163::writeData(uint16_t data)
jackmax 0:06faf770a0c7 79 {
jackmax 0:06faf770a0c7 80 CS_ = 0;
jackmax 0:06faf770a0c7 81 A0_ = 1;
jackmax 0:06faf770a0c7 82 SPI_.write(data >> 8);
jackmax 0:06faf770a0c7 83 SPI_.write(data & 0xFF);
jackmax 0:06faf770a0c7 84 CS_ = 1;
jackmax 0:06faf770a0c7 85 }
jackmax 0:06faf770a0c7 86
jackmax 0:06faf770a0c7 87 // Initialize the display with the require screen orientation
jackmax 0:06faf770a0c7 88 void ILI9163::init(uint8_t orientation)
jackmax 0:06faf770a0c7 89 {
jackmax 0:06faf770a0c7 90 CS_ = 1;
jackmax 0:06faf770a0c7 91 RESET_ = 1;
jackmax 0:06faf770a0c7 92
jackmax 0:06faf770a0c7 93 // Hardware reset the LCD
jackmax 0:06faf770a0c7 94 reset();
jackmax 0:06faf770a0c7 95
jackmax 0:06faf770a0c7 96 writeCommand(EXIT_SLEEP_MODE);
jackmax 0:06faf770a0c7 97 wait_ms(5); // Wait for the screen to wake up
jackmax 0:06faf770a0c7 98
jackmax 0:06faf770a0c7 99 writeCommand(SET_PIXEL_FORMAT);
jackmax 0:06faf770a0c7 100 writeParameter(0x05); // 16 bits per pixel
jackmax 0:06faf770a0c7 101
jackmax 0:06faf770a0c7 102 writeCommand(SET_GAMMA_CURVE);
jackmax 0:06faf770a0c7 103 writeParameter(0x04); // Select gamma curve 3
jackmax 0:06faf770a0c7 104
jackmax 0:06faf770a0c7 105 writeCommand(GAM_R_SEL);
jackmax 0:06faf770a0c7 106 writeParameter(0x01); // Gamma adjustment enabled
jackmax 0:06faf770a0c7 107
jackmax 0:06faf770a0c7 108 writeCommand(POSITIVE_GAMMA_CORRECT);
jackmax 0:06faf770a0c7 109 writeParameter(0x3f); // 1st Parameter
jackmax 0:06faf770a0c7 110 writeParameter(0x25); // 2nd Parameter
jackmax 0:06faf770a0c7 111 writeParameter(0x1c); // 3rd Parameter
jackmax 0:06faf770a0c7 112 writeParameter(0x1e); // 4th Parameter
jackmax 0:06faf770a0c7 113 writeParameter(0x20); // 5th Parameter
jackmax 0:06faf770a0c7 114 writeParameter(0x12); // 6th Parameter
jackmax 0:06faf770a0c7 115 writeParameter(0x2a); // 7th Parameter
jackmax 0:06faf770a0c7 116 writeParameter(0x90); // 8th Parameter
jackmax 0:06faf770a0c7 117 writeParameter(0x24); // 9th Parameter
jackmax 0:06faf770a0c7 118 writeParameter(0x11); // 10th Parameter
jackmax 0:06faf770a0c7 119 writeParameter(0x00); // 11th Parameter
jackmax 0:06faf770a0c7 120 writeParameter(0x00); // 12th Parameter
jackmax 0:06faf770a0c7 121 writeParameter(0x00); // 13th Parameter
jackmax 0:06faf770a0c7 122 writeParameter(0x00); // 14th Parameter
jackmax 0:06faf770a0c7 123 writeParameter(0x00); // 15th Parameter
jackmax 0:06faf770a0c7 124
jackmax 0:06faf770a0c7 125 writeCommand(NEGATIVE_GAMMA_CORRECT);
jackmax 0:06faf770a0c7 126 writeParameter(0x20); // 1st Parameter
jackmax 0:06faf770a0c7 127 writeParameter(0x20); // 2nd Parameter
jackmax 0:06faf770a0c7 128 writeParameter(0x20); // 3rd Parameter
jackmax 0:06faf770a0c7 129 writeParameter(0x20); // 4th Parameter
jackmax 0:06faf770a0c7 130 writeParameter(0x05); // 5th Parameter
jackmax 0:06faf770a0c7 131 writeParameter(0x00); // 6th Parameter
jackmax 0:06faf770a0c7 132 writeParameter(0x15); // 7th Parameter
jackmax 0:06faf770a0c7 133 writeParameter(0xa7); // 8th Parameter
jackmax 0:06faf770a0c7 134 writeParameter(0x3d); // 9th Parameter
jackmax 0:06faf770a0c7 135 writeParameter(0x18); // 10th Parameter
jackmax 0:06faf770a0c7 136 writeParameter(0x25); // 11th Parameter
jackmax 0:06faf770a0c7 137 writeParameter(0x2a); // 12th Parameter
jackmax 0:06faf770a0c7 138 writeParameter(0x2b); // 13th Parameter
jackmax 0:06faf770a0c7 139 writeParameter(0x2b); // 14th Parameter
jackmax 0:06faf770a0c7 140 writeParameter(0x3a); // 15th Parameter
jackmax 0:06faf770a0c7 141
jackmax 0:06faf770a0c7 142 writeCommand(FRAME_RATE_CONTROL1);
jackmax 0:06faf770a0c7 143 writeParameter(0x11); // DIVA = 17
jackmax 0:06faf770a0c7 144 writeParameter(0x14); // VPA = 20
jackmax 0:06faf770a0c7 145
jackmax 0:06faf770a0c7 146 writeCommand(DISPLAY_INVERSION);
jackmax 0:06faf770a0c7 147 writeParameter(0x07); // NLA = 1, NLB = 1, NLC = 1 (all on Frame Inversion)
jackmax 0:06faf770a0c7 148
jackmax 0:06faf770a0c7 149 writeCommand(POWER_CONTROL1);
jackmax 0:06faf770a0c7 150 writeParameter(0x0a); // VRH = 10: GVDD = 4.30
jackmax 0:06faf770a0c7 151 writeParameter(0x02); // VC = 2: VCI1 = 2.65
jackmax 0:06faf770a0c7 152
jackmax 0:06faf770a0c7 153 writeCommand(POWER_CONTROL2);
jackmax 0:06faf770a0c7 154 writeParameter(0x02); // BT = 2: AVDD = 2xVCI1, VCL = -1xVCI1, VGH = 5xVCI1, VGL = -2xVCI1
jackmax 0:06faf770a0c7 155
jackmax 0:06faf770a0c7 156 writeCommand(VCOM_CONTROL1);
jackmax 0:06faf770a0c7 157 writeParameter(0x50); // VMH = 80: VCOMH voltage = 4.5
jackmax 0:06faf770a0c7 158 writeParameter(0x5b); // VML = 91: VCOML voltage = -0.225
jackmax 0:06faf770a0c7 159
jackmax 0:06faf770a0c7 160 writeCommand(VCOM_OFFSET_CONTROL);
jackmax 0:06faf770a0c7 161 writeParameter(0x40); // nVM = 0, VMF = 64: VCOMH output = VMH, VCOML output = VML
jackmax 0:06faf770a0c7 162
jackmax 0:06faf770a0c7 163 writeCommand(SET_COLUMN_ADDRESS);
jackmax 0:06faf770a0c7 164 writeParameter(0x00); // XSH
jackmax 0:06faf770a0c7 165 writeParameter(0x00); // XSL
jackmax 0:06faf770a0c7 166 writeParameter(0x00); // XEH
jackmax 0:06faf770a0c7 167 writeParameter(0x7f); // XEL (128 pixels x)
jackmax 0:06faf770a0c7 168
jackmax 0:06faf770a0c7 169 writeCommand(SET_PAGE_ADDRESS);
jackmax 0:06faf770a0c7 170 writeParameter(0x00);
jackmax 0:06faf770a0c7 171 writeParameter(0x00);
jackmax 0:06faf770a0c7 172 writeParameter(0x00);
jackmax 0:06faf770a0c7 173 writeParameter(0x7f); // 128 pixels y
jackmax 0:06faf770a0c7 174
jackmax 0:06faf770a0c7 175 // Select display orientation
jackmax 0:06faf770a0c7 176 writeCommand(SET_ADDRESS_MODE);
jackmax 0:06faf770a0c7 177 writeParameter(orientation);
jackmax 0:06faf770a0c7 178
jackmax 0:06faf770a0c7 179 // Set the display to on
jackmax 0:06faf770a0c7 180 writeCommand(SET_DISPLAY_ON);
jackmax 0:06faf770a0c7 181 writeCommand(WRITE_MEMORY_START);
jackmax 0:06faf770a0c7 182 }
jackmax 0:06faf770a0c7 183
jackmax 0:06faf770a0c7 184 // LCD graphics functions -----------------------------------------------------------------------------------
jackmax 0:06faf770a0c7 185
jackmax 0:06faf770a0c7 186 void ILI9163::clearDisplay(uint16_t colour)
jackmax 0:06faf770a0c7 187 {
jackmax 0:06faf770a0c7 188 uint16_t pixel;
jackmax 0:06faf770a0c7 189
jackmax 0:06faf770a0c7 190 // Set the column address to 0-127
jackmax 0:06faf770a0c7 191 writeCommand(SET_COLUMN_ADDRESS);
jackmax 0:06faf770a0c7 192 writeParameter(0x00);
jackmax 0:06faf770a0c7 193 writeParameter(0x00);
jackmax 0:06faf770a0c7 194 writeParameter(0x00);
jackmax 0:06faf770a0c7 195 writeParameter(0x7f);
jackmax 0:06faf770a0c7 196
jackmax 0:06faf770a0c7 197 // Set the page address to 0-127
jackmax 0:06faf770a0c7 198 writeCommand(SET_PAGE_ADDRESS);
jackmax 0:06faf770a0c7 199 writeParameter(0x00);
jackmax 0:06faf770a0c7 200 writeParameter(0x00);
jackmax 0:06faf770a0c7 201 writeParameter(0x00);
jackmax 0:06faf770a0c7 202 writeParameter(0x7f);
jackmax 0:06faf770a0c7 203
jackmax 0:06faf770a0c7 204 // Plot the pixels
jackmax 0:06faf770a0c7 205 writeCommand(WRITE_MEMORY_START);
jackmax 0:06faf770a0c7 206
jackmax 0:06faf770a0c7 207 for(pixel = 0; pixel < 128*128; pixel++)
jackmax 0:06faf770a0c7 208 writeData(colour);
jackmax 0:06faf770a0c7 209 }
jackmax 0:06faf770a0c7 210
jackmax 0:06faf770a0c7 211 void ILI9163::plot(uint8_t x, uint8_t y, uint16_t colour)
jackmax 0:06faf770a0c7 212 {
jackmax 0:06faf770a0c7 213 // Horizontal Address Start Position
jackmax 0:06faf770a0c7 214 writeCommand(SET_COLUMN_ADDRESS);
jackmax 0:06faf770a0c7 215 writeParameter(0x00);
jackmax 0:06faf770a0c7 216 writeParameter(x);
jackmax 0:06faf770a0c7 217 writeParameter(0x00);
jackmax 0:06faf770a0c7 218 writeParameter(0x7f);
jackmax 0:06faf770a0c7 219
jackmax 0:06faf770a0c7 220 // Vertical Address end Position
jackmax 0:06faf770a0c7 221 writeCommand(SET_PAGE_ADDRESS);
jackmax 0:06faf770a0c7 222 writeParameter(0x00);
jackmax 0:06faf770a0c7 223 writeParameter(y);
jackmax 0:06faf770a0c7 224 writeParameter(0x00);
jackmax 0:06faf770a0c7 225 writeParameter(0x7f);
jackmax 0:06faf770a0c7 226
jackmax 0:06faf770a0c7 227 // Plot the point
jackmax 0:06faf770a0c7 228 writeCommand(WRITE_MEMORY_START);
jackmax 0:06faf770a0c7 229 writeData(colour);
jackmax 0:06faf770a0c7 230 }
jackmax 0:06faf770a0c7 231
jackmax 0:06faf770a0c7 232 // Draw a line from x0, y0 to x1, y1
jackmax 0:06faf770a0c7 233 // Note: This is a version of Bresenham's line drawing algorithm
jackmax 0:06faf770a0c7 234 // It only draws lines from left to right!
jackmax 0:06faf770a0c7 235 void ILI9163::line(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t colour)
jackmax 0:06faf770a0c7 236 {
jackmax 0:06faf770a0c7 237 int16_t dy = y1 - y0;
jackmax 0:06faf770a0c7 238 int16_t dx = x1 - x0;
jackmax 0:06faf770a0c7 239 int16_t stepx, stepy;
jackmax 0:06faf770a0c7 240
jackmax 0:06faf770a0c7 241 if (dy < 0)
jackmax 0:06faf770a0c7 242 {
jackmax 0:06faf770a0c7 243 dy = -dy; stepy = -1;
jackmax 0:06faf770a0c7 244 }
jackmax 0:06faf770a0c7 245 else stepy = 1;
jackmax 0:06faf770a0c7 246
jackmax 0:06faf770a0c7 247 if (dx < 0)
jackmax 0:06faf770a0c7 248 {
jackmax 0:06faf770a0c7 249 dx = -dx; stepx = -1;
jackmax 0:06faf770a0c7 250 }
jackmax 0:06faf770a0c7 251 else stepx = 1;
jackmax 0:06faf770a0c7 252
jackmax 0:06faf770a0c7 253 dy <<= 1; // dy is now 2*dy
jackmax 0:06faf770a0c7 254 dx <<= 1; // dx is now 2*dx
jackmax 0:06faf770a0c7 255
jackmax 0:06faf770a0c7 256 plot(x0, y0, colour);
jackmax 0:06faf770a0c7 257
jackmax 0:06faf770a0c7 258 if (dx > dy) {
jackmax 0:06faf770a0c7 259 int fraction = dy - (dx >> 1); // same as 2*dy - dx
jackmax 0:06faf770a0c7 260 while (x0 != x1)
jackmax 0:06faf770a0c7 261 {
jackmax 0:06faf770a0c7 262 if (fraction >= 0)
jackmax 0:06faf770a0c7 263 {
jackmax 0:06faf770a0c7 264 y0 += stepy;
jackmax 0:06faf770a0c7 265 fraction -= dx; // same as fraction -= 2*dx
jackmax 0:06faf770a0c7 266 }
jackmax 0:06faf770a0c7 267
jackmax 0:06faf770a0c7 268 x0 += stepx;
jackmax 0:06faf770a0c7 269 fraction += dy; // same as fraction -= 2*dy
jackmax 0:06faf770a0c7 270 plot(x0, y0, colour);
jackmax 0:06faf770a0c7 271 }
jackmax 0:06faf770a0c7 272 }
jackmax 0:06faf770a0c7 273 else
jackmax 0:06faf770a0c7 274 {
jackmax 0:06faf770a0c7 275 int fraction = dx - (dy >> 1);
jackmax 0:06faf770a0c7 276 while (y0 != y1)
jackmax 0:06faf770a0c7 277 {
jackmax 0:06faf770a0c7 278 if (fraction >= 0)
jackmax 0:06faf770a0c7 279 {
jackmax 0:06faf770a0c7 280 x0 += stepx;
jackmax 0:06faf770a0c7 281 fraction -= dy;
jackmax 0:06faf770a0c7 282 }
jackmax 0:06faf770a0c7 283
jackmax 0:06faf770a0c7 284 y0 += stepy;
jackmax 0:06faf770a0c7 285 fraction += dx;
jackmax 0:06faf770a0c7 286 plot(x0, y0, colour);
jackmax 0:06faf770a0c7 287 }
jackmax 0:06faf770a0c7 288 }
jackmax 0:06faf770a0c7 289 }
jackmax 0:06faf770a0c7 290
jackmax 0:06faf770a0c7 291 // Draw a rectangle between x0, y0 and x1, y1
jackmax 0:06faf770a0c7 292 void ILI9163::rectangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t colour)
jackmax 0:06faf770a0c7 293 {
jackmax 0:06faf770a0c7 294 line(x0, y0, x0, y1, colour);
jackmax 0:06faf770a0c7 295 line(x0, y1, x1, y1, colour);
jackmax 0:06faf770a0c7 296 line(x1, y0, x1, y1, colour);
jackmax 0:06faf770a0c7 297 line(x0, y0, x1, y0, colour);
jackmax 0:06faf770a0c7 298 }
jackmax 0:06faf770a0c7 299
jackmax 0:06faf770a0c7 300 // Draw a filled rectangle
jackmax 0:06faf770a0c7 301 // Note: y1 must be greater than y0 and x1 must be greater than x0
jackmax 0:06faf770a0c7 302 // for this to work
jackmax 0:06faf770a0c7 303 void ILI9163::filledRectangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t colour)
jackmax 0:06faf770a0c7 304 {
jackmax 0:06faf770a0c7 305 uint16_t pixels;
jackmax 0:06faf770a0c7 306
jackmax 0:06faf770a0c7 307 // To speed up plotting we define a x window with the width of the
jackmax 0:06faf770a0c7 308 // rectangle and then just output the required number of bytes to
jackmax 0:06faf770a0c7 309 // fill down to the end point
jackmax 0:06faf770a0c7 310
jackmax 0:06faf770a0c7 311 writeCommand(SET_COLUMN_ADDRESS); // Horizontal Address Start Position
jackmax 0:06faf770a0c7 312 writeParameter(0x00);
jackmax 0:06faf770a0c7 313 writeParameter(x0);
jackmax 0:06faf770a0c7 314 writeParameter(0x00);
jackmax 0:06faf770a0c7 315 writeParameter(x1);
jackmax 0:06faf770a0c7 316
jackmax 0:06faf770a0c7 317 writeCommand(SET_PAGE_ADDRESS); // Vertical Address end Position
jackmax 0:06faf770a0c7 318 writeParameter(0x00);
jackmax 0:06faf770a0c7 319 writeParameter(y0);
jackmax 0:06faf770a0c7 320 writeParameter(0x00);
jackmax 0:06faf770a0c7 321 writeParameter(0x7f);
jackmax 0:06faf770a0c7 322
jackmax 0:06faf770a0c7 323 writeCommand(WRITE_MEMORY_START);
jackmax 0:06faf770a0c7 324
jackmax 0:06faf770a0c7 325 for (pixels = 0; pixels < (((x1 - x0) + 1) * ((y1 - y0) + 1)); pixels++)
jackmax 0:06faf770a0c7 326 writeData(colour);;
jackmax 0:06faf770a0c7 327 }
jackmax 0:06faf770a0c7 328
jackmax 0:06faf770a0c7 329 // Draw a circle
jackmax 0:06faf770a0c7 330 // Note: This is another version of Bresenham's line drawing algorithm.
jackmax 0:06faf770a0c7 331 // There's plenty of documentation on the web if you are curious
jackmax 0:06faf770a0c7 332 // how this works.
jackmax 0:06faf770a0c7 333 void ILI9163::circle(int16_t xCentre, int16_t yCentre, int16_t radius, uint16_t colour)
jackmax 0:06faf770a0c7 334 {
jackmax 0:06faf770a0c7 335 int16_t x = 0, y = radius;
jackmax 0:06faf770a0c7 336 int16_t d = 3 - (2 * radius);
jackmax 0:06faf770a0c7 337
jackmax 0:06faf770a0c7 338 while(x <= y)
jackmax 0:06faf770a0c7 339 {
jackmax 0:06faf770a0c7 340 plot(xCentre + x, yCentre + y, colour);
jackmax 0:06faf770a0c7 341 plot(xCentre + y, yCentre + x, colour);
jackmax 0:06faf770a0c7 342 plot(xCentre - x, yCentre + y, colour);
jackmax 0:06faf770a0c7 343 plot(xCentre + y, yCentre - x, colour);
jackmax 0:06faf770a0c7 344 plot(xCentre - x, yCentre - y, colour);
jackmax 0:06faf770a0c7 345 plot(xCentre - y, yCentre - x, colour);
jackmax 0:06faf770a0c7 346 plot(xCentre + x, yCentre - y, colour);
jackmax 0:06faf770a0c7 347 plot(xCentre - y, yCentre + x, colour);
jackmax 0:06faf770a0c7 348
jackmax 0:06faf770a0c7 349 if (d < 0) d += (4 * x) + 6;
jackmax 0:06faf770a0c7 350 else
jackmax 0:06faf770a0c7 351 {
jackmax 0:06faf770a0c7 352 d += (4 * (x - y)) + 10;
jackmax 0:06faf770a0c7 353 y -= 1;
jackmax 0:06faf770a0c7 354 }
jackmax 0:06faf770a0c7 355
jackmax 0:06faf770a0c7 356 x++;
jackmax 0:06faf770a0c7 357 }
jackmax 0:06faf770a0c7 358 }
jackmax 0:06faf770a0c7 359
jackmax 0:06faf770a0c7 360 // LCD text manipulation functions --------------------------------------------------------------------------
jackmax 0:06faf770a0c7 361
jackmax 0:06faf770a0c7 362 // Change the font and store its size information
jackmax 0:06faf770a0c7 363 void ILI9163::setFont(unsigned char* f) {
jackmax 0:06faf770a0c7 364 font = f;
jackmax 0:06faf770a0c7 365 font_bp_char = font[0]; // bytes per character
jackmax 0:06faf770a0c7 366 font_hor = font[1]; // hor size of font
jackmax 0:06faf770a0c7 367 font_vert = font[2]; // vert size of font
jackmax 0:06faf770a0c7 368 font_bp_line = font[3]; // bytes per line
jackmax 0:06faf770a0c7 369 }
jackmax 0:06faf770a0c7 370
jackmax 0:06faf770a0c7 371 // Plot a character at the specified x, y co-ordinates (top left hand corner of character)
jackmax 0:06faf770a0c7 372 void ILI9163::putCh(unsigned char c, uint8_t x, uint8_t y, uint16_t fgColour, uint16_t bgColour)
jackmax 0:06faf770a0c7 373 {
jackmax 0:06faf770a0c7 374 uint16_t sign;
jackmax 0:06faf770a0c7 375 unsigned char z;
jackmax 0:06faf770a0c7 376 unsigned int j,i,b;
jackmax 0:06faf770a0c7 377
jackmax 0:06faf770a0c7 378 if ((c < 31) || (c > 127)) return; //Check if character is printable
jackmax 0:06faf770a0c7 379
jackmax 0:06faf770a0c7 380 // To speed up plotting we define a x window of 6 pixels and then
jackmax 0:06faf770a0c7 381 // write out one row at a time. This means the LCD will correctly
jackmax 0:06faf770a0c7 382 // update the memory pointer saving us a good few bytes
jackmax 0:06faf770a0c7 383
jackmax 0:06faf770a0c7 384 writeCommand(SET_COLUMN_ADDRESS); // Horizontal Address Start Position
jackmax 0:06faf770a0c7 385 writeParameter(0x00);
jackmax 0:06faf770a0c7 386 writeParameter(x);
jackmax 0:06faf770a0c7 387 writeParameter(0x00);
jackmax 0:06faf770a0c7 388 writeParameter(x+font_hor-1); // x + w -1 >> XEnd
jackmax 0:06faf770a0c7 389
jackmax 0:06faf770a0c7 390 writeCommand(SET_PAGE_ADDRESS); // Vertical Address end Position
jackmax 0:06faf770a0c7 391 writeParameter(0x00);
jackmax 0:06faf770a0c7 392 writeParameter(y);
jackmax 0:06faf770a0c7 393 writeParameter(0x00);
jackmax 0:06faf770a0c7 394 writeParameter(y+font_vert-1); // y + h -1 >> YEnd 0x7F
jackmax 0:06faf770a0c7 395
jackmax 0:06faf770a0c7 396 writeCommand(WRITE_MEMORY_START);
jackmax 0:06faf770a0c7 397
jackmax 0:06faf770a0c7 398 sign = (((c -32) * font_bp_char) + 4); // start of char bitmap
jackmax 0:06faf770a0c7 399
jackmax 0:06faf770a0c7 400 // Plot the font data
jackmax 0:06faf770a0c7 401 for (j=0; j<font_vert; j++) { // vert line
jackmax 0:06faf770a0c7 402 for (i=0; i<font_hor; i++) { // horz line
jackmax 0:06faf770a0c7 403 z = font[sign + (font_bp_line * i) + ((j & 0xF8) >> 3)+1];
jackmax 0:06faf770a0c7 404 b = 1 << (j & 0x07);
jackmax 0:06faf770a0c7 405 if (( z & b ) == 0x00) writeData(fgColour);
jackmax 0:06faf770a0c7 406 else writeData(bgColour);
jackmax 0:06faf770a0c7 407 }
jackmax 0:06faf770a0c7 408 }
jackmax 0:06faf770a0c7 409 }
jackmax 0:06faf770a0c7 410
jackmax 0:06faf770a0c7 411 // Plot a string of characters to the LCD
jackmax 0:06faf770a0c7 412 void ILI9163::putS(const char *str, uint8_t x, uint8_t y, uint16_t fgColour, uint16_t bgColour)
jackmax 0:06faf770a0c7 413 {
jackmax 0:06faf770a0c7 414 uint8_t origin = x;
jackmax 0:06faf770a0c7 415
jackmax 0:06faf770a0c7 416 for (uint8_t i = 0; i < strlen(str); i++)
jackmax 0:06faf770a0c7 417 {
jackmax 0:06faf770a0c7 418 // Check if we are out of bounds and move to
jackmax 0:06faf770a0c7 419 // the next line if we are
jackmax 0:06faf770a0c7 420 if (x + font_hor > 127)
jackmax 0:06faf770a0c7 421 {
jackmax 0:06faf770a0c7 422 x = origin;
jackmax 0:06faf770a0c7 423 y += font_vert;
jackmax 0:06faf770a0c7 424 }
jackmax 0:06faf770a0c7 425
jackmax 0:06faf770a0c7 426 // If we move past the bottom of the screen just exit
jackmax 0:06faf770a0c7 427 if (y + font_vert > 127) break;
jackmax 0:06faf770a0c7 428
jackmax 0:06faf770a0c7 429 // Plot the current character
jackmax 0:06faf770a0c7 430 putCh(str[i], x, y, fgColour, bgColour);
jackmax 0:06faf770a0c7 431 x += font_hor;
jackmax 0:06faf770a0c7 432 }
jackmax 0:06faf770a0c7 433 }