//IO settings 接口申明
int BUSY_Pin = D2;
int RES_Pin = D4;
int DC_Pin = D3;
int CS_Pin = D8;
int SCK_Pin = D5;
int SDI_Pin = D7;
/高低电平函数申明/
#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(RES_Pin, LOW)
#define EPD_W21_RST_1 digitalWrite(RES_Pin, HIGH)
#define isEPD_W21_BUSY digitalRead(BUSY_Pin)
400*300///
///#define MONOMSB_MODE 1
///#define MONOLSB_MODE 2
///#define RED_MODE 3
///#define MAX_LINE_BYTES 50//=400/8
///#define MAX_COLUMN_BYTES 300
#define ALLSCREEN_GRAGHBYTES 15000
函数申明//
void driver_delay_us(unsigned int xus);
void driver_delay_xms(unsigned long xms);
void DELAY_S(unsigned int delaytime);
void SPI_Delay(unsigned char xrate);
void SPI_Write(unsigned char value);
void Epaper_Write_Command(unsigned char command);
void Epaper_Write_Data(unsigned char command);
//EPD
void Epaper_READBUSY(void);
void Epaper_Spi_WriteByte(unsigned char TxData);
void Epaper_Write_Command(unsigned char cmd);
void Epaper_Write_Data(unsigned char data);
void EPD_HW_Init(void); //Electronic paper initialization
void EPD_Update(void);
void EPD_DeepSleep(void);
//Display
//void EPD_WhiteScreen_ALL(const unsigned char *BW_datas, const unsigned char *R_datas);
//void EPD_WhiteScreen_ALL_Clean(void);
///EXTERNAL FUNCTION
/delay//
void driver_delay_us(unsigned int xus) //1us
{
for (; xus > 1; xus--)
;
}
void driver_delay_xms(unsigned long xms) //1ms
{
unsigned long i = 0, j = 0;
for (j = 0; j < xms; j++) {
for (i = 0; i < 256; i++)
;
}
}
void DELAY_S(unsigned int delaytime) {
int i, j, k;
for (i = 0; i < delaytime; i++) {
for (j = 0; j < 4000; j++) {
for (k = 0; k < 222; k++)
;
}
}
}
//SPI///
void SPI_Delay(unsigned char xrate) {
unsigned char i;
while (xrate) {
for (i = 0; i < 2; i++)
;
xrate--;
}
}
void SPI_Write(unsigned char value) {
unsigned char i;
SPI_Delay(1);
for (i = 0; i < 8; i++) {
EPD_W21_CLK_0;
SPI_Delay(1);
if (value & 0x80)
EPD_W21_MOSI_1;
else
EPD_W21_MOSI_0;
value = (value << 1);
SPI_Delay(1);
driver_delay_us(1);
EPD_W21_CLK_1;
SPI_Delay(1);
}
}
void Epaper_Write_Command(unsigned char command) {
SPI_Delay(1);
EPD_W21_CS_0;
EPD_W21_DC_0; // command write
SPI_Write(command);
EPD_W21_CS_1;
}
void Epaper_Write_Data(unsigned char command) {
SPI_Delay(1);
EPD_W21_CS_0;
EPD_W21_DC_1; // command write
SPI_Write(command);
EPD_W21_CS_1;
}
/EPD settings Functions/
void EPD_HW_Init(void) {
EPD_W21_RST_0; // Module reset
delay(1); //At least 10ms delay
EPD_W21_RST_1;
delay(1); //At least 10ms delay
Epaper_READBUSY(); //waiting for the electronic paper IC to release the idle signal
Epaper_Write_Command(0x12); //Command: SW Reset
Epaper_READBUSY(); //waiting for the electronic paper IC to release the idle signal
//Epaper_Write_Command(0x74); // Command: Set Analog Block Control
//Epaper_Write_Data(0x54);
Epaper_Write_Command(0x7E); //Command: Set Digital Block Control
Epaper_Write_Data(0x3B);
Epaper_Write_Command(0x2B); // Reduce glitch under ACVCOM ???
Epaper_Write_Data(0x04);
Epaper_Write_Data(0x63);
Epaper_Write_Command(0x0C); // Soft start setting
Epaper_Write_Data(0x8B);
Epaper_Write_Data(0x9C);
Epaper_Write_Data(0x96);
Epaper_Write_Data(0x0F);
Epaper_Write_Command(0x01); // Set MUX as 300
Epaper_Write_Data(0x2B);
Epaper_Write_Data(0x01);
Epaper_Write_Data(0x00);
Epaper_Write_Command(0x11); // Data entry mode
Epaper_Write_Data(0x11);
Epaper_Write_Command(0x44);
Epaper_Write_Data(0x00); // RAM x address start at 0
Epaper_Write_Data(0x31); // RAM x address end at 31h(49+1)*8->400
Epaper_Write_Command(0x45);
Epaper_Write_Data(0x2B); // RAM y address start at 12Bh
Epaper_Write_Data(0x01);
Epaper_Write_Data(0x00); // RAM y address end at 00h
Epaper_Write_Data(0x00);
Epaper_Write_Command(0x3C); // board
Epaper_Write_Data(0x01); // HIZ
Epaper_Write_Command(0x18);
Epaper_Write_Data(0X80);
Epaper_Write_Command(0x22);
Epaper_Write_Data(0XB1); //Load Temperature and waveform setting.
Epaper_Write_Command(0x20);
Epaper_READBUSY(); //waiting for the electronic paper IC to release the idle signal
Epaper_Write_Command(0x4E); // Set RAM X address counte
Epaper_Write_Data(0x00); //00
Epaper_Write_Command(0x4F); //Set RAM Y address counter
Epaper_Write_Data(0x2B); //2B
Epaper_Write_Data(0x01); //01
}
//All screen update
void EPD_Update(void) {
Epaper_Write_Command(0x22); //Display Update Control
Epaper_Write_Data(0xC7); //c7
Epaper_Write_Command(0x20); //Activate Display Update Sequence
Epaper_READBUSY();
}
void EPD_DeepSleep(void) {
Epaper_Write_Command(0x10); //enter deep sleep
Epaper_Write_Data(0x01);
delay(100);
}
void Epaper_READBUSY(void) {
while (1) { //=1 BUSY
if (isEPD_W21_BUSY == 0) break;
delay(10);
}
}
void EPD_WhiteScreen_ALLBW(const unsigned char *BW_datas) ///更新黑色
{
unsigned int i;
Epaper_Write_Command(0x24); //write RAM for black(0)/white (1)
for (i = 0; i < ALLSCREEN_GRAGHBYTES; i++) {
Epaper_Write_Data(pgm_read_byte(&BW_datas[i]));
}
EPD_Update();
}
void EPD_WhiteScreen_ALLR(const unsigned char *R_datas) ///更新红色
{
unsigned int i;
Epaper_Write_Command(0x26); //write RAM for black(0)/white (1)
for (i = 0; i < ALLSCREEN_GRAGHBYTES; i++) {
Epaper_Write_Data(~pgm_read_byte(&R_datas[i]));
}
EPD_Update();
}
/
void EPD_WhiteScreen_ALL_Clean(void) {
unsigned int i;
Epaper_Write_Command(0x24); //write RAM for black(0)/white (1)
for (i = 0; i < ALLSCREEN_GRAGHBYTES; i++) {
Epaper_Write_Data(0xFF);
}
Epaper_Write_Command(0x26); //write RAM for black(0)/white (1)
for (i = 0; i < ALLSCREEN_GRAGHBYTES; i++) {
Epaper_Write_Data(0x00);
}
EPD_Update();
}
///可被调用的程序,全刷代码///
void epdinit() {
pinMode(BUSY_Pin, INPUT);
pinMode(RES_Pin, OUTPUT);
pinMode(DC_Pin, OUTPUT);
pinMode(CS_Pin, OUTPUT);
pinMode(SCK_Pin, OUTPUT);
pinMode(SDI_Pin, OUTPUT);
}
void epdfullrefreshBW(const unsigned char *BWimage) {
//Full screen refresh
EPD_HW_Init(); //Electronic paper initialization
EPD_WhiteScreen_ALLBW(BWimage); //Refresh the picture in full screen
EPD_DeepSleep(); //Enter deep sleep,Sleep instruction is necessary, please do not delete!!!
}
void epdfullrefreshR(const unsigned char *Rimage) {
//Full screen refresh
EPD_HW_Init(); //Electronic paper initialization
EPD_WhiteScreen_ALLR(Rimage); //Refresh the picture in full screen
EPD_DeepSleep(); //Enter deep sleep,Sleep instruction is necessary, please do not delete!!!
}
void epdfullclean() {
//Clean
EPD_HW_Init(); //Electronic paper initialization
EPD_WhiteScreen_ALL_Clean();
EPD_DeepSleep(); //Enter deep sleep,Sleep instruction is necessary, please do not delete!!!
}
void epdrefreshpart(unsigned int xstart, unsigned int ystart, unsigned int xwide, unsigned int yheight, unsigned int blackorred, unsigned char *datas) //x开始点,y开始点,y的高度,(0,黑色部分,1红色部分),数据
{
unsigned int ys = ystart - 1;
/*unsigned int ys2 = ys >> 8;
unsigned int ys1 = ys - (ys2 << 8);
unsigned int ye = ystart + yheight-1;
unsigned int ye2 = ye >> 8;
unsigned int ye1 = ye - (ye2 << 8);
Epaper_Write_Command(0x44);
Epaper_Write_Data( xstart/8); // RAM x address start at 0
Epaper_Write_Data((xstart+xwide)/8-1); // RAM x address end at 31h(49+1)*8->400
Epaper_Write_Command(0x45);
Epaper_Write_Data(ys1); // RAM y address start at 12Bh
Epaper_Write_Data(ys2);
Epaper_Write_Data(ye1); // RAM y address end at 00h
Epaper_Write_Data(ye2);
*/
unsigned int i;
unsigned int ys2;
unsigned int ys1;
for (i = 0; i < xwide * yheight / 8; i++) {
if (i % (xwide / 8) == 0) {
ys += 1;
ys2 = ys >> 8;
ys1 = ys - (ys2 << 8);
Epaper_Write_Command(0x4E); // Set RAM X address counte
Epaper_Write_Data(xstart / 8); //00
Epaper_Write_Command(0x4F); //Set RAM Y address counter
Epaper_Write_Data(ys1); //2B
Epaper_Write_Data(ys2);
if (blackorred == 0) {
Epaper_Write_Command(0x24); //write RAM for black(0)/red (1)
}
if (blackorred == 1) {
Epaper_Write_Command(0x26); //write RAM for black(0)/red (1)
} //01
}
Epaper_Write_Data(pgm_read_byte(&datas[i]));
}
}
//END//
epdrive.h
最新推荐文章于 2024-09-20 21:48:23 发布