Added new programs 2.7inch V2 e-Paper routine.
This commit is contained in:
parent
6d99bdb672
commit
ae96a23767
34 changed files with 23147 additions and 1125 deletions
|
|
@ -5,7 +5,7 @@
|
|||
* | Info :
|
||||
*----------------
|
||||
* | This version: V1.0
|
||||
* | Date : 2021-04-22
|
||||
* | Date : 2022-08-18
|
||||
* | Info :
|
||||
* -----------------------------------------------------------------------------
|
||||
#
|
||||
|
|
@ -60,7 +60,6 @@ int EPD_2in7_V2_test(void)
|
|||
Paint_Clear(WHITE);
|
||||
|
||||
#if 1 // show bmp
|
||||
Paint_NewImage(BlackImage, EPD_2IN7_V2_WIDTH, EPD_2IN7_V2_HEIGHT, 90, WHITE);
|
||||
printf("show window BMP-----------------\r\n");
|
||||
Paint_SelectImage(BlackImage);
|
||||
GUI_ReadBmp("./pic/100x100.bmp", 10, 10);
|
||||
|
|
@ -72,17 +71,7 @@ int EPD_2in7_V2_test(void)
|
|||
GUI_ReadBmp("./pic/2in7.bmp", 0, 0);
|
||||
EPD_2IN7_V2_Display(BlackImage);
|
||||
DEV_Delay_ms(3000);
|
||||
#endif
|
||||
|
||||
#if 1 //show image for array
|
||||
Paint_NewImage(BlackImage, EPD_2IN7_V2_WIDTH, EPD_2IN7_V2_HEIGHT, 90, WHITE);
|
||||
printf("show image for array\r\n");
|
||||
Paint_SelectImage(BlackImage);
|
||||
Paint_Clear(WHITE);
|
||||
Paint_DrawBitMap(gImage_2in7);
|
||||
|
||||
EPD_2IN7_V2_Display(BlackImage);
|
||||
DEV_Delay_ms(3000);
|
||||
#endif
|
||||
|
||||
#if 1 // Drawing on the image
|
||||
|
|
@ -116,23 +105,93 @@ int EPD_2in7_V2_test(void)
|
|||
Paint_DrawNum(10, 33, 123456789, &Font12, BLACK, WHITE);
|
||||
Paint_DrawNum(10, 50, 987654321, &Font16, WHITE, BLACK);
|
||||
|
||||
Paint_DrawString_CN(130, 0,"你好abc", &Font12CN, BLACK, WHITE);
|
||||
Paint_DrawString_CN(130, 20, "微雪电子", &Font24CN, WHITE, BLACK);
|
||||
Paint_DrawString_CN(130, 0,"ÄãºÃabc", &Font12CN, BLACK, WHITE);
|
||||
Paint_DrawString_CN(130, 20, "΢ѩµç×Ó", &Font24CN, WHITE, BLACK);
|
||||
|
||||
EPD_2IN7_V2_Display_Base(BlackImage);
|
||||
DEV_Delay_ms(3000);
|
||||
#endif
|
||||
|
||||
#if 1 //Partial refresh, example shows time
|
||||
Paint_NewImage(BlackImage, EPD_2IN7_V2_WIDTH, EPD_2IN7_V2_HEIGHT, 90, WHITE);
|
||||
#if 1 // Fast Drawing on the image
|
||||
// Fast refresh
|
||||
printf("This is followed by a quick refresh demo\r\n");
|
||||
printf("First, clear the screen\r\n");
|
||||
EPD_2IN7_V2_Init();
|
||||
EPD_2IN7_V2_Clear();
|
||||
|
||||
printf("e-Paper Init Fast\r\n");
|
||||
EPD_2IN7_V2_Init_Fast();
|
||||
Paint_NewImage(BlackImage, EPD_2IN7_V2_WIDTH, EPD_2IN7_V2_HEIGHT, 90, WHITE);
|
||||
printf("Drawing\r\n");
|
||||
//1.Select Image
|
||||
Paint_SelectImage(BlackImage);
|
||||
Paint_Clear(WHITE);
|
||||
|
||||
printf("show window BMP-----------------\r\n");
|
||||
Paint_SelectImage(BlackImage);
|
||||
GUI_ReadBmp("./pic/100x100.bmp", 10, 10);
|
||||
EPD_2IN7_V2_Display_Fast(BlackImage);
|
||||
DEV_Delay_ms(3000);
|
||||
|
||||
printf("show bmp------------------------\r\n");
|
||||
Paint_SelectImage(BlackImage);
|
||||
GUI_ReadBmp("./pic/2in7.bmp", 0, 0);
|
||||
EPD_2IN7_V2_Display_Fast(BlackImage);
|
||||
DEV_Delay_ms(3000);
|
||||
|
||||
// 2.Drawing on the image
|
||||
Paint_Clear(WHITE);
|
||||
printf("Drawing:BlackImage\r\n");
|
||||
Paint_DrawPoint(10, 80, BLACK, DOT_PIXEL_1X1, DOT_STYLE_DFT);
|
||||
Paint_DrawPoint(10, 90, BLACK, DOT_PIXEL_2X2, DOT_STYLE_DFT);
|
||||
Paint_DrawPoint(10, 100, BLACK, DOT_PIXEL_3X3, DOT_STYLE_DFT);
|
||||
|
||||
Paint_DrawLine(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
|
||||
Paint_DrawLine(70, 70, 20, 120, BLACK, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
|
||||
|
||||
Paint_DrawRectangle(20, 70, 70, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
|
||||
Paint_DrawRectangle(80, 70, 130, 120, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL);
|
||||
|
||||
Paint_DrawCircle(45, 95, 20, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
|
||||
Paint_DrawCircle(105, 95, 20, WHITE, DOT_PIXEL_1X1, DRAW_FILL_FULL);
|
||||
|
||||
Paint_DrawLine(85, 95, 125, 95, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
|
||||
Paint_DrawLine(105, 75, 105, 115, BLACK, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
|
||||
|
||||
Paint_DrawString_EN(10, 0, "waveshare", &Font16, BLACK, WHITE);
|
||||
Paint_DrawString_EN(10, 20, "hello world", &Font12, WHITE, BLACK);
|
||||
|
||||
Paint_DrawNum(10, 33, 123456789, &Font12, BLACK, WHITE);
|
||||
Paint_DrawNum(10, 50, 987654321, &Font16, WHITE, BLACK);
|
||||
|
||||
Paint_DrawString_CN(130, 0,"ÄãºÃabc", &Font12CN, BLACK, WHITE);
|
||||
Paint_DrawString_CN(130, 20, "΢ѩµç×Ó", &Font24CN, WHITE, BLACK);
|
||||
|
||||
EPD_2IN7_V2_Display_Fast(BlackImage);
|
||||
DEV_Delay_ms(3000);
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#if 1 //Partial refresh, example shows time
|
||||
// If you didn't use the EPD_2IN7_V2_Display_Base() function to refresh the image before,
|
||||
// use the EPD_2IN7_V2_Display_Base_color() function to refresh the background color,
|
||||
// otherwise the background color will be garbled
|
||||
EPD_2IN7_V2_Init();
|
||||
// EPD_2IN7_V2_Display_Base_color(WHITE);
|
||||
Paint_NewImage(BlackImage, 50, 120, 90, WHITE);
|
||||
|
||||
printf("Partial refresh\r\n");
|
||||
Paint_SelectImage(BlackImage);
|
||||
|
||||
Paint_SetScale(2);
|
||||
Paint_Clear(WHITE);
|
||||
|
||||
PAINT_TIME sPaint_time;
|
||||
sPaint_time.Hour = 12;
|
||||
sPaint_time.Min = 34;
|
||||
sPaint_time.Sec = 56;
|
||||
UBYTE num = 10;
|
||||
UBYTE num = 15;
|
||||
for (;;) {
|
||||
sPaint_time.Sec = sPaint_time.Sec + 1;
|
||||
if (sPaint_time.Sec == 60) {
|
||||
|
|
@ -148,18 +207,67 @@ int EPD_2in7_V2_test(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
Paint_ClearWindows(150, 80, 150 + Font20.Width * 7, 80 + Font20.Height, WHITE);
|
||||
Paint_DrawTime(150, 80, &sPaint_time, &Font20, WHITE, BLACK);
|
||||
|
||||
Paint_Clear(WHITE);
|
||||
Paint_DrawRectangle(1, 1, 120, 50, BLACK, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
|
||||
Paint_DrawTime(10, 15, &sPaint_time, &Font20, WHITE, BLACK);
|
||||
|
||||
num = num - 1;
|
||||
if(num == 0) {
|
||||
break;
|
||||
}
|
||||
EPD_2IN7_V2_Display_Partial(BlackImage);
|
||||
DEV_Delay_ms(500);//Analog clock 1s
|
||||
printf("Part refresh...\r\n");
|
||||
EPD_2IN7_V2_Display_Partial(BlackImage, 60, 134, 110, 254); // Xstart must be a multiple of 8
|
||||
DEV_Delay_ms(500);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 1 // show image for array
|
||||
free(BlackImage);
|
||||
printf("show Gray------------------------\r\n");
|
||||
Imagesize = ((EPD_2IN7_V2_WIDTH % 4 == 0)? (EPD_2IN7_V2_WIDTH / 4 ): (EPD_2IN7_V2_WIDTH / 4 + 1)) * EPD_2IN7_V2_HEIGHT;
|
||||
if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) {
|
||||
printf("Failed to apply for black memory...\r\n");
|
||||
return -1;
|
||||
}
|
||||
EPD_2IN7_V2_Init_4GRAY();
|
||||
printf("4 grayscale display\r\n");
|
||||
Paint_NewImage(BlackImage, EPD_2IN7_V2_WIDTH, EPD_2IN7_V2_HEIGHT, 90, WHITE);
|
||||
Paint_SetScale(4);
|
||||
Paint_Clear(0xff);
|
||||
|
||||
Paint_DrawPoint(10, 80, GRAY4, DOT_PIXEL_1X1, DOT_STYLE_DFT);
|
||||
Paint_DrawPoint(10, 90, GRAY4, DOT_PIXEL_2X2, DOT_STYLE_DFT);
|
||||
Paint_DrawPoint(10, 100, GRAY4, DOT_PIXEL_3X3, DOT_STYLE_DFT);
|
||||
Paint_DrawLine(20, 70, 70, 120, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
|
||||
Paint_DrawLine(70, 70, 20, 120, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
|
||||
Paint_DrawRectangle(20, 70, 70, 120, GRAY4, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
|
||||
Paint_DrawRectangle(80, 70, 130, 120, GRAY4, DOT_PIXEL_1X1, DRAW_FILL_FULL);
|
||||
Paint_DrawCircle(45, 95, 20, GRAY4, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
|
||||
Paint_DrawCircle(105, 95, 20, GRAY2, DOT_PIXEL_1X1, DRAW_FILL_FULL);
|
||||
Paint_DrawLine(85, 95, 125, 95, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
|
||||
Paint_DrawLine(105, 75, 105, 115, GRAY4, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
|
||||
Paint_DrawString_EN(10, 0, "waveshare", &Font16, GRAY4, GRAY1);
|
||||
Paint_DrawString_EN(10, 20, "hello world", &Font12, GRAY3, GRAY1);
|
||||
Paint_DrawNum(10, 33, 123456789, &Font12, GRAY4, GRAY2);
|
||||
Paint_DrawNum(10, 50, 987654321, &Font16, GRAY1, GRAY4);
|
||||
Paint_DrawString_CN(150, 0,"ÄãºÃabc", &Font12CN, GRAY4, GRAY1);
|
||||
Paint_DrawString_CN(150, 20,"ÄãºÃabc", &Font12CN, GRAY3, GRAY2);
|
||||
Paint_DrawString_CN(150, 40,"ÄãºÃabc", &Font12CN, GRAY2, GRAY3);
|
||||
Paint_DrawString_CN(150, 60,"ÄãºÃabc", &Font12CN, GRAY1, GRAY4);
|
||||
Paint_DrawString_CN(10, 130, "΢ѩµç×Ó", &Font24CN, GRAY1, GRAY4);
|
||||
EPD_2IN7_V2_4GrayDisplay(BlackImage);
|
||||
DEV_Delay_ms(3000);
|
||||
|
||||
Paint_NewImage(BlackImage, EPD_2IN7_V2_WIDTH, EPD_2IN7_V2_HEIGHT, 0, WHITE);
|
||||
Paint_SetScale(4);
|
||||
Paint_Clear(WHITE);
|
||||
GUI_ReadBmp_4Gray("./pic/2in7_Scale.bmp", 0, 0);
|
||||
EPD_2IN7_V2_4GrayDisplay(BlackImage);
|
||||
DEV_Delay_ms(3000);
|
||||
|
||||
#endif
|
||||
|
||||
printf("Clear...\r\n");
|
||||
EPD_2IN7_V2_Init();
|
||||
EPD_2IN7_V2_Clear();
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* | Info :
|
||||
*----------------
|
||||
* | This version: V1.0
|
||||
* | Date : 2021-04-22
|
||||
* | Date : 2022-08-18
|
||||
* | Info :
|
||||
* -----------------------------------------------------------------------------
|
||||
#
|
||||
|
|
@ -31,27 +31,27 @@
|
|||
#include "EPD_2in7_V2.h"
|
||||
#include "Debug.h"
|
||||
|
||||
UBYTE WF_PARTIAL_2in7_V2[159] =
|
||||
UBYTE LUT_DATA_4Gray[159] =
|
||||
{
|
||||
0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x40,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0xF,0x0,0x0,0x0,0x0,0x0,0x1,
|
||||
0x1,0x1,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0,
|
||||
0x22,0x17,0x41,0xB0,0x32,0x32,
|
||||
0x40, 0x48, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x8, 0x48, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x2, 0x48, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x20, 0x48, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0xA, 0x19, 0x0, 0x3, 0x8, 0x0, 0x0,
|
||||
0x14, 0x1, 0x0, 0x14, 0x1, 0x0, 0x3,
|
||||
0xA, 0x3, 0x0, 0x8, 0x19, 0x0, 0x0,
|
||||
0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0,
|
||||
0x22, 0x17, 0x41, 0x0, 0x32, 0x1C
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
|
|
@ -115,61 +115,48 @@ parameter:
|
|||
******************************************************************************/
|
||||
static void EPD_2IN7_V2_TurnOnDisplay(void)
|
||||
{
|
||||
EPD_2IN7_V2_SendCommand(0x20);
|
||||
EPD_2IN7_V2_SendCommand(0x22); //Display Update Control
|
||||
EPD_2IN7_V2_SendData(0xF7);
|
||||
EPD_2IN7_V2_SendCommand(0x20); //Activate Display Update Sequence
|
||||
EPD_2IN7_V2_ReadBusy();
|
||||
}
|
||||
|
||||
static void EPD_2IN7_V2_TurnOnDisplay_Fast(void)
|
||||
{
|
||||
EPD_2IN7_V2_SendCommand(0x22); //Display Update Control
|
||||
EPD_2IN7_V2_SendData(0xC7);
|
||||
EPD_2IN7_V2_SendCommand(0x20); //Activate Display Update Sequence
|
||||
EPD_2IN7_V2_ReadBusy();
|
||||
}
|
||||
|
||||
static void EPD_2IN7_V2_TurnOnDisplay_Partial(void)
|
||||
{
|
||||
EPD_2IN7_V2_SendCommand(0x22);
|
||||
EPD_2IN7_V2_SendData(0x0f);
|
||||
EPD_2IN7_V2_SendData(0xFF);
|
||||
EPD_2IN7_V2_SendCommand(0x20);
|
||||
EPD_2IN7_V2_ReadBusy();
|
||||
}
|
||||
|
||||
static void EPD_2IN7_V2_TurnOnDisplay_4GRAY(void)
|
||||
{
|
||||
EPD_2IN7_V2_SendCommand(0x22);
|
||||
EPD_2IN7_V2_SendData(0xC7);
|
||||
EPD_2IN7_V2_SendCommand(0x20);
|
||||
EPD_2IN7_V2_ReadBusy();
|
||||
}
|
||||
/******************************************************************************
|
||||
function : set the look-up tables
|
||||
parameter:
|
||||
******************************************************************************/
|
||||
static void EPD_2IN7_V2_SetLut(void)
|
||||
static void EPD_2IN7_V2_Lut(void)
|
||||
{
|
||||
unsigned int count;
|
||||
EPD_2IN7_V2_SendCommand(0x32); //vcom
|
||||
for(count = 0; count < 153; count++) {
|
||||
EPD_2IN7_V2_SendData(WF_PARTIAL_2in7_V2[count]);
|
||||
EPD_2IN7_V2_SendData(LUT_DATA_4Gray[count]);
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
function : Setting the display window
|
||||
parameter:
|
||||
******************************************************************************/
|
||||
static void EPD_2IN7_V2_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
|
||||
{
|
||||
EPD_2IN7_V2_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION
|
||||
EPD_2IN7_V2_SendData((Xstart>>3) & 0xFF);
|
||||
EPD_2IN7_V2_SendData((Xend>>3) & 0xFF);
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION
|
||||
EPD_2IN7_V2_SendData(Ystart & 0xFF);
|
||||
EPD_2IN7_V2_SendData((Ystart >> 8) & 0xFF);
|
||||
EPD_2IN7_V2_SendData(Yend & 0xFF);
|
||||
EPD_2IN7_V2_SendData((Yend >> 8) & 0xFF);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
function : Set Cursor
|
||||
parameter:
|
||||
******************************************************************************/
|
||||
static void EPD_2IN7_V2_SetCursor(UWORD Xstart, UWORD Ystart)
|
||||
{
|
||||
EPD_2IN7_V2_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
|
||||
EPD_2IN7_V2_SendData(Xstart & 0xFF);
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
|
||||
EPD_2IN7_V2_SendData(Ystart & 0xFF);
|
||||
EPD_2IN7_V2_SendData((Ystart >> 8) & 0xFF);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
function : Initialize the e-Paper register
|
||||
|
|
@ -180,19 +167,121 @@ void EPD_2IN7_V2_Init(void)
|
|||
EPD_2IN7_V2_Reset();
|
||||
EPD_2IN7_V2_ReadBusy();
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x12);
|
||||
EPD_2IN7_V2_SendCommand(0x12); //SWRESET
|
||||
EPD_2IN7_V2_ReadBusy();
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x45); //set Ram-Y address start/end position
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x07); //0x0107-->(263+1)=264
|
||||
EPD_2IN7_V2_SendData(0x01);
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x4F); // set RAM y address count to 0;
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x11); // data entry mode
|
||||
EPD_2IN7_V2_SendData(0x03);
|
||||
|
||||
}
|
||||
void EPD_2IN7_V2_Init_Fast(void)
|
||||
{
|
||||
EPD_2IN7_V2_Reset();
|
||||
EPD_2IN7_V2_ReadBusy();
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x12); //SWRESET
|
||||
EPD_2IN7_V2_ReadBusy();
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x18); //Read built-in temperature sensor
|
||||
EPD_2IN7_V2_SendData(0x80);
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x22); // Load temperature value
|
||||
EPD_2IN7_V2_SendData(0xB1);
|
||||
EPD_2IN7_V2_SendCommand(0x20);
|
||||
EPD_2IN7_V2_ReadBusy();
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x1A); // Write to temperature register
|
||||
EPD_2IN7_V2_SendData(0x64);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x45); //set Ram-Y address start/end position
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x07); //0x0107-->(263+1)=264
|
||||
EPD_2IN7_V2_SendData(0x01);
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x4F); // set RAM y address count to 0;
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x11); // data entry mode
|
||||
EPD_2IN7_V2_SendData(0x03);
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x22); // Load temperature value
|
||||
EPD_2IN7_V2_SendData(0x91);
|
||||
EPD_2IN7_V2_SendCommand(0x20);
|
||||
EPD_2IN7_V2_ReadBusy();
|
||||
}
|
||||
void EPD_2IN7_V2_Init_4GRAY(void)
|
||||
{
|
||||
EPD_2IN7_V2_Reset();
|
||||
|
||||
EPD_2IN7_V2_ReadBusy();
|
||||
EPD_2IN7_V2_SendCommand(0x12); // soft reset
|
||||
EPD_2IN7_V2_ReadBusy();
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x74); //set analog block control
|
||||
EPD_2IN7_V2_SendData(0x54);
|
||||
EPD_2IN7_V2_SendCommand(0x7E); //set digital block control
|
||||
EPD_2IN7_V2_SendData(0x3B);
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x01); //Driver output control
|
||||
EPD_2IN7_V2_SendData(0x27);
|
||||
EPD_2IN7_V2_SendData(0x07);
|
||||
EPD_2IN7_V2_SendData(0x01);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x11); //data entry mode
|
||||
EPD_2IN7_V2_SendData(0x03);
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x44); //set Ram-X address start/end position
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x15); //0x15-->(21+1)*8=176
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x45); //set Ram-Y address start/end position
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x07);//0x0107-->(263+1)=264
|
||||
EPD_2IN7_V2_SendData(0x01);
|
||||
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x3C); //BorderWavefrom
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x2C); //VCOM Voltage
|
||||
EPD_2IN7_V2_SendData(LUT_DATA_4Gray[158]); //0x1C
|
||||
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x3F); //EOPQ
|
||||
EPD_2IN7_V2_SendData(LUT_DATA_4Gray[153]);
|
||||
|
||||
EPD_2IN7_V2_SetWindows(0, 0, EPD_2IN7_V2_WIDTH-1, EPD_2IN7_V2_HEIGHT-1);
|
||||
EPD_2IN7_V2_SetCursor(0, 0);
|
||||
EPD_2IN7_V2_SendCommand(0x03); //VGH
|
||||
EPD_2IN7_V2_SendData(LUT_DATA_4Gray[154]);
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x04); //
|
||||
EPD_2IN7_V2_SendData(LUT_DATA_4Gray[155]); //VSH1
|
||||
EPD_2IN7_V2_SendData(LUT_DATA_4Gray[156]); //VSH2
|
||||
EPD_2IN7_V2_SendData(LUT_DATA_4Gray[157]); //VSL
|
||||
|
||||
EPD_2IN7_V2_Lut(); //LUT
|
||||
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x4E); // set RAM x address count to 0;
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendCommand(0x4F); // set RAM y address count to 0X199;
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_ReadBusy();
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
|
@ -212,12 +301,6 @@ void EPD_2IN7_V2_Clear(void)
|
|||
}
|
||||
}
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x26);
|
||||
for (UWORD j = 0; j < Height; j++) {
|
||||
for (UWORD i = 0; i < Width; i++) {
|
||||
EPD_2IN7_V2_SendData(0X00);
|
||||
}
|
||||
}
|
||||
EPD_2IN7_V2_TurnOnDisplay();
|
||||
}
|
||||
|
||||
|
|
@ -241,6 +324,21 @@ void EPD_2IN7_V2_Display(UBYTE *Image)
|
|||
EPD_2IN7_V2_TurnOnDisplay();
|
||||
}
|
||||
|
||||
void EPD_2IN7_V2_Display_Fast(UBYTE *Image)
|
||||
{
|
||||
UWORD Width, Height;
|
||||
Width = (EPD_2IN7_V2_WIDTH % 8 == 0)? (EPD_2IN7_V2_WIDTH / 8 ): (EPD_2IN7_V2_WIDTH / 8 + 1);
|
||||
Height = EPD_2IN7_V2_HEIGHT;
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x24);
|
||||
for (UWORD j = 0; j < Height; j++) {
|
||||
for (UWORD i = 0; i < Width; i++) {
|
||||
EPD_2IN7_V2_SendData(Image[i + j * Width]);
|
||||
}
|
||||
}
|
||||
EPD_2IN7_V2_TurnOnDisplay_Fast();
|
||||
}
|
||||
|
||||
void EPD_2IN7_V2_Display_Base(UBYTE *Image)
|
||||
{
|
||||
UWORD Width, Height;
|
||||
|
|
@ -262,48 +360,161 @@ void EPD_2IN7_V2_Display_Base(UBYTE *Image)
|
|||
EPD_2IN7_V2_TurnOnDisplay();
|
||||
}
|
||||
|
||||
void EPD_2IN7_V2_Display_Partial(UBYTE *Image)
|
||||
void EPD_2IN7_V2_Display_Base_color(UBYTE color)
|
||||
{
|
||||
UWORD Width, Height;
|
||||
Width = (EPD_2IN7_V2_WIDTH % 8 == 0)? (EPD_2IN7_V2_WIDTH / 8 ): (EPD_2IN7_V2_WIDTH / 8 + 1);
|
||||
Height = EPD_2IN7_V2_HEIGHT;
|
||||
|
||||
DEV_Digital_Write(EPD_RST_PIN, 0);
|
||||
DEV_Delay_ms(1);
|
||||
DEV_Digital_Write(EPD_RST_PIN, 1);
|
||||
|
||||
EPD_2IN7_V2_ReadBusy();
|
||||
EPD_2IN7_V2_SetLut();
|
||||
EPD_2IN7_V2_SendCommand(0x37);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x40);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
EPD_2IN7_V2_SendData(0x00);
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x3c);
|
||||
EPD_2IN7_V2_SendData(0x80);
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x22);
|
||||
EPD_2IN7_V2_SendData(0xc0);
|
||||
EPD_2IN7_V2_SendCommand(0x20);
|
||||
EPD_2IN7_V2_ReadBusy();
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x24);
|
||||
EPD_2IN7_V2_SendCommand(0x24); //Write Black and White image to RAM
|
||||
for (UWORD j = 0; j < Height; j++) {
|
||||
for (UWORD i = 0; i < Width; i++) {
|
||||
EPD_2IN7_V2_SendData(Image[i + j * Width]);
|
||||
EPD_2IN7_V2_SendData(color);
|
||||
}
|
||||
}
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x26); //Write Black and White image to RAM
|
||||
for (UWORD j = 0; j < Height; j++) {
|
||||
for (UWORD i = 0; i < Width; i++) {
|
||||
EPD_2IN7_V2_SendData(color);
|
||||
}
|
||||
}
|
||||
// EPD_2IN7_V2_TurnOnDisplay();
|
||||
}
|
||||
|
||||
void EPD_2IN7_V2_Display_Partial(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
|
||||
{
|
||||
if((Xstart % 8 + Xend % 8 == 8 && Xstart % 8 > Xend % 8) || Xstart % 8 + Xend % 8 == 0 || (Xend - Xstart)%8 == 0)
|
||||
{
|
||||
Xstart = Xstart / 8 ;
|
||||
Xend = Xend / 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
Xstart = Xstart / 8 ;
|
||||
Xend = Xend % 8 == 0 ? Xend / 8 : Xend / 8 + 1;
|
||||
}
|
||||
|
||||
|
||||
UWORD i, Width;
|
||||
Width = Xend - Xstart;
|
||||
UWORD IMAGE_COUNTER = Width * (Yend-Ystart);
|
||||
|
||||
Xend -= 1;
|
||||
Yend -= 1;
|
||||
//Reset
|
||||
EPD_2IN7_V2_Reset();
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x3C); //BorderWavefrom
|
||||
EPD_2IN7_V2_SendData(0x80);
|
||||
//
|
||||
EPD_2IN7_V2_SendCommand(0x44); // set RAM x address start/end, in page 35
|
||||
EPD_2IN7_V2_SendData(Xstart & 0xff); // RAM x address start at 00h;
|
||||
EPD_2IN7_V2_SendData(Xend & 0xff); // RAM x address end at 0fh(15+1)*8->128
|
||||
EPD_2IN7_V2_SendCommand(0x45); // set RAM y address start/end, in page 35
|
||||
EPD_2IN7_V2_SendData(Ystart & 0xff); // RAM y address start at 0127h;
|
||||
EPD_2IN7_V2_SendData((Ystart>>8) & 0x01); // RAM y address start at 0127h;
|
||||
EPD_2IN7_V2_SendData(Yend & 0xff); // RAM y address end at 00h;
|
||||
EPD_2IN7_V2_SendData((Yend>>8) & 0x01);
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x4E); // set RAM x address count to 0;
|
||||
EPD_2IN7_V2_SendData(Xstart & 0xff);
|
||||
EPD_2IN7_V2_SendCommand(0x4F); // set RAM y address count to 0X127;
|
||||
EPD_2IN7_V2_SendData(Ystart & 0xff);
|
||||
EPD_2IN7_V2_SendData((Ystart>>8) & 0x01);
|
||||
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x24); //Write Black and White image to RAM
|
||||
for (i = 0; i < IMAGE_COUNTER; i++) {
|
||||
EPD_2IN7_V2_SendData(Image[i]);
|
||||
}
|
||||
EPD_2IN7_V2_TurnOnDisplay_Partial();
|
||||
}
|
||||
|
||||
|
||||
void EPD_2IN7_V2_4GrayDisplay(UBYTE *Image)
|
||||
{
|
||||
UDOUBLE i,j,k;
|
||||
UBYTE temp1,temp2,temp3;
|
||||
|
||||
// old data
|
||||
EPD_2IN7_V2_SendCommand(0x24);
|
||||
for(i=0; i<5808; i++) { //5808*4 46464
|
||||
temp3=0;
|
||||
for(j=0; j<2; j++) {
|
||||
temp1 = Image[i*2+j];
|
||||
for(k=0; k<2; k++) {
|
||||
temp2 = temp1&0xC0;
|
||||
if(temp2 == 0xC0)
|
||||
temp3 |= 0x00;
|
||||
else if(temp2 == 0x00)
|
||||
temp3 |= 0x01;
|
||||
else if(temp2 == 0x80)
|
||||
temp3 |= 0x01;
|
||||
else //0x40
|
||||
temp3 |= 0x00;
|
||||
temp3 <<= 1;
|
||||
|
||||
temp1 <<= 2;
|
||||
temp2 = temp1&0xC0 ;
|
||||
if(temp2 == 0xC0)
|
||||
temp3 |= 0x00;
|
||||
else if(temp2 == 0x00)
|
||||
temp3 |= 0x01;
|
||||
else if(temp2 == 0x80)
|
||||
temp3 |= 0x01;
|
||||
else //0x40
|
||||
temp3 |= 0x00;
|
||||
if(j!=1 || k!=1)
|
||||
temp3 <<= 1;
|
||||
|
||||
temp1 <<= 2;
|
||||
}
|
||||
|
||||
}
|
||||
EPD_2IN7_V2_SendData(temp3);
|
||||
// printf("%x",temp3);
|
||||
}
|
||||
|
||||
EPD_2IN7_V2_SendCommand(0x26); //write RAM for black(0)/white (1)
|
||||
for(i=0; i<5808; i++) { //5808*4 46464
|
||||
temp3=0;
|
||||
for(j=0; j<2; j++) {
|
||||
temp1 = Image[i*2+j];
|
||||
for(k=0; k<2; k++) {
|
||||
temp2 = temp1&0xC0 ;
|
||||
if(temp2 == 0xC0)
|
||||
temp3 |= 0x00;//white
|
||||
else if(temp2 == 0x00)
|
||||
temp3 |= 0x01; //black
|
||||
else if(temp2 == 0x80)
|
||||
temp3 |= 0x00; //gray1
|
||||
else //0x40
|
||||
temp3 |= 0x01; //gray2
|
||||
temp3 <<= 1;
|
||||
|
||||
temp1 <<= 2;
|
||||
temp2 = temp1&0xC0 ;
|
||||
if(temp2 == 0xC0) //white
|
||||
temp3 |= 0x00;
|
||||
else if(temp2 == 0x00) //black
|
||||
temp3 |= 0x01;
|
||||
else if(temp2 == 0x80)
|
||||
temp3 |= 0x00; //gray1
|
||||
else //0x40
|
||||
temp3 |= 0x01; //gray2
|
||||
if(j!=1 || k!=1)
|
||||
temp3 <<= 1;
|
||||
|
||||
temp1 <<= 2;
|
||||
}
|
||||
}
|
||||
EPD_2IN7_V2_SendData(temp3);
|
||||
// printf("%x",temp3);
|
||||
}
|
||||
|
||||
EPD_2IN7_V2_TurnOnDisplay_4GRAY();
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
function : Enter sleep mode
|
||||
parameter:
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* | Info :
|
||||
*----------------
|
||||
* | This version: V1.0
|
||||
* | Date : 2021-04-22
|
||||
* | Date : 2022-08-18
|
||||
* | Info :
|
||||
* -----------------------------------------------------------------------------
|
||||
#
|
||||
|
|
@ -38,11 +38,15 @@
|
|||
#define EPD_2IN7_V2_HEIGHT 264
|
||||
|
||||
void EPD_2IN7_V2_Init(void);
|
||||
void EPD_2IN7_V2_Init_Fast(void);
|
||||
void EPD_2IN7_V2_Init_4GRAY(void);
|
||||
void EPD_2IN7_V2_Clear(void);
|
||||
void EPD_2IN7_V2_Display(UBYTE *Image);
|
||||
void EPD_2IN7_V2_Display_Fast(UBYTE *Image);
|
||||
void EPD_2IN7_V2_Display_Base(UBYTE *Image);
|
||||
void EPD_2IN7_V2_Display_Base_color(UBYTE color);
|
||||
void EPD_2IN7_V2_Display_Partial(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yende);
|
||||
void EPD_2IN7_V2_4GrayDisplay(UBYTE *Image);
|
||||
void EPD_2IN7_V2_Sleep(void);
|
||||
|
||||
void EPD_2IN7_V2_Display_Base(UBYTE *Image);
|
||||
void EPD_2IN7_V2_Display_Partial(UBYTE *Image);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
158
RaspberryPi_JetsonNano/python/examples/epd_2in7_V2_test.py
Normal file
158
RaspberryPi_JetsonNano/python/examples/epd_2in7_V2_test.py
Normal file
|
|
@ -0,0 +1,158 @@
|
|||
#!/usr/bin/python
|
||||
# -*- coding:utf-8 -*-
|
||||
import sys
|
||||
import os
|
||||
picdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'pic')
|
||||
libdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')
|
||||
if os.path.exists(libdir):
|
||||
sys.path.append(libdir)
|
||||
|
||||
import logging
|
||||
from waveshare_epd import epd2in7_V2
|
||||
import time
|
||||
from PIL import Image,ImageDraw,ImageFont
|
||||
import traceback
|
||||
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
|
||||
try:
|
||||
|
||||
logging.info("epd2in7 Demo")
|
||||
epd = epd2in7_V2.EPD()
|
||||
|
||||
'''2Gray(Black and white) display'''
|
||||
logging.info("init and Clear")
|
||||
epd.init()
|
||||
epd.clear()
|
||||
font24 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)
|
||||
font18 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 18)
|
||||
font35 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 35)
|
||||
|
||||
# Quick refresh
|
||||
logging.info("Quick refresh demo")
|
||||
epd.init_Fast()
|
||||
# Drawing on the Vertical image
|
||||
logging.info("1.Drawing on the Vertical image...")
|
||||
Limage = Image.new('1', (epd.width, epd.height), 255) # 255: clear the frame
|
||||
draw = ImageDraw.Draw(Limage)
|
||||
draw.text((2, 0), 'hello world', font = font18, fill = 0)
|
||||
draw.text((20, 50), u'微雪电子', font = font18, fill = 0)
|
||||
draw.line((10, 90, 60, 140), fill = 0)
|
||||
draw.line((60, 90, 10, 140), fill = 0)
|
||||
draw.rectangle((10, 90, 60, 140), outline = 0)
|
||||
draw.line((95, 90, 95, 140), fill = 0)
|
||||
draw.line((70, 115, 120, 115), fill = 0)
|
||||
draw.arc((70, 90, 120, 140), 0, 360, fill = 0)
|
||||
draw.rectangle((10, 150, 60, 200), fill = 0)
|
||||
draw.chord((70, 150, 120, 200), 0, 360, fill = 0)
|
||||
epd.display_Fast(epd.getbuffer(Limage))
|
||||
time.sleep(2)
|
||||
|
||||
logging.info("2.read bmp file")
|
||||
Himage = Image.open(os.path.join(picdir, '2in7.bmp'))
|
||||
epd.display_Fast(epd.getbuffer(Himage))
|
||||
time.sleep(2)
|
||||
|
||||
# Normal refresh
|
||||
logging.info("Normal refresh demo")
|
||||
epd.init()
|
||||
logging.info("3.read bmp file on window")
|
||||
Himage2 = Image.new('1', (epd.height, epd.width), 255) # 255: clear the frame
|
||||
bmp = Image.open(os.path.join(picdir, '100x100.bmp'))
|
||||
Himage2.paste(bmp, (50,10))
|
||||
epd.display(epd.getbuffer(Himage2))
|
||||
time.sleep(2)
|
||||
|
||||
# Drawing on the Horizontal image
|
||||
logging.info("4.Drawing on the Horizontal image...")
|
||||
Himage = Image.new('1', (epd.height, epd.width), 255) # 255: clear the frame
|
||||
draw = ImageDraw.Draw(Himage)
|
||||
draw.text((10, 0), 'hello world', font = font24, fill = 0)
|
||||
draw.text((150, 0), u'微雪电子', font = font24, fill = 0)
|
||||
draw.line((20, 50, 70, 100), fill = 0)
|
||||
draw.line((70, 50, 20, 100), fill = 0)
|
||||
draw.rectangle((20, 50, 70, 100), outline = 0)
|
||||
draw.line((165, 50, 165, 100), fill = 0)
|
||||
draw.line((140, 75, 190, 75), fill = 0)
|
||||
draw.arc((140, 50, 190, 100), 0, 360, fill = 0)
|
||||
draw.rectangle((80, 50, 130, 100), fill = 0)
|
||||
draw.chord((200, 50, 250, 100), 0, 360, fill = 0)
|
||||
epd.display_Base(epd.getbuffer(Himage))
|
||||
time.sleep(2)
|
||||
|
||||
# partial update
|
||||
logging.info("5.show time")
|
||||
epd.init()
|
||||
'''
|
||||
# If you didn't use the EPD_2IN7_V2_Display_Base() function to refresh the image before,
|
||||
# use the EPD_2IN7_V2_Display_Base_color() function to refresh the background color,
|
||||
# otherwise the background color will be garbled
|
||||
'''
|
||||
# epd.display_Base_color(0xff)
|
||||
# Himage = Image.new('1', (epd.height ,epd.width), 0xff)
|
||||
# draw = ImageDraw.Draw(time_image)
|
||||
num = 0
|
||||
while (True):
|
||||
draw.rectangle((10, 110, 120, 150), fill = 255)
|
||||
draw.text((10, 110), time.strftime('%H:%M:%S'), font = font24, fill = 0)
|
||||
newimage = Himage.crop([10, 110, 120, 150])
|
||||
Himage.paste(newimage, (10,110))
|
||||
epd.display_Partial(epd.getbuffer(Himage),110, epd.height - 120, 150, epd.height - 10)
|
||||
num = num + 1
|
||||
if(num == 10):
|
||||
break
|
||||
|
||||
# epd.init()
|
||||
# epd.clear()
|
||||
# epd.display_Base_color(0xff)
|
||||
# Himage = Image.new('1', (epd.width ,epd.height), 0xff)
|
||||
# draw = ImageDraw.Draw(Himage)
|
||||
# num = 0
|
||||
# while (True):
|
||||
# draw.rectangle((10, 10, 120, 50), fill = 255)
|
||||
# draw.text((10, 10), time.strftime('%H:%M:%S'), font = font24, fill = 0)
|
||||
# newimage = Himage.crop([10, 10, 120, 50])
|
||||
# Himage.paste(newimage, (10,10))
|
||||
# epd.display_Partial(epd.getbuffer(Himage),10, 10, 120, 50)
|
||||
# num = num + 1
|
||||
# if(num == 10):
|
||||
# break
|
||||
|
||||
'''4Gray display'''
|
||||
logging.info("4Gray display--------------------------------")
|
||||
epd.Init_4Gray()
|
||||
|
||||
Limage = Image.new('L', (epd.width, epd.height), 0) # 255: clear the frame
|
||||
draw = ImageDraw.Draw(Limage)
|
||||
draw.text((20, 0), u'微雪电子', font = font35, fill = epd.GRAY1)
|
||||
draw.text((20, 35), u'微雪电子', font = font35, fill = epd.GRAY2)
|
||||
draw.text((20, 70), u'微雪电子', font = font35, fill = epd.GRAY3)
|
||||
draw.text((40, 110), 'hello world', font = font18, fill = epd.GRAY1)
|
||||
draw.line((10, 140, 60, 190), fill = epd.GRAY1)
|
||||
draw.line((60, 140, 10, 190), fill = epd.GRAY1)
|
||||
draw.rectangle((10, 140, 60, 190), outline = epd.GRAY1)
|
||||
draw.line((95, 140, 95, 190), fill = epd.GRAY1)
|
||||
draw.line((70, 165, 120, 165), fill = epd.GRAY1)
|
||||
draw.arc((70, 140, 120, 190), 0, 360, fill = epd.GRAY1)
|
||||
draw.rectangle((10, 200, 60, 250), fill = epd.GRAY1)
|
||||
draw.chord((70, 200, 120, 250), 0, 360, fill = epd.GRAY1)
|
||||
epd.display_4Gray(epd.getbuffer_4Gray(Limage))
|
||||
time.sleep(2)
|
||||
|
||||
#display 4Gra bmp
|
||||
Himage = Image.open(os.path.join(picdir, '2in7_Scale.bmp'))
|
||||
epd.display_4Gray(epd.getbuffer_4Gray(Himage))
|
||||
time.sleep(2)
|
||||
|
||||
logging.info("Clear...")
|
||||
epd.clear()
|
||||
logging.info("Goto Sleep...")
|
||||
epd.sleep()
|
||||
|
||||
except IOError as e:
|
||||
logging.info(e)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
logging.info("ctrl + c:")
|
||||
epd2in7.epdconfig.module_exit()
|
||||
exit()
|
||||
519
RaspberryPi_JetsonNano/python/lib/waveshare_epd/epd2in7_V2.py
Normal file
519
RaspberryPi_JetsonNano/python/lib/waveshare_epd/epd2in7_V2.py
Normal file
|
|
@ -0,0 +1,519 @@
|
|||
# *****************************************************************************
|
||||
# * | File : epd2in7_V2.py
|
||||
# * | Author : Waveshare team
|
||||
# * | Function : Electronic paper driver
|
||||
# * | Info :
|
||||
# *----------------
|
||||
# * | This version: V1.0
|
||||
# * | Date : 2022-09-17
|
||||
# # | Info : python demo
|
||||
# -----------------------------------------------------------------------------
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documnetation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
|
||||
import logging
|
||||
from . import epdconfig
|
||||
|
||||
# Display resolution
|
||||
EPD_WIDTH = 176
|
||||
EPD_HEIGHT = 264
|
||||
|
||||
GRAY1 = 0xff #white
|
||||
GRAY2 = 0xC0
|
||||
GRAY3 = 0x80 #gray
|
||||
GRAY4 = 0x00 #Blackest
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class EPD:
|
||||
def __init__(self):
|
||||
self.reset_pin = epdconfig.RST_PIN
|
||||
self.dc_pin = epdconfig.DC_PIN
|
||||
self.busy_pin = epdconfig.BUSY_PIN
|
||||
self.cs_pin = epdconfig.CS_PIN
|
||||
self.width = EPD_WIDTH
|
||||
self.height = EPD_HEIGHT
|
||||
self.GRAY1 = GRAY1 #white
|
||||
self.GRAY2 = GRAY2
|
||||
self.GRAY3 = GRAY3 #gray
|
||||
self.GRAY4 = GRAY4 #Blackest
|
||||
|
||||
LUT_DATA_4Gray = [
|
||||
0x40,0x48,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x8,0x48,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x2,0x48,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x20,0x48,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0xA,0x19,0x0,0x3,0x8,0x0,0x0,
|
||||
0x14,0x1,0x0,0x14,0x1,0x0,0x3,
|
||||
0xA,0x3,0x0,0x8,0x19,0x0,0x0,
|
||||
0x1,0x0,0x0,0x0,0x0,0x0,0x1,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,
|
||||
0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0,
|
||||
0x22,0x17,0x41,0x0,0x32,0x1C,
|
||||
]
|
||||
|
||||
# Hardware reset
|
||||
def reset(self):
|
||||
epdconfig.digital_write(self.reset_pin, 1)
|
||||
epdconfig.delay_ms(200)
|
||||
epdconfig.digital_write(self.reset_pin, 0)
|
||||
epdconfig.delay_ms(2)
|
||||
epdconfig.digital_write(self.reset_pin, 1)
|
||||
epdconfig.delay_ms(200)
|
||||
|
||||
def send_command(self, command):
|
||||
epdconfig.digital_write(self.dc_pin, 0)
|
||||
epdconfig.digital_write(self.cs_pin, 0)
|
||||
epdconfig.spi_writebyte([command])
|
||||
epdconfig.digital_write(self.cs_pin, 1)
|
||||
|
||||
def send_data(self, data):
|
||||
epdconfig.digital_write(self.dc_pin, 1)
|
||||
epdconfig.digital_write(self.cs_pin, 0)
|
||||
epdconfig.spi_writebyte([data])
|
||||
epdconfig.digital_write(self.cs_pin, 1)
|
||||
|
||||
def ReadBusy(self):
|
||||
logger.debug("e-Paper busy")
|
||||
while(epdconfig.digital_read(self.busy_pin) == 1): # 1: idle, 0: busy
|
||||
epdconfig.delay_ms(20)
|
||||
logger.debug("e-Paper busy release")
|
||||
|
||||
def TurnOnDisplay(self):
|
||||
self.send_command(0x22) #Display Update Control
|
||||
self.send_data(0xF7)
|
||||
self.send_command(0x20) #Activate Display Update Sequence
|
||||
self.ReadBusy()
|
||||
|
||||
def TurnOnDisplay_Fast(self):
|
||||
self.send_command(0x22) #Display Update Control
|
||||
self.send_data(0xC7)
|
||||
self.send_command(0x20) #Activate Display Update Sequence
|
||||
self.ReadBusy()
|
||||
|
||||
def TurnOnDisplay_Partial(self):
|
||||
self.send_command(0x22) #Display Update Control
|
||||
self.send_data(0xFF)
|
||||
self.send_command(0x20) #Activate Display Update Sequence
|
||||
self.ReadBusy()
|
||||
|
||||
def TurnOnDisplay_4GRAY(self):
|
||||
self.send_command(0x22) #Display Update Control
|
||||
self.send_data(0xC7)
|
||||
self.send_command(0x20) #Activate Display Update Sequence
|
||||
self.ReadBusy()
|
||||
|
||||
def Lut(self):
|
||||
self.send_command(0x32)
|
||||
for i in range(159):
|
||||
self.send_data(self.LUT_DATA_4Gray[i])
|
||||
|
||||
def init(self):
|
||||
if (epdconfig.module_init() != 0):
|
||||
return -1
|
||||
|
||||
# EPD hardware init start
|
||||
self.reset()
|
||||
self.ReadBusy()
|
||||
|
||||
self.send_command(0x12) #SWRESET
|
||||
self.ReadBusy()
|
||||
|
||||
self.send_command(0x45) #set Ram-Y address start/end position
|
||||
self.send_data(0x00)
|
||||
self.send_data(0x00)
|
||||
self.send_data(0x07) #0x0107-->(263+1)=264
|
||||
self.send_data(0x01)
|
||||
|
||||
self.send_command(0x4F) # set RAM y address count to 0;
|
||||
self.send_data(0x00)
|
||||
self.send_data(0x00)
|
||||
|
||||
self.send_command(0x11) # data entry mode
|
||||
self.send_data(0x03)
|
||||
return 0
|
||||
|
||||
def init_Fast(self):
|
||||
if (epdconfig.module_init() != 0):
|
||||
return -1
|
||||
|
||||
# EPD hardware init start
|
||||
self.reset()
|
||||
self.ReadBusy()
|
||||
|
||||
self.send_command(0x12) #SWRESET
|
||||
self.ReadBusy()
|
||||
|
||||
self.send_command(0x12) #SWRESET
|
||||
self.ReadBusy()
|
||||
|
||||
self.send_command(0x18) #Read built-in temperature sensor
|
||||
self.send_data(0x80)
|
||||
|
||||
self.send_command(0x22) # Load temperature value
|
||||
self.send_data(0xB1)
|
||||
self.send_command(0x20)
|
||||
self.ReadBusy()
|
||||
|
||||
self.send_command(0x1A) # Write to temperature register
|
||||
self.send_data(0x64)
|
||||
self.send_data(0x00)
|
||||
|
||||
self.send_command(0x45) #set Ram-Y address start/end position
|
||||
self.send_data(0x00)
|
||||
self.send_data(0x00)
|
||||
self.send_data(0x07) #0x0107-->(263+1)=264
|
||||
self.send_data(0x01)
|
||||
|
||||
self.send_command(0x4F) # set RAM y address count to 0;
|
||||
self.send_data(0x00)
|
||||
self.send_data(0x00)
|
||||
|
||||
self.send_command(0x11) # data entry mode
|
||||
self.send_data(0x03)
|
||||
|
||||
self.send_command(0x22) # Load temperature value
|
||||
self.send_data(0x91)
|
||||
self.send_command(0x20)
|
||||
self.ReadBusy()
|
||||
return 0
|
||||
|
||||
def Init_4Gray(self):
|
||||
if (epdconfig.module_init() != 0):
|
||||
return -1
|
||||
self.reset()
|
||||
|
||||
self.send_command(0x12) # soft reset
|
||||
self.ReadBusy();
|
||||
|
||||
self.send_command(0x74) #set analog block control
|
||||
self.send_data(0x54)
|
||||
self.send_command(0x7E) #set digital block control
|
||||
self.send_data(0x3B)
|
||||
|
||||
self.send_command(0x01) #Driver output control
|
||||
self.send_data(0x07)
|
||||
self.send_data(0x01)
|
||||
self.send_data(0x00)
|
||||
|
||||
self.send_command(0x11) #data entry mode
|
||||
self.send_data(0x03)
|
||||
|
||||
self.send_command(0x44) #set Ram-X address start/end position
|
||||
self.send_data(0x00)
|
||||
self.send_data(0x15) #0x15-->(21+1)*8=176
|
||||
|
||||
self.send_command(0x45) #set Ram-Y address start/end position
|
||||
self.send_data(0x00)
|
||||
self.send_data(0x00)
|
||||
self.send_data(0x07) #0x0107-->(263+1)=264
|
||||
self.send_data(0x01)
|
||||
|
||||
|
||||
self.send_command(0x3C) #BorderWavefrom
|
||||
self.send_data(0x00)
|
||||
|
||||
|
||||
self.send_command(0x2C) #VCOM Voltage
|
||||
self.send_data(self.LUT_DATA_4Gray[158]) #0x1C
|
||||
|
||||
|
||||
self.send_command(0x3F) #EOPQ
|
||||
self.send_data(self.LUT_DATA_4Gray[153])
|
||||
|
||||
self.send_command(0x03) #VGH
|
||||
self.send_data(self.LUT_DATA_4Gray[154])
|
||||
|
||||
self.send_command(0x04) #
|
||||
self.send_data(self.LUT_DATA_4Gray[155]) #VSH1
|
||||
self.send_data(self.LUT_DATA_4Gray[156]) #VSH2
|
||||
self.send_data(self.LUT_DATA_4Gray[157]) #VSL
|
||||
|
||||
self.Lut() #LUT
|
||||
|
||||
|
||||
self.send_command(0x4E) # set RAM x address count to 0;
|
||||
self.send_data(0x00)
|
||||
self.send_command(0x4F) # set RAM y address count to 0X199;
|
||||
self.send_data(0x00)
|
||||
self.send_data(0x00)
|
||||
self.ReadBusy()
|
||||
return 0
|
||||
|
||||
def getbuffer(self, image):
|
||||
# logger.debug("bufsiz = ",int(self.width/8) * self.height)
|
||||
buf = [0xFF] * (int(self.width/8) * self.height)
|
||||
image_monocolor = image.convert('1')
|
||||
imwidth, imheight = image_monocolor.size
|
||||
pixels = image_monocolor.load()
|
||||
# logger.debug("imwidth = %d, imheight = %d",imwidth,imheight)
|
||||
if(imwidth == self.width and imheight == self.height):
|
||||
logger.debug("Vertical")
|
||||
for y in range(imheight):
|
||||
for x in range(imwidth):
|
||||
# Set the bits for the column of pixels at the current position.
|
||||
if pixels[x, y] == 0:
|
||||
buf[int((x + y * self.width) / 8)] &= ~(0x80 >> (x % 8))
|
||||
elif(imwidth == self.height and imheight == self.width):
|
||||
logger.debug("Horizontal")
|
||||
for y in range(imheight):
|
||||
for x in range(imwidth):
|
||||
newx = y
|
||||
newy = self.height - x - 1
|
||||
if pixels[x, y] == 0:
|
||||
buf[int((newx + newy*self.width) / 8)] &= ~(0x80 >> (y % 8))
|
||||
return buf
|
||||
|
||||
def getbuffer_4Gray(self, image):
|
||||
# logger.debug("bufsiz = ",int(self.width/8) * self.height)
|
||||
buf = [0xFF] * (int(self.width / 4) * self.height)
|
||||
image_monocolor = image.convert('L')
|
||||
imwidth, imheight = image_monocolor.size
|
||||
pixels = image_monocolor.load()
|
||||
i=0
|
||||
# logger.debug("imwidth = %d, imheight = %d",imwidth,imheight)
|
||||
if(imwidth == self.width and imheight == self.height):
|
||||
logger.debug("Vertical")
|
||||
for y in range(imheight):
|
||||
for x in range(imwidth):
|
||||
# Set the bits for the column of pixels at the current position.
|
||||
if(pixels[x, y] == 0xC0):
|
||||
pixels[x, y] = 0x80
|
||||
elif (pixels[x, y] == 0x80):
|
||||
pixels[x, y] = 0x40
|
||||
i= i+1
|
||||
if(i%4 == 0):
|
||||
buf[int((x + (y * self.width))/4)] = ((pixels[x-3, y]&0xc0) | (pixels[x-2, y]&0xc0)>>2 | (pixels[x-1, y]&0xc0)>>4 | (pixels[x, y]&0xc0)>>6)
|
||||
|
||||
elif(imwidth == self.height and imheight == self.width):
|
||||
logger.debug("Horizontal")
|
||||
for x in range(imwidth):
|
||||
for y in range(imheight):
|
||||
newx = y
|
||||
newy = self.height - x - 1
|
||||
if(pixels[x, y] == 0xC0):
|
||||
pixels[x, y] = 0x80
|
||||
elif (pixels[x, y] == 0x80):
|
||||
pixels[x, y] = 0x40
|
||||
i= i+1
|
||||
if(i%4 == 0):
|
||||
buf[int((newx + (newy * self.width))/4)] = ((pixels[x, y-3]&0xc0) | (pixels[x, y-2]&0xc0)>>2 | (pixels[x, y-1]&0xc0)>>4 | (pixels[x, y]&0xc0)>>6)
|
||||
return buf
|
||||
|
||||
def clear(self):
|
||||
if(self.width % 8 == 0):
|
||||
Width = self.width // 8
|
||||
else:
|
||||
Width = self.width // 8 +1
|
||||
Height = self.height
|
||||
self.send_command(0x24)
|
||||
for j in range(Height):
|
||||
for i in range(Width):
|
||||
self.send_data(0XFF)
|
||||
self.TurnOnDisplay()
|
||||
|
||||
def display(self, image):
|
||||
if(self.width % 8 == 0):
|
||||
Width = self.width // 8
|
||||
else:
|
||||
Width = self.width // 8 +1
|
||||
Height = self.height
|
||||
self.send_command(0x24)
|
||||
for j in range(Height):
|
||||
for i in range(Width):
|
||||
self.send_data(image[i + j * Width])
|
||||
self.TurnOnDisplay()
|
||||
|
||||
def display_Fast(self, image):
|
||||
if(self.width % 8 == 0):
|
||||
Width = self.width // 8
|
||||
else:
|
||||
Width = self.width // 8 +1
|
||||
Height = self.height
|
||||
self.send_command(0x24)
|
||||
for j in range(Height):
|
||||
for i in range(Width):
|
||||
self.send_data(image[i + j * Width])
|
||||
self.TurnOnDisplay_Fast()
|
||||
|
||||
def display_Base(self, image):
|
||||
if(self.width % 8 == 0):
|
||||
Width = self.width // 8
|
||||
else:
|
||||
Width = self.width // 8 +1
|
||||
Height = self.height
|
||||
self.send_command(0x24) #Write Black and White image to RAM
|
||||
for j in range(Height):
|
||||
for i in range(Width):
|
||||
self.send_data(image[i + j * Width])
|
||||
|
||||
self.send_command(0x26) #Write Black and White image to RAM
|
||||
for j in range(Height):
|
||||
for i in range(Width):
|
||||
self.send_data(image[i + j * Width])
|
||||
self.TurnOnDisplay()
|
||||
|
||||
def display_Base_color(self, color):
|
||||
if(self.width % 8 == 0):
|
||||
Width = self.width // 8
|
||||
else:
|
||||
Width = self.width // 8 +1
|
||||
Height = self.height
|
||||
self.send_command(0x24) #Write Black and White image to RAM
|
||||
for j in range(Height):
|
||||
for i in range(Width):
|
||||
self.send_data(color)
|
||||
|
||||
self.send_command(0x26) #Write Black and White image to RAM
|
||||
for j in range(Height):
|
||||
for i in range(Width):
|
||||
self.send_data(color)
|
||||
# self.TurnOnDisplay()
|
||||
|
||||
def display_Partial(self, Image, Xstart, Ystart, Xend, Yend):
|
||||
if((Xstart % 8 + Xend % 8 == 8 & Xstart % 8 > Xend % 8) | Xstart % 8 + Xend % 8 == 0 | (Xend - Xstart)%8 == 0):
|
||||
Xstart = Xstart // 8
|
||||
Xend = Xend // 8
|
||||
else:
|
||||
Xstart = Xstart // 8
|
||||
if Xend % 8 == 0:
|
||||
Xend = Xend // 8
|
||||
else:
|
||||
Xend = Xend // 8 + 1
|
||||
|
||||
if(self.width % 8 == 0):
|
||||
Width = self.width // 8
|
||||
else:
|
||||
Width = self.width // 8 +1
|
||||
Height = self.height
|
||||
|
||||
Xend -= 1
|
||||
Yend -= 1
|
||||
|
||||
# Reset
|
||||
self.reset()
|
||||
|
||||
self.send_command(0x3C) #BorderWavefrom
|
||||
self.send_data(0x80)
|
||||
|
||||
self.send_command(0x44) # set RAM x address start/end, in page 35
|
||||
self.send_data(Xstart & 0xff) # RAM x address start at 00h;
|
||||
self.send_data(Xend & 0xff) # RAM x address end at 0fh(15+1)*8->128
|
||||
self.send_command(0x45) # set RAM y address start/end, in page 35
|
||||
self.send_data(Ystart & 0xff) # RAM y address start at 0127h;
|
||||
self.send_data((Ystart>>8) & 0x01) # RAM y address start at 0127h;
|
||||
self.send_data(Yend & 0xff) # RAM y address end at 00h;
|
||||
self.send_data((Yend>>8) & 0x01)
|
||||
|
||||
self.send_command(0x4E) # set RAM x address count to 0;
|
||||
self.send_data(Xstart & 0xff)
|
||||
self.send_command(0x4F) # set RAM y address count to 0X127;
|
||||
self.send_data(Ystart & 0xff)
|
||||
self.send_data((Ystart>>8) & 0x01)
|
||||
|
||||
self.send_command(0x24) #Write Black and White image to RAM
|
||||
for j in range(Height):
|
||||
for i in range(Width):
|
||||
if((j > Ystart-1) & (j < (Yend + 1)) & (i > Xstart-1) & (i < (Xend + 1))):
|
||||
self.send_data(Image[i + j * Width])
|
||||
self.TurnOnDisplay_Partial()
|
||||
|
||||
def display_4Gray(self, image):
|
||||
self.send_command(0x24)
|
||||
for i in range(0, 5808): #5808*4 46464
|
||||
temp3=0
|
||||
for j in range(0, 2):
|
||||
temp1 = image[i*2+j]
|
||||
for k in range(0, 2):
|
||||
temp2 = temp1&0xC0
|
||||
if(temp2 == 0xC0):
|
||||
temp3 |= 0x00
|
||||
elif(temp2 == 0x00):
|
||||
temp3 |= 0x01
|
||||
elif(temp2 == 0x80):
|
||||
temp3 |= 0x01
|
||||
else: #0x40
|
||||
temp3 |= 0x00
|
||||
temp3 <<= 1
|
||||
|
||||
temp1 <<= 2
|
||||
temp2 = temp1&0xC0
|
||||
if(temp2 == 0xC0):
|
||||
temp3 |= 0x00
|
||||
elif(temp2 == 0x00):
|
||||
temp3 |= 0x01
|
||||
elif(temp2 == 0x80):
|
||||
temp3 |= 0x01
|
||||
else : #0x40
|
||||
temp3 |= 0x00
|
||||
if(j!=1 or k!=1):
|
||||
temp3 <<= 1
|
||||
temp1 <<= 2
|
||||
self.send_data(temp3)
|
||||
|
||||
self.send_command(0x26)
|
||||
for i in range(0, 5808): #5808*4 46464
|
||||
temp3=0
|
||||
for j in range(0, 2):
|
||||
temp1 = image[i*2+j]
|
||||
for k in range(0, 2):
|
||||
temp2 = temp1&0xC0
|
||||
if(temp2 == 0xC0):
|
||||
temp3 |= 0x00
|
||||
elif(temp2 == 0x00):
|
||||
temp3 |= 0x01
|
||||
elif(temp2 == 0x80):
|
||||
temp3 |= 0x00
|
||||
else: #0x40
|
||||
temp3 |= 0x01
|
||||
temp3 <<= 1
|
||||
|
||||
temp1 <<= 2
|
||||
temp2 = temp1&0xC0
|
||||
if(temp2 == 0xC0):
|
||||
temp3 |= 0x00
|
||||
elif(temp2 == 0x00):
|
||||
temp3 |= 0x01
|
||||
elif(temp2 == 0x80):
|
||||
temp3 |= 0x00
|
||||
else: #0x40
|
||||
temp3 |= 0x01
|
||||
if(j!=1 or k!=1):
|
||||
temp3 <<= 1
|
||||
temp1 <<= 2
|
||||
self.send_data(temp3)
|
||||
|
||||
self.TurnOnDisplay_4GRAY()
|
||||
|
||||
def sleep(self):
|
||||
self.send_command(0X10)
|
||||
self.send_data(0x01)
|
||||
|
||||
epdconfig.delay_ms(2000)
|
||||
epdconfig.module_exit()
|
||||
### END OF FILE ###
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue