Library for Waveshare 2.7" tri-colour e-Paper display.

Dependents:   ePD_2_7b_example

Committer:
mdroberts1243
Date:
Fri Dec 06 23:24:50 2019 +0000
Revision:
0:9e6a8e3cd8de
First commit of code modified from Kanjia examples for 2.13" Waveshare example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mdroberts1243 0:9e6a8e3cd8de 1 /**
mdroberts1243 0:9e6a8e3cd8de 2 * @filename : epd2in7b.cpp
mdroberts1243 0:9e6a8e3cd8de 3 * @brief : Implements for Dual-color e-paper library
mdroberts1243 0:9e6a8e3cd8de 4 * @author : Yehui from Waveshare (modified by Mark Roberts / mdroberts1243)
mdroberts1243 0:9e6a8e3cd8de 5 *
mdroberts1243 0:9e6a8e3cd8de 6 * Copyright (C) Waveshare August 10 2017
mdroberts1243 0:9e6a8e3cd8de 7 *
mdroberts1243 0:9e6a8e3cd8de 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
mdroberts1243 0:9e6a8e3cd8de 9 * of this software and associated documnetation files (the "Software"), to deal
mdroberts1243 0:9e6a8e3cd8de 10 * in the Software without restriction, including without limitation the rights
mdroberts1243 0:9e6a8e3cd8de 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
mdroberts1243 0:9e6a8e3cd8de 12 * copies of the Software, and to permit persons to whom the Software is
mdroberts1243 0:9e6a8e3cd8de 13 * furished to do so, subject to the following conditions:
mdroberts1243 0:9e6a8e3cd8de 14 *
mdroberts1243 0:9e6a8e3cd8de 15 * The above copyright notice and this permission notice shall be included in
mdroberts1243 0:9e6a8e3cd8de 16 * all copies or substantial portions of the Software.
mdroberts1243 0:9e6a8e3cd8de 17 *
mdroberts1243 0:9e6a8e3cd8de 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
mdroberts1243 0:9e6a8e3cd8de 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
mdroberts1243 0:9e6a8e3cd8de 20 * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
mdroberts1243 0:9e6a8e3cd8de 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
mdroberts1243 0:9e6a8e3cd8de 22 * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
mdroberts1243 0:9e6a8e3cd8de 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
mdroberts1243 0:9e6a8e3cd8de 24 * THE SOFTWARE.
mdroberts1243 0:9e6a8e3cd8de 25 */
mdroberts1243 0:9e6a8e3cd8de 26
mdroberts1243 0:9e6a8e3cd8de 27 /*
mdroberts1243 0:9e6a8e3cd8de 28 * Modified by Kenji Arai / JH1PJL
mdroberts1243 0:9e6a8e3cd8de 29 *
mdroberts1243 0:9e6a8e3cd8de 30 * http://www.page.sannet.ne.jp/kenjia/index.html
mdroberts1243 0:9e6a8e3cd8de 31 * http://mbed.org/users/kenjiArai/
mdroberts1243 0:9e6a8e3cd8de 32 * Created: April 27th, 2019
mdroberts1243 0:9e6a8e3cd8de 33 * Revised: April 30th, 2019
mdroberts1243 0:9e6a8e3cd8de 34 *
mdroberts1243 0:9e6a8e3cd8de 35 * Refrence software
mdroberts1243 0:9e6a8e3cd8de 36 * https://github.com/waveshare/e-Paper
mdroberts1243 0:9e6a8e3cd8de 37 * https://os.mbed.com/users/imachooon/code/epd1in54/
mdroberts1243 0:9e6a8e3cd8de 38 *
mdroberts1243 0:9e6a8e3cd8de 39 * Technical documents
mdroberts1243 0:9e6a8e3cd8de 40 * https://www.waveshare.com/wiki/2.13inch_e-Paper_HAT_(B)
mdroberts1243 0:9e6a8e3cd8de 41 *
mdroberts1243 0:9e6a8e3cd8de 42 * Product
mdroberts1243 0:9e6a8e3cd8de 43 * http://akizukidenshi.com/catalog/g/gP-13757/
mdroberts1243 0:9e6a8e3cd8de 44 * https://www.waveshare.com/2.13inch-e-paper-hat-b.htm
mdroberts1243 0:9e6a8e3cd8de 45 *
mdroberts1243 0:9e6a8e3cd8de 46 */
mdroberts1243 0:9e6a8e3cd8de 47
mdroberts1243 0:9e6a8e3cd8de 48 #include "epd2in7b.h"
mdroberts1243 0:9e6a8e3cd8de 49
mdroberts1243 0:9e6a8e3cd8de 50 Epd::Epd(PinName mosi,
mdroberts1243 0:9e6a8e3cd8de 51 PinName miso,
mdroberts1243 0:9e6a8e3cd8de 52 PinName sclk,
mdroberts1243 0:9e6a8e3cd8de 53 PinName cs,
mdroberts1243 0:9e6a8e3cd8de 54 PinName dc,
mdroberts1243 0:9e6a8e3cd8de 55 PinName rst,
mdroberts1243 0:9e6a8e3cd8de 56 PinName busy,
mdroberts1243 0:9e6a8e3cd8de 57 PinName pwr
mdroberts1243 0:9e6a8e3cd8de 58 ):EpdIf(mosi, miso, sclk, cs, dc, rst, busy, pwr)
mdroberts1243 0:9e6a8e3cd8de 59 {
mdroberts1243 0:9e6a8e3cd8de 60 horiz = EPD_HORIZ; // MDR -- changed to align with datasheet
mdroberts1243 0:9e6a8e3cd8de 61 vert = EPD_VERT; // MDR -- changed to align with datasheet
mdroberts1243 0:9e6a8e3cd8de 62 };
mdroberts1243 0:9e6a8e3cd8de 63
mdroberts1243 0:9e6a8e3cd8de 64 int Epd::Init(void)
mdroberts1243 0:9e6a8e3cd8de 65 {
mdroberts1243 0:9e6a8e3cd8de 66 /* this calls the peripheral hardware interface, see epdif */
mdroberts1243 0:9e6a8e3cd8de 67 if (IfInit() != 0) {
mdroberts1243 0:9e6a8e3cd8de 68 return -1;
mdroberts1243 0:9e6a8e3cd8de 69 }
mdroberts1243 0:9e6a8e3cd8de 70 /* EPD hardware init start */
mdroberts1243 0:9e6a8e3cd8de 71 Reset();
mdroberts1243 0:9e6a8e3cd8de 72
mdroberts1243 0:9e6a8e3cd8de 73 SendCommand(POWER_ON);
mdroberts1243 0:9e6a8e3cd8de 74 WaitUntilIdle();
mdroberts1243 0:9e6a8e3cd8de 75
mdroberts1243 0:9e6a8e3cd8de 76 SendCommand(PANEL_SETTING);
mdroberts1243 0:9e6a8e3cd8de 77 SendData(0xaf); // 296x160, OTP LUT, B/W/Red mode, scan up, shift right, Booster on, soft reset
mdroberts1243 0:9e6a8e3cd8de 78
mdroberts1243 0:9e6a8e3cd8de 79 SendCommand(PLL_CONTROL);
mdroberts1243 0:9e6a8e3cd8de 80 SendData(0x3a); //3A 100HZ 29 150Hz 39 200HZ 31 171HZ
mdroberts1243 0:9e6a8e3cd8de 81
mdroberts1243 0:9e6a8e3cd8de 82 SendCommand(POWER_SETTING);
mdroberts1243 0:9e6a8e3cd8de 83 SendData(0x03); // VDS_EN, VDG_EN
mdroberts1243 0:9e6a8e3cd8de 84 SendData(0x00); // VCOM_HV, VGHL_LV[1], VGHL_LV[0]
mdroberts1243 0:9e6a8e3cd8de 85 SendData(0x2b); // VDH
mdroberts1243 0:9e6a8e3cd8de 86 SendData(0x2b); // VDL
mdroberts1243 0:9e6a8e3cd8de 87 SendData(0x09); // VDHR
mdroberts1243 0:9e6a8e3cd8de 88
mdroberts1243 0:9e6a8e3cd8de 89 SendCommand(BOOSTER_SOFT_START);
mdroberts1243 0:9e6a8e3cd8de 90 SendData(0x07);
mdroberts1243 0:9e6a8e3cd8de 91 SendData(0x07);
mdroberts1243 0:9e6a8e3cd8de 92 SendData(0x17); // defaults 10ms start, strength 3, 6.58uS off time
mdroberts1243 0:9e6a8e3cd8de 93
mdroberts1243 0:9e6a8e3cd8de 94 // Power optimization
mdroberts1243 0:9e6a8e3cd8de 95 SendCommand(0xF8);
mdroberts1243 0:9e6a8e3cd8de 96 SendData(0x60);
mdroberts1243 0:9e6a8e3cd8de 97 SendData(0xA5);
mdroberts1243 0:9e6a8e3cd8de 98
mdroberts1243 0:9e6a8e3cd8de 99 // Power optimization
mdroberts1243 0:9e6a8e3cd8de 100 SendCommand(0xF8);
mdroberts1243 0:9e6a8e3cd8de 101 SendData(0x89);
mdroberts1243 0:9e6a8e3cd8de 102 SendData(0xA5);
mdroberts1243 0:9e6a8e3cd8de 103
mdroberts1243 0:9e6a8e3cd8de 104 // Power optimization
mdroberts1243 0:9e6a8e3cd8de 105 SendCommand(0xF8);
mdroberts1243 0:9e6a8e3cd8de 106 SendData(0x90);
mdroberts1243 0:9e6a8e3cd8de 107 SendData(0x00);
mdroberts1243 0:9e6a8e3cd8de 108
mdroberts1243 0:9e6a8e3cd8de 109 // Power optimization
mdroberts1243 0:9e6a8e3cd8de 110 SendCommand(0xF8);
mdroberts1243 0:9e6a8e3cd8de 111 SendData(0x93);
mdroberts1243 0:9e6a8e3cd8de 112 SendData(0x2A);
mdroberts1243 0:9e6a8e3cd8de 113
mdroberts1243 0:9e6a8e3cd8de 114 // Power optimization
mdroberts1243 0:9e6a8e3cd8de 115 SendCommand(0xF8);
mdroberts1243 0:9e6a8e3cd8de 116 SendData(0x73);
mdroberts1243 0:9e6a8e3cd8de 117 SendData(0x41);
mdroberts1243 0:9e6a8e3cd8de 118
mdroberts1243 0:9e6a8e3cd8de 119 SendCommand(VCM_DC_SETTING);
mdroberts1243 0:9e6a8e3cd8de 120 SendData(0x12);
mdroberts1243 0:9e6a8e3cd8de 121
mdroberts1243 0:9e6a8e3cd8de 122 SendCommand(VCOM_AND_DATA_INTERVAL_SETTING);
mdroberts1243 0:9e6a8e3cd8de 123 SendData(0x87); // Define by OTP
mdroberts1243 0:9e6a8e3cd8de 124 /*
mdroberts1243 0:9e6a8e3cd8de 125 SendCommand(RESOLUTION_SETTING); // done in the display refresh and clear
mdroberts1243 0:9e6a8e3cd8de 126 SendData(0x01);
mdroberts1243 0:9e6a8e3cd8de 127 SendData(0x08); // horiz: 264
mdroberts1243 0:9e6a8e3cd8de 128 SendData(0x00);
mdroberts1243 0:9e6a8e3cd8de 129 SendData(0xB0); // vert: 176
mdroberts1243 0:9e6a8e3cd8de 130 */
mdroberts1243 0:9e6a8e3cd8de 131 SetLut();
mdroberts1243 0:9e6a8e3cd8de 132
mdroberts1243 0:9e6a8e3cd8de 133 SendCommand(PARTIAL_DISPLAY_REFRESH);
mdroberts1243 0:9e6a8e3cd8de 134 SendData(0x00);
mdroberts1243 0:9e6a8e3cd8de 135
mdroberts1243 0:9e6a8e3cd8de 136 /* EPD hardware init end */
mdroberts1243 0:9e6a8e3cd8de 137 return 0;
mdroberts1243 0:9e6a8e3cd8de 138 }
mdroberts1243 0:9e6a8e3cd8de 139
mdroberts1243 0:9e6a8e3cd8de 140 /**
mdroberts1243 0:9e6a8e3cd8de 141 * @brief: basic function for sending commands
mdroberts1243 0:9e6a8e3cd8de 142 */
mdroberts1243 0:9e6a8e3cd8de 143 void Epd::SendCommand(unsigned char command)
mdroberts1243 0:9e6a8e3cd8de 144 {
mdroberts1243 0:9e6a8e3cd8de 145 DigitalWrite(m_dc, LOW);
mdroberts1243 0:9e6a8e3cd8de 146 SpiTransfer(command);
mdroberts1243 0:9e6a8e3cd8de 147 }
mdroberts1243 0:9e6a8e3cd8de 148
mdroberts1243 0:9e6a8e3cd8de 149 /**
mdroberts1243 0:9e6a8e3cd8de 150 * @brief: basic function for sending data
mdroberts1243 0:9e6a8e3cd8de 151 */
mdroberts1243 0:9e6a8e3cd8de 152 void Epd::SendData(unsigned char data)
mdroberts1243 0:9e6a8e3cd8de 153 {
mdroberts1243 0:9e6a8e3cd8de 154 DigitalWrite(m_dc, HIGH);
mdroberts1243 0:9e6a8e3cd8de 155 SpiTransfer(data);
mdroberts1243 0:9e6a8e3cd8de 156 }
mdroberts1243 0:9e6a8e3cd8de 157
mdroberts1243 0:9e6a8e3cd8de 158 /**
mdroberts1243 0:9e6a8e3cd8de 159 * @brief: Wait until the busy_pin goes HIGH
mdroberts1243 0:9e6a8e3cd8de 160 */
mdroberts1243 0:9e6a8e3cd8de 161 void Epd::WaitUntilIdle(void)
mdroberts1243 0:9e6a8e3cd8de 162 {
mdroberts1243 0:9e6a8e3cd8de 163 while(DigitalRead(m_busy) == 0) { //0: busy, 1: idle
mdroberts1243 0:9e6a8e3cd8de 164 DelayMs(100);
mdroberts1243 0:9e6a8e3cd8de 165 }
mdroberts1243 0:9e6a8e3cd8de 166 }
mdroberts1243 0:9e6a8e3cd8de 167
mdroberts1243 0:9e6a8e3cd8de 168 /**
mdroberts1243 0:9e6a8e3cd8de 169 * @brief: module reset.
mdroberts1243 0:9e6a8e3cd8de 170 * often used to awaken the module in deep sleep,
mdroberts1243 0:9e6a8e3cd8de 171 * see Epd::Sleep();
mdroberts1243 0:9e6a8e3cd8de 172 */
mdroberts1243 0:9e6a8e3cd8de 173 void Epd::Reset(void)
mdroberts1243 0:9e6a8e3cd8de 174 {
mdroberts1243 0:9e6a8e3cd8de 175 DigitalWrite(m_rst,HIGH);
mdroberts1243 0:9e6a8e3cd8de 176 DelayMs(200);
mdroberts1243 0:9e6a8e3cd8de 177 DigitalWrite(m_rst, LOW);
mdroberts1243 0:9e6a8e3cd8de 178 DelayMs(10);
mdroberts1243 0:9e6a8e3cd8de 179 DigitalWrite(m_rst, HIGH);
mdroberts1243 0:9e6a8e3cd8de 180 DelayMs(200);
mdroberts1243 0:9e6a8e3cd8de 181 }
mdroberts1243 0:9e6a8e3cd8de 182
mdroberts1243 0:9e6a8e3cd8de 183 /**
mdroberts1243 0:9e6a8e3cd8de 184 * @brief: set the look-up tables
mdroberts1243 0:9e6a8e3cd8de 185 */
mdroberts1243 0:9e6a8e3cd8de 186 void Epd::SetLut(void) {
mdroberts1243 0:9e6a8e3cd8de 187 unsigned int count;
mdroberts1243 0:9e6a8e3cd8de 188 SendCommand(VCOM_LUT); //vcom
mdroberts1243 0:9e6a8e3cd8de 189 for(count = 0; count < 44; count++) {
mdroberts1243 0:9e6a8e3cd8de 190 SendData(lut_vcom_dc[count]);
mdroberts1243 0:9e6a8e3cd8de 191 }
mdroberts1243 0:9e6a8e3cd8de 192
mdroberts1243 0:9e6a8e3cd8de 193 SendCommand(W2W_LUT); //ww --
mdroberts1243 0:9e6a8e3cd8de 194 for(count = 0; count < 42; count++) {
mdroberts1243 0:9e6a8e3cd8de 195 SendData(lut_ww[count]);
mdroberts1243 0:9e6a8e3cd8de 196 }
mdroberts1243 0:9e6a8e3cd8de 197
mdroberts1243 0:9e6a8e3cd8de 198 SendCommand(B2W_LUT); //bw r
mdroberts1243 0:9e6a8e3cd8de 199 for(count = 0; count < 42; count++) {
mdroberts1243 0:9e6a8e3cd8de 200 SendData(lut_bw[count]);
mdroberts1243 0:9e6a8e3cd8de 201 }
mdroberts1243 0:9e6a8e3cd8de 202
mdroberts1243 0:9e6a8e3cd8de 203 SendCommand(W2B_LUT); //wb w
mdroberts1243 0:9e6a8e3cd8de 204 for(count = 0; count < 42; count++) {
mdroberts1243 0:9e6a8e3cd8de 205 SendData(lut_bb[count]);
mdroberts1243 0:9e6a8e3cd8de 206 }
mdroberts1243 0:9e6a8e3cd8de 207
mdroberts1243 0:9e6a8e3cd8de 208 SendCommand(B2B_LUT); //bb b
mdroberts1243 0:9e6a8e3cd8de 209 for(count = 0; count < 42; count++) {
mdroberts1243 0:9e6a8e3cd8de 210 SendData(lut_wb[count]);
mdroberts1243 0:9e6a8e3cd8de 211 }
mdroberts1243 0:9e6a8e3cd8de 212 }
mdroberts1243 0:9e6a8e3cd8de 213
mdroberts1243 0:9e6a8e3cd8de 214 /**
mdroberts1243 0:9e6a8e3cd8de 215 * @brief: transmit partial data to the SRAM (both black and red)
mdroberts1243 0:9e6a8e3cd8de 216 * MDR -- Partial stuff all rewritten for 2.7 display
mdroberts1243 0:9e6a8e3cd8de 217 */
mdroberts1243 0:9e6a8e3cd8de 218 void Epd::SetPartialWindow(const unsigned char* buffer_black, const unsigned char* buffer_red, int x, int y, int w, int l)
mdroberts1243 0:9e6a8e3cd8de 219 {
mdroberts1243 0:9e6a8e3cd8de 220 SendCommand(PARTIAL_DATA_START_TRANSMISSION_1); // the black stuff
mdroberts1243 0:9e6a8e3cd8de 221 // x upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 222 SendData(x >> 8);
mdroberts1243 0:9e6a8e3cd8de 223 SendData(x & 0xf8); // x should be the multiple of 8, the last 3 bit will always be ignored
mdroberts1243 0:9e6a8e3cd8de 224 // y upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 225 SendData(y >> 8);
mdroberts1243 0:9e6a8e3cd8de 226 SendData(y & 0xff);
mdroberts1243 0:9e6a8e3cd8de 227 // w upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 228 SendData(w >> 8);
mdroberts1243 0:9e6a8e3cd8de 229 SendData(w & 0xf8); // lower three bits zero, multiple of 8
mdroberts1243 0:9e6a8e3cd8de 230 // l upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 231 SendData(l >> 8);
mdroberts1243 0:9e6a8e3cd8de 232 SendData(l & 0xff);
mdroberts1243 0:9e6a8e3cd8de 233 // all the data (KPixel 1 ... KPixel n)
mdroberts1243 0:9e6a8e3cd8de 234 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 235 if (buffer_black != NULL) {
mdroberts1243 0:9e6a8e3cd8de 236 for(int i = 0; i < w / 8 * l; i++) {
mdroberts1243 0:9e6a8e3cd8de 237 SendData(buffer_black[i]);
mdroberts1243 0:9e6a8e3cd8de 238 }
mdroberts1243 0:9e6a8e3cd8de 239 } else {
mdroberts1243 0:9e6a8e3cd8de 240 for(int i = 0; i < w / 8 * l; i++) {
mdroberts1243 0:9e6a8e3cd8de 241 SendData(0x00);
mdroberts1243 0:9e6a8e3cd8de 242 }
mdroberts1243 0:9e6a8e3cd8de 243 }
mdroberts1243 0:9e6a8e3cd8de 244 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 245 // SendCommand(DATA_STOP);
mdroberts1243 0:9e6a8e3cd8de 246
mdroberts1243 0:9e6a8e3cd8de 247 SendCommand(PARTIAL_DATA_START_TRANSMISSION_2); // the red stuff
mdroberts1243 0:9e6a8e3cd8de 248 // x upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 249 SendData(x >> 8);
mdroberts1243 0:9e6a8e3cd8de 250 SendData(x & 0xf8); // x should be the multiple of 8, the last 3 bit will always be ignored
mdroberts1243 0:9e6a8e3cd8de 251 // y upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 252 SendData(y >> 8);
mdroberts1243 0:9e6a8e3cd8de 253 SendData(y & 0xff);
mdroberts1243 0:9e6a8e3cd8de 254 // w upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 255 SendData(w >> 8);
mdroberts1243 0:9e6a8e3cd8de 256 SendData(w & 0xf8); // lower three bits zero, multiple of 8
mdroberts1243 0:9e6a8e3cd8de 257 // l upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 258 SendData(l >> 8);
mdroberts1243 0:9e6a8e3cd8de 259 SendData(l & 0xff);
mdroberts1243 0:9e6a8e3cd8de 260 // all the data (KPixel 1 ... KPixel n)
mdroberts1243 0:9e6a8e3cd8de 261 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 262 if (buffer_red != NULL) {
mdroberts1243 0:9e6a8e3cd8de 263 for(int i = 0; i < w / 8 * l; i++) {
mdroberts1243 0:9e6a8e3cd8de 264 SendData(buffer_red[i]);
mdroberts1243 0:9e6a8e3cd8de 265 }
mdroberts1243 0:9e6a8e3cd8de 266 } else {
mdroberts1243 0:9e6a8e3cd8de 267 for(int i = 0; i < w / 8 * l; i++) {
mdroberts1243 0:9e6a8e3cd8de 268 SendData(0x00);
mdroberts1243 0:9e6a8e3cd8de 269 }
mdroberts1243 0:9e6a8e3cd8de 270 }
mdroberts1243 0:9e6a8e3cd8de 271 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 272 // SendCommand(DATA_STOP);
mdroberts1243 0:9e6a8e3cd8de 273 }
mdroberts1243 0:9e6a8e3cd8de 274
mdroberts1243 0:9e6a8e3cd8de 275 /**
mdroberts1243 0:9e6a8e3cd8de 276 * @brief: transmit partial data to the black part of SRAM
mdroberts1243 0:9e6a8e3cd8de 277 */
mdroberts1243 0:9e6a8e3cd8de 278 void Epd::SetPartialWindowBlack(const unsigned char* buffer_black, int x, int y, int w, int l)
mdroberts1243 0:9e6a8e3cd8de 279 {
mdroberts1243 0:9e6a8e3cd8de 280 SendCommand(PARTIAL_DATA_START_TRANSMISSION_1); // the black stuff
mdroberts1243 0:9e6a8e3cd8de 281 // x upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 282 SendData(x >> 8);
mdroberts1243 0:9e6a8e3cd8de 283 SendData(x & 0xf8); // x should be the multiple of 8, the last 3 bit will always be ignored
mdroberts1243 0:9e6a8e3cd8de 284 // y upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 285 SendData(y >> 8);
mdroberts1243 0:9e6a8e3cd8de 286 SendData(y & 0xff);
mdroberts1243 0:9e6a8e3cd8de 287 // w upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 288 SendData(w >> 8);
mdroberts1243 0:9e6a8e3cd8de 289 SendData(w & 0xf8); // lower three bits zero, multiple of 8
mdroberts1243 0:9e6a8e3cd8de 290 // l upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 291 SendData(l >> 8);
mdroberts1243 0:9e6a8e3cd8de 292 SendData(l & 0xff);
mdroberts1243 0:9e6a8e3cd8de 293 // all the data (KPixel 1 ... KPixel n)
mdroberts1243 0:9e6a8e3cd8de 294 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 295 if (buffer_black != NULL) {
mdroberts1243 0:9e6a8e3cd8de 296 for(int i = 0; i < w / 8 * l; i++) {
mdroberts1243 0:9e6a8e3cd8de 297 SendData(buffer_black[i]);
mdroberts1243 0:9e6a8e3cd8de 298 }
mdroberts1243 0:9e6a8e3cd8de 299 } else {
mdroberts1243 0:9e6a8e3cd8de 300 for(int i = 0; i < w / 8 * l; i++) {
mdroberts1243 0:9e6a8e3cd8de 301 SendData(0x00);
mdroberts1243 0:9e6a8e3cd8de 302 }
mdroberts1243 0:9e6a8e3cd8de 303 }
mdroberts1243 0:9e6a8e3cd8de 304 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 305 }
mdroberts1243 0:9e6a8e3cd8de 306
mdroberts1243 0:9e6a8e3cd8de 307 /**
mdroberts1243 0:9e6a8e3cd8de 308 * @brief: transmit partial data to the red part of SRAM
mdroberts1243 0:9e6a8e3cd8de 309 */
mdroberts1243 0:9e6a8e3cd8de 310 void Epd::SetPartialWindowRed(const unsigned char* buffer_red, int x, int y, int w, int l)
mdroberts1243 0:9e6a8e3cd8de 311 {
mdroberts1243 0:9e6a8e3cd8de 312 SendCommand(PARTIAL_DATA_START_TRANSMISSION_2); // the red stuff
mdroberts1243 0:9e6a8e3cd8de 313 // x upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 314 SendData(x >> 8);
mdroberts1243 0:9e6a8e3cd8de 315 SendData(x & 0xf8); // x should be the multiple of 8, the last 3 bit will always be ignored
mdroberts1243 0:9e6a8e3cd8de 316 // y upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 317 SendData(y >> 8);
mdroberts1243 0:9e6a8e3cd8de 318 SendData(y & 0xff);
mdroberts1243 0:9e6a8e3cd8de 319 // w upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 320 SendData(w >> 8);
mdroberts1243 0:9e6a8e3cd8de 321 SendData(w & 0xf8); // lower three bits zero, multiple of 8
mdroberts1243 0:9e6a8e3cd8de 322 // l upper bit and lower byte
mdroberts1243 0:9e6a8e3cd8de 323 SendData(l >> 8);
mdroberts1243 0:9e6a8e3cd8de 324 SendData(l & 0xff);
mdroberts1243 0:9e6a8e3cd8de 325 // all the data (KPixel 1 ... KPixel n)
mdroberts1243 0:9e6a8e3cd8de 326 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 327 if (buffer_red != NULL) {
mdroberts1243 0:9e6a8e3cd8de 328 for(int i = 0; i < w / 8 * l; i++) {
mdroberts1243 0:9e6a8e3cd8de 329 SendData(buffer_red[i]);
mdroberts1243 0:9e6a8e3cd8de 330 }
mdroberts1243 0:9e6a8e3cd8de 331 } else {
mdroberts1243 0:9e6a8e3cd8de 332 for(int i = 0; i < w / 8 * l; i++) {
mdroberts1243 0:9e6a8e3cd8de 333 SendData(0x00);
mdroberts1243 0:9e6a8e3cd8de 334 }
mdroberts1243 0:9e6a8e3cd8de 335 }
mdroberts1243 0:9e6a8e3cd8de 336 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 337 // SendCommand(DATA_STOP);
mdroberts1243 0:9e6a8e3cd8de 338 }
mdroberts1243 0:9e6a8e3cd8de 339
mdroberts1243 0:9e6a8e3cd8de 340 /**
mdroberts1243 0:9e6a8e3cd8de 341 * @brief: refresh and displays the frame
mdroberts1243 0:9e6a8e3cd8de 342 */
mdroberts1243 0:9e6a8e3cd8de 343 void Epd::DisplayFrame(const unsigned char* frame_buffer_black, const unsigned char* frame_buffer_red)
mdroberts1243 0:9e6a8e3cd8de 344 {
mdroberts1243 0:9e6a8e3cd8de 345 SendCommand(RESOLUTION_SETTING);
mdroberts1243 0:9e6a8e3cd8de 346 SendData(horiz >> 8);
mdroberts1243 0:9e6a8e3cd8de 347 SendData(horiz & 0xff); //176
mdroberts1243 0:9e6a8e3cd8de 348 SendData(vert >> 8);
mdroberts1243 0:9e6a8e3cd8de 349 SendData(vert & 0xff); //264
mdroberts1243 0:9e6a8e3cd8de 350
mdroberts1243 0:9e6a8e3cd8de 351 if (frame_buffer_black != NULL) {
mdroberts1243 0:9e6a8e3cd8de 352 SendCommand(DATA_START_TRANSMISSION_1);
mdroberts1243 0:9e6a8e3cd8de 353 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 354 for (int i = 0; i < this->horiz * this->vert / 8; i++) {
mdroberts1243 0:9e6a8e3cd8de 355 SendData(*(frame_buffer_black + i));
mdroberts1243 0:9e6a8e3cd8de 356 }
mdroberts1243 0:9e6a8e3cd8de 357 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 358 }
mdroberts1243 0:9e6a8e3cd8de 359 if (frame_buffer_red != NULL) {
mdroberts1243 0:9e6a8e3cd8de 360 SendCommand(DATA_START_TRANSMISSION_2);
mdroberts1243 0:9e6a8e3cd8de 361 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 362 for (int i = 0; i < this->horiz * this->vert / 8; i++) {
mdroberts1243 0:9e6a8e3cd8de 363 SendData(*(frame_buffer_red + i));
mdroberts1243 0:9e6a8e3cd8de 364 }
mdroberts1243 0:9e6a8e3cd8de 365 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 366 }
mdroberts1243 0:9e6a8e3cd8de 367 SendCommand(DISPLAY_REFRESH);
mdroberts1243 0:9e6a8e3cd8de 368 WaitUntilIdle();
mdroberts1243 0:9e6a8e3cd8de 369 }
mdroberts1243 0:9e6a8e3cd8de 370
mdroberts1243 0:9e6a8e3cd8de 371 /**
mdroberts1243 0:9e6a8e3cd8de 372 * @brief: clear the frame data from the SRAM, this won't refresh the display
mdroberts1243 0:9e6a8e3cd8de 373 */
mdroberts1243 0:9e6a8e3cd8de 374 void Epd::ClearFrame(void)
mdroberts1243 0:9e6a8e3cd8de 375 {
mdroberts1243 0:9e6a8e3cd8de 376 SendCommand(RESOLUTION_SETTING);
mdroberts1243 0:9e6a8e3cd8de 377 SendData(horiz >> 8);
mdroberts1243 0:9e6a8e3cd8de 378 SendData(horiz & 0xff); //176
mdroberts1243 0:9e6a8e3cd8de 379 SendData(vert >> 8);
mdroberts1243 0:9e6a8e3cd8de 380 SendData(vert & 0xff); //264
mdroberts1243 0:9e6a8e3cd8de 381
mdroberts1243 0:9e6a8e3cd8de 382 SendCommand(DATA_START_TRANSMISSION_1);
mdroberts1243 0:9e6a8e3cd8de 383 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 384 for(int i = 0; i < horiz * vert / 8; i++) {
mdroberts1243 0:9e6a8e3cd8de 385 SendData(0xFF);
mdroberts1243 0:9e6a8e3cd8de 386 }
mdroberts1243 0:9e6a8e3cd8de 387 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 388 SendCommand(DATA_START_TRANSMISSION_2);
mdroberts1243 0:9e6a8e3cd8de 389 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 390 for(int i = 0; i < horiz * vert / 8; i++) {
mdroberts1243 0:9e6a8e3cd8de 391 SendData(0xFF);
mdroberts1243 0:9e6a8e3cd8de 392 }
mdroberts1243 0:9e6a8e3cd8de 393 DelayMs(2);
mdroberts1243 0:9e6a8e3cd8de 394 }
mdroberts1243 0:9e6a8e3cd8de 395
mdroberts1243 0:9e6a8e3cd8de 396 /**
mdroberts1243 0:9e6a8e3cd8de 397 * @brief: This displays the frame data from SRAM
mdroberts1243 0:9e6a8e3cd8de 398 */
mdroberts1243 0:9e6a8e3cd8de 399 void Epd::DisplayFrame(void)
mdroberts1243 0:9e6a8e3cd8de 400 {
mdroberts1243 0:9e6a8e3cd8de 401 SendCommand(DISPLAY_REFRESH);
mdroberts1243 0:9e6a8e3cd8de 402 WaitUntilIdle();
mdroberts1243 0:9e6a8e3cd8de 403 }
mdroberts1243 0:9e6a8e3cd8de 404
mdroberts1243 0:9e6a8e3cd8de 405 /**
mdroberts1243 0:9e6a8e3cd8de 406 * @brief: After this command is transmitted, the chip would enter the deep-sleep mode to save power.
mdroberts1243 0:9e6a8e3cd8de 407 * The deep sleep mode would return to standby by hardware reset. The only one parameter is a
mdroberts1243 0:9e6a8e3cd8de 408 * check code, the command would be executed if check code = 0xA5.
mdroberts1243 0:9e6a8e3cd8de 409 * You can use Epd::Reset() to awaken and use Epd::Init() to initialize.
mdroberts1243 0:9e6a8e3cd8de 410 */
mdroberts1243 0:9e6a8e3cd8de 411 void Epd::Sleep()
mdroberts1243 0:9e6a8e3cd8de 412 {
mdroberts1243 0:9e6a8e3cd8de 413 SendCommand(POWER_OFF);
mdroberts1243 0:9e6a8e3cd8de 414 WaitUntilIdle();
mdroberts1243 0:9e6a8e3cd8de 415 SendCommand(DEEP_SLEEP);
mdroberts1243 0:9e6a8e3cd8de 416 SendData(0xA5); // hardware reset to recover to standby
mdroberts1243 0:9e6a8e3cd8de 417 }
mdroberts1243 0:9e6a8e3cd8de 418
mdroberts1243 0:9e6a8e3cd8de 419 /**
mdroberts1243 0:9e6a8e3cd8de 420 * @brief: e-Paper power control
mdroberts1243 0:9e6a8e3cd8de 421 * MDR -- maybe should check if NC!
mdroberts1243 0:9e6a8e3cd8de 422 */
mdroberts1243 0:9e6a8e3cd8de 423 void Epd::PwrOn()
mdroberts1243 0:9e6a8e3cd8de 424 {
mdroberts1243 0:9e6a8e3cd8de 425 //DigitalWrite(m_pwr, 1);
mdroberts1243 0:9e6a8e3cd8de 426 }
mdroberts1243 0:9e6a8e3cd8de 427
mdroberts1243 0:9e6a8e3cd8de 428 void Epd::PwrOff()
mdroberts1243 0:9e6a8e3cd8de 429 {
mdroberts1243 0:9e6a8e3cd8de 430 //DigitalWrite(m_pwr, 0);
mdroberts1243 0:9e6a8e3cd8de 431 }
mdroberts1243 0:9e6a8e3cd8de 432
mdroberts1243 0:9e6a8e3cd8de 433 const unsigned char lut_vcom_dc[] =
mdroberts1243 0:9e6a8e3cd8de 434 {
mdroberts1243 0:9e6a8e3cd8de 435 0x00, 0x00,
mdroberts1243 0:9e6a8e3cd8de 436 0x00, 0x1A, 0x1A, 0x00, 0x00, 0x01,
mdroberts1243 0:9e6a8e3cd8de 437 0x00, 0x0A, 0x0A, 0x00, 0x00, 0x08,
mdroberts1243 0:9e6a8e3cd8de 438 0x00, 0x0E, 0x01, 0x0E, 0x01, 0x10,
mdroberts1243 0:9e6a8e3cd8de 439 0x00, 0x0A, 0x0A, 0x00, 0x00, 0x08,
mdroberts1243 0:9e6a8e3cd8de 440 0x00, 0x04, 0x10, 0x00, 0x00, 0x05,
mdroberts1243 0:9e6a8e3cd8de 441 0x00, 0x03, 0x0E, 0x00, 0x00, 0x0A,
mdroberts1243 0:9e6a8e3cd8de 442 0x00, 0x23, 0x00, 0x00, 0x00, 0x01
mdroberts1243 0:9e6a8e3cd8de 443 };
mdroberts1243 0:9e6a8e3cd8de 444
mdroberts1243 0:9e6a8e3cd8de 445 //R21H
mdroberts1243 0:9e6a8e3cd8de 446 const unsigned char lut_ww[] =
mdroberts1243 0:9e6a8e3cd8de 447 {
mdroberts1243 0:9e6a8e3cd8de 448 0x90, 0x1A, 0x1A, 0x00, 0x00, 0x01,
mdroberts1243 0:9e6a8e3cd8de 449 0x40, 0x0A, 0x0A, 0x00, 0x00, 0x08,
mdroberts1243 0:9e6a8e3cd8de 450 0x84, 0x0E, 0x01, 0x0E, 0x01, 0x10,
mdroberts1243 0:9e6a8e3cd8de 451 0x80, 0x0A, 0x0A, 0x00, 0x00, 0x08,
mdroberts1243 0:9e6a8e3cd8de 452 0x00, 0x04, 0x10, 0x00, 0x00, 0x05,
mdroberts1243 0:9e6a8e3cd8de 453 0x00, 0x03, 0x0E, 0x00, 0x00, 0x0A,
mdroberts1243 0:9e6a8e3cd8de 454 0x00, 0x23, 0x00, 0x00, 0x00, 0x01
mdroberts1243 0:9e6a8e3cd8de 455 };
mdroberts1243 0:9e6a8e3cd8de 456
mdroberts1243 0:9e6a8e3cd8de 457 //R22H r
mdroberts1243 0:9e6a8e3cd8de 458 const unsigned char lut_bw[] =
mdroberts1243 0:9e6a8e3cd8de 459 {
mdroberts1243 0:9e6a8e3cd8de 460 0xA0, 0x1A, 0x1A, 0x00, 0x00, 0x01,
mdroberts1243 0:9e6a8e3cd8de 461 0x00, 0x0A, 0x0A, 0x00, 0x00, 0x08,
mdroberts1243 0:9e6a8e3cd8de 462 0x84, 0x0E, 0x01, 0x0E, 0x01, 0x10,
mdroberts1243 0:9e6a8e3cd8de 463 0x90, 0x0A, 0x0A, 0x00, 0x00, 0x08,
mdroberts1243 0:9e6a8e3cd8de 464 0xB0, 0x04, 0x10, 0x00, 0x00, 0x05,
mdroberts1243 0:9e6a8e3cd8de 465 0xB0, 0x03, 0x0E, 0x00, 0x00, 0x0A,
mdroberts1243 0:9e6a8e3cd8de 466 0xC0, 0x23, 0x00, 0x00, 0x00, 0x01
mdroberts1243 0:9e6a8e3cd8de 467 };
mdroberts1243 0:9e6a8e3cd8de 468
mdroberts1243 0:9e6a8e3cd8de 469 //R23H w
mdroberts1243 0:9e6a8e3cd8de 470 const unsigned char lut_bb[] =
mdroberts1243 0:9e6a8e3cd8de 471 {
mdroberts1243 0:9e6a8e3cd8de 472 0x90, 0x1A, 0x1A, 0x00, 0x00, 0x01,
mdroberts1243 0:9e6a8e3cd8de 473 0x40, 0x0A, 0x0A, 0x00, 0x00, 0x08,
mdroberts1243 0:9e6a8e3cd8de 474 0x84, 0x0E, 0x01, 0x0E, 0x01, 0x10,
mdroberts1243 0:9e6a8e3cd8de 475 0x80, 0x0A, 0x0A, 0x00, 0x00, 0x08,
mdroberts1243 0:9e6a8e3cd8de 476 0x00, 0x04, 0x10, 0x00, 0x00, 0x05,
mdroberts1243 0:9e6a8e3cd8de 477 0x00, 0x03, 0x0E, 0x00, 0x00, 0x0A,
mdroberts1243 0:9e6a8e3cd8de 478 0x00, 0x23, 0x00, 0x00, 0x00, 0x01
mdroberts1243 0:9e6a8e3cd8de 479 };
mdroberts1243 0:9e6a8e3cd8de 480
mdroberts1243 0:9e6a8e3cd8de 481 //R24H b
mdroberts1243 0:9e6a8e3cd8de 482 const unsigned char lut_wb[] =
mdroberts1243 0:9e6a8e3cd8de 483 {
mdroberts1243 0:9e6a8e3cd8de 484 0x90, 0x1A, 0x1A, 0x00, 0x00, 0x01,
mdroberts1243 0:9e6a8e3cd8de 485 0x20, 0x0A, 0x0A, 0x00, 0x00, 0x08,
mdroberts1243 0:9e6a8e3cd8de 486 0x84, 0x0E, 0x01, 0x0E, 0x01, 0x10,
mdroberts1243 0:9e6a8e3cd8de 487 0x10, 0x0A, 0x0A, 0x00, 0x00, 0x08,
mdroberts1243 0:9e6a8e3cd8de 488 0x00, 0x04, 0x10, 0x00, 0x00, 0x05,
mdroberts1243 0:9e6a8e3cd8de 489 0x00, 0x03, 0x0E, 0x00, 0x00, 0x0A,
mdroberts1243 0:9e6a8e3cd8de 490 0x00, 0x23, 0x00, 0x00, 0x00, 0x01
mdroberts1243 0:9e6a8e3cd8de 491 };
mdroberts1243 0:9e6a8e3cd8de 492
mdroberts1243 0:9e6a8e3cd8de 493
mdroberts1243 0:9e6a8e3cd8de 494 /* END OF FILE */