epdrive.h

//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//

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值