Added a function that can refresh only part of the screen area.

This commit is contained in:
SSYYL 2021-12-29 12:01:53 +08:00
parent fb3ce18166
commit ce29fad2c3
4 changed files with 357 additions and 297 deletions

View file

@ -30,49 +30,63 @@
static const UBYTE lut_4Gray_GC[] = static const UBYTE lut_4Gray_GC[] =
{ {
0x2A,0x06,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1 0x2A,0x06,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1
0x28,0x06,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//2 0x28,0x06,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//2
0x20,0x06,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//3 0x20,0x06,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//3
0x14,0x06,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//4 0x14,0x06,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//4
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//5 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//5
0x00,0x02,0x02,0x0A,0x00,0x00,0x00,0x08,0x08,0x02,//6 0x00,0x02,0x02,0x0A,0x00,0x00,0x00,0x08,0x08,0x02,//6
0x00,0x02,0x02,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,//7 0x00,0x02,0x02,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,//7
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//8 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//8
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//9 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//9
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//10 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//10
0x22,0x22,0x22,0x22,0x22 0x22,0x22,0x22,0x22,0x22
}; };
static const UBYTE lut_1Gray_GC[] = static const UBYTE lut_1Gray_GC[] =
{ {
0x2A,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1 0x2A,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1
0x05,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//2 0x05,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//2
0x2A,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//3 0x2A,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//3
0x05,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//4 0x05,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//4
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//5 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//5
0x00,0x02,0x03,0x0A,0x00,0x02,0x06,0x0A,0x05,0x00,//6 0x00,0x02,0x03,0x0A,0x00,0x02,0x06,0x0A,0x05,0x00,//6
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//7 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//7
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//8 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//8
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//9 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//9
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//10 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//10
0x22,0x22,0x22,0x22,0x22 0x22,0x22,0x22,0x22,0x22
}; };
static const UBYTE lut_1Gray_DU[] = static const UBYTE lut_1Gray_DU[] =
{ {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1
0x01,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0A,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//3 0x0A,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//3
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//5 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//5
0x00,0x00,0x05,0x05,0x00,0x05,0x03,0x05,0x05,0x00, 0x00,0x00,0x05,0x05,0x00,0x05,0x03,0x05,0x05,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//7 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//7
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//9 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//9
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x22,0x22,0x22,0x22,0x22 0x22,0x22,0x22,0x22,0x22
}; };
static const UBYTE lut_1Gray_A2[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //1
0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //2
0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //3
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //4
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //5
0x00,0x00,0x03,0x05,0x00,0x00,0x00,0x00,0x00,0x00, //6
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //7
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //8
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //9
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //10
0x22,0x22,0x22,0x22,0x22
};
Epd::~Epd() { Epd::~Epd() {
}; };
@ -87,80 +101,80 @@ Epd::Epd() {
}; };
int Epd::Init(void) { int Epd::Init(void) {
if (IfInit() != 0) { if (IfInit() != 0) {
return -1; return -1;
} }
Reset(); Reset();
SendCommand(0x12); SendCommand(0x12);
DelayMs(300); DelayMs(300);
SendCommand(0x46);
SendData(0xF7);
WaitUntilIdle();
SendCommand(0x47);
SendData(0xF7);
WaitUntilIdle();
SendCommand(0x01); // setting gaet number
SendData(0xDF);
SendData(0x01);
SendData(0x00);
SendCommand(0x03); // set gate voltage SendCommand(0x46);
SendData(0x00); SendData(0xF7);
WaitUntilIdle();
SendCommand(0x47);
SendData(0xF7);
WaitUntilIdle();
SendCommand(0x04); // set source voltage SendCommand(0x01); // setting gaet number
SendData(0x41); SendData(0xDF);
SendData(0xA8); SendData(0x01);
SendData(0x32); SendData(0x00);
SendCommand(0x11); // set data entry sequence SendCommand(0x03); // set gate voltage
SendData(0x03); SendData(0x00);
SendCommand(0x3C); // set border SendCommand(0x04); // set source voltage
SendData(0x00); SendData(0x41);
SendData(0xA8);
SendData(0x32);
SendCommand(0x0C); // set booster strength SendCommand(0x11); // set data entry sequence
SendData(0xAE); SendData(0x03);
SendData(0xC7);
SendData(0xC3);
SendData(0xC0);
SendData(0xC0);
SendCommand(0x18); // set internal sensor on SendCommand(0x3C); // set border
SendData(0x80); SendData(0x00);
SendCommand(0x2C); // set vcom value
SendData(0x44);
SendCommand(0x37); // set display option, these setting turn on previous function
SendData(0x00);
SendData(0xff);
SendData(0xff);
SendData(0xff);
SendData(0xff);
SendData(0x4f);
SendData(0xff);
SendData(0xff);
SendData(0xff);
SendData(0xff);
SendCommand(0x44); // setting X direction start/end position of RAM SendCommand(0x0C); // set booster strength
SendData(0x00); SendData(0xAE);
SendData(0x00); SendData(0xC7);
SendData(0x17); SendData(0xC3);
SendData(0x01); SendData(0xC0);
SendData(0xC0);
SendCommand(0x45); // setting Y direction start/end position of RAM SendCommand(0x18); // set internal sensor on
SendData(0x00); SendData(0x80);
SendData(0x00);
SendData(0xDF);
SendData(0x01);
SendCommand(0x22); // Display Update Control 2 SendCommand(0x2C); // set vcom value
SendData(0xCF); SendData(0x44);
return 0;
SendCommand(0x37); // set display option, these setting turn on previous function
SendData(0x00);
SendData(0xff);
SendData(0xff);
SendData(0xff);
SendData(0xff);
SendData(0x4f);
SendData(0xff);
SendData(0xff);
SendData(0xff);
SendData(0xff);
SendCommand(0x44); // setting X direction start/end position of RAM
SendData(0x00);
SendData(0x00);
SendData(0x17);
SendData(0x01);
SendCommand(0x45); // setting Y direction start/end position of RAM
SendData(0x00);
SendData(0x00);
SendData(0xDF);
SendData(0x01);
SendCommand(0x22); // Display Update Control 2
SendData(0xCF);
return 0;
} }
/** /**
@ -183,15 +197,13 @@ void Epd::SendData(unsigned char data) {
* @brief: Wait until the busy_pin goes HIGH * @brief: Wait until the busy_pin goes HIGH
*/ */
void Epd::WaitUntilIdle(void) { void Epd::WaitUntilIdle(void) {
Serial.print("e-Paper busy \r\n "); Serial.print("e-Paper busy \r\n ");
UBYTE busy; UBYTE busy;
do do {
{ busy = DigitalRead(busy_pin);
busy = DigitalRead(busy_pin); } while(busy);
} DelayMs(200);
while(busy); Serial.print("e-Paper busy release \r\n ");
DelayMs(200);
Serial.print("e-Paper busy release \r\n ");
} }
/** /**
@ -200,78 +212,131 @@ void Epd::WaitUntilIdle(void) {
* see Epd::Sleep(); * see Epd::Sleep();
*/ */
void Epd::Reset(void) { void Epd::Reset(void) {
DigitalWrite(reset_pin, LOW); //module reset
DelayMs(1);
DigitalWrite(reset_pin, HIGH); DigitalWrite(reset_pin, HIGH);
DelayMs(200); DelayMs(20);
DigitalWrite(reset_pin, LOW); //module reset
DelayMs(2);
DigitalWrite(reset_pin, HIGH);
DelayMs(20);
} }
/****************************************************************************** /******************************************************************************
function : Display function : Display
******************************************************************************/ ******************************************************************************/
void Epd::DisplayFrame(const UBYTE *Image) { void Epd::DisplayFrame(const UBYTE *Image) {
UWORD i; UWORD i;
UWORD IMAGE_COUNTER = width * height / 8; UWORD IMAGE_COUNTER = width * height / 8;
SendCommand(0x4E); SendCommand(0x4E);
SendData(0x00); SendData(0x00);
SendData(0x00); SendData(0x00);
SendCommand(0x4F); SendCommand(0x4F);
SendData(0x00); SendData(0x00);
SendData(0x00); SendData(0x00);
SendCommand(0x24); SendCommand(0x24);
for (i = 0; i < IMAGE_COUNTER; i++) for (i = 0; i < IMAGE_COUNTER; i++) {
{ SendData(pgm_read_byte(&Image[i]));
SendData(pgm_read_byte(&Image[i])); }
} SendCommand(0x26);
for (i = 0; i < IMAGE_COUNTER; i++) {
SendData(pgm_read_byte(&Image[i]));
}
Load_LUT(1); Load_LUT(1);
SendCommand(0x20); SendCommand(0x20);
WaitUntilIdle(); WaitUntilIdle();
} }
/****************************************************************************** /******************************************************************************
function : Partial Display function : Partial Display
note:
1. iwidth must be a multiple of 8
2. The update will clear other parts of the image data
******************************************************************************/ ******************************************************************************/
void Epd::DisplayFrame_Partial(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD iwidth, UWORD iheight) { void Epd::DisplayFrame_Partial(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD iwidth, UWORD iheight) {
UWORD i, j; UWORD i, j;
SendCommand(0x4E); SendCommand(0x4E);
SendData(0x00); SendData(0x00);
SendData(0x00); SendData(0x00);
SendCommand(0x4F); SendCommand(0x4F);
SendData(0x00); SendData(0x00);
SendData(0x00); SendData(0x00);
SendCommand(0x24); SendCommand(0x24);
for(i=0; i<EPD_WIDTH; i++) { for(i=0; i<EPD_WIDTH; i++) {
for(j=0; j<EPD_HEIGHT/8; j++) { for(j=0; j<EPD_HEIGHT/8; j++) {
if(i>=Ystart && i<Ystart+iheight && j>=Xstart/8 && j<(Xstart+iwidth)/8) if(i>=Ystart && i<Ystart+iheight && j>=Xstart/8 && j<(Xstart+iwidth)/8)
SendData(Image[(j-Xstart/8) + (i-Ystart)*iwidth/8]); SendData(Image[(j-Xstart/8) + (i-Ystart)*iwidth/8]);
else else
SendData(0xff); SendData(0xff);
}
} }
}
Load_LUT(0);
Load_LUT(0); SendCommand(0x20);
SendCommand(0x20); WaitUntilIdle();
WaitUntilIdle();
} }
/******************************************************************************
function : Sends part the image buffer in RAM to e-Paper and displays
notes:
1. Xstart must be a multiple of 8
1. isGC: use GC mode to clear base-image
******************************************************************************/
void Epd::DisplayFrame_Part(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, bool isGC)
{
UWORD i, Width;
Width = (Xend-Xstart)%8 == 0 ? (Xend-Xstart)/8 : (Xend-Xstart)/8+1;
UWORD IMAGE_COUNTER = Width * (Yend-Ystart);
Xend -= 1;
Yend -= 1;
SendCommand(0x44);
SendData(Xstart & 0xff);
SendData((Xstart>>8) & 0x03);
SendData(Xend & 0xff);
SendData((Xend>>8) & 0x03);
SendCommand(0x45);
SendData(Ystart & 0xff);
SendData((Ystart>>8) & 0x03);
SendData(Yend & 0xff);
SendData((Yend>>8) & 0x03);
SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
SendData(Xstart & 0xFF);
SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
SendData(Ystart & 0xFF);
SendData((Ystart >> 8) & 0xFF);
SendCommand(0x24);
for (i = 0; i < IMAGE_COUNTER; i++)
{
SendData(Image[i]);
}
if(isGC)
Load_LUT(1);
else
Load_LUT(0);
SendCommand(0x20);
WaitUntilIdle();
}
/****************************************************************************** /******************************************************************************
function : set the look-up tables function : set the look-up tables
parameter: parameter:
******************************************************************************/ ******************************************************************************/
void Epd::Load_LUT(UBYTE mode) { void Epd::Load_LUT(UBYTE mode) {
UWORD i; UWORD i;
SendCommand(0x32); SendCommand(0x32);
for (i = 0; i < 105; i++) { for (i = 0; i < 105; i++) {
if(mode == 1) if(mode == 1)
SendData(lut_1Gray_GC[i]); SendData(lut_1Gray_GC[i]);
else if(mode == 0) else if(mode == 0)
SendData(lut_1Gray_DU[i]); SendData(lut_1Gray_A2[i]);
} }
} }
/****************************************************************************** /******************************************************************************
@ -281,28 +346,27 @@ parameter:
1:clear all 1:clear all
******************************************************************************/ ******************************************************************************/
void Epd::Clear(UBYTE mode) { void Epd::Clear(UBYTE mode) {
UWORD i; UWORD i;
UWORD IMAGE_COUNTER = width * height / 8; UWORD IMAGE_COUNTER = width * height / 8;
SendCommand(0x4E); SendCommand(0x4E);
SendData(0x00); SendData(0x00);
SendData(0x00); SendData(0x00);
SendCommand(0x4F); SendCommand(0x4F);
SendData(0x00); SendData(0x00);
SendData(0x00); SendData(0x00);
SendCommand(0x24);
for (i = 0; i < IMAGE_COUNTER; i++)
{
SendData(0xff);
}
if(mode)
Load_LUT(1);
else
Load_LUT(0);
SendCommand(0x20);
WaitUntilIdle();
SendCommand(0x24);
for (i = 0; i < IMAGE_COUNTER; i++)
{
SendData(0xff);
}
if(mode)
Load_LUT(1);
else
Load_LUT(0);
SendCommand(0x20);
WaitUntilIdle();
} }
/** /**
@ -319,7 +383,4 @@ void Epd::Sleep(void) {
SendCommand(0X07); //deep sleep SendCommand(0X07); //deep sleep
SendData(0xA5); SendData(0xA5);
} }
/* END OF FILE */ /* END OF FILE */

View file

@ -47,6 +47,7 @@ public:
void DisplayFrame(const UBYTE *Image); void DisplayFrame(const UBYTE *Image);
void SendCommand(unsigned char command); void SendCommand(unsigned char command);
void DisplayFrame_Partial(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD iwidth, UWORD iheight); void DisplayFrame_Partial(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD iwidth, UWORD iheight);
void DisplayFrame_Part(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, bool isGC);
void SendData(unsigned char data); void SendData(unsigned char data);
void Sleep(void); void Sleep(void);
void Clear(UBYTE mode); void Clear(UBYTE mode);

View file

@ -32,51 +32,55 @@
#define COLORED 0 #define COLORED 0
#define UNCOLORED 1 #define UNCOLORED 1
UBYTE image[800]; UBYTE image[700];
Paint paint(image, 0, 0); // width should be the multiple of 8 Paint paint(image, 0, 0); // width should be the multiple of 8
UDOUBLE time_start_ms; UDOUBLE time_start_ms;
UDOUBLE time_now_s; UDOUBLE time_now_s;
void setup() { void setup() {
// put your setup code here, to run once: // put your setup code here, to run once:
Serial.begin(115200); Serial.begin(115200);
Epd epd; Epd epd;
if (epd.Init() != 0) { if (epd.Init() != 0) {
Serial.print("e-Paper init failed"); Serial.print("e-Paper init failed");
return; return;
} }
Serial.print("3.7inch e-paper demo\r\n "); Serial.print("3.7inch e-paper demo\r\n ");
Serial.print("e-Paper Clear\r\n "); Serial.print("e-Paper Clear\r\n ");
epd.Clear(1); epd.Clear(1);
Serial.print("draw image\r\n "); Serial.print("draw image\r\n ");
epd.DisplayFrame(IMAGE_DATA); epd.DisplayFrame(IMAGE_DATA); // Set base image
delay(4000); delay(3000);
epd.Clear(0);
paint.SetWidth(40);
UBYTE i; paint.SetHeight(120);
time_start_ms = millis();
for(i=0; i<10; i++) {
time_now_s = (millis() - time_start_ms) / 1000;
char time_string[] = {'0', '0', ':', '0', '0', '\0'};
time_string[0] = time_now_s / 60 / 10 + '0';
time_string[1] = time_now_s / 60 % 10 + '0';
time_string[3] = time_now_s % 60 / 10 + '0';
time_string[4] = time_now_s % 60 % 10 + '0';
paint.SetWidth(48);
paint.SetHeight(100);
paint.SetRotate(ROTATE_270); paint.SetRotate(ROTATE_270);
paint.Clear(UNCOLORED); paint.Clear(UNCOLORED);
paint.DrawStringAt(20, 10, time_string, &Font16, COLORED);
Serial.print("refresh------\r\n "); UBYTE i;
epd.DisplayFrame_Partial(paint.GetImage(), 20, 100, 48, 100); time_start_ms = millis();
} for(i=0; i<10; i++) {
time_now_s = (millis() - time_start_ms) / 1000;
Serial.print("clear and sleep......\r\n "); char time_string[] = {'0', '0', ':', '0', '0', '\0'};
epd.Clear(1); time_string[0] = time_now_s / 60 / 10 + '0';
epd.Sleep(); time_string[1] = time_now_s / 60 % 10 + '0';
time_string[3] = time_now_s % 60 / 10 + '0';
time_string[4] = time_now_s % 60 % 10 + '0';
paint.Clear(UNCOLORED);
paint.DrawStringAt(20, 10, time_string, &Font16, COLORED);
Serial.print("refresh------\r\n ");
// epd.DisplayFrame_Partial(paint.GetImage(), 20, 100, 40, 120); // Width must be a multiple of 8
epd.DisplayFrame_Part(paint.GetImage(), 40, 30, 80, 140, false); // Xstart must be a multiple of 8
}
Serial.print("clear and sleep......\r\n ");
epd.Init();
epd.Clear(1);
epd.Sleep();
} }
void loop() { void loop() {
// put your main code here, to run repeatedly: // put your main code here, to run repeatedly:
} }

View file

@ -33,62 +33,62 @@
static const UBYTE lut_4Gray_GC[] = static const UBYTE lut_4Gray_GC[] =
{ {
0x2A,0x06,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1 0x2A,0x06,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1
0x28,0x06,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//2 0x28,0x06,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//2
0x20,0x06,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//3 0x20,0x06,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//3
0x14,0x06,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//4 0x14,0x06,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//4
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//5 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//5
0x00,0x02,0x02,0x0A,0x00,0x00,0x00,0x08,0x08,0x02,//6 0x00,0x02,0x02,0x0A,0x00,0x00,0x00,0x08,0x08,0x02,//6
0x00,0x02,0x02,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,//7 0x00,0x02,0x02,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,//7
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//8 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//8
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//9 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//9
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//10 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//10
0x22,0x22,0x22,0x22,0x22 0x22,0x22,0x22,0x22,0x22
}; };
static const UBYTE lut_1Gray_GC[] = static const UBYTE lut_1Gray_GC[] =
{ {
0x2A,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1 0x2A,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1
0x05,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//2 0x05,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//2
0x2A,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//3 0x2A,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//3
0x05,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//4 0x05,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//4
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//5 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//5
0x00,0x02,0x03,0x0A,0x00,0x02,0x06,0x0A,0x05,0x00,//6 0x00,0x02,0x03,0x0A,0x00,0x02,0x06,0x0A,0x05,0x00,//6
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//7 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//7
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//8 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//8
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//9 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//9
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//10 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//10
0x22,0x22,0x22,0x22,0x22 0x22,0x22,0x22,0x22,0x22
}; };
static const UBYTE lut_1Gray_DU[] = static const UBYTE lut_1Gray_DU[] =
{ {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1
0x01,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0A,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//3 0x0A,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//3
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//5 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//5
0x00,0x00,0x05,0x05,0x00,0x05,0x03,0x05,0x05,0x00, 0x00,0x00,0x05,0x05,0x00,0x05,0x03,0x05,0x05,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//7 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//7
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//9 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//9
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x22,0x22,0x22,0x22,0x22 0x22,0x22,0x22,0x22,0x22
}; };
static const UBYTE lut_1Gray_A2[] = static const UBYTE lut_1Gray_A2[] =
{ {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //1
0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //2 0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //2
0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //3 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //3
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //4 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //4
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //5 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //5
0x00,0x00,0x03,0x05,0x00,0x00,0x00,0x00,0x00,0x00, //6 0x00,0x00,0x03,0x05,0x00,0x00,0x00,0x00,0x00,0x00, //6
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //7 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //7
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //8 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //8
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //9 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //9
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //10 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //10
0x22,0x22,0x22,0x22,0x22 0x22,0x22,0x22,0x22,0x22
}; };
/****************************************************************************** /******************************************************************************
@ -150,8 +150,7 @@ void EPD_3IN7_Load_LUT(UBYTE lut)
{ {
UWORD i; UWORD i;
EPD_3IN7_SendCommand(0x32); EPD_3IN7_SendCommand(0x32);
for (i = 0; i < 105; i++) for (i = 0; i < 105; i++) {
{
if(lut == 0) if(lut == 0)
EPD_3IN7_SendData(lut_4Gray_GC[i]); EPD_3IN7_SendData(lut_4Gray_GC[i]);
else if(lut == 1) else if(lut == 1)
@ -376,26 +375,25 @@ parameter:
******************************************************************************/ ******************************************************************************/
void EPD_3IN7_1Gray_Clear(void) void EPD_3IN7_1Gray_Clear(void)
{ {
UWORD i; UWORD i;
UWORD IMAGE_COUNTER = EPD_3IN7_WIDTH * EPD_3IN7_HEIGHT / 8; UWORD IMAGE_COUNTER = EPD_3IN7_WIDTH * EPD_3IN7_HEIGHT / 8;
EPD_3IN7_SendCommand(0x4E); EPD_3IN7_SendCommand(0x4E);
EPD_3IN7_SendData(0x00); EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00); EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x4F); EPD_3IN7_SendCommand(0x4F);
EPD_3IN7_SendData(0x00); EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00); EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x24); EPD_3IN7_SendCommand(0x24);
for (i = 0; i < IMAGE_COUNTER; i++) for (i = 0; i < IMAGE_COUNTER; i++) {
{ EPD_3IN7_SendData(0xff);
EPD_3IN7_SendData(0xff); }
}
EPD_3IN7_Load_LUT(2);
EPD_3IN7_Load_LUT(2);
EPD_3IN7_SendCommand(0x20);
EPD_3IN7_SendCommand(0x20); EPD_3IN7_ReadBusy_HIGH();
EPD_3IN7_ReadBusy_HIGH();
} }
/****************************************************************************** /******************************************************************************
@ -518,33 +516,30 @@ parameter:
******************************************************************************/ ******************************************************************************/
void EPD_3IN7_1Gray_Display(const UBYTE *Image) void EPD_3IN7_1Gray_Display(const UBYTE *Image)
{ {
UWORD i; UWORD i;
UWORD IMAGE_COUNTER = EPD_3IN7_WIDTH * EPD_3IN7_HEIGHT / 8; UWORD IMAGE_COUNTER = EPD_3IN7_WIDTH * EPD_3IN7_HEIGHT / 8;
EPD_3IN7_SendCommand(0x4E); EPD_3IN7_SendCommand(0x4E);
EPD_3IN7_SendData(0x00); EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00); EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x4F); EPD_3IN7_SendCommand(0x4F);
EPD_3IN7_SendData(0x00); EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00); EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x24); EPD_3IN7_SendCommand(0x24);
for (i = 0; i < IMAGE_COUNTER; i++) for (i = 0; i < IMAGE_COUNTER; i++) {
{ EPD_3IN7_SendData(Image[i]);
EPD_3IN7_SendData(Image[i]); }
}
EPD_3IN7_Load_LUT(2); EPD_3IN7_Load_LUT(2);
EPD_3IN7_SendCommand(0x20); EPD_3IN7_SendCommand(0x20);
EPD_3IN7_ReadBusy_HIGH(); EPD_3IN7_ReadBusy_HIGH();
} }
/****************************************************************************** /******************************************************************************
function : Sends part the image buffer in RAM to e-Paper and displays function : Sends part the image buffer in RAM to e-Paper and displays
notes: notes:
You can send a part of data to e-Paper,But this function is not recommended Xstart must be a multiple of 8
1.Xsize must be as big as EPD_3IN7_WIDTH
2.Ypointer must be start at 0
******************************************************************************/ ******************************************************************************/
void EPD_3IN7_1Gray_Display_Part(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend) void EPD_3IN7_1Gray_Display_Part(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
{ {
@ -574,9 +569,8 @@ void EPD_3IN7_1Gray_Display_Part(const UBYTE *Image, UWORD Xstart, UWORD Ystart,
EPD_3IN7_SendData((Ystart >> 8) & 0xFF); EPD_3IN7_SendData((Ystart >> 8) & 0xFF);
EPD_3IN7_SendCommand(0x24); EPD_3IN7_SendCommand(0x24);
for (i = 0; i < IMAGE_COUNTER; i++) for (i = 0; i < IMAGE_COUNTER; i++) {
{ EPD_3IN7_SendData(Image[i]);
EPD_3IN7_SendData(Image[i]);
} }
EPD_3IN7_Load_LUT(3); EPD_3IN7_Load_LUT(3);