Library for Waveshare 2.7" tri-colour e-Paper display.
epd2in7b.cpp@0:9e6a8e3cd8de, 2019-12-06 (annotated)
- 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?
User | Revision | Line number | New 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 */ |