Last active
January 9, 2023 10:54
-
-
Save TamojitSaha/cc06ab4e63a086238713b06a04a20f5c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Pin definition | |
#define RST_PIN 2 | |
#define DC_PIN 4 | |
#define CS_PIN 15 | |
#define BUSY_PIN 5 | |
#define SCK_PIN 14 | |
#define SDI_PIN 13 | |
#define SWRESET 0x12 | |
#define ACT_DISPLAY_UPDATE 0x20 | |
#define SLEEP_MODE 0x10 | |
#define EPD_W21_MOSI_0 digitalWrite(SDI_PIN,LOW) | |
#define EPD_W21_MOSI_1 digitalWrite(SDI_PIN,HIGH) | |
#define EPD_W21_CLK_0 digitalWrite(SCK_PIN,LOW) | |
#define EPD_W21_CLK_1 digitalWrite(SCK_PIN,HIGH) | |
#define EPD_W21_CS_0 digitalWrite(CS_PIN,LOW) | |
#define EPD_W21_CS_1 digitalWrite(CS_PIN,HIGH) | |
#define EPD_W21_DC_0 digitalWrite(DC_PIN,LOW) | |
#define EPD_W21_DC_1 digitalWrite(DC_PIN,HIGH) | |
#define EPD_W21_RST_0 digitalWrite(RST_PIN,LOW) | |
#define EPD_W21_RST_1 digitalWrite(RST_PIN,HIGH) | |
#define isEPD_W21_BUSY digitalRead(BUSY_PIN) | |
#define SDI_PIN_READ digitalRead(SDI_PIN) | |
#define DEBUG | |
#define printf(_s) Serial.print(_s) | |
////////FUNCTION////// | |
void SPI_Write(unsigned char value); | |
uint8_t SPI_Read(void); | |
void EPD_W21_WriteDATA(unsigned char command); | |
void EPD_W21_WriteCMD(unsigned char command); | |
//EPD | |
void EPD_W21_Init(void); | |
// void PIC_display(const unsigned char* picData_old,const unsigned char* picData_new); | |
void EPD_update(void); | |
void EPD_sleep(void); | |
void EPD_read_busy(void); | |
// void PIC_display_Clean(void); | |
void EPD_all_white(void); | |
void EPD_all_black(void); | |
void EPD_all_red(void); | |
void EPD_partial_display_Color(unsigned int x_start, unsigned int y_start, const unsigned char *old_data, const unsigned char *new_data, unsigned int PART_COLUMN, unsigned int PART_LINE, unsigned char mode); //partial display | |
//LUT | |
// void EPD_init_LUT(void); | |
void setup() { | |
pinMode(BUSY_PIN, INPUT); | |
pinMode(RST_PIN, OUTPUT); | |
pinMode(DC_PIN, OUTPUT); | |
pinMode(CS_PIN, OUTPUT); | |
pinMode(SCK_PIN, OUTPUT); | |
pinMode(SDI_PIN, OUTPUT); | |
pinMode(LED_BUILTIN, OUTPUT); //ESP8266 Status light | |
ESP.wdtDisable();//Turn off the software watchdog | |
#ifdef DEBUG | |
Serial.begin(115200); | |
#endif | |
} | |
void loop() { | |
printf("Load white\n"); | |
EPD_W21_Init(); | |
printf("Init white done\n"); | |
EPD_all_white(); | |
EPD_update(); | |
EPD_deepSleep(); | |
delay(8000); | |
printf("Load Red\n"); | |
EPD_W21_Init(); | |
printf("Init Red done\n"); | |
EPD_all_red(); | |
EPD_update(); | |
EPD_deepSleep(); | |
delay(8000); | |
printf("Load Black\n"); | |
EPD_W21_Init(); | |
printf("Init Black done\n"); | |
EPD_all_black(); | |
EPD_update(); | |
EPD_deepSleep(); | |
delay(8000); | |
// ESP.wdtFeed(); | |
} | |
//////////////////////SPI/////////////////////////////////// | |
void SPI_Write(unsigned char value) | |
{ | |
unsigned char i; | |
for (i = 0; i < 8; i++) | |
{ | |
EPD_W21_CLK_0; | |
if (value & 0x80) | |
EPD_W21_MOSI_1; | |
else | |
EPD_W21_MOSI_0; | |
value = (value << 1); | |
EPD_W21_CLK_1; | |
} | |
} | |
uint8_t SPI_Read(void) | |
{ | |
EPD_W21_DC_1; | |
delayMicroseconds(5); | |
EPD_W21_CLK_0; | |
unsigned char i, value; | |
for (i = 0; i <= 8; i++) { | |
value = value << 1; | |
value |= SDI_PIN_READ; | |
EPD_W21_CLK_1; | |
delayMicroseconds(5); | |
EPD_W21_CLK_0; | |
} | |
return value; | |
} | |
void EPD_W21_WriteCMD(unsigned char command) | |
{ | |
EPD_W21_CS_0; | |
EPD_W21_DC_0; // command write | |
SPI_Write(command); | |
EPD_W21_CS_1; | |
} | |
void EPD_W21_WriteDATA(unsigned char data) | |
{ | |
EPD_W21_CS_0; | |
EPD_W21_DC_1; // command write | |
SPI_Write(data); | |
EPD_W21_CS_1; | |
} | |
/////////////////EPD settings Functions///////////////////// | |
void EPD_W21_Init(void) | |
{ | |
delay(10); | |
EPD_W21_RST_0; // Module reset | |
delay(10); //At least 10ms | |
EPD_W21_RST_1; | |
delay(10); | |
EPD_read_busy(); | |
EPD_W21_WriteCMD(SWRESET); | |
EPD_read_busy(); | |
} | |
void EPD_update(void) { | |
EPD_W21_WriteCMD(ACT_DISPLAY_UPDATE); | |
EPD_read_busy(); | |
} | |
void EPD_deepSleep(void) { | |
EPD_W21_WriteCMD(SLEEP_MODE); | |
EPD_W21_WriteDATA(0x01); | |
delay(100); | |
} | |
void EPD_read_busy(void) | |
{ | |
// EPD_W21_WriteCMD(0x71); | |
while (1) | |
{ //=1 BUSY | |
if (isEPD_W21_BUSY == 0) break; | |
delayMicroseconds(5) ; | |
ESP.wdtFeed(); | |
} | |
delayMicroseconds(100) ; | |
// while (!isEPD_W21_BUSY) //0 is busy | |
// { | |
//#ifdef DEBUG | |
// printf("Epaper Busy\n"); | |
//#endif | |
// | |
// ESP.wdtFeed(); //Feed dog to prevent system reset | |
// } | |
#ifdef DEBUG | |
printf("Epaper Release\n"); | |
#endif | |
delay(100); | |
} | |
void EPD_all_white(void) { | |
EPD_W21_WriteCMD(0x24); | |
uint16_t i, j; | |
for (i = 0; i < 296; i++) | |
{ | |
for (j = 0; j < 16; j++) { | |
EPD_W21_WriteDATA(0xff); | |
} | |
} | |
EPD_read_busy(); | |
EPD_W21_WriteCMD(0x26); | |
for (i = 0; i < 296; i++) | |
{ | |
for (j = 0; j < 16; j++) { | |
EPD_W21_WriteDATA(0x00); | |
} | |
} | |
} | |
void EPD_all_black(void) { | |
EPD_W21_WriteCMD(0x24); | |
uint16_t i, j; | |
for (i = 0; i < 296; i++) | |
{ | |
for (j = 0; j < 16; j++) { | |
EPD_W21_WriteDATA(0x00); | |
} | |
} | |
EPD_W21_WriteCMD(0x26); | |
for (i = 0; i < 296; i++) { | |
for (j = 0; i < 16; i++) | |
{ | |
EPD_W21_WriteDATA(0x00); | |
} | |
} | |
} | |
void EPD_all_red(void) { | |
EPD_W21_WriteCMD(0x24); | |
uint16_t i, j; | |
for (i = 0; i < 296; i++) | |
{ | |
for (j = 0; j < 16; j++) { | |
EPD_W21_WriteDATA(0xFF); | |
} | |
} | |
EPD_read_busy(); | |
EPD_W21_WriteCMD(0x26); | |
for (i = 0; i < 296; i++) | |
{ | |
for (j = 0; j < 16; j++) { | |
EPD_W21_WriteDATA(0xFF); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment