EPD_4in2bc.c (9161B)
1 /***************************************************************************** 2 * | File : EPD_4in2b.c 3 * | Author : Waveshare team 4 * | Function : 4.2inch 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_4IN2BC_Reset() 14 * EPD_SendCommand() => EPD_4IN2BC_SendCommand() 15 * EPD_SendData() => EPD_4IN2BC_SendData() 16 * EPD_WaitUntilIdle() => EPD_4IN2BC_ReadBusy() 17 * EPD_Init() => EPD_4IN2BC_Init() 18 * EPD_Clear() => EPD_4IN2BC_Clear() 19 * EPD_Display() => EPD_4IN2BC_Display() 20 * EPD_Sleep() => EPD_4IN2BC_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 * ----------------------------------------------------------------------------- 60 * V2.0(2018-11-09): 61 * 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8] 62 * 2.Change:EPD_Display(UBYTE *Image) 63 * Need to pass parameters: pointer to cached data 64 # 65 # Permission is hereby granted, free of charge, to any person obtaining a copy 66 # of this software and associated documnetation files (the "Software"), to deal 67 # in the Software without restriction, including without limitation the rights 68 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 69 # copies of the Software, and to permit persons to whom the Software is 70 # furished to do so, subject to the following conditions: 71 # 72 # The above copyright notice and this permission notice shall be included in 73 # all copies or substantial portions of the Software. 74 # 75 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 76 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 77 # FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 78 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 79 # LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 80 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 81 # THE SOFTWARE. 82 # 83 ******************************************************************************/ 84 #include "EPD_4in2bc.h" 85 #include "Debug.h" 86 87 /****************************************************************************** 88 function : Software reset 89 parameter: 90 ******************************************************************************/ 91 static void EPD_4IN2BC_Reset(void) 92 { 93 DEV_Digital_Write(EPD_RST_PIN, 1); 94 DEV_Delay_ms(200); 95 DEV_Digital_Write(EPD_RST_PIN, 0); 96 DEV_Delay_ms(200); 97 DEV_Digital_Write(EPD_RST_PIN, 1); 98 DEV_Delay_ms(200); 99 } 100 101 /****************************************************************************** 102 function : send command 103 parameter: 104 Reg : Command register 105 ******************************************************************************/ 106 static void EPD_4IN2BC_SendCommand(UBYTE Reg) 107 { 108 DEV_Digital_Write(EPD_DC_PIN, 0); 109 DEV_Digital_Write(EPD_CS_PIN, 0); 110 DEV_SPI_WriteByte(Reg); 111 DEV_Digital_Write(EPD_CS_PIN, 1); 112 } 113 114 /****************************************************************************** 115 function : send data 116 parameter: 117 Data : Write data 118 ******************************************************************************/ 119 static void EPD_4IN2BC_SendData(UBYTE Data) 120 { 121 DEV_Digital_Write(EPD_DC_PIN, 1); 122 DEV_Digital_Write(EPD_CS_PIN, 0); 123 DEV_SPI_WriteByte(Data); 124 DEV_Digital_Write(EPD_CS_PIN, 1); 125 } 126 127 /****************************************************************************** 128 function : Wait until the busy_pin goes LOW 129 parameter: 130 ******************************************************************************/ 131 void EPD_4IN2BC_ReadBusy(void) 132 { 133 Debug("e-Paper busy\r\n"); 134 while(DEV_Digital_Read(EPD_BUSY_PIN) == 0) { //0: busy, 1: idle 135 DEV_Delay_ms(100); 136 } 137 Debug("e-Paper busy release\r\n"); 138 } 139 140 /****************************************************************************** 141 function : Turn On Display 142 parameter: 143 ******************************************************************************/ 144 static void EPD_4IN2BC_TurnOnDisplay(void) 145 { 146 EPD_4IN2BC_SendCommand(0x12); // DISPLAY_REFRESH 147 DEV_Delay_ms(100); 148 EPD_4IN2BC_ReadBusy(); 149 } 150 151 /****************************************************************************** 152 function : Initialize the e-Paper register 153 parameter: 154 ******************************************************************************/ 155 void EPD_4IN2BC_Init(void) 156 { 157 EPD_4IN2BC_Reset(); 158 159 EPD_4IN2BC_SendCommand(0x06); // BOOSTER_SOFT_START 160 EPD_4IN2BC_SendData(0x17); 161 EPD_4IN2BC_SendData(0x17); 162 EPD_4IN2BC_SendData(0x17); // 07 0f 17 1f 27 2F 37 2f 163 EPD_4IN2BC_SendCommand(0x04); // POWER_ON 164 EPD_4IN2BC_ReadBusy(); 165 EPD_4IN2BC_SendCommand(0x00); // PANEL_SETTING 166 EPD_4IN2BC_SendData(0x0F); // LUT from OTP 167 } 168 169 /****************************************************************************** 170 function : Clear screen 171 parameter: 172 ******************************************************************************/ 173 void EPD_4IN2BC_Clear(void) 174 { 175 UWORD Width, Height; 176 Width = (EPD_4IN2BC_WIDTH % 8 == 0)? (EPD_4IN2BC_WIDTH / 8 ): (EPD_4IN2BC_WIDTH / 8 + 1); 177 Height = EPD_4IN2BC_HEIGHT; 178 179 EPD_4IN2BC_SendCommand(0x10); 180 for (UWORD j = 0; j < Height; j++) { 181 for (UWORD i = 0; i < Width; i++) { 182 EPD_4IN2BC_SendData(0xFF); 183 } 184 } 185 186 EPD_4IN2BC_SendCommand(0x13); 187 for (UWORD j = 0; j < Height; j++) { 188 for (UWORD i = 0; i < Width; i++) { 189 EPD_4IN2BC_SendData(0xFF); 190 } 191 } 192 193 EPD_4IN2BC_TurnOnDisplay(); 194 } 195 196 /****************************************************************************** 197 function : Sends the image buffer in RAM to e-Paper and displays 198 parameter: 199 ******************************************************************************/ 200 void EPD_4IN2BC_Display(const UBYTE *blackimage, const UBYTE *ryimage) 201 { 202 UWORD Width, Height; 203 Width = (EPD_4IN2BC_WIDTH % 8 == 0)? (EPD_4IN2BC_WIDTH / 8 ): (EPD_4IN2BC_WIDTH / 8 + 1); 204 Height = EPD_4IN2BC_HEIGHT; 205 206 EPD_4IN2BC_SendCommand(0x10); 207 for (UWORD j = 0; j < Height; j++) { 208 for (UWORD i = 0; i < Width; i++) { 209 EPD_4IN2BC_SendData(blackimage[i + j * Width]); 210 } 211 } 212 213 EPD_4IN2BC_SendCommand(0x13); 214 for (UWORD j = 0; j < Height; j++) { 215 for (UWORD i = 0; i < Width; i++) { 216 EPD_4IN2BC_SendData(ryimage[i + j * Width]); 217 } 218 } 219 220 EPD_4IN2BC_TurnOnDisplay(); 221 } 222 223 /****************************************************************************** 224 function : Enter sleep mode 225 parameter: 226 ******************************************************************************/ 227 void EPD_4IN2BC_Sleep(void) 228 { 229 EPD_4IN2BC_SendCommand(0x02); // POWER_OFF 230 EPD_4IN2BC_ReadBusy(); 231 EPD_4IN2BC_SendCommand(0x07); // DEEP_SLEEP 232 EPD_4IN2BC_SendData(0XA5); 233 }