Aitendo OLED device driver library.

Dependents:   AitendoOLED_TestProgram

Committer:
shintamainjp
Date:
Sun Dec 19 07:46:13 2010 +0000
Revision:
2:74c60a959299
Parent:
1:4b819d5ea905
Bug fixed. The status bit 7 of the resister is not mean busy. It\s just a queue status.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:5062b7730235 1 /**
shintamainjp 0:5062b7730235 2 * =============================================================================
shintamainjp 2:74c60a959299 3 * Aitendo OLED device driver library. (Version 0.0.2)
shintamainjp 0:5062b7730235 4 *
shintamainjp 0:5062b7730235 5 * [The product]
shintamainjp 0:5062b7730235 6 * OLED-2P-095BWNN-SPI : http://www.aitendo.co.jp/product/2099
shintamainjp 0:5062b7730235 7 * ALO-095BWNN-J9 : http://www.aitendo.co.jp/product/1449
shintamainjp 0:5062b7730235 8 *
shintamainjp 0:5062b7730235 9 * [References]
shintamainjp 0:5062b7730235 10 * http://serdisplib.sourceforge.net/ser/doc/Treiber_IC-SSD1332_OLED_96x64_COLOR.pdf
shintamainjp 0:5062b7730235 11 * =============================================================================
shintamainjp 0:5062b7730235 12 * Copyright (c) 2010 Shinichiro Nakamura (CuBeatSystems)
shintamainjp 0:5062b7730235 13 *
shintamainjp 0:5062b7730235 14 * Permission is hereby granted, free of charge, to any person obtaining a copy
shintamainjp 0:5062b7730235 15 * of this software and associated documentation files (the "Software"), to deal
shintamainjp 0:5062b7730235 16 * in the Software without restriction, including without limitation the rights
shintamainjp 0:5062b7730235 17 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
shintamainjp 0:5062b7730235 18 * copies of the Software, and to permit persons to whom the Software is
shintamainjp 0:5062b7730235 19 * furnished to do so, subject to the following conditions:
shintamainjp 0:5062b7730235 20 *
shintamainjp 0:5062b7730235 21 * The above copyright notice and this permission notice shall be included in
shintamainjp 0:5062b7730235 22 * all copies or substantial portions of the Software.
shintamainjp 0:5062b7730235 23 *
shintamainjp 0:5062b7730235 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
shintamainjp 0:5062b7730235 25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
shintamainjp 0:5062b7730235 26 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
shintamainjp 0:5062b7730235 27 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
shintamainjp 0:5062b7730235 28 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
shintamainjp 0:5062b7730235 29 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
shintamainjp 0:5062b7730235 30 * THE SOFTWARE.
shintamainjp 0:5062b7730235 31 * =============================================================================
shintamainjp 0:5062b7730235 32 */
shintamainjp 0:5062b7730235 33 #include "AitendoOLED.h"
shintamainjp 0:5062b7730235 34
shintamainjp 0:5062b7730235 35 #define RES_ENA() io_res = 0
shintamainjp 0:5062b7730235 36 #define RES_DIS() io_res = 1
shintamainjp 0:5062b7730235 37 #define CS_ENA() io_cs = 0
shintamainjp 0:5062b7730235 38 #define CS_DIS() io_cs = 1
shintamainjp 0:5062b7730235 39 #define DC_CMD() io_dc = 0
shintamainjp 0:5062b7730235 40 #define DC_DAT() io_dc = 1
shintamainjp 0:5062b7730235 41 #define SPI_WRITE(a) io_spi.write((a))
shintamainjp 0:5062b7730235 42 #define SPI_READ() io_spi.write(0x00)
shintamainjp 2:74c60a959299 43 #define WAIT_US(a) wait_us((a))
shintamainjp 0:5062b7730235 44 #define swap(a,b) {int c=a;a=b;b=c;}
shintamainjp 0:5062b7730235 45
shintamainjp 0:5062b7730235 46 /**
shintamainjp 0:5062b7730235 47 * Create.
shintamainjp 0:5062b7730235 48 *
shintamainjp 0:5062b7730235 49 * @param pin_mosi MOSI.
shintamainjp 0:5062b7730235 50 * @param pin miso MISO.
shintamainjp 0:5062b7730235 51 * @param pin_sclk SCLK.
shintamainjp 0:5062b7730235 52 * @param pin_res RES.
shintamainjp 0:5062b7730235 53 * @param pin_cs CS.
shintamainjp 0:5062b7730235 54 * @param pin_dc DC.
shintamainjp 0:5062b7730235 55 */
shintamainjp 0:5062b7730235 56 AitendoOLED::AitendoOLED(
shintamainjp 0:5062b7730235 57 PinName pin_mosi,
shintamainjp 0:5062b7730235 58 PinName pin_miso,
shintamainjp 0:5062b7730235 59 PinName pin_sclk,
shintamainjp 0:5062b7730235 60 PinName pin_res,
shintamainjp 0:5062b7730235 61 PinName pin_cs,
shintamainjp 0:5062b7730235 62 PinName pin_dc)
shintamainjp 0:5062b7730235 63 :
shintamainjp 0:5062b7730235 64 io_spi(pin_mosi, pin_miso, pin_sclk),
shintamainjp 0:5062b7730235 65 io_res(pin_res),
shintamainjp 0:5062b7730235 66 io_cs(pin_cs),
shintamainjp 0:5062b7730235 67 io_dc(pin_dc) {
shintamainjp 0:5062b7730235 68 io_spi.format(8, 0);
shintamainjp 0:5062b7730235 69 #if 0
shintamainjp 0:5062b7730235 70 io_spi.frequency(4000000);
shintamainjp 0:5062b7730235 71 #else
shintamainjp 0:5062b7730235 72 io_spi.frequency(40000000);
shintamainjp 0:5062b7730235 73 #endif
shintamainjp 0:5062b7730235 74 reset();
shintamainjp 0:5062b7730235 75 }
shintamainjp 0:5062b7730235 76
shintamainjp 0:5062b7730235 77 /**
shintamainjp 0:5062b7730235 78 * Dispose.
shintamainjp 0:5062b7730235 79 */
shintamainjp 0:5062b7730235 80 AitendoOLED::~AitendoOLED() {
shintamainjp 0:5062b7730235 81 }
shintamainjp 0:5062b7730235 82
shintamainjp 0:5062b7730235 83 /**
shintamainjp 0:5062b7730235 84 * Draw pixel.
shintamainjp 0:5062b7730235 85 *
shintamainjp 0:5062b7730235 86 * @param x X.
shintamainjp 0:5062b7730235 87 * @param y Y.
shintamainjp 0:5062b7730235 88 * @param c Color.
shintamainjp 0:5062b7730235 89 */
shintamainjp 0:5062b7730235 90 void AitendoOLED::drawPixel(int x, int y, Color c) {
shintamainjp 0:5062b7730235 91 setColumnAddress(x, x);
shintamainjp 0:5062b7730235 92 setRowAddress(y, y);
shintamainjp 0:5062b7730235 93 c.b = c.b >> 3;
shintamainjp 0:5062b7730235 94 c.g = c.g >> 2;
shintamainjp 0:5062b7730235 95 c.r = c.r >> 3;
shintamainjp 0:5062b7730235 96 writeData((((c.b << 3) & 0xF8) | ((c.g >> 3) & 0x07)));
shintamainjp 0:5062b7730235 97 writeData((((c.g << 5) & 0xE0) | ((c.r >> 0) & 0x1F)));
shintamainjp 0:5062b7730235 98 }
shintamainjp 0:5062b7730235 99
shintamainjp 0:5062b7730235 100 /**
shintamainjp 0:5062b7730235 101 * Draw line.
shintamainjp 0:5062b7730235 102 *
shintamainjp 0:5062b7730235 103 * @param x1 X1.
shintamainjp 0:5062b7730235 104 * @param y1 Y1.
shintamainjp 0:5062b7730235 105 * @param x2 X2.
shintamainjp 0:5062b7730235 106 * @param y2 Y2.
shintamainjp 0:5062b7730235 107 * @param c Color.
shintamainjp 0:5062b7730235 108 */
shintamainjp 0:5062b7730235 109 void AitendoOLED::drawLine(int x1, int y1, int x2, int y2, Color c) {
shintamainjp 0:5062b7730235 110 #if 0
shintamainjp 0:5062b7730235 111 DC_CMD();
shintamainjp 0:5062b7730235 112 CS_ENA();
shintamainjp 0:5062b7730235 113 SPI_WRITE(0x21);
shintamainjp 0:5062b7730235 114 SPI_WRITE(x1);
shintamainjp 0:5062b7730235 115 SPI_WRITE(y1);
shintamainjp 0:5062b7730235 116 SPI_WRITE(x2);
shintamainjp 0:5062b7730235 117 SPI_WRITE(y2);
shintamainjp 1:4b819d5ea905 118 SPI_WRITE(c.b >> 3);
shintamainjp 1:4b819d5ea905 119 SPI_WRITE(c.g >> 2);
shintamainjp 1:4b819d5ea905 120 SPI_WRITE(c.r >> 3);
shintamainjp 0:5062b7730235 121 CS_DIS();
shintamainjp 2:74c60a959299 122 WAIT_US(100);
shintamainjp 0:5062b7730235 123 #else
shintamainjp 0:5062b7730235 124 /*
shintamainjp 0:5062b7730235 125 * Bresenham's line algorithm
shintamainjp 0:5062b7730235 126 */
shintamainjp 0:5062b7730235 127 bool steep = abs(y2 - y1) > abs(x2 - x1);
shintamainjp 0:5062b7730235 128 if (steep) {
shintamainjp 0:5062b7730235 129 swap(x1, y1);
shintamainjp 0:5062b7730235 130 swap(x2, y2);
shintamainjp 0:5062b7730235 131 }
shintamainjp 0:5062b7730235 132 if (x1 > x2) {
shintamainjp 0:5062b7730235 133 swap(x1, x2);
shintamainjp 0:5062b7730235 134 swap(y1, y2);
shintamainjp 0:5062b7730235 135 }
shintamainjp 0:5062b7730235 136 int deltax = x2 - x1;
shintamainjp 0:5062b7730235 137 int deltay = abs(y2 - y1);
shintamainjp 0:5062b7730235 138 int error = deltax / 2;
shintamainjp 0:5062b7730235 139 int ystep;
shintamainjp 0:5062b7730235 140 int y = y1;
shintamainjp 0:5062b7730235 141 if (y1 < y2) {
shintamainjp 0:5062b7730235 142 ystep = 1;
shintamainjp 0:5062b7730235 143 } else {
shintamainjp 0:5062b7730235 144 ystep = -1;
shintamainjp 0:5062b7730235 145 }
shintamainjp 0:5062b7730235 146 for (int x = x1; x <= x2; x++) {
shintamainjp 0:5062b7730235 147 if (steep) {
shintamainjp 0:5062b7730235 148 drawPixel(y, x, c);
shintamainjp 0:5062b7730235 149 } else {
shintamainjp 0:5062b7730235 150 drawPixel(x, y, c);
shintamainjp 0:5062b7730235 151 }
shintamainjp 0:5062b7730235 152 error = error - deltay;
shintamainjp 0:5062b7730235 153 if (error < 0) {
shintamainjp 0:5062b7730235 154 y = y + ystep;
shintamainjp 0:5062b7730235 155 error = error + deltax;
shintamainjp 0:5062b7730235 156 }
shintamainjp 0:5062b7730235 157 }
shintamainjp 0:5062b7730235 158 #endif
shintamainjp 0:5062b7730235 159 }
shintamainjp 0:5062b7730235 160
shintamainjp 0:5062b7730235 161 /**
shintamainjp 0:5062b7730235 162 * Fill box.
shintamainjp 0:5062b7730235 163 *
shintamainjp 0:5062b7730235 164 * @param x1 X1.
shintamainjp 0:5062b7730235 165 * @param y1 Y1.
shintamainjp 0:5062b7730235 166 * @param x2 X2.
shintamainjp 0:5062b7730235 167 * @param y2 Y2.
shintamainjp 0:5062b7730235 168 * @param c1 Color1.
shintamainjp 0:5062b7730235 169 * @param c2 Color2.
shintamainjp 0:5062b7730235 170 */
shintamainjp 0:5062b7730235 171 void AitendoOLED::fillBox(int x1, int y1, int x2, int y2, Color c1, Color c2) {
shintamainjp 0:5062b7730235 172 DC_CMD();
shintamainjp 0:5062b7730235 173 CS_ENA();
shintamainjp 0:5062b7730235 174 SPI_WRITE(0x22);
shintamainjp 0:5062b7730235 175 SPI_WRITE(x1);
shintamainjp 0:5062b7730235 176 SPI_WRITE(y1);
shintamainjp 0:5062b7730235 177 SPI_WRITE(x2);
shintamainjp 0:5062b7730235 178 SPI_WRITE(y2);
shintamainjp 1:4b819d5ea905 179 SPI_WRITE(c1.b >> 3);
shintamainjp 1:4b819d5ea905 180 SPI_WRITE(c1.g >> 2);
shintamainjp 1:4b819d5ea905 181 SPI_WRITE(c1.r >> 3);
shintamainjp 1:4b819d5ea905 182 SPI_WRITE(c2.b >> 3);
shintamainjp 1:4b819d5ea905 183 SPI_WRITE(c2.g >> 2);
shintamainjp 1:4b819d5ea905 184 SPI_WRITE(c2.r >> 3);
shintamainjp 0:5062b7730235 185 CS_DIS();
shintamainjp 2:74c60a959299 186 WAIT_US(400);
shintamainjp 0:5062b7730235 187 }
shintamainjp 0:5062b7730235 188
shintamainjp 0:5062b7730235 189 /**
shintamainjp 0:5062b7730235 190 * Copy.
shintamainjp 0:5062b7730235 191 *
shintamainjp 0:5062b7730235 192 * @param x1 X1.
shintamainjp 0:5062b7730235 193 * @param y1 Y1.
shintamainjp 0:5062b7730235 194 * @param x2 X2.
shintamainjp 0:5062b7730235 195 * @param y2 Y2.
shintamainjp 0:5062b7730235 196 * @param nx X of the destination.
shintamainjp 0:5062b7730235 197 * @param ny Y of the destination.
shintamainjp 0:5062b7730235 198 */
shintamainjp 0:5062b7730235 199 void AitendoOLED::copy(int x1, int y1, int x2, int y2, int nx, int ny) {
shintamainjp 0:5062b7730235 200 DC_CMD();
shintamainjp 0:5062b7730235 201 CS_ENA();
shintamainjp 0:5062b7730235 202 SPI_WRITE(0x23);
shintamainjp 0:5062b7730235 203 SPI_WRITE(x1);
shintamainjp 0:5062b7730235 204 SPI_WRITE(y1);
shintamainjp 0:5062b7730235 205 SPI_WRITE(x2);
shintamainjp 0:5062b7730235 206 SPI_WRITE(y2);
shintamainjp 0:5062b7730235 207 SPI_WRITE(nx);
shintamainjp 0:5062b7730235 208 SPI_WRITE(ny);
shintamainjp 0:5062b7730235 209 CS_DIS();
shintamainjp 2:74c60a959299 210 WAIT_US(400);
shintamainjp 0:5062b7730235 211 }
shintamainjp 0:5062b7730235 212
shintamainjp 0:5062b7730235 213 /**
shintamainjp 0:5062b7730235 214 * Darker.
shintamainjp 0:5062b7730235 215 *
shintamainjp 0:5062b7730235 216 * @param x1 X1.
shintamainjp 0:5062b7730235 217 * @param y1 Y1.
shintamainjp 0:5062b7730235 218 * @param x2 X2.
shintamainjp 0:5062b7730235 219 * @param y2 Y2.
shintamainjp 0:5062b7730235 220 */
shintamainjp 0:5062b7730235 221 void AitendoOLED::darker(int x1, int y1, int x2, int y2) {
shintamainjp 0:5062b7730235 222 DC_CMD();
shintamainjp 0:5062b7730235 223 CS_ENA();
shintamainjp 0:5062b7730235 224 SPI_WRITE(0x24);
shintamainjp 0:5062b7730235 225 SPI_WRITE(x1);
shintamainjp 0:5062b7730235 226 SPI_WRITE(y1);
shintamainjp 0:5062b7730235 227 SPI_WRITE(x2);
shintamainjp 0:5062b7730235 228 SPI_WRITE(y2);
shintamainjp 0:5062b7730235 229 CS_DIS();
shintamainjp 2:74c60a959299 230 WAIT_US(400);
shintamainjp 0:5062b7730235 231 }
shintamainjp 0:5062b7730235 232
shintamainjp 0:5062b7730235 233 /**
shintamainjp 0:5062b7730235 234 * Clear.
shintamainjp 0:5062b7730235 235 *
shintamainjp 0:5062b7730235 236 * @param x1 X1.
shintamainjp 0:5062b7730235 237 * @param y1 Y1.
shintamainjp 0:5062b7730235 238 * @param x2 X2.
shintamainjp 0:5062b7730235 239 * @param y2 Y2.
shintamainjp 0:5062b7730235 240 */
shintamainjp 0:5062b7730235 241 void AitendoOLED::clear(int x1, int y1, int x2, int y2) {
shintamainjp 2:74c60a959299 242 #if 1
shintamainjp 0:5062b7730235 243 DC_CMD();
shintamainjp 0:5062b7730235 244 CS_ENA();
shintamainjp 0:5062b7730235 245 SPI_WRITE(0x25);
shintamainjp 0:5062b7730235 246 SPI_WRITE(x1);
shintamainjp 0:5062b7730235 247 SPI_WRITE(y1);
shintamainjp 0:5062b7730235 248 SPI_WRITE(x2);
shintamainjp 0:5062b7730235 249 SPI_WRITE(y2);
shintamainjp 0:5062b7730235 250 CS_DIS();
shintamainjp 2:74c60a959299 251 WAIT_US(400);
shintamainjp 2:74c60a959299 252 #else
shintamainjp 2:74c60a959299 253 AitendoOLED::Color c;
shintamainjp 2:74c60a959299 254 c.r = 0x00;
shintamainjp 2:74c60a959299 255 c.g = 0x00;
shintamainjp 2:74c60a959299 256 c.b = 0x00;
shintamainjp 2:74c60a959299 257 for (int x = x1; x <= x2; x++) {
shintamainjp 2:74c60a959299 258 for (int y = y1; y <= y2; y++) {
shintamainjp 2:74c60a959299 259 drawPixel(x, y, c);
shintamainjp 2:74c60a959299 260 }
shintamainjp 2:74c60a959299 261 }
shintamainjp 2:74c60a959299 262 #endif
shintamainjp 0:5062b7730235 263 }
shintamainjp 0:5062b7730235 264
shintamainjp 0:5062b7730235 265 /**
shintamainjp 0:5062b7730235 266 * Reset.
shintamainjp 0:5062b7730235 267 */
shintamainjp 0:5062b7730235 268 void AitendoOLED::reset() {
shintamainjp 0:5062b7730235 269
shintamainjp 0:5062b7730235 270 RES_ENA();
shintamainjp 2:74c60a959299 271 WAIT_US(200 * 1000);
shintamainjp 0:5062b7730235 272 RES_DIS();
shintamainjp 2:74c60a959299 273 WAIT_US(200 * 1000);
shintamainjp 0:5062b7730235 274
shintamainjp 0:5062b7730235 275 setDisplayOnOff(false);
shintamainjp 0:5062b7730235 276 setRowAddress(0, 63);
shintamainjp 0:5062b7730235 277 setColumnAddress(0, 95);
shintamainjp 0:5062b7730235 278 setRemapAndDataFormat(0x70);
shintamainjp 0:5062b7730235 279 setDisplayStartLine(0);
shintamainjp 0:5062b7730235 280 setDisplayOffset(0);
shintamainjp 0:5062b7730235 281 setDisplayMode(AitendoOLED::NormalDisplay);
shintamainjp 0:5062b7730235 282 setMultiplexRatio(0x3f);
shintamainjp 0:5062b7730235 283 setMasterCurrentControl(0x8f);
shintamainjp 0:5062b7730235 284 setPowerSavingMode(0x00);
shintamainjp 0:5062b7730235 285 setPhasePeriod(0x74);
shintamainjp 0:5062b7730235 286 setDisplayClockDivideRatio(0xD0);
shintamainjp 0:5062b7730235 287 setSecondPreChargeSpeedForColorA(0x80);
shintamainjp 0:5062b7730235 288 setSecondPreChargeSpeedForColorB(0x80);
shintamainjp 0:5062b7730235 289 setSecondPreChargeSpeedForColorC(0x80);
shintamainjp 0:5062b7730235 290 setPreChargeLevelForColorA(0x3F);
shintamainjp 0:5062b7730235 291 setPreChargeLevelForColorB(0x3F);
shintamainjp 0:5062b7730235 292 setPreChargeLevelForColorC(0x3F);
shintamainjp 0:5062b7730235 293 setVCOMH(0x3E);
shintamainjp 0:5062b7730235 294 setMasterCurrentControl(0x0F);
shintamainjp 0:5062b7730235 295 // A:Blue, B:Green, C:Red
shintamainjp 0:5062b7730235 296 setContrastForColorA(0x80);
shintamainjp 0:5062b7730235 297 setContrastForColorB(0x80);
shintamainjp 0:5062b7730235 298 setContrastForColorC(0x80);
shintamainjp 0:5062b7730235 299 setMode(true, false);
shintamainjp 0:5062b7730235 300 setDisplayOnOff(true);
shintamainjp 0:5062b7730235 301 }
shintamainjp 0:5062b7730235 302
shintamainjp 0:5062b7730235 303 /**
shintamainjp 0:5062b7730235 304 * Write data.
shintamainjp 0:5062b7730235 305 *
shintamainjp 0:5062b7730235 306 * @param data Data.
shintamainjp 0:5062b7730235 307 */
shintamainjp 0:5062b7730235 308 void AitendoOLED::writeData(uint8_t data) {
shintamainjp 0:5062b7730235 309 DC_DAT();
shintamainjp 0:5062b7730235 310 CS_ENA();
shintamainjp 0:5062b7730235 311 SPI_WRITE(data);
shintamainjp 0:5062b7730235 312 CS_DIS();
shintamainjp 0:5062b7730235 313 }
shintamainjp 0:5062b7730235 314
shintamainjp 0:5062b7730235 315 /**
shintamainjp 0:5062b7730235 316 * Set mode.
shintamainjp 0:5062b7730235 317 *
shintamainjp 0:5062b7730235 318 * @param fillrect Fill the rectangle.
shintamainjp 0:5062b7730235 319 * @param revcopy Reverse copy.
shintamainjp 0:5062b7730235 320 */
shintamainjp 0:5062b7730235 321 void AitendoOLED::setMode(bool fillrect, bool revcopy) {
shintamainjp 0:5062b7730235 322 uint8_t val = 0x00;
shintamainjp 0:5062b7730235 323 if (fillrect) {
shintamainjp 0:5062b7730235 324 val |= 1 << 0;
shintamainjp 0:5062b7730235 325 }
shintamainjp 0:5062b7730235 326 if (revcopy) {
shintamainjp 0:5062b7730235 327 val |= 1 << 4;
shintamainjp 0:5062b7730235 328 }
shintamainjp 0:5062b7730235 329 DC_CMD();
shintamainjp 0:5062b7730235 330 CS_ENA();
shintamainjp 0:5062b7730235 331 SPI_WRITE(0x26);
shintamainjp 0:5062b7730235 332 SPI_WRITE(val);
shintamainjp 0:5062b7730235 333 CS_DIS();
shintamainjp 0:5062b7730235 334 }
shintamainjp 0:5062b7730235 335
shintamainjp 0:5062b7730235 336 /**
shintamainjp 0:5062b7730235 337 * Set column address.
shintamainjp 0:5062b7730235 338 *
shintamainjp 0:5062b7730235 339 * @param start Start address. (0-95)
shintamainjp 0:5062b7730235 340 * @param end End address. (0-95)
shintamainjp 0:5062b7730235 341 */
shintamainjp 0:5062b7730235 342 void AitendoOLED::setColumnAddress(int start, int end) {
shintamainjp 0:5062b7730235 343 DC_CMD();
shintamainjp 0:5062b7730235 344 CS_ENA();
shintamainjp 0:5062b7730235 345 SPI_WRITE(0x15);
shintamainjp 0:5062b7730235 346 SPI_WRITE(start);
shintamainjp 0:5062b7730235 347 SPI_WRITE(end);
shintamainjp 0:5062b7730235 348 CS_DIS();
shintamainjp 0:5062b7730235 349 }
shintamainjp 0:5062b7730235 350
shintamainjp 0:5062b7730235 351 /**
shintamainjp 0:5062b7730235 352 * Set row address.
shintamainjp 0:5062b7730235 353 *
shintamainjp 0:5062b7730235 354 * @param start Start address. (0-63)
shintamainjp 0:5062b7730235 355 * @param end End address. (0-63)
shintamainjp 0:5062b7730235 356 */
shintamainjp 0:5062b7730235 357 void AitendoOLED::setRowAddress(int start, int end) {
shintamainjp 0:5062b7730235 358 DC_CMD();
shintamainjp 0:5062b7730235 359 CS_ENA();
shintamainjp 0:5062b7730235 360 SPI_WRITE(0x75);
shintamainjp 0:5062b7730235 361 SPI_WRITE(start);
shintamainjp 0:5062b7730235 362 SPI_WRITE(end);
shintamainjp 0:5062b7730235 363 CS_DIS();
shintamainjp 0:5062b7730235 364 }
shintamainjp 0:5062b7730235 365
shintamainjp 0:5062b7730235 366 /**
shintamainjp 0:5062b7730235 367 * Set contrast for Color A.
shintamainjp 0:5062b7730235 368 *
shintamainjp 0:5062b7730235 369 * @param contrast Contrast. (Default:0x80)
shintamainjp 0:5062b7730235 370 */
shintamainjp 0:5062b7730235 371 void AitendoOLED::setContrastForColorA(int contrast) {
shintamainjp 0:5062b7730235 372 DC_CMD();
shintamainjp 0:5062b7730235 373 CS_ENA();
shintamainjp 0:5062b7730235 374 SPI_WRITE(0x81);
shintamainjp 0:5062b7730235 375 SPI_WRITE(contrast);
shintamainjp 0:5062b7730235 376 CS_DIS();
shintamainjp 0:5062b7730235 377 }
shintamainjp 0:5062b7730235 378
shintamainjp 0:5062b7730235 379 /**
shintamainjp 0:5062b7730235 380 * Set contrast for Color B.
shintamainjp 0:5062b7730235 381 *
shintamainjp 0:5062b7730235 382 * @param contrast Contrast. (Default:0x80)
shintamainjp 0:5062b7730235 383 */
shintamainjp 0:5062b7730235 384 void AitendoOLED::setContrastForColorB(int contrast) {
shintamainjp 0:5062b7730235 385 DC_CMD();
shintamainjp 0:5062b7730235 386 CS_ENA();
shintamainjp 0:5062b7730235 387 SPI_WRITE(0x82);
shintamainjp 0:5062b7730235 388 SPI_WRITE(contrast);
shintamainjp 0:5062b7730235 389 CS_DIS();
shintamainjp 0:5062b7730235 390 }
shintamainjp 0:5062b7730235 391
shintamainjp 0:5062b7730235 392 /**
shintamainjp 0:5062b7730235 393 * Set contrast for Color C.
shintamainjp 0:5062b7730235 394 *
shintamainjp 0:5062b7730235 395 * @param contrast Contrast. (Default:0x80)
shintamainjp 0:5062b7730235 396 */
shintamainjp 0:5062b7730235 397 void AitendoOLED::setContrastForColorC(int contrast) {
shintamainjp 0:5062b7730235 398 DC_CMD();
shintamainjp 0:5062b7730235 399 CS_ENA();
shintamainjp 0:5062b7730235 400 SPI_WRITE(0x83);
shintamainjp 0:5062b7730235 401 SPI_WRITE(contrast);
shintamainjp 0:5062b7730235 402 CS_DIS();
shintamainjp 0:5062b7730235 403 }
shintamainjp 0:5062b7730235 404
shintamainjp 0:5062b7730235 405 /**
shintamainjp 0:5062b7730235 406 * Set master current control value.
shintamainjp 0:5062b7730235 407 *
shintamainjp 0:5062b7730235 408 * @param current Current value. (0x00-0x0F)
shintamainjp 0:5062b7730235 409 */
shintamainjp 0:5062b7730235 410 void AitendoOLED::setMasterCurrentControl(int current) {
shintamainjp 0:5062b7730235 411 DC_CMD();
shintamainjp 0:5062b7730235 412 CS_ENA();
shintamainjp 0:5062b7730235 413 SPI_WRITE(0x87);
shintamainjp 0:5062b7730235 414 SPI_WRITE(current);
shintamainjp 0:5062b7730235 415 CS_DIS();
shintamainjp 0:5062b7730235 416 }
shintamainjp 0:5062b7730235 417
shintamainjp 0:5062b7730235 418 /**
shintamainjp 0:5062b7730235 419 * Set remapping mode and the data format.
shintamainjp 0:5062b7730235 420 *
shintamainjp 0:5062b7730235 421 * @param mode See the document.
shintamainjp 0:5062b7730235 422 */
shintamainjp 0:5062b7730235 423 void AitendoOLED::setRemapAndDataFormat(int mode) {
shintamainjp 0:5062b7730235 424 DC_CMD();
shintamainjp 0:5062b7730235 425 CS_ENA();
shintamainjp 0:5062b7730235 426 SPI_WRITE(0xA0);
shintamainjp 0:5062b7730235 427 SPI_WRITE(mode);
shintamainjp 0:5062b7730235 428 CS_DIS();
shintamainjp 0:5062b7730235 429 }
shintamainjp 0:5062b7730235 430
shintamainjp 0:5062b7730235 431 /**
shintamainjp 0:5062b7730235 432 * Set display start line.
shintamainjp 0:5062b7730235 433 *
shintamainjp 0:5062b7730235 434 * @param line Start line number. (0-63)
shintamainjp 0:5062b7730235 435 */
shintamainjp 0:5062b7730235 436 void AitendoOLED::setDisplayStartLine(int line) {
shintamainjp 0:5062b7730235 437 DC_CMD();
shintamainjp 0:5062b7730235 438 CS_ENA();
shintamainjp 0:5062b7730235 439 SPI_WRITE(0xA1);
shintamainjp 0:5062b7730235 440 SPI_WRITE(line);
shintamainjp 0:5062b7730235 441 CS_DIS();
shintamainjp 0:5062b7730235 442 }
shintamainjp 0:5062b7730235 443
shintamainjp 0:5062b7730235 444 /**
shintamainjp 0:5062b7730235 445 * Set display offset line.
shintamainjp 0:5062b7730235 446 *
shintamainjp 0:5062b7730235 447 * @param offset Offset line number. (0-63)
shintamainjp 0:5062b7730235 448 */
shintamainjp 0:5062b7730235 449 void AitendoOLED::setDisplayOffset(int offset) {
shintamainjp 0:5062b7730235 450 DC_CMD();
shintamainjp 0:5062b7730235 451 CS_ENA();
shintamainjp 0:5062b7730235 452 SPI_WRITE(0xA2);
shintamainjp 0:5062b7730235 453 SPI_WRITE(offset);
shintamainjp 0:5062b7730235 454 CS_DIS();
shintamainjp 0:5062b7730235 455 }
shintamainjp 0:5062b7730235 456
shintamainjp 0:5062b7730235 457 /**
shintamainjp 0:5062b7730235 458 * Set display mode.
shintamainjp 0:5062b7730235 459 *
shintamainjp 0:5062b7730235 460 * @param mode Display mode.
shintamainjp 0:5062b7730235 461 */
shintamainjp 0:5062b7730235 462 void AitendoOLED::setDisplayMode(DisplayMode mode) {
shintamainjp 0:5062b7730235 463 int val = 0;
shintamainjp 0:5062b7730235 464 switch (mode) {
shintamainjp 0:5062b7730235 465 case NormalDisplay:
shintamainjp 0:5062b7730235 466 val = 0xA4;
shintamainjp 0:5062b7730235 467 break;
shintamainjp 0:5062b7730235 468 case EntireDisplayOn:
shintamainjp 0:5062b7730235 469 val = 0xA5;
shintamainjp 0:5062b7730235 470 break;
shintamainjp 0:5062b7730235 471 case EntireDisplayOff:
shintamainjp 0:5062b7730235 472 val = 0xA6;
shintamainjp 0:5062b7730235 473 break;
shintamainjp 0:5062b7730235 474 case InverseDisplay:
shintamainjp 0:5062b7730235 475 val = 0xA7;
shintamainjp 0:5062b7730235 476 break;
shintamainjp 0:5062b7730235 477 default:
shintamainjp 0:5062b7730235 478 break;
shintamainjp 0:5062b7730235 479 }
shintamainjp 0:5062b7730235 480 if (val != 0) {
shintamainjp 0:5062b7730235 481 DC_CMD();
shintamainjp 0:5062b7730235 482 CS_ENA();
shintamainjp 0:5062b7730235 483 SPI_WRITE(val);
shintamainjp 0:5062b7730235 484 CS_DIS();
shintamainjp 0:5062b7730235 485 }
shintamainjp 0:5062b7730235 486 }
shintamainjp 0:5062b7730235 487
shintamainjp 0:5062b7730235 488 /**
shintamainjp 0:5062b7730235 489 * Set multiplex ratio.
shintamainjp 0:5062b7730235 490 *
shintamainjp 0:5062b7730235 491 * @param ratio Ratio.
shintamainjp 0:5062b7730235 492 */
shintamainjp 0:5062b7730235 493 void AitendoOLED::setMultiplexRatio(int ratio) {
shintamainjp 0:5062b7730235 494 DC_CMD();
shintamainjp 0:5062b7730235 495 CS_ENA();
shintamainjp 0:5062b7730235 496 SPI_WRITE(0xA8);
shintamainjp 0:5062b7730235 497 SPI_WRITE(ratio);
shintamainjp 0:5062b7730235 498 CS_DIS();
shintamainjp 0:5062b7730235 499 }
shintamainjp 0:5062b7730235 500
shintamainjp 0:5062b7730235 501 /**
shintamainjp 0:5062b7730235 502 * Set display on/off.
shintamainjp 0:5062b7730235 503 *
shintamainjp 0:5062b7730235 504 * @param on On.
shintamainjp 0:5062b7730235 505 */
shintamainjp 0:5062b7730235 506 void AitendoOLED::setDisplayOnOff(bool on) {
shintamainjp 0:5062b7730235 507 if (on) {
shintamainjp 0:5062b7730235 508 DC_CMD();
shintamainjp 0:5062b7730235 509 CS_ENA();
shintamainjp 0:5062b7730235 510 SPI_WRITE(0xAF);
shintamainjp 0:5062b7730235 511 CS_DIS();
shintamainjp 0:5062b7730235 512 } else {
shintamainjp 0:5062b7730235 513 DC_CMD();
shintamainjp 0:5062b7730235 514 CS_ENA();
shintamainjp 0:5062b7730235 515 SPI_WRITE(0xAE);
shintamainjp 0:5062b7730235 516 CS_DIS();
shintamainjp 0:5062b7730235 517 }
shintamainjp 0:5062b7730235 518 }
shintamainjp 0:5062b7730235 519
shintamainjp 0:5062b7730235 520 /**
shintamainjp 0:5062b7730235 521 * Set gray scale table.
shintamainjp 0:5062b7730235 522 *
shintamainjp 0:5062b7730235 523 * @param p A pointer to the look up table.
shintamainjp 0:5062b7730235 524 */
shintamainjp 0:5062b7730235 525 void AitendoOLED::setGrayScaleTable(gray_scale_table_t *p) {
shintamainjp 0:5062b7730235 526 DC_CMD();
shintamainjp 0:5062b7730235 527 CS_ENA();
shintamainjp 0:5062b7730235 528 SPI_WRITE(0xB8);
shintamainjp 0:5062b7730235 529 for (int i = 0; i < 32; i++) {
shintamainjp 0:5062b7730235 530 SPI_WRITE(p->data[i]);
shintamainjp 0:5062b7730235 531 }
shintamainjp 0:5062b7730235 532 CS_DIS();
shintamainjp 0:5062b7730235 533 }
shintamainjp 0:5062b7730235 534
shintamainjp 0:5062b7730235 535 /**
shintamainjp 0:5062b7730235 536 * NOP.
shintamainjp 0:5062b7730235 537 */
shintamainjp 0:5062b7730235 538 void AitendoOLED::nop() {
shintamainjp 0:5062b7730235 539 DC_CMD();
shintamainjp 0:5062b7730235 540 CS_ENA();
shintamainjp 0:5062b7730235 541 SPI_WRITE(0xE3);
shintamainjp 0:5062b7730235 542 CS_DIS();
shintamainjp 0:5062b7730235 543 }
shintamainjp 0:5062b7730235 544
shintamainjp 0:5062b7730235 545 /**
shintamainjp 0:5062b7730235 546 * Set power saving mode.
shintamainjp 0:5062b7730235 547 *
shintamainjp 0:5062b7730235 548 * @param value Value. (0x00:None, 0x12:power saving)
shintamainjp 0:5062b7730235 549 */
shintamainjp 0:5062b7730235 550 void AitendoOLED::setPowerSavingMode(int value) {
shintamainjp 0:5062b7730235 551 DC_CMD();
shintamainjp 0:5062b7730235 552 CS_ENA();
shintamainjp 0:5062b7730235 553 SPI_WRITE(0xB0);
shintamainjp 0:5062b7730235 554 SPI_WRITE(value);
shintamainjp 0:5062b7730235 555 CS_DIS();
shintamainjp 0:5062b7730235 556 }
shintamainjp 0:5062b7730235 557
shintamainjp 0:5062b7730235 558 /**
shintamainjp 0:5062b7730235 559 * Set phase period.
shintamainjp 0:5062b7730235 560 *
shintamainjp 0:5062b7730235 561 * @param value Value. (Default:0x74)
shintamainjp 0:5062b7730235 562 */
shintamainjp 0:5062b7730235 563 void AitendoOLED::setPhasePeriod(int value) {
shintamainjp 0:5062b7730235 564 DC_CMD();
shintamainjp 0:5062b7730235 565 CS_ENA();
shintamainjp 0:5062b7730235 566 SPI_WRITE(0xB1);
shintamainjp 0:5062b7730235 567 SPI_WRITE(value);
shintamainjp 0:5062b7730235 568 CS_DIS();
shintamainjp 0:5062b7730235 569 }
shintamainjp 0:5062b7730235 570
shintamainjp 0:5062b7730235 571 /**
shintamainjp 0:5062b7730235 572 * Set display clock divide ratio.
shintamainjp 0:5062b7730235 573 *
shintamainjp 0:5062b7730235 574 * @param value Value. (Default:0x00)
shintamainjp 0:5062b7730235 575 */
shintamainjp 0:5062b7730235 576 void AitendoOLED::setDisplayClockDivideRatio(int value) {
shintamainjp 0:5062b7730235 577 DC_CMD();
shintamainjp 0:5062b7730235 578 CS_ENA();
shintamainjp 0:5062b7730235 579 SPI_WRITE(0xB3);
shintamainjp 0:5062b7730235 580 SPI_WRITE(value);
shintamainjp 0:5062b7730235 581 CS_DIS();
shintamainjp 0:5062b7730235 582 }
shintamainjp 0:5062b7730235 583
shintamainjp 0:5062b7730235 584 /**
shintamainjp 0:5062b7730235 585 * Set second pre-charge speed for color A.
shintamainjp 0:5062b7730235 586 *
shintamainjp 0:5062b7730235 587 * @param value Value.
shintamainjp 0:5062b7730235 588 */
shintamainjp 0:5062b7730235 589 void AitendoOLED::setSecondPreChargeSpeedForColorA(int value) {
shintamainjp 0:5062b7730235 590 DC_CMD();
shintamainjp 0:5062b7730235 591 CS_ENA();
shintamainjp 0:5062b7730235 592 SPI_WRITE(0x8A);
shintamainjp 0:5062b7730235 593 SPI_WRITE(value);
shintamainjp 0:5062b7730235 594 CS_DIS();
shintamainjp 0:5062b7730235 595 }
shintamainjp 0:5062b7730235 596
shintamainjp 0:5062b7730235 597 /**
shintamainjp 0:5062b7730235 598 * Set second pre-charge speed for color B.
shintamainjp 0:5062b7730235 599 *
shintamainjp 0:5062b7730235 600 * @param value Value.
shintamainjp 0:5062b7730235 601 */
shintamainjp 0:5062b7730235 602 void AitendoOLED::setSecondPreChargeSpeedForColorB(int value) {
shintamainjp 0:5062b7730235 603 DC_CMD();
shintamainjp 0:5062b7730235 604 CS_ENA();
shintamainjp 0:5062b7730235 605 SPI_WRITE(0x8B);
shintamainjp 0:5062b7730235 606 SPI_WRITE(value);
shintamainjp 0:5062b7730235 607 CS_DIS();
shintamainjp 0:5062b7730235 608 }
shintamainjp 0:5062b7730235 609
shintamainjp 0:5062b7730235 610 /**
shintamainjp 0:5062b7730235 611 * Set second pre-charge speed for color C.
shintamainjp 0:5062b7730235 612 *
shintamainjp 0:5062b7730235 613 * @param value Value.
shintamainjp 0:5062b7730235 614 */
shintamainjp 0:5062b7730235 615 void AitendoOLED::setSecondPreChargeSpeedForColorC(int value) {
shintamainjp 0:5062b7730235 616 DC_CMD();
shintamainjp 0:5062b7730235 617 CS_ENA();
shintamainjp 0:5062b7730235 618 SPI_WRITE(0x8C);
shintamainjp 0:5062b7730235 619 SPI_WRITE(value);
shintamainjp 0:5062b7730235 620 CS_DIS();
shintamainjp 0:5062b7730235 621 }
shintamainjp 0:5062b7730235 622
shintamainjp 0:5062b7730235 623 /**
shintamainjp 0:5062b7730235 624 * Set pre charge level for color A.
shintamainjp 0:5062b7730235 625 *
shintamainjp 0:5062b7730235 626 * @param value The value.
shintamainjp 0:5062b7730235 627 */
shintamainjp 0:5062b7730235 628 void AitendoOLED::setPreChargeLevelForColorA(int value) {
shintamainjp 0:5062b7730235 629 DC_CMD();
shintamainjp 0:5062b7730235 630 CS_ENA();
shintamainjp 0:5062b7730235 631 SPI_WRITE(0xBB);
shintamainjp 0:5062b7730235 632 SPI_WRITE(value);
shintamainjp 0:5062b7730235 633 CS_DIS();
shintamainjp 0:5062b7730235 634 }
shintamainjp 0:5062b7730235 635
shintamainjp 0:5062b7730235 636 /**
shintamainjp 0:5062b7730235 637 * Set pre charge level for color B.
shintamainjp 0:5062b7730235 638 *
shintamainjp 0:5062b7730235 639 * @param value The value.
shintamainjp 0:5062b7730235 640 */
shintamainjp 0:5062b7730235 641 void AitendoOLED::setPreChargeLevelForColorB(int value) {
shintamainjp 0:5062b7730235 642 DC_CMD();
shintamainjp 0:5062b7730235 643 CS_ENA();
shintamainjp 0:5062b7730235 644 SPI_WRITE(0xBC);
shintamainjp 0:5062b7730235 645 SPI_WRITE(value);
shintamainjp 0:5062b7730235 646 CS_DIS();
shintamainjp 0:5062b7730235 647 }
shintamainjp 0:5062b7730235 648
shintamainjp 0:5062b7730235 649 /**
shintamainjp 0:5062b7730235 650 * Set pre charge level for color C.
shintamainjp 0:5062b7730235 651 *
shintamainjp 0:5062b7730235 652 * @param value The value.
shintamainjp 0:5062b7730235 653 */
shintamainjp 0:5062b7730235 654 void AitendoOLED::setPreChargeLevelForColorC(int value) {
shintamainjp 0:5062b7730235 655 DC_CMD();
shintamainjp 0:5062b7730235 656 CS_ENA();
shintamainjp 0:5062b7730235 657 SPI_WRITE(0xBD);
shintamainjp 0:5062b7730235 658 SPI_WRITE(value);
shintamainjp 0:5062b7730235 659 CS_DIS();
shintamainjp 0:5062b7730235 660 }
shintamainjp 0:5062b7730235 661
shintamainjp 0:5062b7730235 662 /**
shintamainjp 0:5062b7730235 663 * Set VCOMH.
shintamainjp 0:5062b7730235 664 *
shintamainjp 0:5062b7730235 665 * @param value VCOMH value. (0x00:0.43 * Vref, 0x3F:0x83 * Vref)
shintamainjp 0:5062b7730235 666 */
shintamainjp 0:5062b7730235 667 void AitendoOLED::setVCOMH(int value) {
shintamainjp 0:5062b7730235 668 DC_CMD();
shintamainjp 0:5062b7730235 669 CS_ENA();
shintamainjp 0:5062b7730235 670 SPI_WRITE(0xBE);
shintamainjp 0:5062b7730235 671 SPI_WRITE(value);
shintamainjp 0:5062b7730235 672 CS_DIS();
shintamainjp 0:5062b7730235 673 }
shintamainjp 0:5062b7730235 674
shintamainjp 0:5062b7730235 675 /**
shintamainjp 0:5062b7730235 676 * Read the status register.
shintamainjp 0:5062b7730235 677 *
shintamainjp 2:74c60a959299 678 * @return the value. (0x80:CommandLock)
shintamainjp 0:5062b7730235 679 */
shintamainjp 0:5062b7730235 680 uint8_t AitendoOLED::readStatusRegister() {
shintamainjp 0:5062b7730235 681 uint8_t s;
shintamainjp 0:5062b7730235 682 DC_CMD();
shintamainjp 0:5062b7730235 683 CS_ENA();
shintamainjp 0:5062b7730235 684 s = SPI_READ();
shintamainjp 0:5062b7730235 685 CS_DIS();
shintamainjp 0:5062b7730235 686 return s;
shintamainjp 0:5062b7730235 687 }