MeshTalos-Client/ESP32epdx/examples/WiFi-EPD/example1-WiFi/EPD.cpp
2025-10-28 00:34:09 +08:00

600 lines
15 KiB
C++

#include <EPD_SPI.h>
#include "EPD.h"
//Delay Functions
void delay_xms(unsigned int xms)
{
delay(xms);
}
////////////////////////////////////E-paper demo//////////////////////////////////////////////////////////
unsigned char PartImage[1000];//Define Partial canvas space
//Busy function
void lcd_chkstatus(void)
{
while(1)
{ //=0 BUSY
if(isEPD_W21_BUSY==1) break;
}
}
//Full screen update initialization
void EPD_Init(void)
{
EPD_W21_RST_0; // Module reset
delay_xms(10);//At least 10ms delay
EPD_W21_RST_1;
delay_xms(10); //At least 10ms delay
EPD_W21_WriteCMD(0x01); //POWER SETTING
EPD_W21_WriteDATA (0x07);
EPD_W21_WriteDATA (0x07); //VGH=20V,VGL=-20V
EPD_W21_WriteDATA (0x3f); //VDH=15V
EPD_W21_WriteDATA (0x3f); //VDL=-15V
//Enhanced display drive(Add 0x06 command)
EPD_W21_WriteCMD(0x06); //Booster Soft Start
EPD_W21_WriteDATA (0x17);
EPD_W21_WriteDATA (0x17);
EPD_W21_WriteDATA (0x28);
EPD_W21_WriteDATA (0x17);
EPD_W21_WriteCMD(0x04); //POWER ON
delay_xms(100);
lcd_chkstatus(); //waiting for the electronic paper IC to release the idle signal
EPD_W21_WriteCMD(0X00); //PANNEL SETTING
EPD_W21_WriteDATA(0x1F); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_W21_WriteCMD(0x61); //tres
EPD_W21_WriteDATA (0x03); //source 800
EPD_W21_WriteDATA (0x20);
EPD_W21_WriteDATA (0x01); //gate 480
EPD_W21_WriteDATA (0xE0);
EPD_W21_WriteCMD(0X15);
EPD_W21_WriteDATA(0x00);
EPD_W21_WriteCMD(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_W21_WriteDATA(0x10);
EPD_W21_WriteDATA(0x07);
EPD_W21_WriteCMD(0X60); //TCON SETTING
EPD_W21_WriteDATA(0x22);
}
//Fast update 1 initialization
void EPD_Init_Fast(void)
{
EPD_W21_RST_0; // Module reset
delay_xms(10);//At least 10ms delay
EPD_W21_RST_1;
delay_xms(10); //At least 10ms delay
EPD_W21_WriteCMD(0X00); //PANNEL SETTING
EPD_W21_WriteDATA(0x1F); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_W21_WriteCMD(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_W21_WriteDATA(0x10);
EPD_W21_WriteDATA(0x07);
EPD_W21_WriteCMD(0x04); //POWER ON
delay_xms(100);
lcd_chkstatus(); //waiting for the electronic paper IC to release the idle signal
//Enhanced display drive(Add 0x06 command)
EPD_W21_WriteCMD(0x06); //Booster Soft Start
EPD_W21_WriteDATA (0x27);
EPD_W21_WriteDATA (0x27);
EPD_W21_WriteDATA (0x18);
EPD_W21_WriteDATA (0x17);
EPD_W21_WriteCMD(0xE0);
EPD_W21_WriteDATA(0x02);
EPD_W21_WriteCMD(0xE5);
EPD_W21_WriteDATA(0x5A);
}
//Partial update initialization
void EPD_Init_Part(void)
{
EPD_W21_RST_0; // Module reset
delay_xms(10);//At least 10ms delay
EPD_W21_RST_1;
delay_xms(10); //At least 10ms delay
EPD_W21_WriteCMD(0X00); //PANNEL SETTING
EPD_W21_WriteDATA(0x1F); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_W21_WriteCMD(0x04); //POWER ON
delay_xms(100);
lcd_chkstatus(); //waiting for the electronic paper IC to release the idle signal
EPD_W21_WriteCMD(0xE0);
EPD_W21_WriteDATA(0x02);
EPD_W21_WriteCMD(0xE5);
EPD_W21_WriteDATA(0x6E);
}
//////////////////////////////Display Update Function///////////////////////////////////////////////////////
//Full screen update update function
void EPD_Update(void)
{
//update
EPD_W21_WriteCMD(0x12); //DISPLAY update
delay_xms(1); //!!!The delay here is necessary, 200uS at least!!!
lcd_chkstatus(); //waiting for the electronic paper IC to release the idle signal
}
//////////////////////////////Display Data Transfer Function////////////////////////////////////////////
//Full screen update display function
void EPD_WhiteScreen_ALL(const unsigned char *datas)
{
unsigned int i;
EPD_W21_WriteCMD(0x10); //write old data
for(i=0;i<EPD_ARRAY;i++)
{
EPD_W21_WriteDATA(0x00);
}
EPD_W21_WriteCMD(0x13); //write new data
for(i=0;i<EPD_ARRAY;i++)
{
EPD_W21_WriteDATA(datas[i]);
}
EPD_Update();
}
//Fast update display function
void EPD_WhiteScreen_ALL_Fast(const unsigned char *datas)
{
unsigned int i;
EPD_W21_WriteCMD(0x10); //write old data
for(i=0;i<EPD_ARRAY;i++)
{
EPD_W21_WriteDATA(0x00);
}
EPD_W21_WriteCMD(0x13); //write new data
for(i=0;i<EPD_ARRAY;i++)
{
EPD_W21_WriteDATA(datas[i]);
}
EPD_Update();
}
//Clear screen display
void EPD_WhiteScreen_White(void)
{
unsigned int i;
//Write Data
EPD_W21_WriteCMD(0x10);
for(i=0;i<EPD_ARRAY;i++)
{
EPD_W21_WriteDATA(0x00);
}
EPD_W21_WriteCMD(0x13);
for(i=0;i<EPD_ARRAY;i++)
{
EPD_W21_WriteDATA(0x00);
}
EPD_Update();
}
//Clear screen display
void EPD_WhiteScreen_White_Basemap(void)
{
unsigned int i;
//Write Data
EPD_W21_WriteCMD(0x10);
for(i=0;i<EPD_ARRAY;i++)
{
EPD_W21_WriteDATA(0xFF); //is different
}
EPD_W21_WriteCMD(0x13);
for(i=0;i<EPD_ARRAY;i++)
{
EPD_W21_WriteDATA(0x00);
}
EPD_Update();
}
//Display all black
void EPD_WhiteScreen_Black(void)
{
unsigned int i;
//Write Data
EPD_W21_WriteCMD(0x10);
for(i=0;i<EPD_ARRAY;i++)
{
EPD_W21_WriteDATA(0x00);
}
EPD_W21_WriteCMD(0x13);
for(i=0;i<EPD_ARRAY;i++)
{
EPD_W21_WriteDATA(0xff);
}
EPD_Update();
}
//Partial update of background display, this function is necessary, please do not delete it!!!
void EPD_SetRAMValue_BaseMap( const unsigned char * datas)
{
unsigned int i;
EPD_W21_WriteCMD(0x10); //write old data
for(i=0;i<EPD_ARRAY;i++)
{
EPD_W21_WriteDATA(0xFF); //is different
}
EPD_W21_WriteCMD(0x13); //write new data
for(i=0;i<EPD_ARRAY;i++)
{
EPD_W21_WriteDATA(datas[i]);
}
EPD_Update();
}
//Partial update display
void EPD_Dis_Part(unsigned int x_start,unsigned int y_start,const unsigned char * datas,unsigned int PART_COLUMN,unsigned int PART_LINE)
{
unsigned int i;
unsigned int x_end,y_end;
x_end=x_start+PART_LINE-1;
y_end=y_start+PART_COLUMN-1;
EPD_W21_WriteCMD(0x50);
EPD_W21_WriteDATA(0xA9);
EPD_W21_WriteDATA(0x07);
EPD_W21_WriteCMD(0x91); //This command makes the display enter partial mode
EPD_W21_WriteCMD(0x90); //resolution setting
EPD_W21_WriteDATA (x_start/256);
EPD_W21_WriteDATA (x_start%256); //x-start
EPD_W21_WriteDATA (x_end/256);
EPD_W21_WriteDATA (x_end%256-1); //x-end
EPD_W21_WriteDATA (y_start/256); //
EPD_W21_WriteDATA (y_start%256); //y-start
EPD_W21_WriteDATA (y_end/256);
EPD_W21_WriteDATA (y_end%256-1); //y-end
EPD_W21_WriteDATA (0x01);
EPD_W21_WriteCMD(0x13); //writes New data to SRAM.
for(i=0;i<PART_COLUMN*PART_LINE/8;i++)
{
EPD_W21_WriteDATA(datas[i]);
}
EPD_Update();
}
//Full screen partial update display
void EPD_Dis_PartAll(const unsigned char * datas)
{
unsigned int i;
unsigned int x_start=0,y_start=0,x_end,y_end;
unsigned int PART_COLUMN=EPD_HEIGHT,PART_LINE=EPD_WIDTH;
x_end=x_start+PART_LINE-1;
y_end=y_start+PART_COLUMN-1;
EPD_W21_WriteCMD(0x50);
EPD_W21_WriteDATA(0xA9);
EPD_W21_WriteDATA(0x07);
EPD_W21_WriteCMD(0x91); //This command makes the display enter partial mode
EPD_W21_WriteCMD(0x90); //resolution setting
EPD_W21_WriteDATA (x_start/256);
EPD_W21_WriteDATA (x_start%256); //x-start
EPD_W21_WriteDATA (x_end/256);
EPD_W21_WriteDATA (x_end%256-1); //x-end
EPD_W21_WriteDATA (y_start/256); //
EPD_W21_WriteDATA (y_start%256); //y-start
EPD_W21_WriteDATA (y_end/256);
EPD_W21_WriteDATA (y_end%256-1); //y-end
EPD_W21_WriteDATA (0x01);
EPD_W21_WriteCMD(0x13); //writes New data to SRAM.
for(i=0;i<PART_COLUMN*PART_LINE/8;i++)
{
EPD_W21_WriteDATA(datas[i]);
}
EPD_Update();
}
//Deep sleep function
void EPD_DeepSleep(void)
{
EPD_W21_WriteCMD(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_W21_WriteDATA(0xf7); //WBmode:VBDF 17|D7 VBDW 97 VBDB 57 WBRmode:VBDF F7 VBDW 77 VBDB 37 VBDR B7
EPD_W21_WriteCMD(0X02); //power off
lcd_chkstatus(); //waiting for the electronic paper IC to release the idle signal
EPD_W21_WriteCMD(0X07); //deep sleep
EPD_W21_WriteDATA(0xA5);
}
//Partial update write address and data
void EPD_Dis_Part_RAM(unsigned int x_start,unsigned int y_start,
const unsigned char * datas_A,const unsigned char * datas_B,
const unsigned char * datas_C,const unsigned char * datas_D,const unsigned char * datas_E,
unsigned char num,unsigned int PART_COLUMN,unsigned int PART_LINE)
{
unsigned int i,j;
unsigned int x_end,y_end;
x_end=x_start+PART_LINE*num-1;
y_end=y_start+PART_COLUMN-1;
EPD_W21_WriteCMD(0x50);
EPD_W21_WriteDATA(0xA9);
EPD_W21_WriteDATA(0x07);
EPD_W21_WriteCMD(0x91); //This command makes the display enter partial mode
EPD_W21_WriteCMD(0x90); //resolution setting
EPD_W21_WriteDATA (x_start/256);
EPD_W21_WriteDATA (x_start%256); //x-start
EPD_W21_WriteDATA (x_end/256);
EPD_W21_WriteDATA (x_end%256-1); //x-end
EPD_W21_WriteDATA (y_start/256); //
EPD_W21_WriteDATA (y_start%256); //y-start
EPD_W21_WriteDATA (y_end/256);
EPD_W21_WriteDATA (y_end%256-1); //y-end
EPD_W21_WriteDATA (0x01);
EPD_W21_WriteCMD(0x13); //writes New data to SRAM.
for(i=0;i<PART_COLUMN;i++)
{
for(j=0;j<PART_LINE/8;j++)
EPD_W21_WriteDATA(datas_A[i*PART_LINE/8+j]);
for(j=0;j<PART_LINE/8;j++)
EPD_W21_WriteDATA(datas_B[i*PART_LINE/8+j]);
for(j=0;j<PART_LINE/8;j++)
EPD_W21_WriteDATA(datas_C[i*PART_LINE/8+j]);
for(j=0;j<PART_LINE/8;j++)
EPD_W21_WriteDATA(datas_D[i*PART_LINE/8+j]);
for(j=0;j<PART_LINE/8;j++)
EPD_W21_WriteDATA(datas_E[i*PART_LINE/8+j]);
}
}
//Clock display
void EPD_Dis_Part_Time(unsigned int x_start,unsigned int y_start,
const unsigned char * datas_A,const unsigned char * datas_B,
const unsigned char * datas_C,const unsigned char * datas_D,const unsigned char * datas_E,
unsigned char num,unsigned int PART_COLUMN,unsigned int PART_LINE)
{
EPD_Dis_Part_RAM(x_start,y_start,datas_A,datas_B,datas_C,datas_D,datas_E,num,PART_COLUMN,PART_LINE);
EPD_Update();
EPD_W21_WriteCMD(0X92); //This command makes the display exit partial mode and enter normal mode.
}
////////////////////////////////Other newly added functions////////////////////////////////////////////
//Display rotation 180 degrees initialization
void EPD_Init_180(void)
{
EPD_W21_RST_0; // Module reset
delay_xms(10);//At least 10ms delay
EPD_W21_RST_1;
delay_xms(10); //At least 10ms delay
EPD_W21_WriteCMD(0x01); //POWER SETTING
EPD_W21_WriteDATA (0x07);
EPD_W21_WriteDATA (0x07); //VGH=20V,VGL=-20V
EPD_W21_WriteDATA (0x3f); //VDH=15V
EPD_W21_WriteDATA (0x3f); //VDL=-15V
//Enhanced display drive(Add 0x06 command)
EPD_W21_WriteCMD(0x06); //Booster Soft Start
EPD_W21_WriteDATA (0x17);
EPD_W21_WriteDATA (0x17);
EPD_W21_WriteDATA (0x28);
EPD_W21_WriteDATA (0x17);
EPD_W21_WriteCMD(0x04); //POWER ON
delay_xms(100);
lcd_chkstatus(); //waiting for the electronic paper IC to release the idle signal
EPD_W21_WriteCMD(0X00); //PANNEL SETTING
EPD_W21_WriteDATA(0x13); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_W21_WriteCMD(0x61); //tres
EPD_W21_WriteDATA (0x03); //source 800
EPD_W21_WriteDATA (0x20);
EPD_W21_WriteDATA (0x01); //gate 480
EPD_W21_WriteDATA (0xE0);
EPD_W21_WriteCMD(0X15);
EPD_W21_WriteDATA(0x00);
EPD_W21_WriteCMD(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_W21_WriteDATA(0x10);
EPD_W21_WriteDATA(0x07);
EPD_W21_WriteCMD(0X60); //TCON SETTING
EPD_W21_WriteDATA(0x22);
}
//GUI display
void EPD_Display(unsigned char *Image)
{
unsigned int i;
EPD_W21_WriteCMD(0x10); //write old data
for(i=0;i<EPD_ARRAY;i++)
{
EPD_W21_WriteDATA(0x00);
}
EPD_W21_WriteCMD(0x13); //write new data
for(i=0;i<EPD_ARRAY;i++)
{
EPD_W21_WriteDATA(~Image[i]);
}
EPD_Update();
}
// 4 Gray display
void EPD_Init_4G(void)
{
EPD_W21_RST_0; // Module reset
delay_xms(10);//At least 10ms delay
EPD_W21_RST_1;
delay_xms(10); //At least 10ms delay
EPD_W21_WriteCMD(0X00); //PANNEL SETTING
EPD_W21_WriteDATA(0x1F); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_W21_WriteCMD(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_W21_WriteDATA(0x10);
EPD_W21_WriteDATA(0x07);
EPD_W21_WriteCMD(0x04); //POWER ON
delay_xms(100);
lcd_chkstatus(); //waiting for the electronic paper IC to release the idle signal
//Enhanced display drive(Add 0x06 command)
EPD_W21_WriteCMD(0x06); //Booster Soft Start
EPD_W21_WriteDATA (0x27);
EPD_W21_WriteDATA (0x27);
EPD_W21_WriteDATA (0x18);
EPD_W21_WriteDATA (0x17);
EPD_W21_WriteCMD(0xE0);
EPD_W21_WriteDATA(0x02);
EPD_W21_WriteCMD(0xE5);
EPD_W21_WriteDATA(0x5F); //0x5A--1.5s, 0x5F--4 Gray
}
void EPD_WhiteScreen_ALL_4G (const unsigned char *datas)
{
unsigned int i,j,k;
unsigned char temp1,temp2,temp3;
//old data
EPD_W21_WriteCMD(0x10);
for(i=0;i<48000;i++) //48000*2 800*480
{
temp3=0;
for(j=0;j<2;j++)
{
temp1 = datas[i*2+j];
for(k=0;k<4;k++)
{
temp2 = temp1&0xC0 ;
if(temp2 == 0xC0)
temp3 |= 0x01;//white
else if(temp2 == 0x00)
temp3 |= 0x00; //black
else if((temp2>=0x80)&&(temp2<0xC0))
temp3 |= 0x00; //gray1
else if(temp2 == 0x40)
temp3 |= 0x01; //gray2
if((j==0&&k<=3)||(j==1&&k<=2))
{
temp3 <<= 1;
temp1 <<= 2;
}
}
}
EPD_W21_WriteDATA(~temp3);
}
//new data
EPD_W21_WriteCMD(0x13);
for(i=0;i<48000*2;i++) //48000*2 800*480
{
temp3=0;
for(j=0;j<2;j++)
{
temp1 = datas[i*2+j];
for(k=0;k<4;k++)
{
temp2 = temp1&0xC0 ;
if(temp2 == 0xC0)
temp3 |= 0x01;//white
else if(temp2 == 0x00)
temp3 |= 0x00; //black
else if((temp2>=0x80)&&(temp2<0xC0))
temp3 |= 0x01; //gray1
else if(temp2 == 0x40)
temp3 |= 0x00; //gray2
if((j==0&&k<=3)||(j==1&&k<=2))
{
temp3 <<= 1;
temp1 <<= 2;
}
}
}
EPD_W21_WriteDATA(~temp3);
}
EPD_Update();
}
void Display_4Level_Gray(void)
{
unsigned int i,j;
lcd_chkstatus();
EPD_W21_WriteCMD(0x10);
for(i=0;i<800*480/16/2;i++)
{
EPD_W21_WriteDATA(0x00);
}
for(i=0;i<800*480/16/2;i++)
{
EPD_W21_WriteDATA(0xFF);
}
for(i=0;i<800*480/16/2;i++)
{
EPD_W21_WriteDATA(0x00);
}
for(i=0;i<800*480/16/2;i++)
{
EPD_W21_WriteDATA(0xFF);
}
lcd_chkstatus();
EPD_W21_WriteCMD(0x13);
for(i=0;i<800*480/16/2;i++)
{
EPD_W21_WriteDATA(0x00);
}
for(i=0;i<800*480/16/2;i++)
{
EPD_W21_WriteDATA(0x00);
}
for(i=0;i<800*480/16/2;i++)
{
EPD_W21_WriteDATA(0xFF);
}
for(i=0;i<800*480/16/2;i++)
{
EPD_W21_WriteDATA(0xFF);
}
EPD_Update();
}
/***********************************************************
end file
***********************************************************/