EPD_2in13bc.c (9619B)
1 /***************************************************************************** 2 * | File : EPD_2in13bc.c 3 * | Author : Waveshare team 4 * | Function : 2.13inch e-paper b&c 5 * | Info : 6 *---------------- 7 * | This version: V3.0 8 * | Date : 2019-06-13 9 * | Info : 10 * ----------------------------------------------------------------------------- 11 * V3.0(2019-06-13): 12 * 1.Change: 13 * EPD_Reset() => EPD_2IN13BC_Reset() 14 * EPD_SendCommand() => EPD_2IN13BC_SendCommand() 15 * EPD_SendData() => EPD_2IN13BC_SendData() 16 * EPD_WaitUntilIdle() => EPD_2IN13BC_ReadBusy() 17 * EPD_Init() => EPD_2IN13BC_Init() 18 * EPD_Clear() => EPD_2IN13BC_Clear() 19 * EPD_Display() => EPD_2IN13BC_Display() 20 * EPD_Sleep() => EPD_2IN13BC_Sleep() 21 * 2.remove commands define: 22 * #define PANEL_SETTING 0x00 23 * #define POWER_SETTING 0x01 24 * #define POWER_OFF 0x02 25 * #define POWER_OFF_SEQUENCE_SETTING 0x03 26 * #define POWER_ON 0x04 27 * #define POWER_ON_MEASURE 0x05 28 * #define BOOSTER_SOFT_START 0x06 29 * #define DEEP_SLEEP 0x07 30 * #define DATA_START_TRANSMISSION_1 0x10 31 * #define DATA_STOP 0x11 32 * #define DISPLAY_REFRESH 0x12 33 * #define DATA_START_TRANSMISSION_2 0x13 34 * #define VCOM_LUT 0x20 35 * #define W2W_LUT 0x21 36 * #define B2W_LUT 0x22 37 * #define W2B_LUT 0x23 38 * #define B2B_LUT 0x24 39 * #define PLL_CONTROL 0x30 40 * #define TEMPERATURE_SENSOR_CALIBRATION 0x40 41 * #define TEMPERATURE_SENSOR_SELECTION 0x41 42 * #define TEMPERATURE_SENSOR_WRITE 0x42 43 * #define TEMPERATURE_SENSOR_READ 0x43 44 * #define VCOM_AND_DATA_INTERVAL_SETTING 0x50 45 * #define LOW_POWER_DETECTION 0x51 46 * #define TCON_SETTING 0x60 47 * #define RESOLUTION_SETTING 0x61 48 * #define GET_STATUS 0x71 49 * #define AUTO_MEASURE_VCOM 0x80 50 * #define READ_VCOM_VALUE 0x81 51 * #define VCM_DC_SETTING 0x82 52 * #define PARTIAL_WINDOW 0x90 53 * #define PARTIAL_IN 0x91 54 * #define PARTIAL_OUT 0x92 55 * #define PROGRAM_MODE 0xA0 56 * #define ACTIVE_PROGRAM 0xA1 57 * #define READ_OTP_DATA 0xA2 58 * #define POWER_SAVING 0xE3 59 * V2.0(2018-11-13): 60 * 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8] 61 * 2.Change:EPD_Display(UBYTE *Image) 62 * Need to pass parameters: pointer to cached data 63 # 64 # Permission is hereby granted, free of charge, to any person obtaining a copy 65 # of this software and associated documnetation files (the "Software"), to deal 66 # in the Software without restriction, including without limitation the rights 67 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 68 # copies of the Software, and to permit persons to whom the Software is 69 # furished to do so, subject to the following conditions: 70 # 71 # The above copyright notice and this permission notice shall be included in 72 # all copies or substantial portions of the Software. 73 # 74 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 75 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 76 # FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 77 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 78 # LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 79 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 80 # THE SOFTWARE. 81 # 82 ******************************************************************************/ 83 #include "EPD_2in13bc.h" 84 #include "Debug.h" 85 86 /****************************************************************************** 87 function : Software reset 88 parameter: 89 ******************************************************************************/ 90 static void EPD_2IN13BC_Reset(void) 91 { 92 DEV_Digital_Write(EPD_RST_PIN, 1); 93 DEV_Delay_ms(200); 94 DEV_Digital_Write(EPD_RST_PIN, 0); 95 DEV_Delay_ms(200); 96 DEV_Digital_Write(EPD_RST_PIN, 1); 97 DEV_Delay_ms(200); 98 } 99 100 /****************************************************************************** 101 function : send command 102 parameter: 103 Reg : Command register 104 ******************************************************************************/ 105 static void EPD_2IN13BC_SendCommand(UBYTE Reg) 106 { 107 DEV_Digital_Write(EPD_DC_PIN, 0); 108 DEV_Digital_Write(EPD_CS_PIN, 0); 109 DEV_SPI_WriteByte(Reg); 110 DEV_Digital_Write(EPD_CS_PIN, 1); 111 } 112 113 /****************************************************************************** 114 function : send data 115 parameter: 116 Data : Write data 117 ******************************************************************************/ 118 static void EPD_2IN13BC_SendData(UBYTE Data) 119 { 120 DEV_Digital_Write(EPD_DC_PIN, 1); 121 DEV_Digital_Write(EPD_CS_PIN, 0); 122 DEV_SPI_WriteByte(Data); 123 DEV_Digital_Write(EPD_CS_PIN, 1); 124 } 125 126 /****************************************************************************** 127 function : Wait until the busy_pin goes LOW 128 parameter: 129 ******************************************************************************/ 130 void EPD_2IN13BC_ReadBusy(void) 131 { 132 Debug("e-Paper busy\r\n"); 133 while(DEV_Digital_Read(EPD_BUSY_PIN) == 0) { 134 DEV_Delay_ms(100); 135 } 136 Debug("e-Paper busy release\r\n"); 137 } 138 139 /****************************************************************************** 140 function : Turn On Display 141 parameter: 142 ******************************************************************************/ 143 static void EPD_2IN13BC_TurnOnDisplay(void) 144 { 145 EPD_2IN13BC_SendCommand(0x12); //DISPLAY REFRESH 146 DEV_Delay_ms(10); 147 148 EPD_2IN13BC_ReadBusy(); 149 } 150 151 /****************************************************************************** 152 function : Initialize the e-Paper register 153 parameter: 154 ******************************************************************************/ 155 void EPD_2IN13BC_Init(void) 156 { 157 EPD_2IN13BC_Reset(); 158 159 EPD_2IN13BC_SendCommand(0x06); // BOOSTER_SOFT_START 160 EPD_2IN13BC_SendData(0x17); 161 EPD_2IN13BC_SendData(0x17); 162 EPD_2IN13BC_SendData(0x17); 163 164 EPD_2IN13BC_SendCommand(0x04); // POWER_ON 165 EPD_2IN13BC_ReadBusy(); 166 167 EPD_2IN13BC_SendCommand(0x00); // PANEL_SETTING 168 EPD_2IN13BC_SendData(0x8F); 169 170 EPD_2IN13BC_SendCommand(0x50); // VCOM_AND_DATA_INTERVAL_SETTING 171 EPD_2IN13BC_SendData(0xF0); 172 EPD_2IN13BC_SendCommand(0x61); // RESOLUTION_SETTING 173 EPD_2IN13BC_SendData(EPD_2IN13BC_WIDTH); // width: 104 174 EPD_2IN13BC_SendData(EPD_2IN13BC_HEIGHT >> 8); // height: 212 175 EPD_2IN13BC_SendData(EPD_2IN13BC_HEIGHT & 0xFF); 176 } 177 178 /****************************************************************************** 179 function : Clear screen 180 parameter: 181 ******************************************************************************/ 182 void EPD_2IN13BC_Clear(void) 183 { 184 UWORD Width = (EPD_2IN13BC_WIDTH % 8 == 0)? (EPD_2IN13BC_WIDTH / 8 ): (EPD_2IN13BC_WIDTH / 8 + 1); 185 UWORD Height = EPD_2IN13BC_HEIGHT; 186 187 //send black data 188 EPD_2IN13BC_SendCommand(0x10); 189 for (UWORD j = 0; j < Height; j++) { 190 for (UWORD i = 0; i < Width; i++) { 191 EPD_2IN13BC_SendData(0xFF); 192 } 193 } 194 EPD_2IN13BC_SendCommand(0x92); 195 196 //send red data 197 EPD_2IN13BC_SendCommand(0x13); 198 for (UWORD j = 0; j < Height; j++) { 199 for (UWORD i = 0; i < Width; i++) { 200 EPD_2IN13BC_SendData(0xFF); 201 } 202 } 203 EPD_2IN13BC_SendCommand(0x92); 204 205 EPD_2IN13BC_TurnOnDisplay(); 206 } 207 208 /****************************************************************************** 209 function : Sends the image buffer in RAM to e-Paper and displays 210 parameter: 211 ******************************************************************************/ 212 void EPD_2IN13BC_Display(const UBYTE *blackimage, const UBYTE *ryimage) 213 { 214 UWORD Width, Height; 215 Width = (EPD_2IN13BC_WIDTH % 8 == 0)? (EPD_2IN13BC_WIDTH / 8 ): (EPD_2IN13BC_WIDTH / 8 + 1); 216 Height = EPD_2IN13BC_HEIGHT; 217 218 EPD_2IN13BC_SendCommand(0x10); 219 for (UWORD j = 0; j < Height; j++) { 220 for (UWORD i = 0; i < Width; i++) { 221 EPD_2IN13BC_SendData(blackimage[i + j * Width]); 222 } 223 } 224 EPD_2IN13BC_SendCommand(0x92); 225 226 EPD_2IN13BC_SendCommand(0x13); 227 for (UWORD j = 0; j < Height; j++) { 228 for (UWORD i = 0; i < Width; i++) { 229 EPD_2IN13BC_SendData(ryimage[i + j * Width]); 230 } 231 } 232 EPD_2IN13BC_SendCommand(0x92); 233 234 EPD_2IN13BC_TurnOnDisplay(); 235 } 236 237 /****************************************************************************** 238 function : Enter sleep mode 239 parameter: 240 ******************************************************************************/ 241 void EPD_2IN13BC_Sleep(void) 242 { 243 EPD_2IN13BC_SendCommand(0x02); // POWER_OFF 244 EPD_2IN13BC_ReadBusy(); 245 EPD_2IN13BC_SendCommand(0x07); // DEEP_SLEEP 246 EPD_2IN13BC_SendData(0xA5); // check code 247 }