EPD_1in54c.c (8977B)
1 /***************************************************************************** 2 * | File : EPD_1in54c.C 3 * | Author : Waveshare team 4 * | Function : 1.54inch e-paper c 5 * | Info : 6 *---------------- 7 * | This version: V3.1 8 * | Date : 2019-06-12 9 * | Info : 10 * ----------------------------------------------------------------------------- 11 * V3.1(2019-06-12): 12 * 1.Change: 13 * EPD_Reset() => EPD_1IN54C_Reset() 14 * EPD_SendCommand() => EPD_1IN54C_SendCommand() 15 * EPD_SendData() => EPD_1IN54C_SendData() 16 * EPD_WaitUntilIdle() => EPD_1IN54C_ReadBusy() 17 * EPD_Init() => EPD_1IN54C_Init() 18 * EPD_Clear() => EPD_1IN54C_Clear() 19 * EPD_Display() => EPD_1IN54C_Display() 20 * EPD_Sleep() => EPD_1IN54C_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 PLL_CONTROL 0x30 35 * #define TEMPERATURE_SENSOR_COMMAND 0x40 36 * #define TEMPERATURE_SENSOR_CALIBRATION 0x41 37 * #define TEMPERATURE_SENSOR_WRITE 0x42 38 * #define TEMPERATURE_SENSOR_READ 0x43 39 * #define VCOM_AND_DATA_INTERVAL_SETTING 0x50 40 * #define LOW_POWER_DETECTION 0x51 41 * #define TCON_SETTING 0x60 42 * #define TCON_RESOLUTION 0x61 43 * #define SOURCE_AND_GATE_START_SETTING 0x62 44 * #define GET_STATUS 0x71 45 * #define AUTO_MEASURE_VCOM 0x80 46 * #define VCOM_VALUE 0x81 47 * #define VCM_DC_SETTING_REGISTER 0x82 48 * #define PROGRAM_MODE 0xA0 49 * #define ACTIVE_PROGRAM 0xA1 50 * #define READ_OTP_DATA 0xA2 51 * ----------------------------------------------------------------------------- 52 * V2.0(2018-11-14): 53 * 1.Remove:ImageBuff[EPD_1IN54C_HEIGHT * EPD_1IN54C_WIDTH / 8] 54 * 2.Change:EPD_Display(UBYTE *Image) 55 * Need to pass parameters: pointer to cached data 56 * 3.Change: 57 * EPD_RST -> EPD_RST_PIN 58 * EPD_DC -> EPD_DC_PIN 59 * EPD_CS -> EPD_CS_PIN 60 * EPD_BUSY -> EPD_BUSY_PIN 61 # 62 # Permission is hereby granted, free of charge, to any person obtaining a copy 63 # of this software and associated documnetation files (the "Software"), to deal 64 # in the Software without restriction, including without limitation the rights 65 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 66 # copies of the Software, and to permit persons to whom the Software is 67 # furished to do so, subject to the following conditions: 68 # 69 # The above copyright notice and this permission notice shall be included in 70 # all copies or substantial portions of the Software. 71 # 72 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 73 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 74 # FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 75 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 76 # LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 77 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 78 # THE SOFTWARE. 79 # 80 ******************************************************************************/ 81 #include "EPD_1in54c.h" 82 #include "Debug.h" 83 84 /****************************************************************************** 85 function : Software reset 86 parameter: 87 ******************************************************************************/ 88 static void EPD_1IN54C_Reset(void) 89 { 90 DEV_Digital_Write(EPD_RST_PIN, 1); 91 DEV_Delay_ms(10); 92 DEV_Digital_Write(EPD_RST_PIN, 0); 93 DEV_Delay_ms(10); 94 DEV_Digital_Write(EPD_RST_PIN, 1); 95 DEV_Delay_ms(10); 96 } 97 98 /****************************************************************************** 99 function : send command 100 parameter: 101 Reg : Command register 102 ******************************************************************************/ 103 static void EPD_1IN54C_SendCommand(UBYTE Reg) 104 { 105 DEV_Digital_Write(EPD_DC_PIN, 0); 106 DEV_Digital_Write(EPD_CS_PIN, 0); 107 DEV_SPI_WriteByte(Reg); 108 DEV_Digital_Write(EPD_CS_PIN, 1); 109 } 110 111 /****************************************************************************** 112 function : send data 113 parameter: 114 Data : Write data 115 ******************************************************************************/ 116 static void EPD_1IN54C_SendData(UBYTE Data) 117 { 118 DEV_Digital_Write(EPD_DC_PIN, 1); 119 DEV_Digital_Write(EPD_CS_PIN, 0); 120 DEV_SPI_WriteByte(Data); 121 DEV_Digital_Write(EPD_CS_PIN, 1); 122 } 123 124 /****************************************************************************** 125 function : Wait until the busy_pin goes LOW 126 parameter: 127 ******************************************************************************/ 128 static void EPD_1IN54C_ReadBusy(void) 129 { 130 unsigned char busy; 131 do { 132 EPD_1IN54C_SendCommand(0x71); 133 busy = DEV_Digital_Read(EPD_BUSY_PIN); 134 busy =!(busy & 0x01); 135 } while(busy); 136 DEV_Delay_ms(200); 137 } 138 139 /****************************************************************************** 140 function : Initialize the e-Paper register 141 parameter: 142 ******************************************************************************/ 143 void EPD_1IN54C_Init(void) 144 { 145 EPD_1IN54C_Reset(); 146 147 EPD_1IN54C_SendCommand(0x06); //boost soft start 148 EPD_1IN54C_SendData(0x17); 149 EPD_1IN54C_SendData(0x17); 150 EPD_1IN54C_SendData(0x17); 151 EPD_1IN54C_SendCommand(0x04); 152 153 EPD_1IN54C_ReadBusy(); 154 155 EPD_1IN54C_SendCommand(0x00); //panel setting 156 EPD_1IN54C_SendData(0x0f); //LUT from OTP£¬160x296 157 EPD_1IN54C_SendData(0x0d); //VCOM to 0V fast 158 159 EPD_1IN54C_SendCommand(0x61); //resolution setting 160 EPD_1IN54C_SendData(0x98); //152 161 EPD_1IN54C_SendData(0x00); //152 162 EPD_1IN54C_SendData(0x98); 163 164 EPD_1IN54C_SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING 165 EPD_1IN54C_SendData(0x77); //WBmode:VBDF 17|D7 VBDW 97 VBDB 57 WBRmode:VBDF F7 VBDW 77 VBDB 37 VBDR B7 166 } 167 168 /****************************************************************************** 169 function : Clear screen 170 parameter: 171 ******************************************************************************/ 172 void EPD_1IN54C_Clear(void) 173 { 174 UWORD Width, Height; 175 Width = (EPD_1IN54C_WIDTH % 8 == 0)? (EPD_1IN54C_WIDTH / 8 ): (EPD_1IN54C_WIDTH / 8 + 1); 176 Height = EPD_1IN54C_HEIGHT; 177 178 //send black data 179 EPD_1IN54C_SendCommand(0x10); 180 for(UWORD i = 0; i < Height; i++) { 181 for(UWORD i = 0; i < Width; i++) { 182 EPD_1IN54C_SendData(0xFF); 183 } 184 } 185 186 //send red data 187 EPD_1IN54C_SendCommand(0x13); 188 for(UWORD i = 0; i < Height; i++) { 189 for(UWORD i = 0; i < Width; i++) { 190 EPD_1IN54C_SendData(0xFF); 191 } 192 } 193 194 //Display refresh 195 EPD_1IN54C_SendCommand(0x12); 196 EPD_1IN54C_ReadBusy(); 197 } 198 199 /****************************************************************************** 200 function : Sends the image buffer in RAM to e-Paper and displays 201 parameter: 202 ******************************************************************************/ 203 void EPD_1IN54C_Display(const UBYTE *blackimage, const UBYTE *redimage) 204 { 205 UWORD Width, Height; 206 Width = (EPD_1IN54C_WIDTH % 8 == 0)? (EPD_1IN54C_WIDTH / 8 ): (EPD_1IN54C_WIDTH / 8 + 1); 207 Height = EPD_1IN54C_HEIGHT; 208 209 //send black data 210 EPD_1IN54C_SendCommand(0x10); 211 for (UWORD j = 0; j < Height; j++) { 212 for (UWORD i = 0; i < Width; i++) { 213 EPD_1IN54C_SendData(blackimage[i + j * Width]); 214 } 215 } 216 217 //send red data 218 EPD_1IN54C_SendCommand(0x13); 219 for (UWORD j = 0; j < Height; j++) { 220 for (UWORD i = 0; i < Width; i++) { 221 EPD_1IN54C_SendData(redimage[i + j * Width]); 222 } 223 } 224 225 //Display refresh 226 EPD_1IN54C_SendCommand(0x12); 227 EPD_1IN54C_ReadBusy(); 228 } 229 230 /****************************************************************************** 231 function : Enter sleep mode 232 parameter: 233 ******************************************************************************/ 234 void EPD_1IN54C_Sleep(void) 235 { 236 EPD_1IN54C_SendCommand(0X02); //power off 237 EPD_1IN54C_ReadBusy(); 238 EPD_1IN54C_SendCommand(0X07); //deep sleep 239 EPD_1IN54C_SendData(0xA5); 240 }