Library for handling ILI9163 - based LCD displays.
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.
ili9163lcd.cpp@0:06faf770a0c7, 2017-01-25 (annotated)
- Committer:
- jackmax
- Date:
- Wed Jan 25 23:46:47 2017 +0000
- Revision:
- 0:06faf770a0c7
First commit
Who changed what in which revision?
User | Revision | Line number | New 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 | } |