原料:ESP32-C3合宙开发板*1,4线SPI驱动板一块,2.9寸墨水屏IC 1608A*1(其他墨水屏也可)
例程来源佳显改,文末有附件,支持DEPG2.9和A10,貌似威锋做的屏都挺好
环境:arduino
1、首先解锁io11脚,这样可以把11号脚位当GPIO用,参照本博文0.2.1https://blog.csdn.net/qq_63523190/article/details/125900192?spm=1001.2014.3001.5502
接线顺序直接像合宙1.54寸墨水屏 对插不用错位
/*2、编辑ESP32-C3默认脚定义,因为合宙的脚位和其他的开发板脚位不同,不变更的话pin脚和你接的不一致,程序编译后脚位不是你实际接的脚,实际输出就不是你物理脚,就像开发板管理器地址的功能就算与配置好你的脚和其他的定义,合宙C3未发布arduino的配置文件,这里必须要自己改这里的定义
*/实测不需要改配置文件可以点亮刷新
3、上佳显开源ESP32驱动代码
第一段存arduino主程序格式后缀*.ino
#include"Ap_29demo.h"
//合宙C3+双孔三色2.9A10-A3
//IO settings
int BUSY_Pin = 11;
int RES_Pin = 10;
int DC_Pin = 6;
int CS_Pin = 7;
int SCK_Pin = 2;
int SDI_Pin = 3;
#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)
//296*128///
#define MONOMSB_MODE 1
#define MONOLSB_MODE 2
#define RED_MODE 3
#define MAX_LINE_BYTES 16 //=128/8
#define MAX_COLUMN_BYTES 296
#define ALLSCREEN_GRAGHBYTES 4736
FUNCTION//
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);
void setup() {
pinMode(BUSY_Pin, INPUT);
pinMode(RES_Pin, OUTPUT);
pinMode(DC_Pin, OUTPUT);
pinMode(CS_Pin, OUTPUT);
pinMode(SCK_Pin, OUTPUT);
pinMode(SDI_Pin, OUTPUT);
}
//Tips//
/*When the electronic paper is refreshed in full screen, the picture flicker is a normal phenomenon, and the main function is to clear the display afterimage in the previous picture.
When the local refresh is performed, the screen does not flash.*/
/*When you need to transplant the driver, you only need to change the corresponding IO. The BUSY pin is the input mode and the others are the output mode. */
void loop() {
while(1)
{
//Full screen refresh
EPD_HW_Init(); //Electronic paper initialization
EPD_WhiteScreen_ALL(gImage_BW,gImage_R); //Refresh the picture in full screen
EPD_DeepSleep(); //Enter deep sleep,Sleep instruction is necessary, please do not delete!!!
delay(3000);
//Clean
EPD_HW_Init(); //Electronic paper initialization
EPD_WhiteScreen_ALL_Clean();
EPD_DeepSleep(); //Enter deep sleep,Sleep instruction is necessary, please do not delete!!!
while(1);
}
}
///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();
Epaper_Write_Command(0x12); //SWRESET
Epaper_READBUSY();
Epaper_Write_Command(0x01); //Driver output control
Epaper_Write_Data(0x27);
Epaper_Write_Data(0x01);
Epaper_Write_Data(0x00);
Epaper_Write_Command(0x11); //data entry mode
Epaper_Write_Data(0x01);
Epaper_Write_Command(0x44); //set Ram-X address start/end position
Epaper_Write_Data(0x00);
Epaper_Write_Data(0x0F); //0x0F-->(15+1)*8=128
Epaper_Write_Command(0x45); //set Ram-Y address start/end position
Epaper_Write_Data(0x27); //0x0127-->(295+1)=296
Epaper_Write_Data(0x01);
Epaper_Write_Data(0x00);
Epaper_Write_Data(0x00);
Epaper_Write_Command(0x3C); //BorderWavefrom
Epaper_Write_Data(0x05);
Epaper_Write_Command(0x18); //Read built-in temperature sensor
Epaper_Write_Data(0x80);
Epaper_Write_Command(0x21); // Display update control
Epaper_Write_Data(0x00);
Epaper_Write_Data(0x80);
Epaper_Write_Command(0x4E); // set RAM x address count to 0;
Epaper_Write_Data(0x00);
Epaper_Write_Command(0x4F); // set RAM y address count to 0X199;
Epaper_Write_Data(0x27);
Epaper_Write_Data(0x01);
Epaper_READBUSY();
}
//All screen update
void EPD_WhiteScreen_ALL(const unsigned char *BW_datas,const unsigned char *R_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]));
}
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_Update(void)
{
Epaper_Write_Command(0x22); //Display Update Control
Epaper_Write_Data(0xF7);
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;
}
}
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();
}
//END//
第二个文件是刷图文件存文件名 Ap_29demo.h ,内容自行搜素取模
const unsigned char gImage_BW[4736] = { /* 0X01,0X01,0X28,0X01,0X80,0X00, */
略去取模数组
};
const unsigned char gImage_R[4736] = { /* 0X01,0X01,0X28,0X01,0X80,0X00, */
略去取模数组
};
4、编辑IO脚
5、开发板选ESP32-C3 DEV MODULE,FLASHMODE 选DIO,选com口
6、编译上传ok
感谢群友小钟指点
//补充,E029A10和E029A01不是同一个IC,程序不一样不过A01有局刷,A10(三色)没有
2.9ESP32C3例程文件佳显Z92例程