Aitendo OLED device driver library.

Dependents:   AitendoOLED_TestProgram

Committer:
shintamainjp
Date:
Sun Dec 19 07:11:08 2010 +0000
Revision:
1:4b819d5ea905
Parent:
0:5062b7730235
Child:
2:74c60a959299
Bug fixed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:5062b7730235 1 /**
shintamainjp 0:5062b7730235 2 * =============================================================================
shintamainjp 0:5062b7730235 3 * Aitendo OLED device driver library. (Version 0.0.1)
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 0:5062b7730235 43 #define swap(a,b) {int c=a;a=b;b=c;}
shintamainjp 0:5062b7730235 44 #define waitDone() while(1) {uint8_t s = readStatusRegister();if ((s & 0x80) != 0) {break;}}
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 0:5062b7730235 122 waitDone();
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 0:5062b7730235 186 waitDone();
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 0:5062b7730235 210 waitDone();
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 0:5062b7730235 230 waitDone();
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 0:5062b7730235 242 DC_CMD();
shintamainjp 0:5062b7730235 243 CS_ENA();
shintamainjp 0:5062b7730235 244 SPI_WRITE(0x25);
shintamainjp 0:5062b7730235 245 SPI_WRITE(x1);
shintamainjp 0:5062b7730235 246 SPI_WRITE(y1);
shintamainjp 0:5062b7730235 247 SPI_WRITE(x2);
shintamainjp 0:5062b7730235 248 SPI_WRITE(y2);
shintamainjp 0:5062b7730235 249 CS_DIS();
shintamainjp 0:5062b7730235 250 waitDone();
shintamainjp 0:5062b7730235 251 }
shintamainjp 0:5062b7730235 252
shintamainjp 0:5062b7730235 253 /**
shintamainjp 0:5062b7730235 254 * Reset.
shintamainjp 0:5062b7730235 255 */
shintamainjp 0:5062b7730235 256 void AitendoOLED::reset() {
shintamainjp 0:5062b7730235 257
shintamainjp 0:5062b7730235 258 RES_ENA();
shintamainjp 0:5062b7730235 259 wait_ms(200);
shintamainjp 0:5062b7730235 260 RES_DIS();
shintamainjp 0:5062b7730235 261 wait_ms(200);
shintamainjp 0:5062b7730235 262
shintamainjp 0:5062b7730235 263 setDisplayOnOff(false);
shintamainjp 0:5062b7730235 264 setRowAddress(0, 63);
shintamainjp 0:5062b7730235 265 setColumnAddress(0, 95);
shintamainjp 0:5062b7730235 266 setRemapAndDataFormat(0x70);
shintamainjp 0:5062b7730235 267 setDisplayStartLine(0);
shintamainjp 0:5062b7730235 268 setDisplayOffset(0);
shintamainjp 0:5062b7730235 269 setDisplayMode(AitendoOLED::NormalDisplay);
shintamainjp 0:5062b7730235 270 setMultiplexRatio(0x3f);
shintamainjp 0:5062b7730235 271 setMasterCurrentControl(0x8f);
shintamainjp 0:5062b7730235 272 setPowerSavingMode(0x00);
shintamainjp 0:5062b7730235 273 setPhasePeriod(0x74);
shintamainjp 0:5062b7730235 274 setDisplayClockDivideRatio(0xD0);
shintamainjp 0:5062b7730235 275 setSecondPreChargeSpeedForColorA(0x80);
shintamainjp 0:5062b7730235 276 setSecondPreChargeSpeedForColorB(0x80);
shintamainjp 0:5062b7730235 277 setSecondPreChargeSpeedForColorC(0x80);
shintamainjp 0:5062b7730235 278 setPreChargeLevelForColorA(0x3F);
shintamainjp 0:5062b7730235 279 setPreChargeLevelForColorB(0x3F);
shintamainjp 0:5062b7730235 280 setPreChargeLevelForColorC(0x3F);
shintamainjp 0:5062b7730235 281 setVCOMH(0x3E);
shintamainjp 0:5062b7730235 282 setMasterCurrentControl(0x0F);
shintamainjp 0:5062b7730235 283 // A:Blue, B:Green, C:Red
shintamainjp 0:5062b7730235 284 setContrastForColorA(0x80);
shintamainjp 0:5062b7730235 285 setContrastForColorB(0x80);
shintamainjp 0:5062b7730235 286 setContrastForColorC(0x80);
shintamainjp 0:5062b7730235 287 setMode(true, false);
shintamainjp 0:5062b7730235 288 setDisplayOnOff(true);
shintamainjp 0:5062b7730235 289 }
shintamainjp 0:5062b7730235 290
shintamainjp 0:5062b7730235 291 /**
shintamainjp 0:5062b7730235 292 * Write data.
shintamainjp 0:5062b7730235 293 *
shintamainjp 0:5062b7730235 294 * @param data Data.
shintamainjp 0:5062b7730235 295 */
shintamainjp 0:5062b7730235 296 void AitendoOLED::writeData(uint8_t data) {
shintamainjp 0:5062b7730235 297 DC_DAT();
shintamainjp 0:5062b7730235 298 CS_ENA();
shintamainjp 0:5062b7730235 299 SPI_WRITE(data);
shintamainjp 0:5062b7730235 300 CS_DIS();
shintamainjp 0:5062b7730235 301 }
shintamainjp 0:5062b7730235 302
shintamainjp 0:5062b7730235 303 /**
shintamainjp 0:5062b7730235 304 * Set mode.
shintamainjp 0:5062b7730235 305 *
shintamainjp 0:5062b7730235 306 * @param fillrect Fill the rectangle.
shintamainjp 0:5062b7730235 307 * @param revcopy Reverse copy.
shintamainjp 0:5062b7730235 308 */
shintamainjp 0:5062b7730235 309 void AitendoOLED::setMode(bool fillrect, bool revcopy) {
shintamainjp 0:5062b7730235 310 uint8_t val = 0x00;
shintamainjp 0:5062b7730235 311 if (fillrect) {
shintamainjp 0:5062b7730235 312 val |= 1 << 0;
shintamainjp 0:5062b7730235 313 }
shintamainjp 0:5062b7730235 314 if (revcopy) {
shintamainjp 0:5062b7730235 315 val |= 1 << 4;
shintamainjp 0:5062b7730235 316 }
shintamainjp 0:5062b7730235 317 DC_CMD();
shintamainjp 0:5062b7730235 318 CS_ENA();
shintamainjp 0:5062b7730235 319 SPI_WRITE(0x26);
shintamainjp 0:5062b7730235 320 SPI_WRITE(val);
shintamainjp 0:5062b7730235 321 CS_DIS();
shintamainjp 0:5062b7730235 322 }
shintamainjp 0:5062b7730235 323
shintamainjp 0:5062b7730235 324 /**
shintamainjp 0:5062b7730235 325 * Set column address.
shintamainjp 0:5062b7730235 326 *
shintamainjp 0:5062b7730235 327 * @param start Start address. (0-95)
shintamainjp 0:5062b7730235 328 * @param end End address. (0-95)
shintamainjp 0:5062b7730235 329 */
shintamainjp 0:5062b7730235 330 void AitendoOLED::setColumnAddress(int start, int end) {
shintamainjp 0:5062b7730235 331 DC_CMD();
shintamainjp 0:5062b7730235 332 CS_ENA();
shintamainjp 0:5062b7730235 333 SPI_WRITE(0x15);
shintamainjp 0:5062b7730235 334 SPI_WRITE(start);
shintamainjp 0:5062b7730235 335 SPI_WRITE(end);
shintamainjp 0:5062b7730235 336 CS_DIS();
shintamainjp 0:5062b7730235 337 }
shintamainjp 0:5062b7730235 338
shintamainjp 0:5062b7730235 339 /**
shintamainjp 0:5062b7730235 340 * Set row address.
shintamainjp 0:5062b7730235 341 *
shintamainjp 0:5062b7730235 342 * @param start Start address. (0-63)
shintamainjp 0:5062b7730235 343 * @param end End address. (0-63)
shintamainjp 0:5062b7730235 344 */
shintamainjp 0:5062b7730235 345 void AitendoOLED::setRowAddress(int start, int end) {
shintamainjp 0:5062b7730235 346 DC_CMD();
shintamainjp 0:5062b7730235 347 CS_ENA();
shintamainjp 0:5062b7730235 348 SPI_WRITE(0x75);
shintamainjp 0:5062b7730235 349 SPI_WRITE(start);
shintamainjp 0:5062b7730235 350 SPI_WRITE(end);
shintamainjp 0:5062b7730235 351 CS_DIS();
shintamainjp 0:5062b7730235 352 }
shintamainjp 0:5062b7730235 353
shintamainjp 0:5062b7730235 354 /**
shintamainjp 0:5062b7730235 355 * Set contrast for Color A.
shintamainjp 0:5062b7730235 356 *
shintamainjp 0:5062b7730235 357 * @param contrast Contrast. (Default:0x80)
shintamainjp 0:5062b7730235 358 */
shintamainjp 0:5062b7730235 359 void AitendoOLED::setContrastForColorA(int contrast) {
shintamainjp 0:5062b7730235 360 DC_CMD();
shintamainjp 0:5062b7730235 361 CS_ENA();
shintamainjp 0:5062b7730235 362 SPI_WRITE(0x81);
shintamainjp 0:5062b7730235 363 SPI_WRITE(contrast);
shintamainjp 0:5062b7730235 364 CS_DIS();
shintamainjp 0:5062b7730235 365 }
shintamainjp 0:5062b7730235 366
shintamainjp 0:5062b7730235 367 /**
shintamainjp 0:5062b7730235 368 * Set contrast for Color B.
shintamainjp 0:5062b7730235 369 *
shintamainjp 0:5062b7730235 370 * @param contrast Contrast. (Default:0x80)
shintamainjp 0:5062b7730235 371 */
shintamainjp 0:5062b7730235 372 void AitendoOLED::setContrastForColorB(int contrast) {
shintamainjp 0:5062b7730235 373 DC_CMD();
shintamainjp 0:5062b7730235 374 CS_ENA();
shintamainjp 0:5062b7730235 375 SPI_WRITE(0x82);
shintamainjp 0:5062b7730235 376 SPI_WRITE(contrast);
shintamainjp 0:5062b7730235 377 CS_DIS();
shintamainjp 0:5062b7730235 378 }
shintamainjp 0:5062b7730235 379
shintamainjp 0:5062b7730235 380 /**
shintamainjp 0:5062b7730235 381 * Set contrast for Color C.
shintamainjp 0:5062b7730235 382 *
shintamainjp 0:5062b7730235 383 * @param contrast Contrast. (Default:0x80)
shintamainjp 0:5062b7730235 384 */
shintamainjp 0:5062b7730235 385 void AitendoOLED::setContrastForColorC(int contrast) {
shintamainjp 0:5062b7730235 386 DC_CMD();
shintamainjp 0:5062b7730235 387 CS_ENA();
shintamainjp 0:5062b7730235 388 SPI_WRITE(0x83);
shintamainjp 0:5062b7730235 389 SPI_WRITE(contrast);
shintamainjp 0:5062b7730235 390 CS_DIS();
shintamainjp 0:5062b7730235 391 }
shintamainjp 0:5062b7730235 392
shintamainjp 0:5062b7730235 393 /**
shintamainjp 0:5062b7730235 394 * Set master current control value.
shintamainjp 0:5062b7730235 395 *
shintamainjp 0:5062b7730235 396 * @param current Current value. (0x00-0x0F)
shintamainjp 0:5062b7730235 397 */
shintamainjp 0:5062b7730235 398 void AitendoOLED::setMasterCurrentControl(int current) {
shintamainjp 0:5062b7730235 399 DC_CMD();
shintamainjp 0:5062b7730235 400 CS_ENA();
shintamainjp 0:5062b7730235 401 SPI_WRITE(0x87);
shintamainjp 0:5062b7730235 402 SPI_WRITE(current);
shintamainjp 0:5062b7730235 403 CS_DIS();
shintamainjp 0:5062b7730235 404 }
shintamainjp 0:5062b7730235 405
shintamainjp 0:5062b7730235 406 /**
shintamainjp 0:5062b7730235 407 * Set remapping mode and the data format.
shintamainjp 0:5062b7730235 408 *
shintamainjp 0:5062b7730235 409 * @param mode See the document.
shintamainjp 0:5062b7730235 410 */
shintamainjp 0:5062b7730235 411 void AitendoOLED::setRemapAndDataFormat(int mode) {
shintamainjp 0:5062b7730235 412 DC_CMD();
shintamainjp 0:5062b7730235 413 CS_ENA();
shintamainjp 0:5062b7730235 414 SPI_WRITE(0xA0);
shintamainjp 0:5062b7730235 415 SPI_WRITE(mode);
shintamainjp 0:5062b7730235 416 CS_DIS();
shintamainjp 0:5062b7730235 417 }
shintamainjp 0:5062b7730235 418
shintamainjp 0:5062b7730235 419 /**
shintamainjp 0:5062b7730235 420 * Set display start line.
shintamainjp 0:5062b7730235 421 *
shintamainjp 0:5062b7730235 422 * @param line Start line number. (0-63)
shintamainjp 0:5062b7730235 423 */
shintamainjp 0:5062b7730235 424 void AitendoOLED::setDisplayStartLine(int line) {
shintamainjp 0:5062b7730235 425 DC_CMD();
shintamainjp 0:5062b7730235 426 CS_ENA();
shintamainjp 0:5062b7730235 427 SPI_WRITE(0xA1);
shintamainjp 0:5062b7730235 428 SPI_WRITE(line);
shintamainjp 0:5062b7730235 429 CS_DIS();
shintamainjp 0:5062b7730235 430 }
shintamainjp 0:5062b7730235 431
shintamainjp 0:5062b7730235 432 /**
shintamainjp 0:5062b7730235 433 * Set display offset line.
shintamainjp 0:5062b7730235 434 *
shintamainjp 0:5062b7730235 435 * @param offset Offset line number. (0-63)
shintamainjp 0:5062b7730235 436 */
shintamainjp 0:5062b7730235 437 void AitendoOLED::setDisplayOffset(int offset) {
shintamainjp 0:5062b7730235 438 DC_CMD();
shintamainjp 0:5062b7730235 439 CS_ENA();
shintamainjp 0:5062b7730235 440 SPI_WRITE(0xA2);
shintamainjp 0:5062b7730235 441 SPI_WRITE(offset);
shintamainjp 0:5062b7730235 442 CS_DIS();
shintamainjp 0:5062b7730235 443 }
shintamainjp 0:5062b7730235 444
shintamainjp 0:5062b7730235 445 /**
shintamainjp 0:5062b7730235 446 * Set display mode.
shintamainjp 0:5062b7730235 447 *
shintamainjp 0:5062b7730235 448 * @param mode Display mode.
shintamainjp 0:5062b7730235 449 */
shintamainjp 0:5062b7730235 450 void AitendoOLED::setDisplayMode(DisplayMode mode) {
shintamainjp 0:5062b7730235 451 int val = 0;
shintamainjp 0:5062b7730235 452 switch (mode) {
shintamainjp 0:5062b7730235 453 case NormalDisplay:
shintamainjp 0:5062b7730235 454 val = 0xA4;
shintamainjp 0:5062b7730235 455 break;
shintamainjp 0:5062b7730235 456 case EntireDisplayOn:
shintamainjp 0:5062b7730235 457 val = 0xA5;
shintamainjp 0:5062b7730235 458 break;
shintamainjp 0:5062b7730235 459 case EntireDisplayOff:
shintamainjp 0:5062b7730235 460 val = 0xA6;
shintamainjp 0:5062b7730235 461 break;
shintamainjp 0:5062b7730235 462 case InverseDisplay:
shintamainjp 0:5062b7730235 463 val = 0xA7;
shintamainjp 0:5062b7730235 464 break;
shintamainjp 0:5062b7730235 465 default:
shintamainjp 0:5062b7730235 466 break;
shintamainjp 0:5062b7730235 467 }
shintamainjp 0:5062b7730235 468 if (val != 0) {
shintamainjp 0:5062b7730235 469 DC_CMD();
shintamainjp 0:5062b7730235 470 CS_ENA();
shintamainjp 0:5062b7730235 471 SPI_WRITE(val);
shintamainjp 0:5062b7730235 472 CS_DIS();
shintamainjp 0:5062b7730235 473 }
shintamainjp 0:5062b7730235 474 }
shintamainjp 0:5062b7730235 475
shintamainjp 0:5062b7730235 476 /**
shintamainjp 0:5062b7730235 477 * Set multiplex ratio.
shintamainjp 0:5062b7730235 478 *
shintamainjp 0:5062b7730235 479 * @param ratio Ratio.
shintamainjp 0:5062b7730235 480 */
shintamainjp 0:5062b7730235 481 void AitendoOLED::setMultiplexRatio(int ratio) {
shintamainjp 0:5062b7730235 482 DC_CMD();
shintamainjp 0:5062b7730235 483 CS_ENA();
shintamainjp 0:5062b7730235 484 SPI_WRITE(0xA8);
shintamainjp 0:5062b7730235 485 SPI_WRITE(ratio);
shintamainjp 0:5062b7730235 486 CS_DIS();
shintamainjp 0:5062b7730235 487 }
shintamainjp 0:5062b7730235 488
shintamainjp 0:5062b7730235 489 /**
shintamainjp 0:5062b7730235 490 * Set display on/off.
shintamainjp 0:5062b7730235 491 *
shintamainjp 0:5062b7730235 492 * @param on On.
shintamainjp 0:5062b7730235 493 */
shintamainjp 0:5062b7730235 494 void AitendoOLED::setDisplayOnOff(bool on) {
shintamainjp 0:5062b7730235 495 if (on) {
shintamainjp 0:5062b7730235 496 DC_CMD();
shintamainjp 0:5062b7730235 497 CS_ENA();
shintamainjp 0:5062b7730235 498 SPI_WRITE(0xAF);
shintamainjp 0:5062b7730235 499 CS_DIS();
shintamainjp 0:5062b7730235 500 } else {
shintamainjp 0:5062b7730235 501 DC_CMD();
shintamainjp 0:5062b7730235 502 CS_ENA();
shintamainjp 0:5062b7730235 503 SPI_WRITE(0xAE);
shintamainjp 0:5062b7730235 504 CS_DIS();
shintamainjp 0:5062b7730235 505 }
shintamainjp 0:5062b7730235 506 }
shintamainjp 0:5062b7730235 507
shintamainjp 0:5062b7730235 508 /**
shintamainjp 0:5062b7730235 509 * Set gray scale table.
shintamainjp 0:5062b7730235 510 *
shintamainjp 0:5062b7730235 511 * @param p A pointer to the look up table.
shintamainjp 0:5062b7730235 512 */
shintamainjp 0:5062b7730235 513 void AitendoOLED::setGrayScaleTable(gray_scale_table_t *p) {
shintamainjp 0:5062b7730235 514 DC_CMD();
shintamainjp 0:5062b7730235 515 CS_ENA();
shintamainjp 0:5062b7730235 516 SPI_WRITE(0xB8);
shintamainjp 0:5062b7730235 517 for (int i = 0; i < 32; i++) {
shintamainjp 0:5062b7730235 518 SPI_WRITE(p->data[i]);
shintamainjp 0:5062b7730235 519 }
shintamainjp 0:5062b7730235 520 CS_DIS();
shintamainjp 0:5062b7730235 521 }
shintamainjp 0:5062b7730235 522
shintamainjp 0:5062b7730235 523 /**
shintamainjp 0:5062b7730235 524 * NOP.
shintamainjp 0:5062b7730235 525 */
shintamainjp 0:5062b7730235 526 void AitendoOLED::nop() {
shintamainjp 0:5062b7730235 527 DC_CMD();
shintamainjp 0:5062b7730235 528 CS_ENA();
shintamainjp 0:5062b7730235 529 SPI_WRITE(0xE3);
shintamainjp 0:5062b7730235 530 CS_DIS();
shintamainjp 0:5062b7730235 531 }
shintamainjp 0:5062b7730235 532
shintamainjp 0:5062b7730235 533 /**
shintamainjp 0:5062b7730235 534 * Set power saving mode.
shintamainjp 0:5062b7730235 535 *
shintamainjp 0:5062b7730235 536 * @param value Value. (0x00:None, 0x12:power saving)
shintamainjp 0:5062b7730235 537 */
shintamainjp 0:5062b7730235 538 void AitendoOLED::setPowerSavingMode(int value) {
shintamainjp 0:5062b7730235 539 DC_CMD();
shintamainjp 0:5062b7730235 540 CS_ENA();
shintamainjp 0:5062b7730235 541 SPI_WRITE(0xB0);
shintamainjp 0:5062b7730235 542 SPI_WRITE(value);
shintamainjp 0:5062b7730235 543 CS_DIS();
shintamainjp 0:5062b7730235 544 }
shintamainjp 0:5062b7730235 545
shintamainjp 0:5062b7730235 546 /**
shintamainjp 0:5062b7730235 547 * Set phase period.
shintamainjp 0:5062b7730235 548 *
shintamainjp 0:5062b7730235 549 * @param value Value. (Default:0x74)
shintamainjp 0:5062b7730235 550 */
shintamainjp 0:5062b7730235 551 void AitendoOLED::setPhasePeriod(int value) {
shintamainjp 0:5062b7730235 552 DC_CMD();
shintamainjp 0:5062b7730235 553 CS_ENA();
shintamainjp 0:5062b7730235 554 SPI_WRITE(0xB1);
shintamainjp 0:5062b7730235 555 SPI_WRITE(value);
shintamainjp 0:5062b7730235 556 CS_DIS();
shintamainjp 0:5062b7730235 557 }
shintamainjp 0:5062b7730235 558
shintamainjp 0:5062b7730235 559 /**
shintamainjp 0:5062b7730235 560 * Set display clock divide ratio.
shintamainjp 0:5062b7730235 561 *
shintamainjp 0:5062b7730235 562 * @param value Value. (Default:0x00)
shintamainjp 0:5062b7730235 563 */
shintamainjp 0:5062b7730235 564 void AitendoOLED::setDisplayClockDivideRatio(int value) {
shintamainjp 0:5062b7730235 565 DC_CMD();
shintamainjp 0:5062b7730235 566 CS_ENA();
shintamainjp 0:5062b7730235 567 SPI_WRITE(0xB3);
shintamainjp 0:5062b7730235 568 SPI_WRITE(value);
shintamainjp 0:5062b7730235 569 CS_DIS();
shintamainjp 0:5062b7730235 570 }
shintamainjp 0:5062b7730235 571
shintamainjp 0:5062b7730235 572 /**
shintamainjp 0:5062b7730235 573 * Set second pre-charge speed for color A.
shintamainjp 0:5062b7730235 574 *
shintamainjp 0:5062b7730235 575 * @param value Value.
shintamainjp 0:5062b7730235 576 */
shintamainjp 0:5062b7730235 577 void AitendoOLED::setSecondPreChargeSpeedForColorA(int value) {
shintamainjp 0:5062b7730235 578 DC_CMD();
shintamainjp 0:5062b7730235 579 CS_ENA();
shintamainjp 0:5062b7730235 580 SPI_WRITE(0x8A);
shintamainjp 0:5062b7730235 581 SPI_WRITE(value);
shintamainjp 0:5062b7730235 582 CS_DIS();
shintamainjp 0:5062b7730235 583 }
shintamainjp 0:5062b7730235 584
shintamainjp 0:5062b7730235 585 /**
shintamainjp 0:5062b7730235 586 * Set second pre-charge speed for color B.
shintamainjp 0:5062b7730235 587 *
shintamainjp 0:5062b7730235 588 * @param value Value.
shintamainjp 0:5062b7730235 589 */
shintamainjp 0:5062b7730235 590 void AitendoOLED::setSecondPreChargeSpeedForColorB(int value) {
shintamainjp 0:5062b7730235 591 DC_CMD();
shintamainjp 0:5062b7730235 592 CS_ENA();
shintamainjp 0:5062b7730235 593 SPI_WRITE(0x8B);
shintamainjp 0:5062b7730235 594 SPI_WRITE(value);
shintamainjp 0:5062b7730235 595 CS_DIS();
shintamainjp 0:5062b7730235 596 }
shintamainjp 0:5062b7730235 597
shintamainjp 0:5062b7730235 598 /**
shintamainjp 0:5062b7730235 599 * Set second pre-charge speed for color C.
shintamainjp 0:5062b7730235 600 *
shintamainjp 0:5062b7730235 601 * @param value Value.
shintamainjp 0:5062b7730235 602 */
shintamainjp 0:5062b7730235 603 void AitendoOLED::setSecondPreChargeSpeedForColorC(int value) {
shintamainjp 0:5062b7730235 604 DC_CMD();
shintamainjp 0:5062b7730235 605 CS_ENA();
shintamainjp 0:5062b7730235 606 SPI_WRITE(0x8C);
shintamainjp 0:5062b7730235 607 SPI_WRITE(value);
shintamainjp 0:5062b7730235 608 CS_DIS();
shintamainjp 0:5062b7730235 609 }
shintamainjp 0:5062b7730235 610
shintamainjp 0:5062b7730235 611 /**
shintamainjp 0:5062b7730235 612 * Set pre charge level for color A.
shintamainjp 0:5062b7730235 613 *
shintamainjp 0:5062b7730235 614 * @param value The value.
shintamainjp 0:5062b7730235 615 */
shintamainjp 0:5062b7730235 616 void AitendoOLED::setPreChargeLevelForColorA(int value) {
shintamainjp 0:5062b7730235 617 DC_CMD();
shintamainjp 0:5062b7730235 618 CS_ENA();
shintamainjp 0:5062b7730235 619 SPI_WRITE(0xBB);
shintamainjp 0:5062b7730235 620 SPI_WRITE(value);
shintamainjp 0:5062b7730235 621 CS_DIS();
shintamainjp 0:5062b7730235 622 }
shintamainjp 0:5062b7730235 623
shintamainjp 0:5062b7730235 624 /**
shintamainjp 0:5062b7730235 625 * Set pre charge level for color B.
shintamainjp 0:5062b7730235 626 *
shintamainjp 0:5062b7730235 627 * @param value The value.
shintamainjp 0:5062b7730235 628 */
shintamainjp 0:5062b7730235 629 void AitendoOLED::setPreChargeLevelForColorB(int value) {
shintamainjp 0:5062b7730235 630 DC_CMD();
shintamainjp 0:5062b7730235 631 CS_ENA();
shintamainjp 0:5062b7730235 632 SPI_WRITE(0xBC);
shintamainjp 0:5062b7730235 633 SPI_WRITE(value);
shintamainjp 0:5062b7730235 634 CS_DIS();
shintamainjp 0:5062b7730235 635 }
shintamainjp 0:5062b7730235 636
shintamainjp 0:5062b7730235 637 /**
shintamainjp 0:5062b7730235 638 * Set pre charge level for color C.
shintamainjp 0:5062b7730235 639 *
shintamainjp 0:5062b7730235 640 * @param value The value.
shintamainjp 0:5062b7730235 641 */
shintamainjp 0:5062b7730235 642 void AitendoOLED::setPreChargeLevelForColorC(int value) {
shintamainjp 0:5062b7730235 643 DC_CMD();
shintamainjp 0:5062b7730235 644 CS_ENA();
shintamainjp 0:5062b7730235 645 SPI_WRITE(0xBD);
shintamainjp 0:5062b7730235 646 SPI_WRITE(value);
shintamainjp 0:5062b7730235 647 CS_DIS();
shintamainjp 0:5062b7730235 648 }
shintamainjp 0:5062b7730235 649
shintamainjp 0:5062b7730235 650 /**
shintamainjp 0:5062b7730235 651 * Set VCOMH.
shintamainjp 0:5062b7730235 652 *
shintamainjp 0:5062b7730235 653 * @param value VCOMH value. (0x00:0.43 * Vref, 0x3F:0x83 * Vref)
shintamainjp 0:5062b7730235 654 */
shintamainjp 0:5062b7730235 655 void AitendoOLED::setVCOMH(int value) {
shintamainjp 0:5062b7730235 656 DC_CMD();
shintamainjp 0:5062b7730235 657 CS_ENA();
shintamainjp 0:5062b7730235 658 SPI_WRITE(0xBE);
shintamainjp 0:5062b7730235 659 SPI_WRITE(value);
shintamainjp 0:5062b7730235 660 CS_DIS();
shintamainjp 0:5062b7730235 661 }
shintamainjp 0:5062b7730235 662
shintamainjp 0:5062b7730235 663 /**
shintamainjp 0:5062b7730235 664 * Read the status register.
shintamainjp 0:5062b7730235 665 *
shintamainjp 0:5062b7730235 666 * @return the value.
shintamainjp 0:5062b7730235 667 */
shintamainjp 0:5062b7730235 668 uint8_t AitendoOLED::readStatusRegister() {
shintamainjp 0:5062b7730235 669 uint8_t s;
shintamainjp 0:5062b7730235 670 DC_CMD();
shintamainjp 0:5062b7730235 671 CS_ENA();
shintamainjp 0:5062b7730235 672 s = SPI_READ();
shintamainjp 0:5062b7730235 673 CS_DIS();
shintamainjp 0:5062b7730235 674 return s;
shintamainjp 0:5062b7730235 675 }