Gitakichi Tokyo / Mbed 2 deprecated ATM0177B3A

Dependencies:   mbed

Committer:
gitakichi
Date:
Sat Jan 02 08:49:47 2021 +0000
Revision:
7:eaaf60683ca4
Parent:
6:7abe5999dc1c
Child:
9:58f6248ef377
bool picture

Who changed what in which revision?

UserRevisionLine numberNew contents of line
morita 0:c0be4e018a09 1 /**
morita 0:c0be4e018a09 2 * @file ili9163lcd.c
gitakichi 2:4d5b94a92f19 3 * @brief ILI9163 128x160 LCD Driver
morita 0:c0be4e018a09 4 *
morita 0:c0be4e018a09 5 * This code has been ported from the ili9163lcd library for mbed
morita 0:c0be4e018a09 6 * made by Jun Morita.
morita 0:c0be4e018a09 7 * Source form <http://files.noccylabs.info/lib430/liblcd/ili9163lcd_8c.html>
morita 0:c0be4e018a09 8 *
morita 0:c0be4e018a09 9 * This code has been ported from the ili9163lcd library for avr made
morita 0:c0be4e018a09 10 * by Simon Inns, to run on a msp430.
morita 0:c0be4e018a09 11 *
morita 0:c0be4e018a09 12 * This program is free software: you can redistribute it and/or modify
morita 0:c0be4e018a09 13 * it under the terms of the GNU General Public License as published by
morita 0:c0be4e018a09 14 * the Free Software Foundation, either version 3 of the License, or
morita 0:c0be4e018a09 15 * (at your option) any later version.
morita 0:c0be4e018a09 16 *
morita 0:c0be4e018a09 17 * This program is distributed in the hope that it will be useful,
morita 0:c0be4e018a09 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
morita 0:c0be4e018a09 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
morita 0:c0be4e018a09 20 * GNU General Public License for more details.
morita 0:c0be4e018a09 21 *
morita 0:c0be4e018a09 22 * You should have received a copy of the GNU General Public License
morita 0:c0be4e018a09 23 * along with this program. If not, see <http://www.gnu.org/licenses/>.
morita 0:c0be4e018a09 24 *
gitakichi 2:4d5b94a92f19 25 * @author Gitakichi
morita 0:c0be4e018a09 26 * @author Jun Morita (iccraft)
morita 0:c0be4e018a09 27 * @author Simon Inns <simon.inns@gmail.com>
morita 0:c0be4e018a09 28 * @author Christopher Vagnetoft (NoccyLabs)
morita 0:c0be4e018a09 29 * @copyright (C) 2012 Simon Inns
morita 0:c0be4e018a09 30 * @copyright parts (C) 2012 NoccyLabs
morita 0:c0be4e018a09 31 */
morita 0:c0be4e018a09 32
morita 0:c0be4e018a09 33 #include "mbed.h"
morita 0:c0be4e018a09 34 #include "font5x8.h"
morita 0:c0be4e018a09 35 #include "ili9163lcd.h"
morita 0:c0be4e018a09 36
morita 0:c0be4e018a09 37 // Connection of mbed pins.
gitakichi 1:cd2949e87b17 38 DigitalOut SCK_(A4);
gitakichi 1:cd2949e87b17 39 DigitalOut SDA_(A6);
gitakichi 1:cd2949e87b17 40 DigitalOut A0_(A2);
gitakichi 1:cd2949e87b17 41 DigitalOut RESET_(A1);
gitakichi 1:cd2949e87b17 42 DigitalOut CS_(A3);
morita 0:c0be4e018a09 43
morita 0:c0be4e018a09 44 // Low-level LCD driving functions --------------------------------------------------------------------------
morita 0:c0be4e018a09 45
morita 0:c0be4e018a09 46 // Reset the LCD hardware
morita 0:c0be4e018a09 47 void lcdReset(void)
morita 0:c0be4e018a09 48 {
morita 0:c0be4e018a09 49 // Reset pin is active low (0 = reset, 1 = ready)
morita 0:c0be4e018a09 50 RESET_ = 0;
morita 0:c0be4e018a09 51 wait_ms(50);
morita 0:c0be4e018a09 52
morita 0:c0be4e018a09 53 RESET_ = 1;
morita 0:c0be4e018a09 54 wait_ms(120);
morita 0:c0be4e018a09 55 }
morita 0:c0be4e018a09 56
morita 0:c0be4e018a09 57 void lcdWriteCommand(uint8_t address)
morita 0:c0be4e018a09 58 {
morita 0:c0be4e018a09 59 uint8_t i;
morita 0:c0be4e018a09 60
morita 0:c0be4e018a09 61 CS_ = 0;
morita 0:c0be4e018a09 62 A0_ = 0;
morita 0:c0be4e018a09 63 for(i=0;i<8;i++){
morita 0:c0be4e018a09 64 if(address & 128)SDA_= 1; else SDA_ = 0;
gitakichi 3:9caa79f40909 65 SCK_ = 0;//TBD
morita 0:c0be4e018a09 66 address <<= 1;
gitakichi 3:9caa79f40909 67 SCK_ = 1;//TBD
morita 0:c0be4e018a09 68 }
morita 0:c0be4e018a09 69 wait_us(1);
morita 0:c0be4e018a09 70 CS_ = 1;
morita 0:c0be4e018a09 71 }
morita 0:c0be4e018a09 72
morita 0:c0be4e018a09 73 void lcdWriteParameter(uint8_t parameter)
morita 0:c0be4e018a09 74 {
morita 0:c0be4e018a09 75 uint8_t i;
morita 0:c0be4e018a09 76
morita 0:c0be4e018a09 77 CS_ = 0;
morita 0:c0be4e018a09 78 A0_ = 1;
morita 0:c0be4e018a09 79 for(i=0;i<8;i++){
morita 0:c0be4e018a09 80 if(parameter & 128)SDA_= 1; else SDA_ = 0;
gitakichi 3:9caa79f40909 81 SCK_ = 0;//TBD
morita 0:c0be4e018a09 82 parameter <<= 1;
gitakichi 3:9caa79f40909 83 SCK_ = 1;//TBD
morita 0:c0be4e018a09 84 }
morita 0:c0be4e018a09 85 wait_us(1);
morita 0:c0be4e018a09 86 CS_ = 1;
morita 0:c0be4e018a09 87 }
morita 0:c0be4e018a09 88
morita 0:c0be4e018a09 89 void lcdWriteData(uint8_t dataByte1, uint8_t dataByte2)
morita 0:c0be4e018a09 90 {
morita 0:c0be4e018a09 91 uint8_t i;
morita 0:c0be4e018a09 92
morita 0:c0be4e018a09 93 CS_ = 0;
morita 0:c0be4e018a09 94 A0_ = 1;
morita 0:c0be4e018a09 95 for(i=0;i<8;i++){
morita 0:c0be4e018a09 96 if(dataByte1 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 3:9caa79f40909 97 SCK_ = 0;//TBD
morita 0:c0be4e018a09 98 dataByte1 <<= 1;
gitakichi 3:9caa79f40909 99 SCK_ = 1;//TBD
morita 0:c0be4e018a09 100 }
morita 0:c0be4e018a09 101 wait_us(1);
morita 0:c0be4e018a09 102 for(i=0;i<8;i++){
morita 0:c0be4e018a09 103 if(dataByte2 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 3:9caa79f40909 104 SCK_ = 0;//TBD
morita 0:c0be4e018a09 105 dataByte2 <<= 1;
gitakichi 3:9caa79f40909 106 SCK_ = 1;//TBD
morita 0:c0be4e018a09 107 }
morita 0:c0be4e018a09 108 wait_us(1);
morita 0:c0be4e018a09 109 CS_ = 1;
morita 0:c0be4e018a09 110 }
morita 0:c0be4e018a09 111
gitakichi 6:7abe5999dc1c 112 void lcdWriteData_burst(uint16_t *burst_data,uint16_t length)
gitakichi 6:7abe5999dc1c 113 {
gitakichi 6:7abe5999dc1c 114 uint8_t dataByte1,dataByte2;
gitakichi 6:7abe5999dc1c 115 uint8_t i;
gitakichi 6:7abe5999dc1c 116 uint16_t pixel;
gitakichi 6:7abe5999dc1c 117
gitakichi 6:7abe5999dc1c 118 CS_ = 0;
gitakichi 6:7abe5999dc1c 119 A0_ = 1;
gitakichi 6:7abe5999dc1c 120 for(pixel = 0;pixel < length;pixel++){
gitakichi 6:7abe5999dc1c 121 dataByte1 = *burst_data >> 8;
gitakichi 6:7abe5999dc1c 122 dataByte2 = *burst_data;
gitakichi 6:7abe5999dc1c 123 burst_data++;
gitakichi 6:7abe5999dc1c 124
gitakichi 6:7abe5999dc1c 125 for(i=0;i<8;i++){
gitakichi 6:7abe5999dc1c 126 if(dataByte1 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 6:7abe5999dc1c 127 SCK_ = 0;//TBD
gitakichi 6:7abe5999dc1c 128 dataByte1 <<= 1;
gitakichi 6:7abe5999dc1c 129 SCK_ = 1;//TBD
gitakichi 6:7abe5999dc1c 130 }
gitakichi 6:7abe5999dc1c 131 for(i=0;i<8;i++){
gitakichi 6:7abe5999dc1c 132 if(dataByte2 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 6:7abe5999dc1c 133 SCK_ = 0;//TBD
gitakichi 6:7abe5999dc1c 134 dataByte2 <<= 1;
gitakichi 6:7abe5999dc1c 135 SCK_ = 1;//TBD
gitakichi 6:7abe5999dc1c 136 }
gitakichi 6:7abe5999dc1c 137 }
gitakichi 6:7abe5999dc1c 138 wait_us(1);
gitakichi 6:7abe5999dc1c 139 CS_ = 1;
gitakichi 6:7abe5999dc1c 140 }
gitakichi 6:7abe5999dc1c 141
gitakichi 7:eaaf60683ca4 142 void lcdWriteData_monoburst(bool *burst_data,uint16_t length)
gitakichi 7:eaaf60683ca4 143 {
gitakichi 7:eaaf60683ca4 144 uint8_t dataByte1,dataByte2;
gitakichi 7:eaaf60683ca4 145 uint8_t i;
gitakichi 7:eaaf60683ca4 146 uint16_t pixel;
gitakichi 7:eaaf60683ca4 147 uint16_t colour;
gitakichi 7:eaaf60683ca4 148
gitakichi 7:eaaf60683ca4 149 CS_ = 0;
gitakichi 7:eaaf60683ca4 150 A0_ = 1;
gitakichi 7:eaaf60683ca4 151 for(pixel = 0;pixel < length;pixel++){
gitakichi 7:eaaf60683ca4 152 if(*burst_data)colour=decodeRgbValue(31, 0, 0);
gitakichi 7:eaaf60683ca4 153 else colour=decodeRgbValue(0, 0, 0);
gitakichi 7:eaaf60683ca4 154 dataByte1 = colour >> 8;
gitakichi 7:eaaf60683ca4 155 dataByte2 = colour;
gitakichi 7:eaaf60683ca4 156 burst_data++;
gitakichi 7:eaaf60683ca4 157
gitakichi 7:eaaf60683ca4 158 for(i=0;i<8;i++){
gitakichi 7:eaaf60683ca4 159 if(dataByte1 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 7:eaaf60683ca4 160 SCK_ = 0;//TBD
gitakichi 7:eaaf60683ca4 161 dataByte1 <<= 1;
gitakichi 7:eaaf60683ca4 162 SCK_ = 1;//TBD
gitakichi 7:eaaf60683ca4 163 }
gitakichi 7:eaaf60683ca4 164 for(i=0;i<8;i++){
gitakichi 7:eaaf60683ca4 165 if(dataByte2 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 7:eaaf60683ca4 166 SCK_ = 0;//TBD
gitakichi 7:eaaf60683ca4 167 dataByte2 <<= 1;
gitakichi 7:eaaf60683ca4 168 SCK_ = 1;//TBD
gitakichi 7:eaaf60683ca4 169 }
gitakichi 7:eaaf60683ca4 170 }
gitakichi 7:eaaf60683ca4 171 wait_us(1);
gitakichi 7:eaaf60683ca4 172 CS_ = 1;
gitakichi 7:eaaf60683ca4 173 }
gitakichi 7:eaaf60683ca4 174
gitakichi 6:7abe5999dc1c 175 void lcdWriteData_sameburst(uint16_t data,uint16_t length)
gitakichi 6:7abe5999dc1c 176 {
gitakichi 6:7abe5999dc1c 177 uint8_t dataByte1,dataByte2;
gitakichi 6:7abe5999dc1c 178 uint8_t i;
gitakichi 6:7abe5999dc1c 179 uint16_t pixel;
gitakichi 6:7abe5999dc1c 180
gitakichi 6:7abe5999dc1c 181 CS_ = 0;
gitakichi 6:7abe5999dc1c 182 A0_ = 1;
gitakichi 6:7abe5999dc1c 183 for(pixel = 0;pixel < length;pixel++){
gitakichi 6:7abe5999dc1c 184 dataByte1 = data >> 8;
gitakichi 6:7abe5999dc1c 185 dataByte2 = data;
gitakichi 6:7abe5999dc1c 186
gitakichi 6:7abe5999dc1c 187 for(i=0;i<8;i++){
gitakichi 6:7abe5999dc1c 188 if(dataByte1 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 6:7abe5999dc1c 189 SCK_ = 0;//TBD
gitakichi 6:7abe5999dc1c 190 dataByte1 <<= 1;
gitakichi 6:7abe5999dc1c 191 SCK_ = 1;//TBD
gitakichi 6:7abe5999dc1c 192 }
gitakichi 6:7abe5999dc1c 193 for(i=0;i<8;i++){
gitakichi 6:7abe5999dc1c 194 if(dataByte2 & 128)SDA_= 1; else SDA_ = 0;
gitakichi 6:7abe5999dc1c 195 SCK_ = 0;//TBD
gitakichi 6:7abe5999dc1c 196 dataByte2 <<= 1;
gitakichi 6:7abe5999dc1c 197 SCK_ = 1;//TBD
gitakichi 6:7abe5999dc1c 198 }
gitakichi 6:7abe5999dc1c 199 }
gitakichi 6:7abe5999dc1c 200 wait_us(1);
gitakichi 6:7abe5999dc1c 201 CS_ = 1;
gitakichi 6:7abe5999dc1c 202 }
gitakichi 6:7abe5999dc1c 203
morita 0:c0be4e018a09 204 // Initialise the display with the require screen orientation
morita 0:c0be4e018a09 205 void lcdInitialise(uint8_t orientation)
morita 0:c0be4e018a09 206 {
morita 0:c0be4e018a09 207 CS_ = 1;
morita 0:c0be4e018a09 208 SCK_ = 0;
morita 0:c0be4e018a09 209 RESET_ = 1;
morita 0:c0be4e018a09 210
morita 0:c0be4e018a09 211 // Hardware reset the LCD
morita 0:c0be4e018a09 212 lcdReset();
morita 0:c0be4e018a09 213
morita 0:c0be4e018a09 214 lcdWriteCommand(EXIT_SLEEP_MODE);
morita 0:c0be4e018a09 215 wait_ms(5); // Wait for the screen to wake up
morita 0:c0be4e018a09 216
morita 0:c0be4e018a09 217 lcdWriteCommand(SET_PIXEL_FORMAT);
morita 0:c0be4e018a09 218 lcdWriteParameter(0x05); // 16 bits per pixel
gitakichi 2:4d5b94a92f19 219 /*
morita 0:c0be4e018a09 220 lcdWriteCommand(SET_GAMMA_CURVE);
morita 0:c0be4e018a09 221 lcdWriteParameter(0x04); // Select gamma curve 3
morita 0:c0be4e018a09 222
morita 0:c0be4e018a09 223 lcdWriteCommand(GAM_R_SEL);
morita 0:c0be4e018a09 224 lcdWriteParameter(0x01); // Gamma adjustment enabled
morita 0:c0be4e018a09 225
gitakichi 2:4d5b94a92f19 226
morita 0:c0be4e018a09 227 lcdWriteCommand(POSITIVE_GAMMA_CORRECT);
morita 0:c0be4e018a09 228 lcdWriteParameter(0x3f); // 1st Parameter
morita 0:c0be4e018a09 229 lcdWriteParameter(0x25); // 2nd Parameter
morita 0:c0be4e018a09 230 lcdWriteParameter(0x1c); // 3rd Parameter
morita 0:c0be4e018a09 231 lcdWriteParameter(0x1e); // 4th Parameter
morita 0:c0be4e018a09 232 lcdWriteParameter(0x20); // 5th Parameter
morita 0:c0be4e018a09 233 lcdWriteParameter(0x12); // 6th Parameter
morita 0:c0be4e018a09 234 lcdWriteParameter(0x2a); // 7th Parameter
morita 0:c0be4e018a09 235 lcdWriteParameter(0x90); // 8th Parameter
morita 0:c0be4e018a09 236 lcdWriteParameter(0x24); // 9th Parameter
morita 0:c0be4e018a09 237 lcdWriteParameter(0x11); // 10th Parameter
morita 0:c0be4e018a09 238 lcdWriteParameter(0x00); // 11th Parameter
morita 0:c0be4e018a09 239 lcdWriteParameter(0x00); // 12th Parameter
morita 0:c0be4e018a09 240 lcdWriteParameter(0x00); // 13th Parameter
morita 0:c0be4e018a09 241 lcdWriteParameter(0x00); // 14th Parameter
morita 0:c0be4e018a09 242 lcdWriteParameter(0x00); // 15th Parameter
morita 0:c0be4e018a09 243
morita 0:c0be4e018a09 244 lcdWriteCommand(NEGATIVE_GAMMA_CORRECT);
morita 0:c0be4e018a09 245 lcdWriteParameter(0x20); // 1st Parameter
morita 0:c0be4e018a09 246 lcdWriteParameter(0x20); // 2nd Parameter
morita 0:c0be4e018a09 247 lcdWriteParameter(0x20); // 3rd Parameter
morita 0:c0be4e018a09 248 lcdWriteParameter(0x20); // 4th Parameter
morita 0:c0be4e018a09 249 lcdWriteParameter(0x05); // 5th Parameter
morita 0:c0be4e018a09 250 lcdWriteParameter(0x00); // 6th Parameter
morita 0:c0be4e018a09 251 lcdWriteParameter(0x15); // 7th Parameter
morita 0:c0be4e018a09 252 lcdWriteParameter(0xa7); // 8th Parameter
morita 0:c0be4e018a09 253 lcdWriteParameter(0x3d); // 9th Parameter
morita 0:c0be4e018a09 254 lcdWriteParameter(0x18); // 10th Parameter
morita 0:c0be4e018a09 255 lcdWriteParameter(0x25); // 11th Parameter
morita 0:c0be4e018a09 256 lcdWriteParameter(0x2a); // 12th Parameter
morita 0:c0be4e018a09 257 lcdWriteParameter(0x2b); // 13th Parameter
morita 0:c0be4e018a09 258 lcdWriteParameter(0x2b); // 14th Parameter
morita 0:c0be4e018a09 259 lcdWriteParameter(0x3a); // 15th Parameter
gitakichi 2:4d5b94a92f19 260 */
morita 0:c0be4e018a09 261
morita 0:c0be4e018a09 262 lcdWriteCommand(FRAME_RATE_CONTROL1);
morita 0:c0be4e018a09 263 lcdWriteParameter(0x08); // DIVA = 8
morita 0:c0be4e018a09 264 lcdWriteParameter(0x08); // VPA = 8
morita 0:c0be4e018a09 265
morita 0:c0be4e018a09 266 lcdWriteCommand(DISPLAY_INVERSION);
morita 0:c0be4e018a09 267 lcdWriteParameter(0x07); // NLA = 1, NLB = 1, NLC = 1 (all on Frame Inversion)
morita 0:c0be4e018a09 268
morita 0:c0be4e018a09 269 lcdWriteCommand(POWER_CONTROL1);
morita 0:c0be4e018a09 270 lcdWriteParameter(0x0a); // VRH = 10: GVDD = 4.30
morita 0:c0be4e018a09 271 lcdWriteParameter(0x02); // VC = 2: VCI1 = 2.65
morita 0:c0be4e018a09 272
morita 0:c0be4e018a09 273 lcdWriteCommand(POWER_CONTROL2);
morita 0:c0be4e018a09 274 lcdWriteParameter(0x02); // BT = 2: AVDD = 2xVCI1, VCL = -1xVCI1, VGH = 5xVCI1, VGL = -2xVCI1
morita 0:c0be4e018a09 275
morita 0:c0be4e018a09 276 lcdWriteCommand(VCOM_CONTROL1);
morita 0:c0be4e018a09 277 lcdWriteParameter(0x50); // VMH = 80: VCOMH voltage = 4.5
morita 0:c0be4e018a09 278 lcdWriteParameter(0x5b); // VML = 91: VCOML voltage = -0.225
morita 0:c0be4e018a09 279
morita 0:c0be4e018a09 280 lcdWriteCommand(VCOM_OFFSET_CONTROL);
morita 0:c0be4e018a09 281 lcdWriteParameter(0x40); // nVM = 0, VMF = 64: VCOMH output = VMH, VCOML output = VML
morita 0:c0be4e018a09 282
gitakichi 2:4d5b94a92f19 283 //lcdWriteCommand(SET_COLUMN_ADDRESS);
gitakichi 2:4d5b94a92f19 284 //lcdWriteParameter(0x00); // XSH
gitakichi 2:4d5b94a92f19 285 //lcdWriteParameter(0x00); // XSL
gitakichi 2:4d5b94a92f19 286 //lcdWriteParameter(0x00); // XEH
gitakichi 2:4d5b94a92f19 287 //lcdWriteParameter(0x7f); // XEL (128 pixels x)
morita 0:c0be4e018a09 288
gitakichi 2:4d5b94a92f19 289 //lcdWriteCommand(SET_PAGE_ADDRESS);
gitakichi 2:4d5b94a92f19 290 //lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 291 //lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 292 //lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 293 //lcdWriteParameter(0x7f); // 128 pixels y
gitakichi 2:4d5b94a92f19 294 //lcdWriteParameter(PAGE_MAX); // 160 pixels y
morita 0:c0be4e018a09 295
morita 0:c0be4e018a09 296 // Select display orientation
morita 0:c0be4e018a09 297 lcdWriteCommand(SET_ADDRESS_MODE);
morita 0:c0be4e018a09 298 lcdWriteParameter(orientation);
morita 0:c0be4e018a09 299
morita 0:c0be4e018a09 300 // Set the display to on
morita 0:c0be4e018a09 301 lcdWriteCommand(SET_DISPLAY_ON);
morita 0:c0be4e018a09 302 lcdWriteCommand(WRITE_MEMORY_START);
morita 0:c0be4e018a09 303 }
morita 0:c0be4e018a09 304
morita 0:c0be4e018a09 305 // LCD graphics functions -----------------------------------------------------------------------------------
morita 0:c0be4e018a09 306
morita 0:c0be4e018a09 307 void lcdClearDisplay(uint16_t colour)
morita 0:c0be4e018a09 308 {
morita 0:c0be4e018a09 309 // Set the column address to 0-127
morita 0:c0be4e018a09 310 lcdWriteCommand(SET_COLUMN_ADDRESS);
morita 0:c0be4e018a09 311 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 312 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 313 lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 314 lcdWriteParameter(COL_MAX);
morita 0:c0be4e018a09 315
morita 0:c0be4e018a09 316 // Set the page address to 0-127
morita 0:c0be4e018a09 317 lcdWriteCommand(SET_PAGE_ADDRESS);
morita 0:c0be4e018a09 318 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 319 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 320 lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 321 //lcdWriteParameter(0x7f);
gitakichi 2:4d5b94a92f19 322 lcdWriteParameter(PAGE_MAX);
morita 0:c0be4e018a09 323
morita 0:c0be4e018a09 324 // Plot the pixels
morita 0:c0be4e018a09 325 lcdWriteCommand(WRITE_MEMORY_START);
gitakichi 2:4d5b94a92f19 326 //for(pixel = 0; pixel < 16385; pixel++) lcdWriteData(colour >> 8, colour);
gitakichi 5:570ba49da81c 327 //for(pixel = 0; pixel < 20480; pixel++) lcdWriteData(colour >> 8, colour);
gitakichi 6:7abe5999dc1c 328 lcdWriteData_sameburst(colour,20480);
morita 0:c0be4e018a09 329 }
morita 0:c0be4e018a09 330
gitakichi 3:9caa79f40909 331 void grade(void)
gitakichi 3:9caa79f40909 332 {
gitakichi 3:9caa79f40909 333 uint16_t line_buf[128];
gitakichi 6:7abe5999dc1c 334 uint8_t pixel;
gitakichi 3:9caa79f40909 335
gitakichi 3:9caa79f40909 336 // Set the column address to 0-127
gitakichi 3:9caa79f40909 337 lcdWriteCommand(SET_COLUMN_ADDRESS);
gitakichi 3:9caa79f40909 338 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 339 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 340 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 341 lcdWriteParameter(COL_MAX);
gitakichi 3:9caa79f40909 342
gitakichi 3:9caa79f40909 343 // Set the page address to 0-127
gitakichi 3:9caa79f40909 344 lcdWriteCommand(SET_PAGE_ADDRESS);
gitakichi 3:9caa79f40909 345 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 346 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 347 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 348 //lcdWriteParameter(0x7f);
gitakichi 3:9caa79f40909 349 lcdWriteParameter(PAGE_MAX);
gitakichi 3:9caa79f40909 350
gitakichi 3:9caa79f40909 351 for(pixel = 0; pixel < 128; pixel++){
gitakichi 5:570ba49da81c 352 if(pixel < 32) line_buf[pixel] = decodeRgbValue((pixel&0b11111)>>1, 0, 0);
gitakichi 5:570ba49da81c 353 else if(pixel < 64) line_buf[pixel] = decodeRgbValue(0, (pixel&0b11111)>>1, 0);
gitakichi 5:570ba49da81c 354 else if(pixel < 96) line_buf[pixel] = decodeRgbValue(0, 0, (pixel&0b11111)>>1);
gitakichi 5:570ba49da81c 355 else line_buf[pixel] = decodeRgbValue(0, 0, 0);
gitakichi 3:9caa79f40909 356 }
gitakichi 3:9caa79f40909 357 // Plot the pixels
gitakichi 3:9caa79f40909 358 lcdWriteCommand(WRITE_MEMORY_START);
gitakichi 6:7abe5999dc1c 359 for(uint16_t page = 0;page < 160;page++){
gitakichi 6:7abe5999dc1c 360 lcdWriteData_burst(line_buf,128);
gitakichi 3:9caa79f40909 361 }
gitakichi 6:7abe5999dc1c 362 lcdWriteData_burst(line_buf,128);
gitakichi 5:570ba49da81c 363
gitakichi 3:9caa79f40909 364 }
gitakichi 3:9caa79f40909 365
gitakichi 3:9caa79f40909 366 void colorbar(void)
gitakichi 3:9caa79f40909 367 {
gitakichi 3:9caa79f40909 368 uint16_t colour;
gitakichi 3:9caa79f40909 369
gitakichi 3:9caa79f40909 370 // Set the column address to 0-127
gitakichi 3:9caa79f40909 371 lcdWriteCommand(SET_COLUMN_ADDRESS);
gitakichi 3:9caa79f40909 372 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 373 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 374 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 375 lcdWriteParameter(COL_MAX);
gitakichi 3:9caa79f40909 376
gitakichi 3:9caa79f40909 377 // Set the page address to 0-127
gitakichi 3:9caa79f40909 378 lcdWriteCommand(SET_PAGE_ADDRESS);
gitakichi 3:9caa79f40909 379 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 380 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 381 lcdWriteParameter(0x00);
gitakichi 3:9caa79f40909 382 //lcdWriteParameter(0x7f);
gitakichi 3:9caa79f40909 383 lcdWriteParameter(PAGE_MAX);
gitakichi 3:9caa79f40909 384
gitakichi 3:9caa79f40909 385 // Plot the pixels
gitakichi 3:9caa79f40909 386 lcdWriteCommand(WRITE_MEMORY_START);
gitakichi 6:7abe5999dc1c 387 CS_ = 0;
gitakichi 6:7abe5999dc1c 388 A0_ = 1;
gitakichi 3:9caa79f40909 389 for(uint16_t page = 0;page < 160;page++){
gitakichi 3:9caa79f40909 390 if(page < 28) colour = decodeRgbValue(31, 31, 31);
gitakichi 3:9caa79f40909 391 else if(page < 50) colour = decodeRgbValue(31, 31, 0);
gitakichi 3:9caa79f40909 392 else if(page < 72) colour = decodeRgbValue(0, 31, 31);
gitakichi 3:9caa79f40909 393 else if(page < 94) colour = decodeRgbValue(0, 31, 0);
gitakichi 3:9caa79f40909 394 else if(page < 116) colour = decodeRgbValue(31, 0, 31);
gitakichi 3:9caa79f40909 395 else if(page < 138) colour = decodeRgbValue(31, 0, 0);
gitakichi 3:9caa79f40909 396 else colour = decodeRgbValue(0, 0, 31);
gitakichi 3:9caa79f40909 397
gitakichi 6:7abe5999dc1c 398 lcdWriteData_sameburst(colour,128);
gitakichi 3:9caa79f40909 399 }
gitakichi 3:9caa79f40909 400 }
gitakichi 3:9caa79f40909 401
morita 0:c0be4e018a09 402 void lcdPlot(uint8_t x, uint8_t y, uint16_t colour)
morita 0:c0be4e018a09 403 {
morita 0:c0be4e018a09 404 // Horizontal Address Start Position
morita 0:c0be4e018a09 405 lcdWriteCommand(SET_COLUMN_ADDRESS);
morita 0:c0be4e018a09 406 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 407 lcdWriteParameter(x);
morita 0:c0be4e018a09 408 lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 409 lcdWriteParameter(COL_MAX);
morita 0:c0be4e018a09 410
morita 0:c0be4e018a09 411 // Vertical Address end Position
morita 0:c0be4e018a09 412 lcdWriteCommand(SET_PAGE_ADDRESS);
morita 0:c0be4e018a09 413 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 414 lcdWriteParameter(y);
morita 0:c0be4e018a09 415 lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 416 lcdWriteParameter(PAGE_MAX);
morita 0:c0be4e018a09 417
morita 0:c0be4e018a09 418 // Plot the point
morita 0:c0be4e018a09 419 lcdWriteCommand(WRITE_MEMORY_START);
morita 0:c0be4e018a09 420 lcdWriteData(colour >> 8, colour);
morita 0:c0be4e018a09 421 }
morita 0:c0be4e018a09 422
morita 0:c0be4e018a09 423 // Draw a line from x0, y0 to x1, y1
morita 0:c0be4e018a09 424 // Note: This is a version of Bresenham's line drawing algorithm
morita 0:c0be4e018a09 425 // It only draws lines from left to right!
morita 0:c0be4e018a09 426 void lcdLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t colour)
morita 0:c0be4e018a09 427 {
morita 0:c0be4e018a09 428 int16_t dy = y1 - y0;
morita 0:c0be4e018a09 429 int16_t dx = x1 - x0;
morita 0:c0be4e018a09 430 int16_t stepx, stepy;
morita 0:c0be4e018a09 431
morita 0:c0be4e018a09 432 if (dy < 0)
morita 0:c0be4e018a09 433 {
morita 0:c0be4e018a09 434 dy = -dy; stepy = -1;
morita 0:c0be4e018a09 435 }
morita 0:c0be4e018a09 436 else stepy = 1;
morita 0:c0be4e018a09 437
morita 0:c0be4e018a09 438 if (dx < 0)
morita 0:c0be4e018a09 439 {
morita 0:c0be4e018a09 440 dx = -dx; stepx = -1;
morita 0:c0be4e018a09 441 }
morita 0:c0be4e018a09 442 else stepx = 1;
morita 0:c0be4e018a09 443
morita 0:c0be4e018a09 444 dy <<= 1; // dy is now 2*dy
morita 0:c0be4e018a09 445 dx <<= 1; // dx is now 2*dx
morita 0:c0be4e018a09 446
morita 0:c0be4e018a09 447 lcdPlot(x0, y0, colour);
morita 0:c0be4e018a09 448
morita 0:c0be4e018a09 449 if (dx > dy) {
morita 0:c0be4e018a09 450 int fraction = dy - (dx >> 1); // same as 2*dy - dx
morita 0:c0be4e018a09 451 while (x0 != x1)
morita 0:c0be4e018a09 452 {
morita 0:c0be4e018a09 453 if (fraction >= 0)
morita 0:c0be4e018a09 454 {
morita 0:c0be4e018a09 455 y0 += stepy;
morita 0:c0be4e018a09 456 fraction -= dx; // same as fraction -= 2*dx
morita 0:c0be4e018a09 457 }
morita 0:c0be4e018a09 458
morita 0:c0be4e018a09 459 x0 += stepx;
morita 0:c0be4e018a09 460 fraction += dy; // same as fraction -= 2*dy
morita 0:c0be4e018a09 461 lcdPlot(x0, y0, colour);
morita 0:c0be4e018a09 462 }
morita 0:c0be4e018a09 463 }
morita 0:c0be4e018a09 464 else
morita 0:c0be4e018a09 465 {
morita 0:c0be4e018a09 466 int fraction = dx - (dy >> 1);
morita 0:c0be4e018a09 467 while (y0 != y1)
morita 0:c0be4e018a09 468 {
morita 0:c0be4e018a09 469 if (fraction >= 0)
morita 0:c0be4e018a09 470 {
morita 0:c0be4e018a09 471 x0 += stepx;
morita 0:c0be4e018a09 472 fraction -= dy;
morita 0:c0be4e018a09 473 }
morita 0:c0be4e018a09 474
morita 0:c0be4e018a09 475 y0 += stepy;
morita 0:c0be4e018a09 476 fraction += dx;
morita 0:c0be4e018a09 477 lcdPlot(x0, y0, colour);
morita 0:c0be4e018a09 478 }
morita 0:c0be4e018a09 479 }
morita 0:c0be4e018a09 480 }
morita 0:c0be4e018a09 481
morita 0:c0be4e018a09 482 // Draw a rectangle between x0, y0 and x1, y1
morita 0:c0be4e018a09 483 void lcdRectangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t colour)
morita 0:c0be4e018a09 484 {
morita 0:c0be4e018a09 485 lcdLine(x0, y0, x0, y1, colour);
morita 0:c0be4e018a09 486 lcdLine(x0, y1, x1, y1, colour);
morita 0:c0be4e018a09 487 lcdLine(x1, y0, x1, y1, colour);
morita 0:c0be4e018a09 488 lcdLine(x0, y0, x1, y0, colour);
morita 0:c0be4e018a09 489 }
morita 0:c0be4e018a09 490
morita 0:c0be4e018a09 491 // Draw a filled rectangle
morita 0:c0be4e018a09 492 // Note: y1 must be greater than y0 and x1 must be greater than x0
morita 0:c0be4e018a09 493 // for this to work
morita 0:c0be4e018a09 494 void lcdFilledRectangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t colour)
morita 0:c0be4e018a09 495 {
morita 0:c0be4e018a09 496 uint16_t pixels;
morita 0:c0be4e018a09 497
morita 0:c0be4e018a09 498 // To speed up plotting we define a x window with the width of the
morita 0:c0be4e018a09 499 // rectangle and then just output the required number of bytes to
morita 0:c0be4e018a09 500 // fill down to the end point
morita 0:c0be4e018a09 501
morita 0:c0be4e018a09 502 lcdWriteCommand(SET_COLUMN_ADDRESS); // Horizontal Address Start Position
morita 0:c0be4e018a09 503 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 504 lcdWriteParameter(x0);
morita 0:c0be4e018a09 505 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 506 lcdWriteParameter(x1);
morita 0:c0be4e018a09 507
morita 0:c0be4e018a09 508 lcdWriteCommand(SET_PAGE_ADDRESS); // Vertical Address end Position
morita 0:c0be4e018a09 509 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 510 lcdWriteParameter(y0);
morita 0:c0be4e018a09 511 lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 512 lcdWriteParameter(PAGE_MAX);
morita 0:c0be4e018a09 513
morita 0:c0be4e018a09 514 lcdWriteCommand(WRITE_MEMORY_START);
morita 0:c0be4e018a09 515
morita 0:c0be4e018a09 516 for (pixels = 0; pixels < (((x1 - x0) + 1) * ((y1 - y0) + 1)); pixels++)
morita 0:c0be4e018a09 517 lcdWriteData(colour >> 8, colour);;
morita 0:c0be4e018a09 518 }
morita 0:c0be4e018a09 519
morita 0:c0be4e018a09 520 // Draw a circle
morita 0:c0be4e018a09 521 // Note: This is another version of Bresenham's line drawing algorithm.
morita 0:c0be4e018a09 522 // There's plenty of documentation on the web if you are curious
morita 0:c0be4e018a09 523 // how this works.
morita 0:c0be4e018a09 524 void lcdCircle(int16_t xCentre, int16_t yCentre, int16_t radius, uint16_t colour)
morita 0:c0be4e018a09 525 {
morita 0:c0be4e018a09 526 int16_t x = 0, y = radius;
morita 0:c0be4e018a09 527 int16_t d = 3 - (2 * radius);
morita 0:c0be4e018a09 528
morita 0:c0be4e018a09 529 while(x <= y)
morita 0:c0be4e018a09 530 {
morita 0:c0be4e018a09 531 lcdPlot(xCentre + x, yCentre + y, colour);
morita 0:c0be4e018a09 532 lcdPlot(xCentre + y, yCentre + x, colour);
morita 0:c0be4e018a09 533 lcdPlot(xCentre - x, yCentre + y, colour);
morita 0:c0be4e018a09 534 lcdPlot(xCentre + y, yCentre - x, colour);
morita 0:c0be4e018a09 535 lcdPlot(xCentre - x, yCentre - y, colour);
morita 0:c0be4e018a09 536 lcdPlot(xCentre - y, yCentre - x, colour);
morita 0:c0be4e018a09 537 lcdPlot(xCentre + x, yCentre - y, colour);
morita 0:c0be4e018a09 538 lcdPlot(xCentre - y, yCentre + x, colour);
morita 0:c0be4e018a09 539
morita 0:c0be4e018a09 540 if (d < 0) d += (4 * x) + 6;
morita 0:c0be4e018a09 541 else
morita 0:c0be4e018a09 542 {
morita 0:c0be4e018a09 543 d += (4 * (x - y)) + 10;
morita 0:c0be4e018a09 544 y -= 1;
morita 0:c0be4e018a09 545 }
morita 0:c0be4e018a09 546
morita 0:c0be4e018a09 547 x++;
morita 0:c0be4e018a09 548 }
morita 0:c0be4e018a09 549 }
morita 0:c0be4e018a09 550
morita 0:c0be4e018a09 551 // LCD text manipulation functions --------------------------------------------------------------------------
morita 0:c0be4e018a09 552
morita 0:c0be4e018a09 553 // Plot a character at the specified x, y co-ordinates (top left hand corner of character)
morita 0:c0be4e018a09 554 void lcdPutCh(unsigned char character, uint8_t x, uint8_t y, uint16_t fgColour, uint16_t bgColour)
morita 0:c0be4e018a09 555 {
morita 0:c0be4e018a09 556 uint8_t row, column;
morita 0:c0be4e018a09 557
morita 0:c0be4e018a09 558 // To speed up plotting we define a x window of 6 pixels and then
morita 0:c0be4e018a09 559 // write out one row at a time. This means the LCD will correctly
morita 0:c0be4e018a09 560 // update the memory pointer saving us a good few bytes
morita 0:c0be4e018a09 561
morita 0:c0be4e018a09 562 lcdWriteCommand(SET_COLUMN_ADDRESS); // Horizontal Address Start Position
morita 0:c0be4e018a09 563 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 564 lcdWriteParameter(x);
morita 0:c0be4e018a09 565 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 566 lcdWriteParameter(x+5);
morita 0:c0be4e018a09 567
morita 0:c0be4e018a09 568 lcdWriteCommand(SET_PAGE_ADDRESS); // Vertical Address end Position
morita 0:c0be4e018a09 569 lcdWriteParameter(0x00);
morita 0:c0be4e018a09 570 lcdWriteParameter(y);
morita 0:c0be4e018a09 571 lcdWriteParameter(0x00);
gitakichi 2:4d5b94a92f19 572 lcdWriteParameter(PAGE_MAX);
morita 0:c0be4e018a09 573
morita 0:c0be4e018a09 574 lcdWriteCommand(WRITE_MEMORY_START);
morita 0:c0be4e018a09 575
morita 0:c0be4e018a09 576 // Plot the font data
morita 0:c0be4e018a09 577 for (row = 0; row < 8; row++)
morita 0:c0be4e018a09 578 {
morita 0:c0be4e018a09 579 for (column = 0; column < 6; column++)
morita 0:c0be4e018a09 580 {
morita 0:c0be4e018a09 581 if ((font5x8[character][column]) & (1 << row))
morita 0:c0be4e018a09 582 lcdWriteData(fgColour >> 8, fgColour);
morita 0:c0be4e018a09 583 else lcdWriteData(bgColour >> 8, bgColour);
morita 0:c0be4e018a09 584 }
morita 0:c0be4e018a09 585 }
morita 0:c0be4e018a09 586 }
morita 0:c0be4e018a09 587
morita 0:c0be4e018a09 588 // Plot a string of characters to the LCD
morita 0:c0be4e018a09 589 void lcdPutS(const char *string, uint8_t x, uint8_t y, uint16_t fgColour, uint16_t bgColour)
morita 0:c0be4e018a09 590 {
morita 0:c0be4e018a09 591 uint8_t origin = x;
morita 0:c0be4e018a09 592
morita 0:c0be4e018a09 593 for (uint8_t characterNumber = 0; characterNumber < strlen(string); characterNumber++)
morita 0:c0be4e018a09 594 {
morita 0:c0be4e018a09 595 // Check if we are out of bounds and move to
morita 0:c0be4e018a09 596 // the next line if we are
morita 0:c0be4e018a09 597 if (x > 121)
morita 0:c0be4e018a09 598 {
morita 0:c0be4e018a09 599 x = origin;
morita 0:c0be4e018a09 600 y += 8;
morita 0:c0be4e018a09 601 }
morita 0:c0be4e018a09 602
morita 0:c0be4e018a09 603 // If we move past the bottom of the screen just exit
morita 0:c0be4e018a09 604 if (y > 120) break;
morita 0:c0be4e018a09 605
morita 0:c0be4e018a09 606 // Plot the current character
morita 0:c0be4e018a09 607 lcdPutCh(string[characterNumber], x, y, fgColour, bgColour);
morita 0:c0be4e018a09 608 x += 6;
morita 0:c0be4e018a09 609 }
morita 0:c0be4e018a09 610 }