initial commit, display with commands working

This commit is contained in:
aeroreyna
2026-01-03 20:37:58 -05:00
commit b7e3dde91a
276 changed files with 100087 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
# Find all source files in a single current directory
# Save the name to DIR_ePaper_SRCS
aux_source_directory(. DIR_ePaper_SRCS)
include_directories(../Config)
# Generate the link library
add_library(ePaper ${DIR_ePaper_SRCS})
target_link_libraries(ePaper PUBLIC Config)

View File

@@ -0,0 +1,364 @@
/*****************************************************************************
* | File : EPD_2in13_V2.c
* | Author : Waveshare team
* | Function : 2.13inch e-paper V2
* | Info :
*----------------
* | This version: V3.0
* | Date : 2019-06-13
* | Info :
* -----------------------------------------------------------------------------
* V3.0(2019-06-13):
* 1.Change name:
* EPD_Reset() => EPD_2IN13_V2_Reset()
* EPD_SendCommand() => EPD_2IN13_V2_SendCommand()
* EPD_SendData() => EPD_2IN13_V2_SendData()
* EPD_WaitUntilIdle() => EPD_2IN13_V2_ReadBusy()
* EPD_Init() => EPD_2IN13_V2_Init()
* EPD_Clear() => EPD_2IN13_V2_Clear()
* EPD_Display() => EPD_2IN13_V2_Display()
* EPD_Sleep() => EPD_2IN13_V2_Sleep()
* 2.add:
* EPD_2IN13_V2_DisplayPartBaseImage()
* -----------------------------------------------------------------------------
* V2.0(2018-11-14):
* 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8]
* 2.Change:EPD_2IN13_V2_Display(UBYTE *Image)
* Need to pass parameters: pointer to cached data
* 3.Change:
* EPD_RST -> EPD_RST_PIN
* EPD_DC -> EPD_DC_PIN
* EPD_CS -> EPD_CS_PIN
* EPD_BUSY -> EPD_BUSY_PIN
#
# 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.
#
******************************************************************************/
#include "EPD_2in13_V2.h"
#include "Debug.h"
const unsigned char EPD_2IN13_V2_lut_full_update[]= {
0x80,0x60,0x40,0x00,0x00,0x00,0x00, //LUT0: BB: VS 0 ~7
0x10,0x60,0x20,0x00,0x00,0x00,0x00, //LUT1: BW: VS 0 ~7
0x80,0x60,0x40,0x00,0x00,0x00,0x00, //LUT2: WB: VS 0 ~7
0x10,0x60,0x20,0x00,0x00,0x00,0x00, //LUT3: WW: VS 0 ~7
0x00,0x00,0x00,0x00,0x00,0x00,0x00, //LUT4: VCOM: VS 0 ~7
0x03,0x03,0x00,0x00,0x02, // TP0 A~D RP0
0x09,0x09,0x00,0x00,0x02, // TP1 A~D RP1
0x03,0x03,0x00,0x00,0x02, // TP2 A~D RP2
0x00,0x00,0x00,0x00,0x00, // TP3 A~D RP3
0x00,0x00,0x00,0x00,0x00, // TP4 A~D RP4
0x00,0x00,0x00,0x00,0x00, // TP5 A~D RP5
0x00,0x00,0x00,0x00,0x00, // TP6 A~D RP6
0x15,0x41,0xA8,0x32,0x30,0x0A,
};
const unsigned char EPD_2IN13_V2_lut_partial_update[]= { //20 bytes
0x00,0x00,0x00,0x00,0x00,0x00,0x00, //LUT0: BB: VS 0 ~7
0x80,0x00,0x00,0x00,0x00,0x00,0x00, //LUT1: BW: VS 0 ~7
0x40,0x00,0x00,0x00,0x00,0x00,0x00, //LUT2: WB: VS 0 ~7
0x00,0x00,0x00,0x00,0x00,0x00,0x00, //LUT3: WW: VS 0 ~7
0x00,0x00,0x00,0x00,0x00,0x00,0x00, //LUT4: VCOM: VS 0 ~7
0x0A,0x00,0x00,0x00,0x00, // TP0 A~D RP0
0x00,0x00,0x00,0x00,0x00, // TP1 A~D RP1
0x00,0x00,0x00,0x00,0x00, // TP2 A~D RP2
0x00,0x00,0x00,0x00,0x00, // TP3 A~D RP3
0x00,0x00,0x00,0x00,0x00, // TP4 A~D RP4
0x00,0x00,0x00,0x00,0x00, // TP5 A~D RP5
0x00,0x00,0x00,0x00,0x00, // TP6 A~D RP6
0x15,0x41,0xA8,0x32,0x30,0x0A,
};
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2IN13_V2_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2IN13_V2_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2IN13_V2_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_2IN13_V2_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
while(DEV_Digital_Read(EPD_BUSY_PIN) == 1) { //LOW: idle, HIGH: busy
DEV_Delay_ms(100);
}
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_2IN13_V2_TurnOnDisplay(void)
{
EPD_2IN13_V2_SendCommand(0x22);
EPD_2IN13_V2_SendData(0xC7);
EPD_2IN13_V2_SendCommand(0x20);
EPD_2IN13_V2_ReadBusy();
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_2IN13_V2_TurnOnDisplayPart(void)
{
EPD_2IN13_V2_SendCommand(0x22);
EPD_2IN13_V2_SendData(0x0C);
EPD_2IN13_V2_SendCommand(0x20);
EPD_2IN13_V2_ReadBusy();
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2IN13_V2_Init(UBYTE Mode)
{
UBYTE count;
EPD_2IN13_V2_Reset();
if(Mode == EPD_2IN13_V2_FULL) {
EPD_2IN13_V2_ReadBusy();
EPD_2IN13_V2_SendCommand(0x12); // soft reset
EPD_2IN13_V2_ReadBusy();
EPD_2IN13_V2_SendCommand(0x74); //set analog block control
EPD_2IN13_V2_SendData(0x54);
EPD_2IN13_V2_SendCommand(0x7E); //set digital block control
EPD_2IN13_V2_SendData(0x3B);
EPD_2IN13_V2_SendCommand(0x01); //Driver output control
EPD_2IN13_V2_SendData(0xF9);
EPD_2IN13_V2_SendData(0x00);
EPD_2IN13_V2_SendData(0x00);
EPD_2IN13_V2_SendCommand(0x11); //data entry mode
EPD_2IN13_V2_SendData(0x01);
EPD_2IN13_V2_SendCommand(0x44); //set Ram-X address start/end position
EPD_2IN13_V2_SendData(0x00);
EPD_2IN13_V2_SendData(0x0F); //0x0C-->(15+1)*8=128
EPD_2IN13_V2_SendCommand(0x45); //set Ram-Y address start/end position
EPD_2IN13_V2_SendData(0xF9); //0xF9-->(249+1)=250
EPD_2IN13_V2_SendData(0x00);
EPD_2IN13_V2_SendData(0x00);
EPD_2IN13_V2_SendData(0x00);
EPD_2IN13_V2_SendCommand(0x3C); //BorderWaveform
EPD_2IN13_V2_SendData(0x03);
EPD_2IN13_V2_SendCommand(0x2C); //VCOM Voltage
EPD_2IN13_V2_SendData(0x55); //
EPD_2IN13_V2_SendCommand(0x03);
EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[70]);
EPD_2IN13_V2_SendCommand(0x04); //
EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[71]);
EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[72]);
EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[73]);
EPD_2IN13_V2_SendCommand(0x3A); //Dummy Line
EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[74]);
EPD_2IN13_V2_SendCommand(0x3B); //Gate time
EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[75]);
EPD_2IN13_V2_SendCommand(0x32);
for(count = 0; count < 70; count++) {
EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_full_update[count]);
}
EPD_2IN13_V2_SendCommand(0x4E); // set RAM x address count to 0;
EPD_2IN13_V2_SendData(0x00);
EPD_2IN13_V2_SendCommand(0x4F); // set RAM y address count to 0X127;
EPD_2IN13_V2_SendData(0xF9);
EPD_2IN13_V2_SendData(0x00);
EPD_2IN13_V2_ReadBusy();
} else if(Mode == EPD_2IN13_V2_PART) {
EPD_2IN13_V2_SendCommand(0x2C); //VCOM Voltage
EPD_2IN13_V2_SendData(0x26);
EPD_2IN13_V2_ReadBusy();
EPD_2IN13_V2_SendCommand(0x32);
for(count = 0; count < 70; count++) {
EPD_2IN13_V2_SendData(EPD_2IN13_V2_lut_partial_update[count]);
}
EPD_2IN13_V2_SendCommand(0x37);
EPD_2IN13_V2_SendData(0x00);
EPD_2IN13_V2_SendData(0x00);
EPD_2IN13_V2_SendData(0x00);
EPD_2IN13_V2_SendData(0x00);
EPD_2IN13_V2_SendData(0x40);
EPD_2IN13_V2_SendData(0x00);
EPD_2IN13_V2_SendData(0x00);
EPD_2IN13_V2_SendCommand(0x22);
EPD_2IN13_V2_SendData(0xC0);
EPD_2IN13_V2_SendCommand(0x20);
EPD_2IN13_V2_ReadBusy();
EPD_2IN13_V2_SendCommand(0x3C); //BorderWaveform
EPD_2IN13_V2_SendData(0x01);
} else {
Debug("error, the Mode is EPD_2IN13_FULL or EPD_2IN13_PART");
}
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2IN13_V2_Clear(void)
{
UWORD Width, Height;
Width = (EPD_2IN13_V2_WIDTH % 8 == 0)? (EPD_2IN13_V2_WIDTH / 8 ): (EPD_2IN13_V2_WIDTH / 8 + 1);
Height = EPD_2IN13_V2_HEIGHT;
EPD_2IN13_V2_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13_V2_SendData(0XFF);
}
}
EPD_2IN13_V2_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN13_V2_Display(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_2IN13_V2_WIDTH % 8 == 0)? (EPD_2IN13_V2_WIDTH / 8 ): (EPD_2IN13_V2_WIDTH / 8 + 1);
Height = EPD_2IN13_V2_HEIGHT;
EPD_2IN13_V2_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13_V2_SendData(Image[i + j * Width]);
}
}
EPD_2IN13_V2_TurnOnDisplay();
}
/******************************************************************************
function : The image of the previous frame must be uploaded, otherwise the
first few seconds will display an exception.
parameter:
******************************************************************************/
void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_2IN13_V2_WIDTH % 8 == 0)? (EPD_2IN13_V2_WIDTH / 8 ): (EPD_2IN13_V2_WIDTH / 8 + 1);
Height = EPD_2IN13_V2_HEIGHT;
UDOUBLE Addr = 0;
EPD_2IN13_V2_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
Addr = i + j * Width;
EPD_2IN13_V2_SendData(Image[Addr]);
}
}
EPD_2IN13_V2_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
Addr = i + j * Width;
EPD_2IN13_V2_SendData(Image[Addr]);
}
}
EPD_2IN13_V2_TurnOnDisplay();
}
void EPD_2IN13_V2_DisplayPart(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_2IN13_V2_WIDTH % 8 == 0)? (EPD_2IN13_V2_WIDTH / 8 ): (EPD_2IN13_V2_WIDTH / 8 + 1);
Height = EPD_2IN13_V2_HEIGHT;
EPD_2IN13_V2_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13_V2_SendData(Image[i + j * Width]);
}
}
EPD_2IN13_V2_TurnOnDisplayPart();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_2IN13_V2_Sleep(void)
{
EPD_2IN13_V2_SendCommand(0x22); //POWER OFF
EPD_2IN13_V2_SendData(0xC3);
EPD_2IN13_V2_SendCommand(0x20);
EPD_2IN13_V2_SendCommand(0x10); //enter deep sleep
EPD_2IN13_V2_SendData(0x01);
DEV_Delay_ms(100);
}

View File

@@ -0,0 +1,72 @@
/*****************************************************************************
* | File : EPD_2in13_V2.h
* | Author : Waveshare team
* | Function : 2.13inch e-paper V2
* | Info :
*----------------
* | This version: V3.0
* | Date : 2019-06-13
* | Info :
* -----------------------------------------------------------------------------
* V3.0(2019-06-13):
* 1.Change name:
* EPD_Reset() => EPD_2IN13_V2_Reset()
* EPD_SendCommand() => EPD_2IN13_V2_SendCommand()
* EPD_SendData() => EPD_2IN13_V2_SendData()
* EPD_WaitUntilIdle() => EPD_2IN13_V2_ReadBusy()
* EPD_Init() => EPD_2IN13_V2_Init()
* EPD_Clear() => EPD_2IN13_V2_Clear()
* EPD_Display() => EPD_2IN13_V2_Display()
* EPD_Sleep() => EPD_2IN13_V2_Sleep()
* 2.add:
* EPD_2IN13_V2_DisplayPartBaseImage()
* -----------------------------------------------------------------------------
* V2.0(2018-11-14):
* 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8]
* 2.Change:EPD_2IN13_V2_Display(UBYTE *Image)
* Need to pass parameters: pointer to cached data
* 3.Change:
* EPD_RST -> EPD_RST_PIN
* EPD_DC -> EPD_DC_PIN
* EPD_CS -> EPD_CS_PIN
* EPD_BUSY -> EPD_BUSY_PIN
#
# 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.
#
******************************************************************************/
#ifndef _EPD_2IN13_V2_H_
#define _EPD_2IN13_V2_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2IN13_V2_WIDTH 122
#define EPD_2IN13_V2_HEIGHT 250
#define EPD_2IN13_V2_FULL 0
#define EPD_2IN13_V2_PART 1
void EPD_2IN13_V2_Init(UBYTE Mode);
void EPD_2IN13_V2_Clear(void);
void EPD_2IN13_V2_Display(UBYTE *Image);
void EPD_2IN13_V2_DisplayPart(UBYTE *Image);
void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image);
void EPD_2IN13_V2_Sleep(void);
#endif

View File

@@ -0,0 +1,407 @@
/*****************************************************************************
* | File : EPD_2in13_V3.c
* | Author : Waveshare team
* | Function : 2.13inch e-paper V3
* | Info :
*----------------
* | This version: V1.1
* | Date : 2021-10-30
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#include "EPD_2in13_V3.h"
#include "Debug.h"
UBYTE WF_PARTIAL_2IN13_V3[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,
0x14,0x0,0x0,0x0,0x0,0x0,0x0,
0x1,0x0,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,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,0x00,0x32,0x36,
};
UBYTE WS_20_30_2IN13_V3[159] =
{
0x80, 0x4A, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x40, 0x4A, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x80, 0x4A, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x40, 0x4A, 0x80, 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, 0x0,
0xF, 0x0, 0x0, 0xF, 0x0, 0x0, 0x2,
0xF, 0x0, 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, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0,
0x22, 0x17, 0x41, 0x0, 0x32, 0x36
};
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2in13_V3_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(20);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(20);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2in13_V3_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2in13_V3_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_2in13_V3_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
while(1)
{ //=1 BUSY
if(DEV_Digital_Read(EPD_BUSY_PIN)==0)
break;
DEV_Delay_ms(10);
}
DEV_Delay_ms(10);
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_2in13_V3_TurnOnDisplay(void)
{
EPD_2in13_V3_SendCommand(0x22); // Display Update Control
EPD_2in13_V3_SendData(0xc7);
EPD_2in13_V3_SendCommand(0x20); // Activate Display Update Sequence
EPD_2in13_V3_ReadBusy();
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_2in13_V3_TurnOnDisplay_Partial(void)
{
EPD_2in13_V3_SendCommand(0x22); // Display Update Control
EPD_2in13_V3_SendData(0x0f); // fast:0x0c, quality:0x0f, 0xcf
EPD_2in13_V3_SendCommand(0x20); // Activate Display Update Sequence
EPD_2in13_V3_ReadBusy();
}
/******************************************************************************
function : Set lut
parameter:
lut : lut data
******************************************************************************/
static void EPD_2IN13_V3_LUT(UBYTE *lut)
{
UBYTE count;
EPD_2in13_V3_SendCommand(0x32);
for(count=0; count<153; count++)
EPD_2in13_V3_SendData(lut[count]);
EPD_2in13_V3_ReadBusy();
}
/******************************************************************************
function : Send lut data and configuration
parameter:
lut : lut data
******************************************************************************/
static void EPD_2IN13_V3_LUT_by_host(UBYTE *lut)
{
EPD_2IN13_V3_LUT((UBYTE *)lut); //lut
EPD_2in13_V3_SendCommand(0x3f);
EPD_2in13_V3_SendData(*(lut+153));
EPD_2in13_V3_SendCommand(0x03); // gate voltage
EPD_2in13_V3_SendData(*(lut+154));
EPD_2in13_V3_SendCommand(0x04); // source voltage
EPD_2in13_V3_SendData(*(lut+155)); // VSH
EPD_2in13_V3_SendData(*(lut+156)); // VSH2
EPD_2in13_V3_SendData(*(lut+157)); // VSL
EPD_2in13_V3_SendCommand(0x2c); // VCOM
EPD_2in13_V3_SendData(*(lut+158));
}
/******************************************************************************
function : Setting the display window
parameter:
Xstart : X-axis starting position
Ystart : Y-axis starting position
Xend : End position of X-axis
Yend : End position of Y-axis
******************************************************************************/
static void EPD_2in13_V3_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
{
EPD_2in13_V3_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION
EPD_2in13_V3_SendData((Xstart>>3) & 0xFF);
EPD_2in13_V3_SendData((Xend>>3) & 0xFF);
EPD_2in13_V3_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION
EPD_2in13_V3_SendData(Ystart & 0xFF);
EPD_2in13_V3_SendData((Ystart >> 8) & 0xFF);
EPD_2in13_V3_SendData(Yend & 0xFF);
EPD_2in13_V3_SendData((Yend >> 8) & 0xFF);
}
/******************************************************************************
function : Set Cursor
parameter:
Xstart : X-axis starting position
Ystart : Y-axis starting position
******************************************************************************/
static void EPD_2in13_V3_SetCursor(UWORD Xstart, UWORD Ystart)
{
EPD_2in13_V3_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
EPD_2in13_V3_SendData(Xstart & 0xFF);
EPD_2in13_V3_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
EPD_2in13_V3_SendData(Ystart & 0xFF);
EPD_2in13_V3_SendData((Ystart >> 8) & 0xFF);
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2in13_V3_Init(void)
{
EPD_2in13_V3_Reset();
DEV_Delay_ms(100);
EPD_2in13_V3_ReadBusy();
EPD_2in13_V3_SendCommand(0x12); //SWRESET
EPD_2in13_V3_ReadBusy();
EPD_2in13_V3_SendCommand(0x01); //Driver output control
EPD_2in13_V3_SendData(0xf9);
EPD_2in13_V3_SendData(0x00);
EPD_2in13_V3_SendData(0x00);
EPD_2in13_V3_SendCommand(0x11); //data entry mode
EPD_2in13_V3_SendData(0x03);
EPD_2in13_V3_SetWindows(0, 0, EPD_2in13_V3_WIDTH-1, EPD_2in13_V3_HEIGHT-1);
EPD_2in13_V3_SetCursor(0, 0);
EPD_2in13_V3_SendCommand(0x3C); //BorderWaveform
EPD_2in13_V3_SendData(0x05);
EPD_2in13_V3_SendCommand(0x21); // Display update control
EPD_2in13_V3_SendData(0x00);
EPD_2in13_V3_SendData(0x80);
EPD_2in13_V3_SendCommand(0x18); //Read built-in temperature sensor
EPD_2in13_V3_SendData(0x80);
EPD_2in13_V3_ReadBusy();
EPD_2IN13_V3_LUT_by_host(WS_20_30_2IN13_V3);
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2in13_V3_Clear(void)
{
UWORD Width, Height;
Width = (EPD_2in13_V3_WIDTH % 8 == 0)? (EPD_2in13_V3_WIDTH / 8 ): (EPD_2in13_V3_WIDTH / 8 + 1);
Height = EPD_2in13_V3_HEIGHT;
EPD_2in13_V3_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++)
{
for (UWORD i = 0; i < Width; i++)
{
EPD_2in13_V3_SendData(0XFF);
}
}
EPD_2in13_V3_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
image : Image data
******************************************************************************/
void EPD_2in13_V3_Display(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_2in13_V3_WIDTH % 8 == 0)? (EPD_2in13_V3_WIDTH / 8 ): (EPD_2in13_V3_WIDTH / 8 + 1);
Height = EPD_2in13_V3_HEIGHT;
EPD_2in13_V3_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++)
{
for (UWORD i = 0; i < Width; i++)
{
EPD_2in13_V3_SendData(Image[i + j * Width]);
}
}
EPD_2in13_V3_TurnOnDisplay();
}
/******************************************************************************
function : Refresh a base image
parameter:
image : Image data
******************************************************************************/
void EPD_2in13_V3_Display_Base(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_2in13_V3_WIDTH % 8 == 0)? (EPD_2in13_V3_WIDTH / 8 ): (EPD_2in13_V3_WIDTH / 8 + 1);
Height = EPD_2in13_V3_HEIGHT;
EPD_2in13_V3_SendCommand(0x24); //Write Black and White image to RAM
for (UWORD j = 0; j < Height; j++)
{
for (UWORD i = 0; i < Width; i++)
{
EPD_2in13_V3_SendData(Image[i + j * Width]);
}
}
EPD_2in13_V3_SendCommand(0x26); //Write Black and White image to RAM
for (UWORD j = 0; j < Height; j++)
{
for (UWORD i = 0; i < Width; i++)
{
EPD_2in13_V3_SendData(Image[i + j * Width]);
}
}
EPD_2in13_V3_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and partial refresh
parameter:
image : Image data
******************************************************************************/
void EPD_2in13_V3_Display_Partial(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_2in13_V3_WIDTH % 8 == 0)? (EPD_2in13_V3_WIDTH / 8 ): (EPD_2in13_V3_WIDTH / 8 + 1);
Height = EPD_2in13_V3_HEIGHT;
//Reset
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
EPD_2IN13_V3_LUT_by_host(WF_PARTIAL_2IN13_V3);
EPD_2in13_V3_SendCommand(0x37);
EPD_2in13_V3_SendData(0x00);
EPD_2in13_V3_SendData(0x00);
EPD_2in13_V3_SendData(0x00);
EPD_2in13_V3_SendData(0x00);
EPD_2in13_V3_SendData(0x00);
EPD_2in13_V3_SendData(0x40); ///RAM Ping-Pong enable
EPD_2in13_V3_SendData(0x00);
EPD_2in13_V3_SendData(0x00);
EPD_2in13_V3_SendData(0x00);
EPD_2in13_V3_SendData(0x00);
EPD_2in13_V3_SendCommand(0x3C); //BorderWaveform
EPD_2in13_V3_SendData(0x80);
EPD_2in13_V3_SendCommand(0x22); //Display Update Sequence Option
EPD_2in13_V3_SendData(0xC0); // Enable clock and Enable analog
EPD_2in13_V3_SendCommand(0x20); //Activate Display Update Sequence
EPD_2in13_V3_ReadBusy();
EPD_2in13_V3_SetWindows(0, 0, EPD_2in13_V3_WIDTH-1, EPD_2in13_V3_HEIGHT-1);
EPD_2in13_V3_SetCursor(0, 0);
EPD_2in13_V3_SendCommand(0x24); //Write Black and White image to RAM
for (UWORD j = 0; j < Height; j++)
{
for (UWORD i = 0; i < Width; i++)
{
EPD_2in13_V3_SendData(Image[i + j * Width]);
}
}
EPD_2in13_V3_TurnOnDisplay_Partial();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_2in13_V3_Sleep(void)
{
EPD_2in13_V3_SendCommand(0x10); //enter deep sleep
EPD_2in13_V3_SendData(0x01);
DEV_Delay_ms(100);
}

View File

@@ -0,0 +1,47 @@
/*****************************************************************************
* | File : EPD_2Iin13_V3.h
* | Author : Waveshare team
* | Function : 2.13inch e-paper V3
* | Info :
*----------------
* | This version: V1.1
* | Date : 2021-10-30
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#ifndef __EPD_2in13_V3_H_
#define __EPD_2in13_V3_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2in13_V3_WIDTH 122
#define EPD_2in13_V3_HEIGHT 250
void EPD_2in13_V3_Init(void);
void EPD_2in13_V3_Clear(void);
void EPD_2in13_V3_Display(UBYTE *Image);
void EPD_2in13_V3_Display_Base(UBYTE *Image);
void EPD_2in13_V3_Display_Partial(UBYTE *Image);
void EPD_2in13_V3_Sleep(void);
#endif

View File

@@ -0,0 +1,370 @@
/*****************************************************************************
* | File : EPD_2in13_V4.c
* | Author : Waveshare team
* | Function : 2.13inch e-paper V4
* | Info :
*----------------
* | This version: V1.0
* | Date : 2023-08-12
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#include "EPD_2in13_V4.h"
#include "Debug.h"
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2in13_V4_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(20);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(20);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2in13_V4_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2in13_V4_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_2in13_V4_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
while(1)
{ //=1 BUSY
if(DEV_Digital_Read(EPD_BUSY_PIN)==0)
break;
DEV_Delay_ms(10);
}
DEV_Delay_ms(10);
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Setting the display window
parameter:
Xstart : X-axis starting position
Ystart : Y-axis starting position
Xend : End position of X-axis
Yend : End position of Y-axis
******************************************************************************/
static void EPD_2in13_V4_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
{
EPD_2in13_V4_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION
EPD_2in13_V4_SendData((Xstart>>3) & 0xFF);
EPD_2in13_V4_SendData((Xend>>3) & 0xFF);
EPD_2in13_V4_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION
EPD_2in13_V4_SendData(Ystart & 0xFF);
EPD_2in13_V4_SendData((Ystart >> 8) & 0xFF);
EPD_2in13_V4_SendData(Yend & 0xFF);
EPD_2in13_V4_SendData((Yend >> 8) & 0xFF);
}
/******************************************************************************
function : Set Cursor
parameter:
Xstart : X-axis starting position
Ystart : Y-axis starting position
******************************************************************************/
static void EPD_2in13_V4_SetCursor(UWORD Xstart, UWORD Ystart)
{
EPD_2in13_V4_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
EPD_2in13_V4_SendData(Xstart & 0xFF);
EPD_2in13_V4_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
EPD_2in13_V4_SendData(Ystart & 0xFF);
EPD_2in13_V4_SendData((Ystart >> 8) & 0xFF);
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_2in13_V4_TurnOnDisplay(void)
{
EPD_2in13_V4_SendCommand(0x22); // Display Update Control
EPD_2in13_V4_SendData(0xf7);
EPD_2in13_V4_SendCommand(0x20); // Activate Display Update Sequence
EPD_2in13_V4_ReadBusy();
}
static void EPD_2in13_V4_TurnOnDisplay_Fast(void)
{
EPD_2in13_V4_SendCommand(0x22); // Display Update Control
EPD_2in13_V4_SendData(0xc7); // fast:0x0c, quality:0x0f, 0xcf
EPD_2in13_V4_SendCommand(0x20); // Activate Display Update Sequence
EPD_2in13_V4_ReadBusy();
}
static void EPD_2in13_V4_TurnOnDisplay_Partial(void)
{
EPD_2in13_V4_SendCommand(0x22); // Display Update Control
EPD_2in13_V4_SendData(0xff); // fast:0x0c, quality:0x0f, 0xcf
EPD_2in13_V4_SendCommand(0x20); // Activate Display Update Sequence
EPD_2in13_V4_ReadBusy();
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2in13_V4_Init(void)
{
EPD_2in13_V4_Reset();
EPD_2in13_V4_ReadBusy();
EPD_2in13_V4_SendCommand(0x12); //SWRESET
EPD_2in13_V4_ReadBusy();
EPD_2in13_V4_SendCommand(0x01); //Driver output control
EPD_2in13_V4_SendData(0xF9);
EPD_2in13_V4_SendData(0x00);
EPD_2in13_V4_SendData(0x00);
EPD_2in13_V4_SendCommand(0x11); //data entry mode
EPD_2in13_V4_SendData(0x03);
EPD_2in13_V4_SetWindows(0, 0, EPD_2in13_V4_WIDTH-1, EPD_2in13_V4_HEIGHT-1);
EPD_2in13_V4_SetCursor(0, 0);
EPD_2in13_V4_SendCommand(0x3C); //BorderWavefrom
EPD_2in13_V4_SendData(0x05);
EPD_2in13_V4_SendCommand(0x21); // Display update control
EPD_2in13_V4_SendData(0x00);
EPD_2in13_V4_SendData(0x80);
EPD_2in13_V4_SendCommand(0x18); //Read built-in temperature sensor
EPD_2in13_V4_SendData(0x80);
EPD_2in13_V4_ReadBusy();
}
void EPD_2in13_V4_Init_Fast(void)
{
EPD_2in13_V4_Reset();
EPD_2in13_V4_SendCommand(0x12); //SWRESET
EPD_2in13_V4_ReadBusy();
EPD_2in13_V4_SendCommand(0x18); //Read built-in temperature sensor
EPD_2in13_V4_SendData(0x80);
EPD_2in13_V4_SendCommand(0x11); //data entry mode
EPD_2in13_V4_SendData(0x03);
EPD_2in13_V4_SetWindows(0, 0, EPD_2in13_V4_WIDTH-1, EPD_2in13_V4_HEIGHT-1);
EPD_2in13_V4_SetCursor(0, 0);
EPD_2in13_V4_SendCommand(0x22); // Load temperature value
EPD_2in13_V4_SendData(0xB1);
EPD_2in13_V4_SendCommand(0x20);
EPD_2in13_V4_ReadBusy();
EPD_2in13_V4_SendCommand(0x1A); // Write to temperature register
EPD_2in13_V4_SendData(0x64);
EPD_2in13_V4_SendData(0x00);
EPD_2in13_V4_SendCommand(0x22); // Load temperature value
EPD_2in13_V4_SendData(0x91);
EPD_2in13_V4_SendCommand(0x20);
EPD_2in13_V4_ReadBusy();
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2in13_V4_Clear(void)
{
UWORD Width, Height;
Width = (EPD_2in13_V4_WIDTH % 8 == 0)? (EPD_2in13_V4_WIDTH / 8 ): (EPD_2in13_V4_WIDTH / 8 + 1);
Height = EPD_2in13_V4_HEIGHT;
EPD_2in13_V4_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2in13_V4_SendData(0XFF);
}
}
EPD_2in13_V4_TurnOnDisplay();
}
void EPD_2in13_V4_Clear_Black(void)
{
UWORD Width, Height;
Width = (EPD_2in13_V4_WIDTH % 8 == 0)? (EPD_2in13_V4_WIDTH / 8 ): (EPD_2in13_V4_WIDTH / 8 + 1);
Height = EPD_2in13_V4_HEIGHT;
EPD_2in13_V4_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2in13_V4_SendData(0X00);
}
}
EPD_2in13_V4_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
Image : Image data
******************************************************************************/
void EPD_2in13_V4_Display(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_2in13_V4_WIDTH % 8 == 0)? (EPD_2in13_V4_WIDTH / 8 ): (EPD_2in13_V4_WIDTH / 8 + 1);
Height = EPD_2in13_V4_HEIGHT;
EPD_2in13_V4_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2in13_V4_SendData(Image[i + j * Width]);
}
}
EPD_2in13_V4_TurnOnDisplay();
}
void EPD_2in13_V4_Display_Fast(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_2in13_V4_WIDTH % 8 == 0)? (EPD_2in13_V4_WIDTH / 8 ): (EPD_2in13_V4_WIDTH / 8 + 1);
Height = EPD_2in13_V4_HEIGHT;
EPD_2in13_V4_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2in13_V4_SendData(Image[i + j * Width]);
}
}
EPD_2in13_V4_TurnOnDisplay_Fast();
}
/******************************************************************************
function : Refresh a base image
parameter:
Image : Image data
******************************************************************************/
void EPD_2in13_V4_Display_Base(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_2in13_V4_WIDTH % 8 == 0)? (EPD_2in13_V4_WIDTH / 8 ): (EPD_2in13_V4_WIDTH / 8 + 1);
Height = EPD_2in13_V4_HEIGHT;
EPD_2in13_V4_SendCommand(0x24); //Write Black and White image to RAM
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2in13_V4_SendData(Image[i + j * Width]);
}
}
EPD_2in13_V4_SendCommand(0x26); //Write Black and White image to RAM
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2in13_V4_SendData(Image[i + j * Width]);
}
}
EPD_2in13_V4_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and partial refresh
parameter:
Image : Image data
******************************************************************************/
void EPD_2in13_V4_Display_Partial(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_2in13_V4_WIDTH % 8 == 0)? (EPD_2in13_V4_WIDTH / 8 ): (EPD_2in13_V4_WIDTH / 8 + 1);
Height = EPD_2in13_V4_HEIGHT;
//Reset
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
EPD_2in13_V4_SendCommand(0x3C); //BorderWavefrom
EPD_2in13_V4_SendData(0x80);
EPD_2in13_V4_SendCommand(0x01); //Driver output control
EPD_2in13_V4_SendData(0xF9);
EPD_2in13_V4_SendData(0x00);
EPD_2in13_V4_SendData(0x00);
EPD_2in13_V4_SendCommand(0x11); //data entry mode
EPD_2in13_V4_SendData(0x03);
EPD_2in13_V4_SetWindows(0, 0, EPD_2in13_V4_WIDTH-1, EPD_2in13_V4_HEIGHT-1);
EPD_2in13_V4_SetCursor(0, 0);
EPD_2in13_V4_SendCommand(0x24); //Write Black and White image to RAM
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2in13_V4_SendData(Image[i + j * Width]);
}
}
EPD_2in13_V4_TurnOnDisplay_Partial();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_2in13_V4_Sleep(void)
{
EPD_2in13_V4_SendCommand(0x10); //enter deep sleep
EPD_2in13_V4_SendData(0x01);
DEV_Delay_ms(100);
}

View File

@@ -0,0 +1,53 @@
/*****************************************************************************
* | File : EPD_2Iin13_V4.h
* | Author : Waveshare team
* | Function : 2.13inch e-paper V4
* | Info :
*----------------
* | This version: V1.0
* | Date : 2023-08-12
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#ifndef __EPD_2in13_V4_H_
#define __EPD_2in13_V4_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2in13_V4_WIDTH 122
#define EPD_2in13_V4_HEIGHT 250
void EPD_2in13_V4_Init(void);
void EPD_2in13_V4_Init_Fast(void);
void EPD_2in13_V4_Init_GUI(void);
void EPD_2in13_V4_Clear(void);
void EPD_2in13_V4_Clear_Black(void);
void EPD_2in13_V4_Display(UBYTE *Image);
void EPD_2in13_V4_Display_Fast(UBYTE *Image);
void EPD_2in13_V4_Display_Base(UBYTE *Image);
void EPD_2in13_V4_Display_Partial(UBYTE *Image);
void EPD_2in13_V4_Sleep(void);
#endif

View File

@@ -0,0 +1,197 @@
/*****************************************************************************
* | File : EPD_2in13b_V3.c
* | Author : Waveshare team
* | Function : 2.13inch e-paper b V3
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-04-13
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#include "EPD_2in13b_V3.h"
#include "Debug.h"
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2IN13B_V3_Reset(void)
{
DEV_Digital_Write(EPD_CS_PIN, 1);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(10);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(10);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2IN13B_V3_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2IN13B_V3_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_2IN13B_V3_ReadBusy(void)
{
UBYTE busy;
Debug("e-Paper busy\r\n");
do{
EPD_2IN13B_V3_SendCommand(0x71);
busy = DEV_Digital_Read(EPD_BUSY_PIN);
busy =!(busy & 0x01);
}while(busy);
Debug("e-Paper busy release\r\n");
DEV_Delay_ms(200);
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_2IN13B_V3_TurnOnDisplay(void)
{
EPD_2IN13B_V3_SendCommand(0x12); //DISPLAY REFRESH
DEV_Delay_ms(100);
EPD_2IN13B_V3_ReadBusy();
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2IN13B_V3_Init(void)
{
EPD_2IN13B_V3_Reset();
DEV_Delay_ms(10);
EPD_2IN13B_V3_SendCommand(0x04);
EPD_2IN13B_V3_ReadBusy();//waiting for the electronic paper IC to release the idle signal
EPD_2IN13B_V3_SendCommand(0x00);//panel setting
EPD_2IN13B_V3_SendData(0x0f);//LUT from OTP<54><50>?128x296
EPD_2IN13B_V3_SendData(0x89);//Temperature sensor, boost and other related timing settings
EPD_2IN13B_V3_SendCommand(0x61);//resolution setting
EPD_2IN13B_V3_SendData (0x68);
EPD_2IN13B_V3_SendData (0x00);
EPD_2IN13B_V3_SendData (0xD4);
EPD_2IN13B_V3_SendCommand(0X50);//VCOM AND DATA INTERVAL SETTING
EPD_2IN13B_V3_SendData(0x77);//WBmode:VBDF 17|D7 VBDW 97 VBDB 57
//WBRmode:VBDF F7 VBDW 77 VBDB 37 VBDR B7;
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2IN13B_V3_Clear(void)
{
UWORD Width = (EPD_2IN13B_V3_WIDTH % 8 == 0)? (EPD_2IN13B_V3_WIDTH / 8 ): (EPD_2IN13B_V3_WIDTH / 8 + 1);
UWORD Height = EPD_2IN13B_V3_HEIGHT;
//send black data
EPD_2IN13B_V3_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13B_V3_SendData(0xFF);
}
}
//send red data
EPD_2IN13B_V3_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13B_V3_SendData(0xFF);
}
}
EPD_2IN13B_V3_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN13B_V3_Display(const UBYTE *blackimage, const UBYTE *ryimage)
{
UWORD Width, Height;
Width = (EPD_2IN13B_V3_WIDTH % 8 == 0)? (EPD_2IN13B_V3_WIDTH / 8 ): (EPD_2IN13B_V3_WIDTH / 8 + 1);
Height = EPD_2IN13B_V3_HEIGHT;
EPD_2IN13B_V3_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13B_V3_SendData(blackimage[i + j * Width]);
}
}
EPD_2IN13B_V3_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13B_V3_SendData(ryimage[i + j * Width]);
}
}
EPD_2IN13B_V3_TurnOnDisplay();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_2IN13B_V3_Sleep(void)
{
EPD_2IN13B_V3_SendCommand(0X50);
EPD_2IN13B_V3_SendData(0xf7);
EPD_2IN13B_V3_SendCommand(0X02); //power off
EPD_2IN13B_V3_ReadBusy(); //waiting for the electronic paper IC to release the idle signal
EPD_2IN13B_V3_SendCommand(0X07); //deep sleep
EPD_2IN13B_V3_SendData(0xA5);
}

View File

@@ -0,0 +1,45 @@
/*****************************************************************************
* | File : EPD_2in13b_V3.h
* | Author : Waveshare team
* | Function : 2.13inch e-paper b V3
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-04-13
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#ifndef __EPD_2IN13B_V3_H_
#define __EPD_2IN13B_V3_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2IN13B_V3_WIDTH 104
#define EPD_2IN13B_V3_HEIGHT 212
void EPD_2IN13B_V3_Init(void);
void EPD_2IN13B_V3_Clear(void);
void EPD_2IN13B_V3_Display(const UBYTE *blackimage, const UBYTE *ryimage);
void EPD_2IN13B_V3_Sleep(void);
#endif

View File

@@ -0,0 +1,228 @@
/*****************************************************************************
* | File : EPD_2IN13b_V4.c
* | Author : Waveshare team
* | Function : 2.13inch e-paper B V4
* | Info :
*----------------
* | This version: V1.0
* | Date : 2022-04-25
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#include "EPD_2in13b_V4.h"
#include "Debug.h"
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2IN13B_V4_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(20);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(20);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2IN13B_V4_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2IN13B_V4_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_2IN13B_V4_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
while(1)
{ //=1 BUSY
if(DEV_Digital_Read(EPD_BUSY_PIN)==0)
break;
DEV_Delay_ms(20);
}
DEV_Delay_ms(20);
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_2IN13B_V4_TurnOnDisplay(void)
{
EPD_2IN13B_V4_SendCommand(0x20); // Activate Display Update Sequence
EPD_2IN13B_V4_ReadBusy();
}
/******************************************************************************
function : Setting the display window
parameter:
******************************************************************************/
static void EPD_2IN13B_V4_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
{
EPD_2IN13B_V4_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION
EPD_2IN13B_V4_SendData((Xstart>>3) & 0xFF);
EPD_2IN13B_V4_SendData((Xend>>3) & 0xFF);
EPD_2IN13B_V4_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION
EPD_2IN13B_V4_SendData(Ystart & 0xFF);
EPD_2IN13B_V4_SendData((Ystart >> 8) & 0xFF);
EPD_2IN13B_V4_SendData(Yend & 0xFF);
EPD_2IN13B_V4_SendData((Yend >> 8) & 0xFF);
}
/******************************************************************************
function : Set Cursor
parameter:
******************************************************************************/
static void EPD_2IN13B_V4_SetCursor(UWORD Xstart, UWORD Ystart)
{
EPD_2IN13B_V4_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
EPD_2IN13B_V4_SendData(Xstart & 0xFF);
EPD_2IN13B_V4_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
EPD_2IN13B_V4_SendData(Ystart & 0xFF);
EPD_2IN13B_V4_SendData((Ystart >> 8) & 0xFF);
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2IN13B_V4_Init(void)
{
EPD_2IN13B_V4_Reset();
EPD_2IN13B_V4_ReadBusy();
EPD_2IN13B_V4_SendCommand(0x12); //SWRESET
EPD_2IN13B_V4_ReadBusy();
EPD_2IN13B_V4_SendCommand(0x01); //Driver output control
EPD_2IN13B_V4_SendData(0xf9);
EPD_2IN13B_V4_SendData(0x00);
EPD_2IN13B_V4_SendData(0x00);
EPD_2IN13B_V4_SendCommand(0x11); //data entry mode
EPD_2IN13B_V4_SendData(0x03);
EPD_2IN13B_V4_SetWindows(0, 0, EPD_2IN13B_V4_WIDTH-1, EPD_2IN13B_V4_HEIGHT-1);
EPD_2IN13B_V4_SetCursor(0, 0);
EPD_2IN13B_V4_SendCommand(0x3C); //BorderWaveform
EPD_2IN13B_V4_SendData(0x05);
EPD_2IN13B_V4_SendCommand(0x18); //Read built-in temperature sensor
EPD_2IN13B_V4_SendData(0x80);
EPD_2IN13B_V4_SendCommand(0x21); // Display update control
EPD_2IN13B_V4_SendData(0x80);
EPD_2IN13B_V4_SendData(0x80);
EPD_2IN13B_V4_ReadBusy();
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2IN13B_V4_Clear(void)
{
UWORD Width, Height;
Width = (EPD_2IN13B_V4_WIDTH % 8 == 0)? (EPD_2IN13B_V4_WIDTH / 8 ): (EPD_2IN13B_V4_WIDTH / 8 + 1);
Height = EPD_2IN13B_V4_HEIGHT;
EPD_2IN13B_V4_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13B_V4_SendData(0XFF);
}
}
EPD_2IN13B_V4_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13B_V4_SendData(0XFF);
}
}
EPD_2IN13B_V4_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN13B_V4_Display(const UBYTE *blackImage, const UBYTE *redImage)
{
UWORD Width, Height;
Width = (EPD_2IN13B_V4_WIDTH % 8 == 0)? (EPD_2IN13B_V4_WIDTH / 8 ): (EPD_2IN13B_V4_WIDTH / 8 + 1);
Height = EPD_2IN13B_V4_HEIGHT;
EPD_2IN13B_V4_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13B_V4_SendData(blackImage[i + j * Width]);
}
}
EPD_2IN13B_V4_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13B_V4_SendData(redImage[i + j * Width]);
}
}
EPD_2IN13B_V4_TurnOnDisplay();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_2IN13B_V4_Sleep(void)
{
EPD_2IN13B_V4_SendCommand(0x10); //enter deep sleep
EPD_2IN13B_V4_SendData(0x01);
DEV_Delay_ms(100);
}

View File

@@ -0,0 +1,45 @@
/*****************************************************************************
* | File : EPD_2in13b_V4.h
* | Author : Waveshare team
* | Function : 2.13inch e-paper B V4
* | Info :
*----------------
* | This version: V1.0
* | Date : 2022-04-25
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#ifndef __EPD_2IN13B_V4_H_
#define __EPD_2IN13B_V4_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2IN13B_V4_WIDTH 122
#define EPD_2IN13B_V4_HEIGHT 250
void EPD_2IN13B_V4_Init(void);
void EPD_2IN13B_V4_Clear(void);
void EPD_2IN13B_V4_Display(const UBYTE *blackImage, const UBYTE *redImage);
void EPD_2IN13B_V4_Sleep(void);
#endif

View File

@@ -0,0 +1,247 @@
/*****************************************************************************
* | File : EPD_2in13bc.c
* | Author : Waveshare team
* | Function : 2.13inch e-paper b&c
* | Info :
*----------------
* | This version: V3.0
* | Date : 2019-06-13
* | Info :
* -----------------------------------------------------------------------------
* V3.0(2019-06-13):
* 1.Change:
* EPD_Reset() => EPD_2IN13BC_Reset()
* EPD_SendCommand() => EPD_2IN13BC_SendCommand()
* EPD_SendData() => EPD_2IN13BC_SendData()
* EPD_WaitUntilIdle() => EPD_2IN13BC_ReadBusy()
* EPD_Init() => EPD_2IN13BC_Init()
* EPD_Clear() => EPD_2IN13BC_Clear()
* EPD_Display() => EPD_2IN13BC_Display()
* EPD_Sleep() => EPD_2IN13BC_Sleep()
* 2.remove commands define:
* #define PANEL_SETTING 0x00
* #define POWER_SETTING 0x01
* #define POWER_OFF 0x02
* #define POWER_OFF_SEQUENCE_SETTING 0x03
* #define POWER_ON 0x04
* #define POWER_ON_MEASURE 0x05
* #define BOOSTER_SOFT_START 0x06
* #define DEEP_SLEEP 0x07
* #define DATA_START_TRANSMISSION_1 0x10
* #define DATA_STOP 0x11
* #define DISPLAY_REFRESH 0x12
* #define DATA_START_TRANSMISSION_2 0x13
* #define VCOM_LUT 0x20
* #define W2W_LUT 0x21
* #define B2W_LUT 0x22
* #define W2B_LUT 0x23
* #define B2B_LUT 0x24
* #define PLL_CONTROL 0x30
* #define TEMPERATURE_SENSOR_CALIBRATION 0x40
* #define TEMPERATURE_SENSOR_SELECTION 0x41
* #define TEMPERATURE_SENSOR_WRITE 0x42
* #define TEMPERATURE_SENSOR_READ 0x43
* #define VCOM_AND_DATA_INTERVAL_SETTING 0x50
* #define LOW_POWER_DETECTION 0x51
* #define TCON_SETTING 0x60
* #define RESOLUTION_SETTING 0x61
* #define GET_STATUS 0x71
* #define AUTO_MEASURE_VCOM 0x80
* #define READ_VCOM_VALUE 0x81
* #define VCM_DC_SETTING 0x82
* #define PARTIAL_WINDOW 0x90
* #define PARTIAL_IN 0x91
* #define PARTIAL_OUT 0x92
* #define PROGRAM_MODE 0xA0
* #define ACTIVE_PROGRAM 0xA1
* #define READ_OTP_DATA 0xA2
* #define POWER_SAVING 0xE3
* V2.0(2018-11-13):
* 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8]
* 2.Change:EPD_Display(UBYTE *Image)
* Need to pass parameters: pointer to cached data
#
# 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.
#
******************************************************************************/
#include "EPD_2in13bc.h"
#include "Debug.h"
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2IN13BC_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2IN13BC_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2IN13BC_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_2IN13BC_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
while(DEV_Digital_Read(EPD_BUSY_PIN) == 0) {
DEV_Delay_ms(100);
}
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_2IN13BC_TurnOnDisplay(void)
{
EPD_2IN13BC_SendCommand(0x12); //DISPLAY REFRESH
DEV_Delay_ms(10);
EPD_2IN13BC_ReadBusy();
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2IN13BC_Init(void)
{
EPD_2IN13BC_Reset();
EPD_2IN13BC_SendCommand(0x06); // BOOSTER_SOFT_START
EPD_2IN13BC_SendData(0x17);
EPD_2IN13BC_SendData(0x17);
EPD_2IN13BC_SendData(0x17);
EPD_2IN13BC_SendCommand(0x04); // POWER_ON
EPD_2IN13BC_ReadBusy();
EPD_2IN13BC_SendCommand(0x00); // PANEL_SETTING
EPD_2IN13BC_SendData(0x8F);
EPD_2IN13BC_SendCommand(0x50); // VCOM_AND_DATA_INTERVAL_SETTING
EPD_2IN13BC_SendData(0xF0);
EPD_2IN13BC_SendCommand(0x61); // RESOLUTION_SETTING
EPD_2IN13BC_SendData(EPD_2IN13BC_WIDTH); // width: 104
EPD_2IN13BC_SendData(EPD_2IN13BC_HEIGHT >> 8); // height: 212
EPD_2IN13BC_SendData(EPD_2IN13BC_HEIGHT & 0xFF);
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2IN13BC_Clear(void)
{
UWORD Width = (EPD_2IN13BC_WIDTH % 8 == 0)? (EPD_2IN13BC_WIDTH / 8 ): (EPD_2IN13BC_WIDTH / 8 + 1);
UWORD Height = EPD_2IN13BC_HEIGHT;
//send black data
EPD_2IN13BC_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13BC_SendData(0xFF);
}
}
EPD_2IN13BC_SendCommand(0x92);
//send red data
EPD_2IN13BC_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13BC_SendData(0xFF);
}
}
EPD_2IN13BC_SendCommand(0x92);
EPD_2IN13BC_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN13BC_Display(const UBYTE *blackimage, const UBYTE *ryimage)
{
UWORD Width, Height;
Width = (EPD_2IN13BC_WIDTH % 8 == 0)? (EPD_2IN13BC_WIDTH / 8 ): (EPD_2IN13BC_WIDTH / 8 + 1);
Height = EPD_2IN13BC_HEIGHT;
EPD_2IN13BC_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13BC_SendData(blackimage[i + j * Width]);
}
}
EPD_2IN13BC_SendCommand(0x92);
EPD_2IN13BC_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13BC_SendData(ryimage[i + j * Width]);
}
}
EPD_2IN13BC_SendCommand(0x92);
EPD_2IN13BC_TurnOnDisplay();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_2IN13BC_Sleep(void)
{
EPD_2IN13BC_SendCommand(0x02); // POWER_OFF
EPD_2IN13BC_ReadBusy();
EPD_2IN13BC_SendCommand(0x07); // DEEP_SLEEP
EPD_2IN13BC_SendData(0xA5); // check code
}

View File

@@ -0,0 +1,97 @@
/*****************************************************************************
* | File : EPD_2in13bc.h
* | Author : Waveshare team
* | Function : 2.13inch e-paper b&c
* | Info :
*----------------
* | This version: V3.0
* | Date : 2019-06-13
* | Info :
* -----------------------------------------------------------------------------
* V3.0(2019-06-13):
* 1.Change:
* EPD_Reset() => EPD_2IN13BC_Reset()
* EPD_SendCommand() => EPD_2IN13BC_SendCommand()
* EPD_SendData() => EPD_2IN13BC_SendData()
* EPD_WaitUntilIdle() => EPD_2IN13BC_ReadBusy()
* EPD_Init() => EPD_2IN13BC_Init()
* EPD_Clear() => EPD_2IN13BC_Clear()
* EPD_Display() => EPD_2IN13BC_Display()
* EPD_Sleep() => EPD_2IN13BC_Sleep()
* 2.remove commands define:
* #define PANEL_SETTING 0x00
* #define POWER_SETTING 0x01
* #define POWER_OFF 0x02
* #define POWER_OFF_SEQUENCE_SETTING 0x03
* #define POWER_ON 0x04
* #define POWER_ON_MEASURE 0x05
* #define BOOSTER_SOFT_START 0x06
* #define DEEP_SLEEP 0x07
* #define DATA_START_TRANSMISSION_1 0x10
* #define DATA_STOP 0x11
* #define DISPLAY_REFRESH 0x12
* #define DATA_START_TRANSMISSION_2 0x13
* #define VCOM_LUT 0x20
* #define W2W_LUT 0x21
* #define B2W_LUT 0x22
* #define W2B_LUT 0x23
* #define B2B_LUT 0x24
* #define PLL_CONTROL 0x30
* #define TEMPERATURE_SENSOR_CALIBRATION 0x40
* #define TEMPERATURE_SENSOR_SELECTION 0x41
* #define TEMPERATURE_SENSOR_WRITE 0x42
* #define TEMPERATURE_SENSOR_READ 0x43
* #define VCOM_AND_DATA_INTERVAL_SETTING 0x50
* #define LOW_POWER_DETECTION 0x51
* #define TCON_SETTING 0x60
* #define RESOLUTION_SETTING 0x61
* #define GET_STATUS 0x71
* #define AUTO_MEASURE_VCOM 0x80
* #define READ_VCOM_VALUE 0x81
* #define VCM_DC_SETTING 0x82
* #define PARTIAL_WINDOW 0x90
* #define PARTIAL_IN 0x91
* #define PARTIAL_OUT 0x92
* #define PROGRAM_MODE 0xA0
* #define ACTIVE_PROGRAM 0xA1
* #define READ_OTP_DATA 0xA2
* #define POWER_SAVING 0xE3
* V2.0(2018-11-13):
* 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8]
* 2.Change:EPD_Display(UBYTE *Image)
* Need to pass parameters: pointer to cached data
#
# 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.
#
******************************************************************************/
#ifndef __EPD_2IN13BC_H_
#define __EPD_2IN13BC_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2IN13BC_WIDTH 104
#define EPD_2IN13BC_HEIGHT 212
void EPD_2IN13BC_Init(void);
void EPD_2IN13BC_Clear(void);
void EPD_2IN13BC_Display(const UBYTE *blackimage, const UBYTE *ryimage);
void EPD_2IN13BC_Sleep(void);
#endif

View File

@@ -0,0 +1,461 @@
/*****************************************************************************
* | File : EPD_2in13d.c
* | Author : Waveshare team
* | Function : 2.13inch e-paper d
* | Info :
*----------------
* | This version: V3.0
* | Date : 2019-06-12
* | Info :
* -----------------------------------------------------------------------------
* V3.0(2019-06-12):
* 1.Change:
* lut_vcomDC[] => EPD_2IN13D_lut_vcomDC[]
* lut_ww[] => EPD_2IN13D_lut_ww[]
* lut_bw[] => EPD_2IN13D_lut_bw[]
* lut_wb[] => EPD_2IN13D_lut_wb[]
* lut_bb[] => EPD_2IN13D_lut_bb[]
* lut_vcom1[] => EPD_2IN13D_lut_vcom1[]
* lut_ww1[] => EPD_2IN13D_lut_ww1[]
* lut_bw1[] => EPD_2IN13D_lut_bw1[]
* lut_wb1[] => EPD_2IN13D_lut_wb1[]
* lut_bb1[] => EPD_2IN13D_lut_bb1[]
* EPD_Reset() => EPD_2IN13D_Reset()
* EPD_SendCommand() => EPD_2IN13D_SendCommand()
* EPD_SendData() => EPD_2IN13D_SendData()
* EPD_WaitUntilIdle() => EPD_2IN13D_ReadBusy()
* EPD_SetFullReg() => EPD_2IN13D_SetFullReg()
* EPD_SetPartReg() => EPD_2IN13D_SetPartReg()
* EPD_TurnOnDisplay() => EPD_2IN13D_TurnOnDisplay()
* EPD_Init() => EPD_2IN13D_Init()
* EPD_Clear() => EPD_2IN13D_Clear()
* EPD_Display() => EPD_2IN13D_Display()
* EPD_Sleep() => EPD_2IN13D_Sleep()
* V2.0(2018-11-13):
* 1.Remove:ImageBuff[EPD_2IN13D_HEIGHT * EPD_2IN13D_WIDTH / 8]
* 2.Change:EPD_Display(UBYTE *Image)
* Need to pass parameters: pointer to cached data
* 3.Change:
* EPD_RST -> EPD_RST_PIN
* EPD_DC -> EPD_DC_PIN
* EPD_CS -> EPD_CS_PIN
* EPD_BUSY -> EPD_BUSY_PIN
#
# 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.
#
******************************************************************************/
#include "EPD_2in13d.h"
#include "Debug.h"
/**
* full screen update LUT
**/
static const unsigned char EPD_2IN13D_lut_vcomDC[] = {
0x00, 0x08, 0x00, 0x00, 0x00, 0x02,
0x60, 0x28, 0x28, 0x00, 0x00, 0x01,
0x00, 0x14, 0x00, 0x00, 0x00, 0x01,
0x00, 0x12, 0x12, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
};
static const unsigned char EPD_2IN13D_lut_ww[] = {
0x40, 0x08, 0x00, 0x00, 0x00, 0x02,
0x90, 0x28, 0x28, 0x00, 0x00, 0x01,
0x40, 0x14, 0x00, 0x00, 0x00, 0x01,
0xA0, 0x12, 0x12, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
static const unsigned char EPD_2IN13D_lut_bw[] = {
0x40, 0x17, 0x00, 0x00, 0x00, 0x02,
0x90, 0x0F, 0x0F, 0x00, 0x00, 0x03,
0x40, 0x0A, 0x01, 0x00, 0x00, 0x01,
0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
static const unsigned char EPD_2IN13D_lut_wb[] = {
0x80, 0x08, 0x00, 0x00, 0x00, 0x02,
0x90, 0x28, 0x28, 0x00, 0x00, 0x01,
0x80, 0x14, 0x00, 0x00, 0x00, 0x01,
0x50, 0x12, 0x12, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
static const unsigned char EPD_2IN13D_lut_bb[] = {
0x80, 0x08, 0x00, 0x00, 0x00, 0x02,
0x90, 0x28, 0x28, 0x00, 0x00, 0x01,
0x80, 0x14, 0x00, 0x00, 0x00, 0x01,
0x50, 0x12, 0x12, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/**
* partial screen update LUT
**/
static const unsigned char EPD_2IN13D_lut_vcom1[] = {
0x00, 0x19, 0x01, 0x00, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
,0x00, 0x00,
};
static const unsigned char EPD_2IN13D_lut_ww1[] = {
0x00, 0x19, 0x01, 0x00, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
static const unsigned char EPD_2IN13D_lut_bw1[] = {
0x80, 0x19, 0x01, 0x00, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
static const unsigned char EPD_2IN13D_lut_wb1[] = {
0x40, 0x19, 0x01, 0x00, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
static const unsigned char EPD_2IN13D_lut_bb1[] = {
0x00, 0x19, 0x01, 0x00, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2IN13D_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2IN13D_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2IN13D_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
static void EPD_2IN13D_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
UBYTE busy;
do {
EPD_2IN13D_SendCommand(0x71);
busy = DEV_Digital_Read(EPD_BUSY_PIN);
busy =!(busy & 0x01);
} while(busy);
DEV_Delay_ms(200);
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : LUT download
parameter:
******************************************************************************/
static void EPD_2IN13D_SetFullReg(void)
{
EPD_2IN13D_SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_2IN13D_SendData(0xb7); //WBmode:VBDF 17|D7 VBDW 97 VBDB 57 WBRmode:VBDF F7 VBDW 77 VBDB 37 VBDR B7
unsigned int count;
EPD_2IN13D_SendCommand(0x20);
for(count=0; count<44; count++) {
EPD_2IN13D_SendData(EPD_2IN13D_lut_vcomDC[count]);
}
EPD_2IN13D_SendCommand(0x21);
for(count=0; count<42; count++) {
EPD_2IN13D_SendData(EPD_2IN13D_lut_ww[count]);
}
EPD_2IN13D_SendCommand(0x22);
for(count=0; count<42; count++) {
EPD_2IN13D_SendData(EPD_2IN13D_lut_bw[count]);
}
EPD_2IN13D_SendCommand(0x23);
for(count=0; count<42; count++) {
EPD_2IN13D_SendData(EPD_2IN13D_lut_wb[count]);
}
EPD_2IN13D_SendCommand(0x24);
for(count=0; count<42; count++) {
EPD_2IN13D_SendData(EPD_2IN13D_lut_bb[count]);
}
}
/******************************************************************************
function : LUT download
parameter:
******************************************************************************/
static void EPD_2IN13D_SetPartReg(void)
{
EPD_2IN13D_SendCommand(0x82); //vcom_DC setting
EPD_2IN13D_SendData(0x00);
EPD_2IN13D_SendCommand(0X50);
EPD_2IN13D_SendData(0xb7);
unsigned int count;
EPD_2IN13D_SendCommand(0x20);
for(count=0; count<44; count++) {
EPD_2IN13D_SendData(EPD_2IN13D_lut_vcom1[count]);
}
EPD_2IN13D_SendCommand(0x21);
for(count=0; count<42; count++) {
EPD_2IN13D_SendData(EPD_2IN13D_lut_ww1[count]);
}
EPD_2IN13D_SendCommand(0x22);
for(count=0; count<42; count++) {
EPD_2IN13D_SendData(EPD_2IN13D_lut_bw1[count]);
}
EPD_2IN13D_SendCommand(0x23);
for(count=0; count<42; count++) {
EPD_2IN13D_SendData(EPD_2IN13D_lut_wb1[count]);
}
EPD_2IN13D_SendCommand(0x24);
for(count=0; count<42; count++) {
EPD_2IN13D_SendData(EPD_2IN13D_lut_bb1[count]);
}
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_2IN13D_TurnOnDisplay(void)
{
EPD_2IN13D_SendCommand(0x12); //DISPLAY REFRESH
DEV_Delay_ms(100); //!!!The delay here is necessary, 200uS at least!!!
EPD_2IN13D_ReadBusy();
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2IN13D_Init()
{
EPD_2IN13D_Reset();
EPD_2IN13D_SendCommand(0x01); //POWER SETTING
EPD_2IN13D_SendData(0x03);
EPD_2IN13D_SendData(0x00);
EPD_2IN13D_SendData(0x2b);
EPD_2IN13D_SendData(0x2b);
EPD_2IN13D_SendData(0x03);
EPD_2IN13D_SendCommand(0x06); //boost soft start
EPD_2IN13D_SendData(0x17); //A
EPD_2IN13D_SendData(0x17); //B
EPD_2IN13D_SendData(0x17); //C
EPD_2IN13D_SendCommand(0x04);
EPD_2IN13D_ReadBusy();
EPD_2IN13D_SendCommand(0x00); //panel setting
EPD_2IN13D_SendData(0xbf); //LUT from OTP<54><50>?128x296
EPD_2IN13D_SendData(0x0e); //VCOM to 0V fast
EPD_2IN13D_SendCommand(0x30); //PLL setting
EPD_2IN13D_SendData(0x3a); // 3a 100HZ 29 150Hz 39 200HZ 31 171HZ
EPD_2IN13D_SendCommand(0x61); //resolution setting
EPD_2IN13D_SendData(EPD_2IN13D_WIDTH);
EPD_2IN13D_SendData((EPD_2IN13D_HEIGHT >> 8) & 0xff);
EPD_2IN13D_SendData(EPD_2IN13D_HEIGHT& 0xff);
EPD_2IN13D_SendCommand(0x82); //vcom_DC setting
EPD_2IN13D_SendData(0x28);
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2IN13D_Clear(void)
{
UWORD Width, Height;
Width = (EPD_2IN13D_WIDTH % 8 == 0)? (EPD_2IN13D_WIDTH / 8 ): (EPD_2IN13D_WIDTH / 8 + 1);
Height = EPD_2IN13D_HEIGHT;
EPD_2IN13D_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13D_SendData(0x00);
}
}
EPD_2IN13D_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13D_SendData(0xff);
}
}
EPD_2IN13D_SetFullReg();
EPD_2IN13D_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN13D_Display(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_2IN13D_WIDTH % 8 == 0)? (EPD_2IN13D_WIDTH / 8 ): (EPD_2IN13D_WIDTH / 8 + 1);
Height = EPD_2IN13D_HEIGHT;
EPD_2IN13D_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13D_SendData(0x00);
}
}
// Dev_Delay_ms(10);
EPD_2IN13D_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13D_SendData(Image[i + j * Width]);
}
}
// Dev_Delay_ms(10);
EPD_2IN13D_SetFullReg();
EPD_2IN13D_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN13D_DisplayPart(UBYTE *Image)
{
/* Set partial Windows */
EPD_2IN13D_SendCommand(0x91); //This command makes the display enter partial mode
EPD_2IN13D_SendCommand(0x90); //resolution setting
EPD_2IN13D_SendData(0); //x-start
EPD_2IN13D_SendData(EPD_2IN13D_WIDTH - 1); //x-end
EPD_2IN13D_SendData(0);
EPD_2IN13D_SendData(0); //y-start
EPD_2IN13D_SendData(EPD_2IN13D_HEIGHT / 256);
EPD_2IN13D_SendData(EPD_2IN13D_HEIGHT % 256 - 1); //y-end
EPD_2IN13D_SendData(0x28);
UWORD Width;
Width = (EPD_2IN13D_WIDTH % 8 == 0)? (EPD_2IN13D_WIDTH / 8 ): (EPD_2IN13D_WIDTH / 8 + 1);
/* send data */
EPD_2IN13D_SendCommand(0x10);
for (UWORD j = 0; j < EPD_2IN13D_HEIGHT; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13D_SendData(~Image[i + j * Width]);
}
}
EPD_2IN13D_SendCommand(0x13);
for (UWORD j = 0; j < EPD_2IN13D_HEIGHT; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN13D_SendData(Image[i + j * Width]);
}
}
EPD_2IN13D_SetPartReg();
/* Set partial refresh */
EPD_2IN13D_TurnOnDisplay();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_2IN13D_Sleep(void)
{
EPD_2IN13D_SendCommand(0X50);
EPD_2IN13D_SendData(0xf7);
EPD_2IN13D_SendCommand(0X02); //power off
EPD_2IN13D_SendCommand(0X07); //deep sleep
EPD_2IN13D_SendData(0xA5);
}

View File

@@ -0,0 +1,78 @@
/*****************************************************************************
* | File : EPD_2in13d.h
* | Author : Waveshare team
* | Function : 2.13inch e-paper d
* | Info :
*----------------
* | This version: V3.0
* | Date : 2019-06-12
* | Info :
* -----------------------------------------------------------------------------
* V3.0(2019-06-12):
* 1.Change:
* lut_vcomDC[] => EPD_2IN13D_lut_vcomDC[]
* lut_ww[] => EPD_2IN13D_lut_ww[]
* lut_bw[] => EPD_2IN13D_lut_bw[]
* lut_wb[] => EPD_2IN13D_lut_wb[]
* lut_bb[] => EPD_2IN13D_lut_bb[]
* lut_vcom1[] => EPD_2IN13D_lut_vcom1[]
* lut_ww1[] => EPD_2IN13D_lut_ww1[]
* lut_bw1[] => EPD_2IN13D_lut_bw1[]
* lut_wb1[] => EPD_2IN13D_lut_wb1[]
* lut_bb1[] => EPD_2IN13D_lut_bb1[]
* EPD_Reset() => EPD_2IN13D_Reset()
* EPD_SendCommand() => EPD_2IN13D_SendCommand()
* EPD_SendData() => EPD_2IN13D_SendData()
* EPD_WaitUntilIdle() => EPD_2IN13D_ReadBusy()
* EPD_SetFullReg() => EPD_2IN13D_SetFullReg()
* EPD_SetPartReg() => EPD_2IN13D_SetPartReg()
* EPD_TurnOnDisplay() => EPD_2IN13D_TurnOnDisplay()
* EPD_Init() => EPD_2IN13D_Init()
* EPD_Clear() => EPD_2IN13D_Clear()
* EPD_Display() => EPD_2IN13D_Display()
* EPD_Sleep() => EPD_2IN13D_Sleep()
* V2.0(2018-11-13):
* 1.Remove:ImageBuff[EPD_2IN13D_HEIGHT * EPD_2IN13D_WIDTH / 8]
* 2.Change:EPD_Display(UBYTE *Image)
* Need to pass parameters: pointer to cached data
* 3.Change:
* EPD_RST -> EPD_RST_PIN
* EPD_DC -> EPD_DC_PIN
* EPD_CS -> EPD_CS_PIN
* EPD_BUSY -> EPD_BUSY_PIN
#
# 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.
#
******************************************************************************/
#ifndef __EPD_2IN13D_H_
#define __EPD_2IN13D_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2IN13D_WIDTH 104
#define EPD_2IN13D_HEIGHT 212
void EPD_2IN13D_Init(void);
void EPD_2IN13D_Clear(void);
void EPD_2IN13D_Display(UBYTE *Image);
void EPD_2IN13D_DisplayPart(UBYTE *Image);
void EPD_2IN13D_Sleep(void);
#endif

View File

@@ -0,0 +1,259 @@
/*****************************************************************************
* | File : EPD_2in66.c
* | Author : Waveshare team
* | Function : 2.66inch e-paper
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-07-29
* | Info :
* -----------------------------------------------------------------------------
# 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.
#
******************************************************************************/
#include "EPD_2in66.h"
#include "Debug.h"
const unsigned char WF_PARTIAL[159] ={
0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0A,0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,
0x00,0x00,0x00,0x00,0x01,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,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,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,
0x00,0x00,0x00,0x22,0x17,0x41,0xB0,0x32,0x36,
};
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2IN66_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2IN66_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2IN66_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_2IN66_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
DEV_Delay_ms(100);
while(DEV_Digital_Read(EPD_BUSY_PIN) == 1) { //LOW: idle, HIGH: busy
DEV_Delay_ms(100);
}
DEV_Delay_ms(100);
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_2IN66_TurnOnDisplay(void)
{
EPD_2IN66_SendCommand(0x20);
EPD_2IN66_ReadBusy();
}
/******************************************************************************
function : Send LUT
parameter:
******************************************************************************/
static void EPD_2IN66_SetLUA(void)
{
UWORD count;
EPD_2IN66_SendCommand(0x32);
for(count=0;count<153;count++){
EPD_2IN66_SendData(WF_PARTIAL[count]);
}
EPD_2IN66_ReadBusy();
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2IN66_Init(void)
{
EPD_2IN66_Reset();
EPD_2IN66_ReadBusy();
EPD_2IN66_SendCommand(0x12);//soft reset
EPD_2IN66_ReadBusy();
/* Y increment, X increment */
EPD_2IN66_SendCommand(0x11);
EPD_2IN66_SendData(0x03);
/* Set RamX-address Start/End position */
EPD_2IN66_SendCommand(0x44);
EPD_2IN66_SendData(0x01);
EPD_2IN66_SendData((EPD_2IN66_WIDTH % 8 == 0)? (EPD_2IN66_WIDTH / 8 ): (EPD_2IN66_WIDTH / 8 + 1) );
/* Set RamY-address Start/End position */
EPD_2IN66_SendCommand(0x45);
EPD_2IN66_SendData(0);
EPD_2IN66_SendData(0);
EPD_2IN66_SendData((EPD_2IN66_HEIGHT&0xff));
EPD_2IN66_SendData((EPD_2IN66_HEIGHT&0x100)>>8);
EPD_2IN66_ReadBusy();
}
/******************************************************************************
function : Initialize the e-Paper register(Partial display)
parameter:
******************************************************************************/
void EPD_2IN66_Init_Partial(void)
{
EPD_2IN66_Reset();
EPD_2IN66_ReadBusy();
EPD_2IN66_SendCommand(0x12);//soft reset
EPD_2IN66_ReadBusy();
EPD_2IN66_SetLUA();
EPD_2IN66_SendCommand(0x37);
EPD_2IN66_SendData(0x00);
EPD_2IN66_SendData(0x00);
EPD_2IN66_SendData(0x00);
EPD_2IN66_SendData(0x00);
EPD_2IN66_SendData(0x00);
EPD_2IN66_SendData(0x40);
EPD_2IN66_SendData(0x00);
EPD_2IN66_SendData(0x00);
EPD_2IN66_SendData(0x00);
EPD_2IN66_SendData(0x00);
/* Y increment, X increment */
EPD_2IN66_SendCommand(0x11);
EPD_2IN66_SendData(0x03);
/* Set RamX-address Start/End position */
EPD_2IN66_SendCommand(0x44);
EPD_2IN66_SendData(0x01);
EPD_2IN66_SendData((EPD_2IN66_WIDTH % 8 == 0)? (EPD_2IN66_WIDTH / 8 ): (EPD_2IN66_WIDTH / 8 + 1) );
/* Set RamY-address Start/End position */
EPD_2IN66_SendCommand(0x45);
EPD_2IN66_SendData(0);
EPD_2IN66_SendData(0);
EPD_2IN66_SendData((EPD_2IN66_HEIGHT&0xff));
EPD_2IN66_SendData((EPD_2IN66_HEIGHT&0x100)>>8);
EPD_2IN66_SendCommand(0x3C);
EPD_2IN66_SendData(0x80);
EPD_2IN66_SendCommand(0x22);
EPD_2IN66_SendData(0xcf);
EPD_2IN66_SendCommand(0x20);
EPD_2IN66_ReadBusy();
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2IN66_Clear(void)
{
UWORD Width, Height;
Width = (EPD_2IN66_WIDTH % 8 == 0)? (EPD_2IN66_WIDTH / 8 ): (EPD_2IN66_WIDTH / 8 + 1);
Height = EPD_2IN66_HEIGHT;
EPD_2IN66_SendCommand(0x24);
for (UWORD j = 0; j <=Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN66_SendData(0xff);
}
}
EPD_2IN66_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN66_Display(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_2IN66_WIDTH % 8 == 0)? (EPD_2IN66_WIDTH / 8 ): (EPD_2IN66_WIDTH / 8 + 1);
Height = EPD_2IN66_HEIGHT;
UDOUBLE Addr = 0;
// UDOUBLE Offset = ImageName;
EPD_2IN66_SendCommand(0x24);
for (UWORD j = 0; j <Height; j++) {
for (UWORD i = 0; i <Width; i++) {
Addr = i + j * Width;
EPD_2IN66_SendData(Image[Addr]);
}
}
EPD_2IN66_TurnOnDisplay();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_2IN66_Sleep(void)
{
EPD_2IN66_SendCommand(0x10);
EPD_2IN66_SendData(0x01);
//EPD_2IN66_ReadBusy();
}

View File

@@ -0,0 +1,46 @@
/*****************************************************************************
* | File : EPD_2in66.h
* | Author : Waveshare team
* | Function : 2.66inch e-paper
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-07-29
* | Info :
* -----------------------------------------------------------------------------
# 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.
#
******************************************************************************/
#ifndef __EPD_2IN66_H_
#define __EPD_2IN66_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2IN66_WIDTH 152
#define EPD_2IN66_HEIGHT 296
void EPD_2IN66_Init(void);
void EPD_2IN66_Init_Partial(void);
void EPD_2IN66_Clear(void);
void EPD_2IN66_Display(UBYTE *Image);
void EPD_2IN66_Sleep(void);
#endif

View File

@@ -0,0 +1,214 @@
/*****************************************************************************
* | File : EPD_2in66b.c
* | Author : Waveshare team
* | Function : 2.66inch e-paper b
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-12-02
* | Info :
* -----------------------------------------------------------------------------
# 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.
#
******************************************************************************/
#include "EPD_2in66b.h"
#include "Debug.h"
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2IN66B_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2IN66B_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2IN66B_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
static void EPD_2IN66B_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
DEV_Delay_ms(50);
while(DEV_Digital_Read(EPD_BUSY_PIN) == 1) { //LOW: idle, HIGH: busy
DEV_Delay_ms(10);
}
DEV_Delay_ms(50);
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_2IN66B_TurnOnDisplay(void)
{
EPD_2IN66B_SendCommand(0x20);
EPD_2IN66B_ReadBusy();
}
/******************************************************************************
function : Setting the display window
parameter:
******************************************************************************/
static void EPD_2IN66B_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
{
EPD_2IN66B_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION
EPD_2IN66B_SendData((Xstart>>3) & 0x1F);
EPD_2IN66B_SendData((Xend>>3) & 0x1F);
EPD_2IN66B_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION
EPD_2IN66B_SendData(Ystart & 0xFF);
EPD_2IN66B_SendData((Ystart >> 8) & 0x01);
EPD_2IN66B_SendData(Yend & 0xFF);
EPD_2IN66B_SendData((Yend >> 8) & 0x01);
}
/******************************************************************************
function : Set Cursor
parameter:
******************************************************************************/
static void EPD_2IN66B_SetCursor(UWORD Xstart, UWORD Ystart)
{
EPD_2IN66B_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
EPD_2IN66B_SendData(Xstart & 0x1F);
EPD_2IN66B_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
EPD_2IN66B_SendData(Ystart & 0xFF);
EPD_2IN66B_SendData((Ystart >> 8) & 0x01);
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2IN66B_Init(void)
{
EPD_2IN66B_Reset();
EPD_2IN66B_ReadBusy();
EPD_2IN66B_SendCommand(0x12);//soft reset
EPD_2IN66B_ReadBusy();
EPD_2IN66B_SendCommand(0x11); //data entry mode
EPD_2IN66B_SendData(0x03);
EPD_2IN66B_SetWindows(0, 0, EPD_2IN66B_WIDTH-1, EPD_2IN66B_HEIGHT-1);
EPD_2IN66B_SendCommand(0x21); // Display update control
EPD_2IN66B_SendData(0x00);
EPD_2IN66B_SendData(0x80);
EPD_2IN66B_SetCursor(0, 0);
EPD_2IN66B_ReadBusy();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN66B_Display(UBYTE *ImageBlack, UBYTE*ImageRed)
{
UWORD Width, Height;
Width = (EPD_2IN66B_WIDTH % 8 == 0)? (EPD_2IN66B_WIDTH / 8 ): (EPD_2IN66B_WIDTH / 8 + 1);
Height = EPD_2IN66B_HEIGHT;
EPD_2IN66B_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN66B_SendData(ImageBlack[i + j * Width]);
}
}
EPD_2IN66B_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN66B_SendData(~ImageRed[i + j * Width]);
}
}
EPD_2IN66B_TurnOnDisplay();
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2IN66B_Clear(void)
{
UWORD Width, Height;
Width = (EPD_2IN66B_WIDTH % 8 == 0)? (EPD_2IN66B_WIDTH / 8 ): (EPD_2IN66B_WIDTH / 8 + 1);
Height = EPD_2IN66B_HEIGHT;
EPD_2IN66B_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN66B_SendData(0xff);
}
}
EPD_2IN66B_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN66B_SendData(0x00);
}
}
EPD_2IN66B_TurnOnDisplay();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_2IN66B_Sleep(void)
{
EPD_2IN66B_SendCommand(0x10);
EPD_2IN66B_SendData(0x01);
}

View File

@@ -0,0 +1,45 @@
/*****************************************************************************
* | File : EPD_2in66b.h
* | Author : Waveshare team
* | Function : 2.66inch e-paper b
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-12-02
* | Info :
* -----------------------------------------------------------------------------
# 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.
#
******************************************************************************/
#ifndef __EPD_2IN66B_H_
#define __EPD_2IN66B_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2IN66B_WIDTH 152
#define EPD_2IN66B_HEIGHT 296
void EPD_2IN66B_Init(void);
void EPD_2IN66B_Display(UBYTE *ImageBlack, UBYTE*ImageRed);
void EPD_2IN66B_Clear(void);
void EPD_2IN66B_Sleep(void);
#endif

View File

@@ -0,0 +1,553 @@
/*****************************************************************************
* | File : EPD_2in7.c
* | Author : Waveshare team
* | Function : 2.9inch e-paper V2
* | Info :
*----------------
* | This version: V1.0
* | Date : 2021-06-03
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#include "EPD_2in7.h"
#include "Debug.h"
static const unsigned char EPD_2in7_lut_vcom_dc[] = {
0x00 ,0x00,
0x00 ,0x08 ,0x00 ,0x00 ,0x00 ,0x02,
0x60 ,0x28 ,0x28 ,0x00 ,0x00 ,0x01,
0x00 ,0x14 ,0x00 ,0x00 ,0x00 ,0x01,
0x00 ,0x12 ,0x12 ,0x00 ,0x00 ,0x01,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00
};
static const unsigned char EPD_2in7_lut_ww[] = {
0x40 ,0x08 ,0x00 ,0x00 ,0x00 ,0x02,
0x90 ,0x28 ,0x28 ,0x00 ,0x00 ,0x01,
0x40 ,0x14 ,0x00 ,0x00 ,0x00 ,0x01,
0xA0 ,0x12 ,0x12 ,0x00 ,0x00 ,0x01,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
};
static const unsigned char EPD_2in7_lut_bw[] = {
0x40 ,0x08 ,0x00 ,0x00 ,0x00 ,0x02,
0x90 ,0x28 ,0x28 ,0x00 ,0x00 ,0x01,
0x40 ,0x14 ,0x00 ,0x00 ,0x00 ,0x01,
0xA0 ,0x12 ,0x12 ,0x00 ,0x00 ,0x01,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
};
static const unsigned char EPD_2in7_lut_bb[] = {
0x80 ,0x08 ,0x00 ,0x00 ,0x00 ,0x02,
0x90 ,0x28 ,0x28 ,0x00 ,0x00 ,0x01,
0x80 ,0x14 ,0x00 ,0x00 ,0x00 ,0x01,
0x50 ,0x12 ,0x12 ,0x00 ,0x00 ,0x01,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
};
static const unsigned char EPD_2in7_lut_wb[] = {
0x80 ,0x08 ,0x00 ,0x00 ,0x00 ,0x02,
0x90 ,0x28 ,0x28 ,0x00 ,0x00 ,0x01,
0x80 ,0x14 ,0x00 ,0x00 ,0x00 ,0x01,
0x50 ,0x12 ,0x12 ,0x00 ,0x00 ,0x01,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
};
//////////////////////////////////////full screen update LUT////////////////////////////////////////////
//0~3 gray
static const unsigned char EPD_2in7_gray_lut_vcom[] =
{
0x00 ,0x00,
0x00 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
0x60 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
0x00 ,0x14 ,0x00 ,0x00 ,0x00 ,0x01,
0x00 ,0x13 ,0x0A ,0x01 ,0x00 ,0x01,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
};
//R21
static const unsigned char EPD_2in7_gray_lut_ww[] ={
0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
0x10 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
0xA0 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
};
//R22H r
static const unsigned char EPD_2in7_gray_lut_bw[] ={
0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
0x99 ,0x0C ,0x01 ,0x03 ,0x04 ,0x01,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
};
//R23H w
static const unsigned char EPD_2in7_gray_lut_wb[] ={
0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
0x99 ,0x0B ,0x04 ,0x04 ,0x01 ,0x01,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
};
//R24H b
static const unsigned char EPD_2in7_gray_lut_bb[] ={
0x80 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
0x20 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
0x50 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
};
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2in7_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2in7_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2in7_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
static void EPD_2in7_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
UBYTE busy;
do {
EPD_2in7_SendCommand(0x71);
busy = DEV_Digital_Read(EPD_BUSY_PIN);
busy =!(busy & 0x01);
} while(busy);
DEV_Delay_ms(200);
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : set the look-up tables
parameter:
******************************************************************************/
static void EPD_2in7_SetLut(void)
{
unsigned int count;
EPD_2in7_SendCommand(0x20); //vcom
for(count = 0; count < 44; count++) {
EPD_2in7_SendData(EPD_2in7_lut_vcom_dc[count]);
}
EPD_2in7_SendCommand(0x21); //ww --
for(count = 0; count < 42; count++) {
EPD_2in7_SendData(EPD_2in7_lut_ww[count]);
}
EPD_2in7_SendCommand(0x22); //bw r
for(count = 0; count < 42; count++) {
EPD_2in7_SendData(EPD_2in7_lut_bw[count]);
}
EPD_2in7_SendCommand(0x23); //wb w
for(count = 0; count < 42; count++) {
EPD_2in7_SendData(EPD_2in7_lut_bb[count]);
}
EPD_2in7_SendCommand(0x24); //bb b
for(count = 0; count < 42; count++) {
EPD_2in7_SendData(EPD_2in7_lut_wb[count]);
}
}
void EPD_2in7_gray_SetLut(void)
{
unsigned int count;
EPD_2in7_SendCommand(0x20); //vcom
for(count=0;count<44;count++)
{EPD_2in7_SendData(EPD_2in7_gray_lut_vcom[count]);}
EPD_2in7_SendCommand(0x21); //red not use
for(count=0;count<42;count++)
{EPD_2in7_SendData(EPD_2in7_gray_lut_ww[count]);}
EPD_2in7_SendCommand(0x22); //bw r
for(count=0;count<42;count++)
{EPD_2in7_SendData(EPD_2in7_gray_lut_bw[count]);}
EPD_2in7_SendCommand(0x23); //wb w
for(count=0;count<42;count++)
{EPD_2in7_SendData(EPD_2in7_gray_lut_wb[count]);}
EPD_2in7_SendCommand(0x24); //bb b
for(count=0;count<42;count++)
{EPD_2in7_SendData(EPD_2in7_gray_lut_bb[count]);}
EPD_2in7_SendCommand(0x25); //vcom
for(count=0;count<42;count++)
{EPD_2in7_SendData(EPD_2in7_gray_lut_ww[count]);}
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2IN7_Init(void)
{
EPD_2in7_Reset();
EPD_2in7_SendCommand(0x01); // POWER_SETTING
EPD_2in7_SendData(0x03); // VDS_EN, VDG_EN
EPD_2in7_SendData(0x00); // VCOM_HV, VGHL_LV[1], VGHL_LV[0]
EPD_2in7_SendData(0x2b); // VDH
EPD_2in7_SendData(0x2b); // VDL
EPD_2in7_SendData(0x09); // VDHR
EPD_2in7_SendCommand(0x06); // BOOSTER_SOFT_START
EPD_2in7_SendData(0x07);
EPD_2in7_SendData(0x07);
EPD_2in7_SendData(0x17);
// Power optimization
EPD_2in7_SendCommand(0xF8);
EPD_2in7_SendData(0x60);
EPD_2in7_SendData(0xA5);
// Power optimization
EPD_2in7_SendCommand(0xF8);
EPD_2in7_SendData(0x89);
EPD_2in7_SendData(0xA5);
// Power optimization
EPD_2in7_SendCommand(0xF8);
EPD_2in7_SendData(0x90);
EPD_2in7_SendData(0x00);
// Power optimization
EPD_2in7_SendCommand(0xF8);
EPD_2in7_SendData(0x93);
EPD_2in7_SendData(0x2A);
// Power optimization
EPD_2in7_SendCommand(0xF8);
EPD_2in7_SendData(0xA0);
EPD_2in7_SendData(0xA5);
// Power optimization
EPD_2in7_SendCommand(0xF8);
EPD_2in7_SendData(0xA1);
EPD_2in7_SendData(0x00);
// Power optimization
EPD_2in7_SendCommand(0xF8);
EPD_2in7_SendData(0x73);
EPD_2in7_SendData(0x41);
EPD_2in7_SendCommand(0x16); // PARTIAL_DISPLAY_REFRESH
EPD_2in7_SendData(0x00);
EPD_2in7_SendCommand(0x04); // POWER_ON
EPD_2in7_ReadBusy();
EPD_2in7_SendCommand(0x00); // PANEL_SETTING
EPD_2in7_SendData(0xAF); // KW-BF KWR-AF BWROTP 0f
EPD_2in7_SendCommand(0x30); // PLL_CONTROL
EPD_2in7_SendData(0x3A); // 3A 100HZ 29 150Hz 39 200HZ 31 171HZ
EPD_2in7_SendCommand(0x82); // VCM_DC_SETTING_REGISTER
EPD_2in7_SendData(0x12);
EPD_2in7_SetLut();
}
void EPD_2IN7_Init_4Gray(void)
{
EPD_2in7_Reset();
EPD_2in7_SendCommand(0x01); //POWER SETTING
EPD_2in7_SendData (0x03);
EPD_2in7_SendData (0x00);
EPD_2in7_SendData (0x2b);
EPD_2in7_SendData (0x2b);
EPD_2in7_SendCommand(0x06); //booster soft start
EPD_2in7_SendData (0x07); //A
EPD_2in7_SendData (0x07); //B
EPD_2in7_SendData (0x17); //C
EPD_2in7_SendCommand(0xF8); //boost??
EPD_2in7_SendData (0x60);
EPD_2in7_SendData (0xA5);
EPD_2in7_SendCommand(0xF8); //boost??
EPD_2in7_SendData (0x89);
EPD_2in7_SendData (0xA5);
EPD_2in7_SendCommand(0xF8); //boost??
EPD_2in7_SendData (0x90);
EPD_2in7_SendData (0x00);
EPD_2in7_SendCommand(0xF8); //boost??
EPD_2in7_SendData (0x93);
EPD_2in7_SendData (0x2A);
EPD_2in7_SendCommand(0xF8); //boost??
EPD_2in7_SendData (0xa0);
EPD_2in7_SendData (0xa5);
EPD_2in7_SendCommand(0xF8); //boost??
EPD_2in7_SendData (0xa1);
EPD_2in7_SendData (0x00);
EPD_2in7_SendCommand(0xF8); //boost??
EPD_2in7_SendData (0x73);
EPD_2in7_SendData (0x41);
EPD_2in7_SendCommand(0x16);
EPD_2in7_SendData(0x00);
EPD_2in7_SendCommand(0x04);
EPD_2in7_ReadBusy();
EPD_2in7_SendCommand(0x00); //panel setting
EPD_2in7_SendData(0xbf); //KW-BF KWR-AF BWROTP 0f
EPD_2in7_SendCommand(0x30); //PLL setting
EPD_2in7_SendData (0x90); //100hz
EPD_2in7_SendCommand(0x61); //resolution setting
EPD_2in7_SendData (0x00); //176
EPD_2in7_SendData (0xb0);
EPD_2in7_SendData (0x01); //264
EPD_2in7_SendData (0x08);
EPD_2in7_SendCommand(0x82); //vcom_DC setting
EPD_2in7_SendData (0x12);
EPD_2in7_SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_2in7_SendData(0x97);
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2IN7_Clear(void)
{
UWORD Width, Height;
Width = (EPD_2IN7_WIDTH % 8 == 0)? (EPD_2IN7_WIDTH / 8 ): (EPD_2IN7_WIDTH / 8 + 1);
Height = EPD_2IN7_HEIGHT;
EPD_2in7_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2in7_SendData(0XFF);
}
}
EPD_2in7_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2in7_SendData(0XFF);
}
}
EPD_2in7_SendCommand(0x12);
EPD_2in7_ReadBusy();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN7_Display(const UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_2IN7_WIDTH % 8 == 0)? (EPD_2IN7_WIDTH / 8 ): (EPD_2IN7_WIDTH / 8 + 1);
Height = EPD_2IN7_HEIGHT;
EPD_2in7_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2in7_SendData(0XFF);
}
}
EPD_2in7_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2in7_SendData(Image[i + j * Width]);
}
}
EPD_2in7_SendCommand(0x12);
EPD_2in7_ReadBusy();
}
void EPD_2IN7_4GrayDisplay(const UBYTE *Image)
{
UDOUBLE i,j,k;
UBYTE temp1,temp2,temp3;
EPD_2in7_SendCommand(0x10);
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 |= 0x01;//white
else if(temp2 == 0x00)
temp3 |= 0x00; //black
else if(temp2 == 0x80)
temp3 |= 0x01; //gray1
else //0x40
temp3 |= 0x00; //gray2
temp3 <<= 1;
temp1 <<= 2;
temp2 = temp1&0xC0 ;
if(temp2 == 0xC0) //white
temp3 |= 0x01;
else if(temp2 == 0x00) //black
temp3 |= 0x00;
else if(temp2 == 0x80)
temp3 |= 0x01; //gray1
else //0x40
temp3 |= 0x00; //gray2
if(j!=1 || k!=1)
temp3 <<= 1;
temp1 <<= 2;
}
}
EPD_2in7_SendData(temp3);
}
// new data
EPD_2in7_SendCommand(0x13);
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 |= 0x01;//white
else if(temp2 == 0x00)
temp3 |= 0x00; //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 |= 0x01;
else if(temp2 == 0x00) //black
temp3 |= 0x00;
else if(temp2 == 0x80)
temp3 |= 0x00; //gray1
else //0x40
temp3 |= 0x01; //gray2
if(j!=1 || k!=1)
temp3 <<= 1;
temp1 <<= 2;
}
}
EPD_2in7_SendData(temp3);
}
EPD_2in7_gray_SetLut();
EPD_2in7_SendCommand(0x12);
DEV_Delay_ms(200);
EPD_2in7_ReadBusy();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_2IN7_Sleep(void)
{
EPD_2in7_SendCommand(0X50);
EPD_2in7_SendData(0xf7);
EPD_2in7_SendCommand(0X02); //power off
EPD_2in7_SendCommand(0X07); //deep sleep
EPD_2in7_SendData(0xA5);
}

View File

@@ -0,0 +1,51 @@
/*****************************************************************************
* | File : EPD_2in7.h
* | Author : Waveshare team
* | Function : 2.9inch e-paper V2
* | Info :
*----------------
* | This version: V1.0
* | Date : 2021-06-03
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#ifndef __EPD_2IN7_H_
#define __EPD_2IN7_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2IN7_WIDTH 176
#define EPD_2IN7_HEIGHT 264 //46464
#define KEY0 15
#define KEY1 17
#define KEY2 2
void EPD_2IN7_Init(void);
void EPD_2IN7_Clear(void);
void EPD_2IN7_Display(const UBYTE *Image);
void EPD_2IN7_Sleep(void);
void EPD_2IN7_Init_4Gray(void);
void EPD_2IN7_4GrayDisplay(const UBYTE *Image);
#endif

View File

@@ -0,0 +1,526 @@
/*****************************************************************************
* | File : EPD_2in7_V2.c
* | Author : Waveshare team
* | Function : 2.7inch V2 e-paper
* | Info :
*----------------
* | This version: V1.0
* | Date : 2022-08-18
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#include "EPD_2in7_V2.h"
#include "Debug.h"
UBYTE LUT_DATA_4Gray[159] =
{
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
};
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2IN7_V2_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(20);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(20);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2IN7_V2_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2IN7_V2_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
static void EPD_2IN7_V2_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
do {
if(DEV_Digital_Read(EPD_BUSY_PIN) == 0)
break;
} while(1);
DEV_Delay_ms(20);
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Turn on display
parameter:
******************************************************************************/
static void EPD_2IN7_V2_TurnOnDisplay(void)
{
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(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_Lut(void)
{
unsigned int count;
EPD_2IN7_V2_SendCommand(0x32); //vcom
for(count = 0; count < 153; count++) {
EPD_2IN7_V2_SendData(LUT_DATA_4Gray[count]);
}
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2IN7_V2_Init(void)
{
EPD_2IN7_V2_Reset();
EPD_2IN7_V2_ReadBusy();
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(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_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();
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2IN7_V2_Clear(void)
{
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(0XFF);
}
}
EPD_2IN7_V2_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN7_V2_Display(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();
}
void EPD_2IN7_V2_Display_Fast(const 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;
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); //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_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(Image[i + j * Width]);
}
}
EPD_2IN7_V2_TurnOnDisplay();
}
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;
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(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(const 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:
******************************************************************************/
void EPD_2IN7_V2_Sleep(void)
{
EPD_2IN7_V2_SendCommand(0X10);
EPD_2IN7_V2_SendData(0x01);
}

View File

@@ -0,0 +1,56 @@
/*****************************************************************************
* | File : EPD_2in7_V2.h
* | Author : Waveshare team
* | Function : 2.7inch V2 e-paper
* | Info :
*----------------
* | This version: V1.0
* | Date : 2022-08-18
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#ifndef __EPD_2IN7_V2_H_
#define __EPD_2IN7_V2_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2IN7_V2_WIDTH 176
#define EPD_2IN7_V2_HEIGHT 264
#define KEY0 15
#define KEY1 17
#define KEY2 2
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(const 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(const UBYTE *Image);
void EPD_2IN7_V2_Sleep(void);
#endif

View File

@@ -0,0 +1,485 @@
/*****************************************************************************
* | File : EPD_2in9_V2.c
* | Author : Waveshare team
* | Function : 2.9inch e-paper V2
* | Info :
*----------------
* | This version: V1.1
* | Date : 2023-08-30
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#include "EPD_2in9_V2.h"
#include "Debug.h"
UBYTE _WF_PARTIAL_2IN9[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,
0x0A,0x0,0x0,0x0,0x0,0x0,0x2,
0x1,0x0,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,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,0x36,
};
UBYTE WS_20_30[159] =
{
0x80, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0,
0x10, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0,
0x80, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0,
0x10, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x14, 0x8, 0x0, 0x0, 0x0, 0x0, 0x1,
0xA, 0xA, 0x0, 0xA, 0xA, 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,
0x14, 0x8, 0x0, 0x1, 0x0, 0x0, 0x1,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0,
0x22, 0x17, 0x41, 0x0, 0x32, 0x36
};
unsigned char Gray4[159] =
{
0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L0 //2.28s
0x20, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L1
0x28, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L2
0x2A, 0x60, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L3
0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //VS L4
0x00, 0x02, 0x00, 0x05, 0x14, 0x00, 0x00, //TP, SR, RP of Group0
0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x01, //TP, SR, RP of Group1
0x00, 0x02, 0x00, 0x05, 0x14, 0x00, 0x00, //TP, SR, RP of Group2
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group3
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group4
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group5
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group6
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group7
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group8
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group9
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group10
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //TP, SR, RP of Group11
0x24, 0x22, 0x22, 0x22, 0x23, 0x32, 0x00, 0x00, 0x00, //FR, XON
0x22, 0x17, 0x41, 0xAE, 0x32, 0x28, //EOPT VGH VSH1 VSH2 VSL VCOM
};
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2IN9_V2_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(10);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(10);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2IN9_V2_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2IN9_V2_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_2IN9_V2_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
while(1)
{ //=1 BUSY
if(DEV_Digital_Read(EPD_BUSY_PIN)==0)
break;
DEV_Delay_ms(50);
}
DEV_Delay_ms(50);
Debug("e-Paper busy release\r\n");
}
static void EPD_2IN9_V2_LUT(UBYTE *lut)
{
UBYTE count;
EPD_2IN9_V2_SendCommand(0x32);
for(count=0; count<153; count++)
EPD_2IN9_V2_SendData(lut[count]);
EPD_2IN9_V2_ReadBusy();
}
static void EPD_2IN9_V2_LUT_by_host(UBYTE *lut)
{
EPD_2IN9_V2_LUT((UBYTE *)lut); //lut
EPD_2IN9_V2_SendCommand(0x3f);
EPD_2IN9_V2_SendData(*(lut+153));
EPD_2IN9_V2_SendCommand(0x03); // gate voltage
EPD_2IN9_V2_SendData(*(lut+154));
EPD_2IN9_V2_SendCommand(0x04); // source voltage
EPD_2IN9_V2_SendData(*(lut+155)); // VSH
EPD_2IN9_V2_SendData(*(lut+156)); // VSH2
EPD_2IN9_V2_SendData(*(lut+157)); // VSL
EPD_2IN9_V2_SendCommand(0x2c); // VCOM
EPD_2IN9_V2_SendData(*(lut+158));
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_2IN9_V2_TurnOnDisplay(void)
{
EPD_2IN9_V2_SendCommand(0x22); //Display Update Control
EPD_2IN9_V2_SendData(0xc7);
EPD_2IN9_V2_SendCommand(0x20); //Activate Display Update Sequence
EPD_2IN9_V2_ReadBusy();
}
static void EPD_2IN9_V2_TurnOnDisplay_Partial(void)
{
EPD_2IN9_V2_SendCommand(0x22); //Display Update Control
EPD_2IN9_V2_SendData(0x0F);
EPD_2IN9_V2_SendCommand(0x20); //Activate Display Update Sequence
EPD_2IN9_V2_ReadBusy();
}
/******************************************************************************
function : Setting the display window
parameter:
******************************************************************************/
static void EPD_2IN9_V2_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
{
EPD_2IN9_V2_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION
EPD_2IN9_V2_SendData((Xstart>>3) & 0xFF);
EPD_2IN9_V2_SendData((Xend>>3) & 0xFF);
EPD_2IN9_V2_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION
EPD_2IN9_V2_SendData(Ystart & 0xFF);
EPD_2IN9_V2_SendData((Ystart >> 8) & 0xFF);
EPD_2IN9_V2_SendData(Yend & 0xFF);
EPD_2IN9_V2_SendData((Yend >> 8) & 0xFF);
}
/******************************************************************************
function : Set Cursor
parameter:
******************************************************************************/
static void EPD_2IN9_V2_SetCursor(UWORD Xstart, UWORD Ystart)
{
EPD_2IN9_V2_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
EPD_2IN9_V2_SendData(Xstart & 0xFF);
EPD_2IN9_V2_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
EPD_2IN9_V2_SendData(Ystart & 0xFF);
EPD_2IN9_V2_SendData((Ystart >> 8) & 0xFF);
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2IN9_V2_Init(void)
{
EPD_2IN9_V2_Reset();
DEV_Delay_ms(100);
EPD_2IN9_V2_ReadBusy();
EPD_2IN9_V2_SendCommand(0x12); // soft reset
EPD_2IN9_V2_ReadBusy();
EPD_2IN9_V2_SendCommand(0x01); //Driver output control
EPD_2IN9_V2_SendData(0x27);
EPD_2IN9_V2_SendData(0x01);
EPD_2IN9_V2_SendData(0x00);
EPD_2IN9_V2_SendCommand(0x11); //data entry mode
EPD_2IN9_V2_SendData(0x03);
EPD_2IN9_V2_SetWindows(0, 0, EPD_2IN9_V2_WIDTH-1, EPD_2IN9_V2_HEIGHT-1);
EPD_2IN9_V2_SendCommand(0x21); // Display update control
EPD_2IN9_V2_SendData(0x00);
EPD_2IN9_V2_SendData(0x80);
EPD_2IN9_V2_SetCursor(0, 0);
EPD_2IN9_V2_ReadBusy();
EPD_2IN9_V2_LUT_by_host(WS_20_30);
}
void EPD_2IN9_V2_Gray4_Init(void)
{
EPD_2IN9_V2_Reset();
DEV_Delay_ms(100);
EPD_2IN9_V2_ReadBusy();
EPD_2IN9_V2_SendCommand(0x12); // soft reset
EPD_2IN9_V2_ReadBusy();
EPD_2IN9_V2_SendCommand(0x01); //Driver output control
EPD_2IN9_V2_SendData(0x27);
EPD_2IN9_V2_SendData(0x01);
EPD_2IN9_V2_SendData(0x00);
EPD_2IN9_V2_SendCommand(0x11); //data entry mode
EPD_2IN9_V2_SendData(0x03);
EPD_2IN9_V2_SetWindows(8, 0, EPD_2IN9_V2_WIDTH, EPD_2IN9_V2_HEIGHT-1);
EPD_2IN9_V2_SendCommand(0x3C);
EPD_2IN9_V2_SendData(0x04);
EPD_2IN9_V2_SetCursor(1, 0);
EPD_2IN9_V2_ReadBusy();
EPD_2IN9_V2_LUT_by_host(Gray4);
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2IN9_V2_Clear(void)
{
UWORD i;
EPD_2IN9_V2_SendCommand(0x24); //write RAM for black(0)/white (1)
for(i=0;i<4736;i++)
{
EPD_2IN9_V2_SendData(0xff);
}
EPD_2IN9_V2_SendCommand(0x26); //write RAM for black(0)/white (1)
for(i=0;i<4736;i++)
{
EPD_2IN9_V2_SendData(0xff);
}
EPD_2IN9_V2_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN9_V2_Display(UBYTE *Image)
{
UWORD i;
EPD_2IN9_V2_SendCommand(0x24); //write RAM for black(0)/white (1)
for(i=0;i<4736;i++)
{
EPD_2IN9_V2_SendData(Image[i]);
}
EPD_2IN9_V2_TurnOnDisplay();
}
void EPD_2IN9_V2_Display_Base(UBYTE *Image)
{
UWORD i;
EPD_2IN9_V2_SendCommand(0x24); //Write Black and White image to RAM
for(i=0;i<4736;i++)
{
EPD_2IN9_V2_SendData(Image[i]);
}
EPD_2IN9_V2_SendCommand(0x26); //Write Black and White image to RAM
for(i=0;i<4736;i++)
{
EPD_2IN9_V2_SendData(Image[i]);
}
EPD_2IN9_V2_TurnOnDisplay();
}
void EPD_2IN9_V2_4GrayDisplay(UBYTE *Image)
{
UDOUBLE i,j,k;
UBYTE temp1,temp2,temp3;
// old data
EPD_2IN9_V2_SendCommand(0x24);
for(i=0; i<4736; i++) {
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_2IN9_V2_SendData(temp3);
// printf("%x ",temp3);
}
EPD_2IN9_V2_SendCommand(0x26); //write RAM for black(0)/white (1)
for(i=0; i<4736; i++) {
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_2IN9_V2_SendData(temp3);
// printf("%x ",temp3);
}
EPD_2IN9_V2_TurnOnDisplay();
}
void EPD_2IN9_V2_Display_Partial(UBYTE *Image)
{
UWORD i;
//Reset
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(2);
EPD_2IN9_V2_LUT(_WF_PARTIAL_2IN9);
EPD_2IN9_V2_SendCommand(0x37);
EPD_2IN9_V2_SendData(0x00);
EPD_2IN9_V2_SendData(0x00);
EPD_2IN9_V2_SendData(0x00);
EPD_2IN9_V2_SendData(0x00);
EPD_2IN9_V2_SendData(0x00);
EPD_2IN9_V2_SendData(0x40);
EPD_2IN9_V2_SendData(0x00);
EPD_2IN9_V2_SendData(0x00);
EPD_2IN9_V2_SendData(0x00);
EPD_2IN9_V2_SendData(0x00);
EPD_2IN9_V2_SendCommand(0x3C); //BorderWavefrom
EPD_2IN9_V2_SendData(0x80);
EPD_2IN9_V2_SendCommand(0x22);
EPD_2IN9_V2_SendData(0xC0);
EPD_2IN9_V2_SendCommand(0x20);
EPD_2IN9_V2_ReadBusy();
EPD_2IN9_V2_SetWindows(0, 0, EPD_2IN9_V2_WIDTH-1, EPD_2IN9_V2_HEIGHT-1);
EPD_2IN9_V2_SetCursor(0, 0);
EPD_2IN9_V2_SendCommand(0x24); //Write Black and White image to RAM
for(i=0;i<4736;i++)
{
EPD_2IN9_V2_SendData(Image[i]);
}
EPD_2IN9_V2_TurnOnDisplay_Partial();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_2IN9_V2_Sleep(void)
{
EPD_2IN9_V2_SendCommand(0x10); //enter deep sleep
EPD_2IN9_V2_SendData(0x01);
DEV_Delay_ms(100);
}

View File

@@ -0,0 +1,48 @@
/*****************************************************************************
* | File : EPD_2in9_V2.h
* | Author : Waveshare team
* | Function : 2.9inch e-paper V2
* | Info :
*----------------
* | This version: V1.1
* | Date : 2023-08-30
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#ifndef __EPD_2IN9_V2_H_
#define __EPD_2IN9_V2_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2IN9_V2_WIDTH 128
#define EPD_2IN9_V2_HEIGHT 296
void EPD_2IN9_V2_Init(void);
void EPD_2IN9_V2_Gray4_Init(void);
void EPD_2IN9_V2_Clear(void);
void EPD_2IN9_V2_Display(UBYTE *Image);
void EPD_2IN9_V2_Display_Base(UBYTE *Image);
void EPD_2IN9_V2_4GrayDisplay(UBYTE *Image);
void EPD_2IN9_V2_Display_Partial(UBYTE *Image);
void EPD_2IN9_V2_Sleep(void);
#endif

View File

@@ -0,0 +1,187 @@
/*****************************************************************************
* | File : EPD_2in9b_V3.c
* | Author : Waveshare team
* | Function : 2.9inch e-paper b V3
* | Info :
*----------------
* | This version: V1.1
* | Date : 2020-12-03
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#include "EPD_2in9b_V3.h"
#include "Debug.h"
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2IN9B_V3_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2IN9B_V3_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2IN9B_V3_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_2IN9B_V3_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
UBYTE busy;
do
{
EPD_2IN9B_V3_SendCommand(0x71);
busy = DEV_Digital_Read(EPD_BUSY_PIN);
busy =!(busy & 0x01);
}
while(busy);
Debug("e-Paper busy release\r\n");
DEV_Delay_ms(200);
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2IN9B_V3_Init(void)
{
EPD_2IN9B_V3_Reset();
EPD_2IN9B_V3_SendCommand(0x04);
EPD_2IN9B_V3_ReadBusy();//waiting for the electronic paper IC to release the idle signal
EPD_2IN9B_V3_SendCommand(0x00);//panel setting
EPD_2IN9B_V3_SendData(0x0f);//LUT from OTP<54><50>?128x296
EPD_2IN9B_V3_SendData(0x89);//Temperature sensor, boost and other related timing settings
EPD_2IN9B_V3_SendCommand(0x61);//resolution setting
EPD_2IN9B_V3_SendData (0x80);
EPD_2IN9B_V3_SendData (0x01);
EPD_2IN9B_V3_SendData (0x28);
EPD_2IN9B_V3_SendCommand(0X50);//VCOM AND DATA INTERVAL SETTING
EPD_2IN9B_V3_SendData(0x77);//WBmode:VBDF 17|D7 VBDW 97 VBDB 57
//WBRmode:VBDF F7 VBDW 77 VBDB 37 VBDR B7
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2IN9B_V3_Clear(void)
{
UWORD Width = (EPD_2IN9B_V3_WIDTH % 8 == 0)? (EPD_2IN9B_V3_WIDTH / 8 ): (EPD_2IN9B_V3_WIDTH / 8 + 1);
UWORD Height = EPD_2IN9B_V3_HEIGHT;
//send black data
EPD_2IN9B_V3_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V3_SendData(0xFF);
}
}
//send red data
EPD_2IN9B_V3_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V3_SendData(0xFF);
}
}
EPD_2IN9B_V3_SendCommand(0x12);
EPD_2IN9B_V3_ReadBusy();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN9B_V3_Display(const UBYTE *blackimage, const UBYTE *ryimage)
{
UWORD Width, Height;
Width = (EPD_2IN9B_V3_WIDTH % 8 == 0)? (EPD_2IN9B_V3_WIDTH / 8 ): (EPD_2IN9B_V3_WIDTH / 8 + 1);
Height = EPD_2IN9B_V3_HEIGHT;
EPD_2IN9B_V3_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V3_SendData(blackimage[i + j * Width]);
}
}
EPD_2IN9B_V3_SendCommand(0x92);
EPD_2IN9B_V3_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V3_SendData(ryimage[i + j * Width]);
}
}
EPD_2IN9B_V3_SendCommand(0x92);
EPD_2IN9B_V3_SendCommand(0x12);
EPD_2IN9B_V3_ReadBusy();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_2IN9B_V3_Sleep(void)
{
EPD_2IN9B_V3_SendCommand(0x02); // POWER_OFF
EPD_2IN9B_V3_ReadBusy();
EPD_2IN9B_V3_SendCommand(0x07); // DEEP_SLEEP
EPD_2IN9B_V3_SendData(0xA5); // check code
}

View File

@@ -0,0 +1,45 @@
/*****************************************************************************
* | File : EPD_2in9b V3.h
* | Author : Waveshare team
* | Function : 2.9inch e-paper b V3
* | Info :
*----------------
* | This version: V1.1
* | Date : 2020-12-03
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#ifndef __EPD_2IN9B_V3_H_
#define __EPD_2IN9B_V3_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2IN9B_V3_WIDTH 128
#define EPD_2IN9B_V3_HEIGHT 296
void EPD_2IN9B_V3_Init(void);
void EPD_2IN9B_V3_Clear(void);
void EPD_2IN9B_V3_Display(const UBYTE *blackimage, const UBYTE *ryimage);
void EPD_2IN9B_V3_Sleep(void);
#endif

View File

@@ -0,0 +1,465 @@
/*****************************************************************************
* | File : EPD_2in9b_V4.c
* | Author : Waveshare team
* | Function : 2.9inch e-paper b V4
* | Info :
*----------------
* | This version: V1.0
* | Date : 2023-12-18
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#include "EPD_2in9b_V4.h"
#include "Debug.h"
#include <time.h>
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2IN9B_V4_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2IN9B_V4_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2IN9B_V4_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_2IN9B_V4_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
while(1)
{ //=1 BUSY
if(DEV_Digital_Read(EPD_BUSY_PIN)==0)
break;
DEV_Delay_ms(50);
}
Debug("e-Paper busy release\r\n");
DEV_Delay_ms(200);
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_2IN9B_V4_TurnOnDisplay(void)
{
EPD_2IN9B_V4_SendCommand(0x22); //Display Update Control
EPD_2IN9B_V4_SendData(0xF7);
EPD_2IN9B_V4_SendCommand(0x20); //Activate Display Update Sequence
EPD_2IN9B_V4_ReadBusy();
}
static void EPD_2IN9B_V4_TurnOnDisplay_Base(void)
{
EPD_2IN9B_V4_SendCommand(0x22); //Display Update Control
EPD_2IN9B_V4_SendData(0xF4);
EPD_2IN9B_V4_SendCommand(0x20); //Activate Display Update Sequence
EPD_2IN9B_V4_ReadBusy();
}
static void EPD_2IN9B_V4_TurnOnDisplay_Partial(void)
{
EPD_2IN9B_V4_SendCommand(0x22); //Display Update Control
EPD_2IN9B_V4_SendData(0x1C);
EPD_2IN9B_V4_SendCommand(0x20); //Activate Display Update Sequence
EPD_2IN9B_V4_ReadBusy();
}
static void EPD_2IN9B_V4_TurnOnDisplay_Fast(void)
{
EPD_2IN9B_V4_SendCommand(0x22); //Display Update Control
EPD_2IN9B_V4_SendData(0xC7);
EPD_2IN9B_V4_SendCommand(0x20); //Activate Display Update Sequence
EPD_2IN9B_V4_ReadBusy();
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2IN9B_V4_Init(void)
{
EPD_2IN9B_V4_Reset();
EPD_2IN9B_V4_ReadBusy();
EPD_2IN9B_V4_SendCommand(0x12); //SWRESET
EPD_2IN9B_V4_ReadBusy();
EPD_2IN9B_V4_SendCommand(0x01); //Driver output control
EPD_2IN9B_V4_SendData((EPD_2IN9B_V4_HEIGHT-1)%256);
EPD_2IN9B_V4_SendData((EPD_2IN9B_V4_HEIGHT-1)/256);
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_SendCommand(0x11); //data entry mode
EPD_2IN9B_V4_SendData(0x03);
EPD_2IN9B_V4_SendCommand(0x44); //set Ram-X address start/end position
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_SendData(EPD_2IN9B_V4_WIDTH/8-1);
EPD_2IN9B_V4_SendCommand(0x45); //set Ram-Y address start/end position
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_SendData((EPD_2IN9B_V4_HEIGHT-1)%256);
EPD_2IN9B_V4_SendData((EPD_2IN9B_V4_HEIGHT-1)/256);
EPD_2IN9B_V4_SendCommand(0x3C); //BorderWavefrom
EPD_2IN9B_V4_SendData(0x05);
EPD_2IN9B_V4_SendCommand(0x21); // Display update control
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_SendData(0x80);
EPD_2IN9B_V4_SendCommand(0x18); //Read built-in temperature sensor
EPD_2IN9B_V4_SendData(0x80);
EPD_2IN9B_V4_SendCommand(0x4E); // set RAM x address count to 0;
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_SendCommand(0x4F); // set RAM y address count to 0X199;
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_ReadBusy();
}
void EPD_2IN9B_V4_Init_Fast(void)
{
EPD_2IN9B_V4_Reset();
EPD_2IN9B_V4_ReadBusy();
EPD_2IN9B_V4_SendCommand(0x12); //SWRESET
EPD_2IN9B_V4_ReadBusy();
EPD_2IN9B_V4_SendCommand(0x18); //Read built-in temperature sensor
EPD_2IN9B_V4_SendData(0x80);
EPD_2IN9B_V4_SendCommand(0x22); // Load temperature value
EPD_2IN9B_V4_SendData(0xB1);
EPD_2IN9B_V4_SendCommand(0x20);
EPD_2IN9B_V4_ReadBusy();
EPD_2IN9B_V4_SendCommand(0x1A); // Write to temperature register
EPD_2IN9B_V4_SendData(0x5a); // 90
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_SendCommand(0x22); // Load temperature value
EPD_2IN9B_V4_SendData(0x91);
EPD_2IN9B_V4_SendCommand(0x20);
EPD_2IN9B_V4_ReadBusy();
EPD_2IN9B_V4_SendCommand(0x01); //Driver output control
EPD_2IN9B_V4_SendData((EPD_2IN9B_V4_HEIGHT-1)%256);
EPD_2IN9B_V4_SendData((EPD_2IN9B_V4_HEIGHT-1)/256);
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_SendCommand(0x11); //data entry mode
EPD_2IN9B_V4_SendData(0x03);
EPD_2IN9B_V4_SendCommand(0x44); //set Ram-X address start/end position
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_SendData(EPD_2IN9B_V4_WIDTH/8-1);
EPD_2IN9B_V4_SendCommand(0x45); //set Ram-Y address start/end position
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_SendData((EPD_2IN9B_V4_HEIGHT-1)%256);
EPD_2IN9B_V4_SendData((EPD_2IN9B_V4_HEIGHT-1)/256);
EPD_2IN9B_V4_SendCommand(0x4E); // set RAM x address count to 0;
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_SendCommand(0x4F); // set RAM y address count to 0X199;
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_SendData(0x00);
EPD_2IN9B_V4_ReadBusy();
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2IN9B_V4_Clear(void)
{
UWORD Width = (EPD_2IN9B_V4_WIDTH % 8 == 0)? (EPD_2IN9B_V4_WIDTH / 8 ): (EPD_2IN9B_V4_WIDTH / 8 + 1);
UWORD Height = EPD_2IN9B_V4_HEIGHT;
//send black data
EPD_2IN9B_V4_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V4_SendData(0xFF);
}
}
//send red data
EPD_2IN9B_V4_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V4_SendData(0x00);
}
}
EPD_2IN9B_V4_TurnOnDisplay();
}
void EPD_2IN9B_V4_Clear_Fast(void)
{
UWORD Width = (EPD_2IN9B_V4_WIDTH % 8 == 0)? (EPD_2IN9B_V4_WIDTH / 8 ): (EPD_2IN9B_V4_WIDTH / 8 + 1);
UWORD Height = EPD_2IN9B_V4_HEIGHT;
//send black data
EPD_2IN9B_V4_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V4_SendData(0xFF);
}
}
//send red data
EPD_2IN9B_V4_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V4_SendData(0x00);
}
}
EPD_2IN9B_V4_TurnOnDisplay_Fast();
}
void EPD_2IN9B_V4_Clear_Black_Fast(void)
{
UWORD Width = (EPD_2IN9B_V4_WIDTH % 8 == 0)? (EPD_2IN9B_V4_WIDTH / 8 ): (EPD_2IN9B_V4_WIDTH / 8 + 1);
UWORD Height = EPD_2IN9B_V4_HEIGHT;
//send black data
EPD_2IN9B_V4_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V4_SendData(0x00);
}
}
//send red data
EPD_2IN9B_V4_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V4_SendData(0x00);
}
}
EPD_2IN9B_V4_TurnOnDisplay_Fast();
}
void EPD_2IN9B_V4_Clear_Red_Fast(void)
{
UWORD Width = (EPD_2IN9B_V4_WIDTH % 8 == 0)? (EPD_2IN9B_V4_WIDTH / 8 ): (EPD_2IN9B_V4_WIDTH / 8 + 1);
UWORD Height = EPD_2IN9B_V4_HEIGHT;
//send black data
EPD_2IN9B_V4_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V4_SendData(0xFF);
}
}
//send red data
EPD_2IN9B_V4_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V4_SendData(0xFF);
}
}
EPD_2IN9B_V4_TurnOnDisplay_Fast();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN9B_V4_Display(const UBYTE *blackimage, const UBYTE *ryimage)
{
UWORD Width, Height;
Width = (EPD_2IN9B_V4_WIDTH % 8 == 0)? (EPD_2IN9B_V4_WIDTH / 8 ): (EPD_2IN9B_V4_WIDTH / 8 + 1);
Height = EPD_2IN9B_V4_HEIGHT;
EPD_2IN9B_V4_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V4_SendData(blackimage[i + j * Width]);
}
}
EPD_2IN9B_V4_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V4_SendData(~ryimage[i + j * Width]);
}
}
EPD_2IN9B_V4_TurnOnDisplay();
}
void EPD_2IN9B_V4_Display_Fast(const UBYTE *blackimage, const UBYTE *ryimage)
{
UWORD Width, Height;
Width = (EPD_2IN9B_V4_WIDTH % 8 == 0)? (EPD_2IN9B_V4_WIDTH / 8 ): (EPD_2IN9B_V4_WIDTH / 8 + 1);
Height = EPD_2IN9B_V4_HEIGHT;
EPD_2IN9B_V4_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V4_SendData(blackimage[i + j * Width]);
}
}
EPD_2IN9B_V4_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V4_SendData(~ryimage[i + j * Width]);
}
}
EPD_2IN9B_V4_TurnOnDisplay_Fast();
}
void EPD_2IN9B_V4_Display_Base(const UBYTE *blackimage, const UBYTE *ryimage)
{
UWORD Width, Height;
Width = (EPD_2IN9B_V4_WIDTH % 8 == 0)? (EPD_2IN9B_V4_WIDTH / 8 ): (EPD_2IN9B_V4_WIDTH / 8 + 1);
Height = EPD_2IN9B_V4_HEIGHT;
EPD_2IN9B_V4_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V4_SendData(blackimage[i + j * Width]);
}
}
EPD_2IN9B_V4_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V4_SendData(~ryimage[i + j * Width]);
}
}
EPD_2IN9B_V4_TurnOnDisplay_Base();
EPD_2IN9B_V4_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9B_V4_SendData(blackimage[i + j * Width]);
}
}
}
//Partial refresh display
void EPD_2IN9B_V4_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;
EPD_2IN9B_V4_SendCommand(0x44); // set RAM x address start/end, in page 35
EPD_2IN9B_V4_SendData(Xstart & 0xff); // RAM x address start at 00h;
EPD_2IN9B_V4_SendData(Xend & 0xff); // RAM x address end at 0fh(15+1)*8->128
EPD_2IN9B_V4_SendCommand(0x45); // set RAM y address start/end, in page 35
EPD_2IN9B_V4_SendData(Ystart & 0xff); // RAM y address start at 0127h;
EPD_2IN9B_V4_SendData((Ystart>>8) & 0x01); // RAM y address start at 0127h;
EPD_2IN9B_V4_SendData(Yend & 0xff); // RAM y address end at 00h;
EPD_2IN9B_V4_SendData((Yend>>8) & 0x01);
EPD_2IN9B_V4_SendCommand(0x4E); // set RAM x address count to 0;
EPD_2IN9B_V4_SendData(Xstart & 0xff);
EPD_2IN9B_V4_SendCommand(0x4F); // set RAM y address count to 0X127;
EPD_2IN9B_V4_SendData(Ystart & 0xff);
EPD_2IN9B_V4_SendData((Ystart>>8) & 0x01);
EPD_2IN9B_V4_SendCommand(0x24); //Write Black and White image to RAM
for (i = 0; i < IMAGE_COUNTER; i++) {
EPD_2IN9B_V4_SendData(Image[i]);
}
EPD_2IN9B_V4_TurnOnDisplay_Partial();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_2IN9B_V4_Sleep(void)
{
EPD_2IN9B_V4_SendCommand(0x10); //enter deep sleep
EPD_2IN9B_V4_SendData(0x01);
DEV_Delay_ms(100);
}

View File

@@ -0,0 +1,52 @@
/*****************************************************************************
* | File : EPD_2in9b V4.h
* | Author : Waveshare team
* | Function : 2.9inch e-paper b V4
* | Info :
*----------------
* | This version: V1.0
* | Date : 2023-12-18
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#ifndef __EPD_2IN9B_V4_H_
#define __EPD_2IN9B_V4_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2IN9B_V4_WIDTH 128
#define EPD_2IN9B_V4_HEIGHT 296
void EPD_2IN9B_V4_Init(void);
void EPD_2IN9B_V4_Init_Fast(void);
void EPD_2IN9B_V4_Clear_Fast(void);
void EPD_2IN9B_V4_Clear_Black_Fast(void);
void EPD_2IN9B_V4_Clear_Red_Fast(void);
void EPD_2IN9B_V4_Clear(void);
void EPD_2IN9B_V4_Display(const UBYTE *blackimage, const UBYTE *ryimage);
void EPD_2IN9B_V4_Display_Fast(const UBYTE *blackimage, const UBYTE *ryimage);
void EPD_2IN9B_V4_Display_Base(const UBYTE *blackimage, const UBYTE *ryimage);
void EPD_2IN9B_V4_Display_Partial(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend);
void EPD_2IN9B_V4_Sleep(void);
#endif

View File

@@ -0,0 +1,240 @@
/*****************************************************************************
* | File : EPD_2in9bc.c
* | Author : Waveshare team
* | Function : 2.9inch e-paper b&c
* | Info :
*----------------
* | This version: V3.0
* | Date : 2019-06-12
* | Info :
* -----------------------------------------------------------------------------
* V3.0(2019-06-12):
* 1.Change:
* EPD_Reset() => EPD_2IN9BC_Reset()
* EPD_SendCommand() => EPD_2IN9BC_SendCommand()
* EPD_SendData() => EPD_2IN9BC_SendData()
* EPD_WaitUntilIdle() => EPD_2IN9BC_ReadBusy()
* EPD_Init() => EPD_2IN9BC_Init()
* EPD_Clear() => EPD_2IN9BC_Clear()
* EPD_Display() => EPD_2IN9BC_Display()
* EPD_Sleep() => EPD_2IN9BC_Sleep()
* 2.remove commands define:
* #define PANEL_SETTING 0x00
* #define POWER_SETTING 0x01
* #define POWER_OFF 0x02
* #define POWER_OFF_SEQUENCE_SETTING 0x03
* #define POWER_ON 0x04
* #define POWER_ON_MEASURE 0x05
* #define BOOSTER_SOFT_START 0x06
* #define DEEP_SLEEP 0x07
* #define DATA_START_TRANSMISSION_1 0x10
* #define DATA_STOP 0x11
* #define DISPLAY_REFRESH 0x12
* #define DATA_START_TRANSMISSION_2 0x13
* #define PLL_CONTROL 0x30
* #define TEMPERATURE_SENSOR_COMMAND 0x40
* #define TEMPERATURE_SENSOR_CALIBRATION 0x41
* #define TEMPERATURE_SENSOR_WRITE 0x42
* #define TEMPERATURE_SENSOR_READ 0x43
* #define VCOM_AND_DATA_INTERVAL_SETTING 0x50
* #define LOW_POWER_DETECTION 0x51
* #define TCON_SETTING 0x60
* #define TCON_RESOLUTION 0x61
* #define GET_STATUS 0x71
* #define AUTO_MEASURE_VCOM 0x80
* #define VCOM_VALUE 0x81
* #define VCM_DC_SETTING_REGISTER 0x82
* #define PARTIAL_WINDOW 0x90
* #define PARTIAL_IN 0x91
* #define PARTIAL_OUT 0x92
* #define PROGRAM_MODE 0xA0
* #define ACTIVE_PROGRAM 0xA1
* #define READ_OTP_DATA 0xA2
* #define POWER_SAVING 0xE3
* -----------------------------------------------------------------------------
* V2.0(2018-11-06):
* 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8]
* 2.Change:EPD_Display(UBYTE *Image)
* Need to pass parameters: pointer to cached data
* 3.Change:
* EPD_RST -> EPD_RST_PIN
* EPD_DC -> EPD_DC_PIN
* EPD_CS -> EPD_CS_PIN
* EPD_BUSY -> EPD_BUSY_PIN
#
# 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.
#
******************************************************************************/
#include "EPD_2in9bc.h"
#include "Debug.h"
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2IN9BC_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2IN9BC_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2IN9BC_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_2IN9BC_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
while(DEV_Digital_Read(EPD_BUSY_PIN) == 0) { //LOW: idle, HIGH: busy
DEV_Delay_ms(100);
}
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2IN9BC_Init(void)
{
EPD_2IN9BC_Reset();
EPD_2IN9BC_SendCommand(0x06); // BOOSTER_SOFT_START
EPD_2IN9BC_SendData(0x17);
EPD_2IN9BC_SendData(0x17);
EPD_2IN9BC_SendData(0x17);
EPD_2IN9BC_SendCommand(0x04); // POWER_ON
EPD_2IN9BC_ReadBusy();
EPD_2IN9BC_SendCommand(0x00); // PANEL_SETTING
EPD_2IN9BC_SendData(0x8F);
EPD_2IN9BC_SendCommand(0x50); // VCOM_AND_DATA_INTERVAL_SETTING
EPD_2IN9BC_SendData(0x77);
EPD_2IN9BC_SendCommand(0x61); // TCON_RESOLUTION
EPD_2IN9BC_SendData(0x80);
EPD_2IN9BC_SendData(0x01);
EPD_2IN9BC_SendData(0x28);
EPD_2IN9BC_SendCommand(0x82); // VCM_DC_SETTING_REGISTER
EPD_2IN9BC_SendData(0X0A);
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2IN9BC_Clear(void)
{
UWORD Width = (EPD_2IN9BC_WIDTH % 8 == 0)? (EPD_2IN9BC_WIDTH / 8 ): (EPD_2IN9BC_WIDTH / 8 + 1);
UWORD Height = EPD_2IN9BC_HEIGHT;
//send black data
EPD_2IN9BC_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9BC_SendData(0xFF);
}
}
//send red data
EPD_2IN9BC_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9BC_SendData(0xFF);
}
}
EPD_2IN9BC_SendCommand(0x12);
EPD_2IN9BC_ReadBusy();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN9BC_Display(const UBYTE *blackimage, const UBYTE *ryimage)
{
UWORD Width, Height;
Width = (EPD_2IN9BC_WIDTH % 8 == 0)? (EPD_2IN9BC_WIDTH / 8 ): (EPD_2IN9BC_WIDTH / 8 + 1);
Height = EPD_2IN9BC_HEIGHT;
EPD_2IN9BC_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9BC_SendData(blackimage[i + j * Width]);
}
}
EPD_2IN9BC_SendCommand(0x92);
EPD_2IN9BC_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9BC_SendData(ryimage[i + j * Width]);
}
}
EPD_2IN9BC_SendCommand(0x92);
EPD_2IN9BC_SendCommand(0x12);
EPD_2IN9BC_ReadBusy();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_2IN9BC_Sleep(void)
{
EPD_2IN9BC_SendCommand(0x02); // POWER_OFF
EPD_2IN9BC_ReadBusy();
EPD_2IN9BC_SendCommand(0x07); // DEEP_SLEEP
EPD_2IN9BC_SendData(0xA5); // check code
}

View File

@@ -0,0 +1,98 @@
/*****************************************************************************
* | File : EPD_2in9bc.h
* | Author : Waveshare team
* | Function : 2.9inch e-paper b&c
* | Info :
*----------------
* | This version: V3.0
* | Date : 2019-06-12
* | Info :
* -----------------------------------------------------------------------------
* V3.0(2019-06-12):
* 1.Change:
* EPD_Reset() => EPD_2IN9BC_Reset()
* EPD_SendCommand() => EPD_2IN9BC_SendCommand()
* EPD_SendData() => EPD_2IN9BC_SendData()
* EPD_WaitUntilIdle() => EPD_2IN9BC_ReadBusy()
* EPD_Init() => EPD_2IN9BC_Init()
* EPD_Clear() => EPD_2IN9BC_Clear()
* EPD_Display() => EPD_2IN9BC_Display()
* EPD_Sleep() => EPD_2IN9BC_Sleep()
* 2.remove commands define:
* #define PANEL_SETTING 0x00
* #define POWER_SETTING 0x01
* #define POWER_OFF 0x02
* #define POWER_OFF_SEQUENCE_SETTING 0x03
* #define POWER_ON 0x04
* #define POWER_ON_MEASURE 0x05
* #define BOOSTER_SOFT_START 0x06
* #define DEEP_SLEEP 0x07
* #define DATA_START_TRANSMISSION_1 0x10
* #define DATA_STOP 0x11
* #define DISPLAY_REFRESH 0x12
* #define DATA_START_TRANSMISSION_2 0x13
* #define PLL_CONTROL 0x30
* #define TEMPERATURE_SENSOR_COMMAND 0x40
* #define TEMPERATURE_SENSOR_CALIBRATION 0x41
* #define TEMPERATURE_SENSOR_WRITE 0x42
* #define TEMPERATURE_SENSOR_READ 0x43
* #define VCOM_AND_DATA_INTERVAL_SETTING 0x50
* #define LOW_POWER_DETECTION 0x51
* #define TCON_SETTING 0x60
* #define TCON_RESOLUTION 0x61
* #define GET_STATUS 0x71
* #define AUTO_MEASURE_VCOM 0x80
* #define VCOM_VALUE 0x81
* #define VCM_DC_SETTING_REGISTER 0x82
* #define PARTIAL_WINDOW 0x90
* #define PARTIAL_IN 0x91
* #define PARTIAL_OUT 0x92
* #define PROGRAM_MODE 0xA0
* #define ACTIVE_PROGRAM 0xA1
* #define READ_OTP_DATA 0xA2
* #define POWER_SAVING 0xE3
* -----------------------------------------------------------------------------
* V2.0(2018-11-06):
* 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8]
* 2.Change:EPD_Display(UBYTE *Image)
* Need to pass parameters: pointer to cached data
* 3.Change:
* EPD_RST -> EPD_RST_PIN
* EPD_DC -> EPD_DC_PIN
* EPD_CS -> EPD_CS_PIN
* EPD_BUSY -> EPD_BUSY_PIN
#
# 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.
#
******************************************************************************/
#ifndef __EPD_2IN9BC_H_
#define __EPD_2IN9BC_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2IN9BC_WIDTH 128
#define EPD_2IN9BC_HEIGHT 296
void EPD_2IN9BC_Init(void);
void EPD_2IN9BC_Clear(void);
void EPD_2IN9BC_Display(const UBYTE *blackimage, const UBYTE *ryimage);
void EPD_2IN9BC_Sleep(void);
#endif

View File

@@ -0,0 +1,446 @@
/*****************************************************************************
* | File : EPD_2in9d.c
* | Author : Waveshare team
* | Function : 2.9inch e-paper d
* | Info :
*----------------
* | This version: V2.0
* | Date : 2019-06-12
* | Info :
* -----------------------------------------------------------------------------
* V3.0(2019-06-12):
* 1.Change:
* lut_vcomDC[] => EPD_2IN9D_lut_vcomDC[]
* lut_ww[] => EPD_2IN9D_lut_ww[]
* lut_bw[] => EPD_2IN9D_lut_bw[]
* lut_wb[] => EPD_2IN9D_lut_wb[]
* lut_bb[] => EPD_2IN9D_lut_bb[]
* lut_vcom1[] => EPD_2IN9D_lut_vcom1[]
* lut_ww1[] => EPD_2IN9D_lut_ww1[]
* lut_bw1[] => EPD_2IN9D_lut_bw1[]
* lut_wb1[] => EPD_2IN9D_lut_wb1[]
* lut_bb1[] => EPD_2IN9D_lut_bb1[]
* EPD_Reset() => EPD_2IN9D_Reset()
* EPD_SendCommand() => EPD_2IN9D_SendCommand()
* EPD_SendData() => EPD_2IN9D_SendData()
* EPD_WaitUntilIdle() => EPD_2IN9D_ReadBusy()
* EPD_SetFullReg() => EPD_2IN9D_SetFullReg()
* EPD_SetPartReg() => EPD_2IN9D_SetPartReg()
* EPD_TurnOnDisplay() => EPD_2IN9D_TurnOnDisplay()
* EPD_Init() => EPD_2IN9D_Init()
* EPD_Clear() => EPD_2IN9D_Clear()
* EPD_Display() => EPD_2IN9D_Display()
* EPD_Sleep() => EPD_2IN9D_Sleep()
*
# 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.
#
******************************************************************************/
#include "EPD_2in9d.h"
#include "Debug.h"
/**
* full screen update LUT
**/
const unsigned char EPD_2IN9D_lut_vcomDC[] = {
0x00, 0x08, 0x00, 0x00, 0x00, 0x02,
0x60, 0x28, 0x28, 0x00, 0x00, 0x01,
0x00, 0x14, 0x00, 0x00, 0x00, 0x01,
0x00, 0x12, 0x12, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
};
const unsigned char EPD_2IN9D_lut_ww[] = {
0x40, 0x08, 0x00, 0x00, 0x00, 0x02,
0x90, 0x28, 0x28, 0x00, 0x00, 0x01,
0x40, 0x14, 0x00, 0x00, 0x00, 0x01,
0xA0, 0x12, 0x12, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const unsigned char EPD_2IN9D_lut_bw[] = {
0x40, 0x17, 0x00, 0x00, 0x00, 0x02,
0x90, 0x0F, 0x0F, 0x00, 0x00, 0x03,
0x40, 0x0A, 0x01, 0x00, 0x00, 0x01,
0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const unsigned char EPD_2IN9D_lut_wb[] = {
0x80, 0x08, 0x00, 0x00, 0x00, 0x02,
0x90, 0x28, 0x28, 0x00, 0x00, 0x01,
0x80, 0x14, 0x00, 0x00, 0x00, 0x01,
0x50, 0x12, 0x12, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const unsigned char EPD_2IN9D_lut_bb[] = {
0x80, 0x08, 0x00, 0x00, 0x00, 0x02,
0x90, 0x28, 0x28, 0x00, 0x00, 0x01,
0x80, 0x14, 0x00, 0x00, 0x00, 0x01,
0x50, 0x12, 0x12, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/**
* partial screen update LUT
**/
const unsigned char EPD_2IN9D_lut_vcom1[] = {
0x00, 0x19, 0x01, 0x00, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
,0x00, 0x00,
};
const unsigned char EPD_2IN9D_lut_ww1[] = {
0x00, 0x19, 0x01, 0x00, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const unsigned char EPD_2IN9D_lut_bw1[] = {
0x80, 0x19, 0x01, 0x00, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const unsigned char EPD_2IN9D_lut_wb1[] = {
0x40, 0x19, 0x01, 0x00, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const unsigned char EPD_2IN9D_lut_bb1[] = {
0x00, 0x19, 0x01, 0x00, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_2IN9D_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_2IN9D_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_2IN9D_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_2IN9D_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
UBYTE busy;
do {
EPD_2IN9D_SendCommand(0x71);
busy = DEV_Digital_Read(EPD_BUSY_PIN);
busy =!(busy & 0x01);
} while(busy);
DEV_Delay_ms(200);
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : LUT download
parameter:
******************************************************************************/
static void EPD_SetFullReg(void)
{
EPD_2IN9D_SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_2IN9D_SendData(0xb7); //WBmode:VBDF 17|D7 VBDW 97 VBDB 57 WBRmode:VBDF F7 VBDW 77 VBDB 37 VBDR B7
unsigned int count;
EPD_2IN9D_SendCommand(0x20);
for(count=0; count<44; count++) {
EPD_2IN9D_SendData(EPD_2IN9D_lut_vcomDC[count]);
}
EPD_2IN9D_SendCommand(0x21);
for(count=0; count<42; count++) {
EPD_2IN9D_SendData(EPD_2IN9D_lut_ww[count]);
}
EPD_2IN9D_SendCommand(0x22);
for(count=0; count<42; count++) {
EPD_2IN9D_SendData(EPD_2IN9D_lut_bw[count]);
}
EPD_2IN9D_SendCommand(0x23);
for(count=0; count<42; count++) {
EPD_2IN9D_SendData(EPD_2IN9D_lut_wb[count]);
}
EPD_2IN9D_SendCommand(0x24);
for(count=0; count<42; count++) {
EPD_2IN9D_SendData(EPD_2IN9D_lut_bb[count]);
}
}
/******************************************************************************
function : LUT download
parameter:
******************************************************************************/
static void EPD_2IN9D_SetPartReg(void)
{
EPD_2IN9D_SendCommand(0x82); //vcom_DC setting
EPD_2IN9D_SendData(0x00);
EPD_2IN9D_SendCommand(0X50);
EPD_2IN9D_SendData(0xb7);
unsigned int count;
EPD_2IN9D_SendCommand(0x20);
for(count=0; count<44; count++) {
EPD_2IN9D_SendData(EPD_2IN9D_lut_vcom1[count]);
}
EPD_2IN9D_SendCommand(0x21);
for(count=0; count<42; count++) {
EPD_2IN9D_SendData(EPD_2IN9D_lut_ww1[count]);
}
EPD_2IN9D_SendCommand(0x22);
for(count=0; count<42; count++) {
EPD_2IN9D_SendData(EPD_2IN9D_lut_bw1[count]);
}
EPD_2IN9D_SendCommand(0x23);
for(count=0; count<42; count++) {
EPD_2IN9D_SendData(EPD_2IN9D_lut_wb1[count]);
}
EPD_2IN9D_SendCommand(0x24);
for(count=0; count<42; count++) {
EPD_2IN9D_SendData(EPD_2IN9D_lut_bb1[count]);
}
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_2IN9D_TurnOnDisplay(void)
{
EPD_2IN9D_SendCommand(0x12); //DISPLAY REFRESH
DEV_Delay_ms(10); //!!!The delay here is necessary, 200uS at least!!!
EPD_2IN9D_ReadBusy();
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_2IN9D_Init(void)
{
EPD_2IN9D_Reset();
EPD_2IN9D_SendCommand(0x01); //POWER SETTING
EPD_2IN9D_SendData(0x03);
EPD_2IN9D_SendData(0x00);
EPD_2IN9D_SendData(0x2b);
EPD_2IN9D_SendData(0x2b);
EPD_2IN9D_SendData(0x03);
EPD_2IN9D_SendCommand(0x06); //boost soft start
EPD_2IN9D_SendData(0x17); //A
EPD_2IN9D_SendData(0x17); //B
EPD_2IN9D_SendData(0x17); //C
EPD_2IN9D_SendCommand(0x04);
EPD_2IN9D_ReadBusy();
EPD_2IN9D_SendCommand(0x00); //panel setting
EPD_2IN9D_SendData(0xbf); //LUT from OTP<54><50>?128x296
EPD_2IN9D_SendData(0x0e); //VCOM to 0V fast
EPD_2IN9D_SendCommand(0x30); //PLL setting
EPD_2IN9D_SendData(0x3a); // 3a 100HZ 29 150Hz 39 200HZ 31 171HZ
EPD_2IN9D_SendCommand(0x61); //resolution setting
EPD_2IN9D_SendData(EPD_2IN9D_WIDTH);
EPD_2IN9D_SendData((EPD_2IN9D_HEIGHT >> 8) & 0xff);
EPD_2IN9D_SendData(EPD_2IN9D_HEIGHT & 0xff);
EPD_2IN9D_SendCommand(0x82); //vcom_DC setting
EPD_2IN9D_SendData(0x28);
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_2IN9D_Clear(void)
{
UWORD Width, Height;
Width = (EPD_2IN9D_WIDTH % 8 == 0)? (EPD_2IN9D_WIDTH / 8 ): (EPD_2IN9D_WIDTH / 8 + 1);
Height = EPD_2IN9D_HEIGHT;
EPD_2IN9D_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9D_SendData(0x00);
}
}
EPD_2IN9D_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9D_SendData(0xFF);
}
}
EPD_SetFullReg();
EPD_2IN9D_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN9D_Display(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_2IN9D_WIDTH % 8 == 0)? (EPD_2IN9D_WIDTH / 8 ): (EPD_2IN9D_WIDTH / 8 + 1);
Height = EPD_2IN9D_HEIGHT;
EPD_2IN9D_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9D_SendData(0x00);
}
}
// Dev_Delay_ms(10);
EPD_2IN9D_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9D_SendData(Image[i + j * Width]);
}
}
// Dev_Delay_ms(10);
EPD_SetFullReg();
EPD_2IN9D_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_2IN9D_DisplayPart(UBYTE *Image)
{
/* Set partial Windows */
EPD_2IN9D_SetPartReg();
EPD_2IN9D_SendCommand(0x91); //This command makes the display enter partial mode
EPD_2IN9D_SendCommand(0x90); //resolution setting
EPD_2IN9D_SendData(0); //x-start
EPD_2IN9D_SendData(EPD_2IN9D_WIDTH - 1); //x-end
EPD_2IN9D_SendData(0);
EPD_2IN9D_SendData(0); //y-start
EPD_2IN9D_SendData(EPD_2IN9D_HEIGHT / 256);
EPD_2IN9D_SendData(EPD_2IN9D_HEIGHT % 256 - 1); //y-end
EPD_2IN9D_SendData(0x28);
UWORD Width;
Width = (EPD_2IN9D_WIDTH % 8 == 0)? (EPD_2IN9D_WIDTH / 8 ): (EPD_2IN9D_WIDTH / 8 + 1);
/* send data */
EPD_2IN9D_SendCommand(0x13);
for (UWORD j = 0; j < EPD_2IN9D_HEIGHT; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_2IN9D_SendData(Image[i + j * Width]);
}
}
/* Set partial refresh */
EPD_2IN9D_TurnOnDisplay();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_2IN9D_Sleep(void)
{
EPD_2IN9D_SendCommand(0X50);
EPD_2IN9D_SendData(0xf7);
EPD_2IN9D_SendCommand(0X02); //power off
EPD_2IN9D_ReadBusy();
EPD_2IN9D_SendCommand(0X07); //deep sleep
EPD_2IN9D_SendData(0xA5);
}

View File

@@ -0,0 +1,69 @@
/*****************************************************************************
* | File : EPD_2in9d.c
* | Author : Waveshare team
* | Function : 2.9inch e-paper d
* | Info :
*----------------
* | This version: V2.0
* | Date : 2019-06-12
* | Info :
* -----------------------------------------------------------------------------
* V3.0(2019-06-12):
* 1.Change:
* lut_vcomDC[] => EPD_2IN9D_lut_vcomDC[]
* lut_ww[] => EPD_2IN9D_lut_ww[]
* lut_bw[] => EPD_2IN9D_lut_bw[]
* lut_wb[] => EPD_2IN9D_lut_wb[]
* lut_bb[] => EPD_2IN9D_lut_bb[]
* lut_vcom1[] => EPD_2IN9D_lut_vcom1[]
* lut_ww1[] => EPD_2IN9D_lut_ww1[]
* lut_bw1[] => EPD_2IN9D_lut_bw1[]
* lut_wb1[] => EPD_2IN9D_lut_wb1[]
* lut_bb1[] => EPD_2IN9D_lut_bb1[]
* EPD_Reset() => EPD_2IN9D_Reset()
* EPD_SendCommand() => EPD_2IN9D_SendCommand()
* EPD_SendData() => EPD_2IN9D_SendData()
* EPD_WaitUntilIdle() => EPD_2IN9D_ReadBusy()
* EPD_SetFullReg() => EPD_2IN9D_SetFullReg()
* EPD_SetPartReg() => EPD_2IN9D_SetPartReg()
* EPD_TurnOnDisplay() => EPD_2IN9D_TurnOnDisplay()
* EPD_Init() => EPD_2IN9D_Init()
* EPD_Clear() => EPD_2IN9D_Clear()
* EPD_Display() => EPD_2IN9D_Display()
* EPD_Sleep() => EPD_2IN9D_Sleep()
*
# 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.
#
******************************************************************************/
#ifndef __EPD_2IN9D_H_
#define __EPD_2IN9D_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_2IN9D_WIDTH 128
#define EPD_2IN9D_HEIGHT 296
void EPD_2IN9D_Init(void);
void EPD_2IN9D_Clear(void);
void EPD_2IN9D_Display(UBYTE *Image);
void EPD_2IN9D_DisplayPart(UBYTE *Image);
void EPD_2IN9D_Sleep(void);
#endif

View File

@@ -0,0 +1,595 @@
/*****************************************************************************
* | File : EPD_3IN7.C
* | Author : Waveshare team
* | Function : 3.7inch e-paper
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-07-16
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#include "EPD_3in7.h"
#include "Debug.h"
static const UBYTE lut_4Gray_GC[] =
{
0x2A,0x06,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1
0x28,0x06,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//2
0x20,0x06,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//3
0x14,0x06,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//4
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,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
};
static const UBYTE lut_1Gray_GC[] =
{
0x2A,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1
0x05,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//2
0x2A,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//3
0x05,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//4
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//5
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,//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
};
static const UBYTE lut_1Gray_DU[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1
0x01,0x2A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
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,//5
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,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//9
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
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
};
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_3IN7_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(30);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(3);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(30);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_3IN7_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_3IN7_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
static void EPD_3IN7_ReadBusy_HIGH(void)
{
Debug("e-Paper busy\r\n");
UBYTE busy;
do {
busy = DEV_Digital_Read(EPD_BUSY_PIN);
} while(busy);
DEV_Delay_ms(200);
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : set the look-up tables
parameter:
******************************************************************************/
void EPD_3IN7_Load_LUT(UBYTE lut)
{
UWORD i;
EPD_3IN7_SendCommand(0x32);
for (i = 0; i < 105; i++)
{
if(lut == 0)
EPD_3IN7_SendData(lut_4Gray_GC[i]);
else if(lut == 1)
EPD_3IN7_SendData(lut_1Gray_GC[i]);
else if(lut == 2)
EPD_3IN7_SendData(lut_1Gray_DU[i]);
else if(lut == 3)
EPD_3IN7_SendData(lut_1Gray_A2[i]);
else
Debug("There is no such lut \r\n");
}
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_3IN7_4Gray_Init(void)
{
EPD_3IN7_Reset();
EPD_3IN7_SendCommand(0x12);
DEV_Delay_ms(300);
EPD_3IN7_SendCommand(0x46);
EPD_3IN7_SendData(0xF7);
EPD_3IN7_ReadBusy_HIGH();
EPD_3IN7_SendCommand(0x47);
EPD_3IN7_SendData(0xF7);
EPD_3IN7_ReadBusy_HIGH();
EPD_3IN7_SendCommand(0x01); // setting gaet number
EPD_3IN7_SendData(0xDF);
EPD_3IN7_SendData(0x01);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x03); // set gate voltage
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x04); // set source voltage
EPD_3IN7_SendData(0x41);
EPD_3IN7_SendData(0xA8);
EPD_3IN7_SendData(0x32);
EPD_3IN7_SendCommand(0x11); // set data entry sequence
EPD_3IN7_SendData(0x03);
EPD_3IN7_SendCommand(0x3C); // set border
EPD_3IN7_SendData(0x03);
EPD_3IN7_SendCommand(0x0C); // set booster strength
EPD_3IN7_SendData(0xAE);
EPD_3IN7_SendData(0xC7);
EPD_3IN7_SendData(0xC3);
EPD_3IN7_SendData(0xC0);
EPD_3IN7_SendData(0xC0);
EPD_3IN7_SendCommand(0x18); // set internal sensor on
EPD_3IN7_SendData(0x80);
EPD_3IN7_SendCommand(0x2C); // set vcom value
EPD_3IN7_SendData(0x44);
EPD_3IN7_SendCommand(0x37); // set display option, these setting turn on previous function
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x44); // setting X direction start/end position of RAM
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x17);
EPD_3IN7_SendData(0x01);
EPD_3IN7_SendCommand(0x45); // setting Y direction start/end position of RAM
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0xDF);
EPD_3IN7_SendData(0x01);
EPD_3IN7_SendCommand(0x22); // Display Update Control 2
EPD_3IN7_SendData(0xCF);
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_3IN7_1Gray_Init(void)
{
EPD_3IN7_Reset();
EPD_3IN7_SendCommand(0x12);
DEV_Delay_ms(300);
EPD_3IN7_SendCommand(0x46);
EPD_3IN7_SendData(0xF7);
EPD_3IN7_ReadBusy_HIGH();
EPD_3IN7_SendCommand(0x47);
EPD_3IN7_SendData(0xF7);
EPD_3IN7_ReadBusy_HIGH();
EPD_3IN7_SendCommand(0x01); // setting gaet number
EPD_3IN7_SendData(0xDF);
EPD_3IN7_SendData(0x01);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x03); // set gate voltage
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x04); // set source voltage
EPD_3IN7_SendData(0x41);
EPD_3IN7_SendData(0xA8);
EPD_3IN7_SendData(0x32);
EPD_3IN7_SendCommand(0x11); // set data entry sequence
EPD_3IN7_SendData(0x03);
EPD_3IN7_SendCommand(0x3C); // set border
EPD_3IN7_SendData(0x03);
EPD_3IN7_SendCommand(0x0C); // set booster strength
EPD_3IN7_SendData(0xAE);
EPD_3IN7_SendData(0xC7);
EPD_3IN7_SendData(0xC3);
EPD_3IN7_SendData(0xC0);
EPD_3IN7_SendData(0xC0);
EPD_3IN7_SendCommand(0x18); // set internal sensor on
EPD_3IN7_SendData(0x80);
EPD_3IN7_SendCommand(0x2C); // set vcom value
EPD_3IN7_SendData(0x44);
EPD_3IN7_SendCommand(0x37); // set display option, these setting turn on previous function
EPD_3IN7_SendData(0x00); //can switch 1 gray or 4 gray
EPD_3IN7_SendData(0xFF);
EPD_3IN7_SendData(0xFF);
EPD_3IN7_SendData(0xFF);
EPD_3IN7_SendData(0xFF);
EPD_3IN7_SendData(0x4F);
EPD_3IN7_SendData(0xFF);
EPD_3IN7_SendData(0xFF);
EPD_3IN7_SendData(0xFF);
EPD_3IN7_SendData(0xFF);
EPD_3IN7_SendCommand(0x44); // setting X direction start/end position of RAM
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x17);
EPD_3IN7_SendData(0x01);
EPD_3IN7_SendCommand(0x45); // setting Y direction start/end position of RAM
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0xDF);
EPD_3IN7_SendData(0x01);
EPD_3IN7_SendCommand(0x22); // Display Update Control 2
EPD_3IN7_SendData(0xCF);
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_3IN7_4Gray_Clear(void)
{
UWORD Width, Height;
Width = (EPD_3IN7_WIDTH % 8 == 0)? (EPD_3IN7_WIDTH / 8 ): (EPD_3IN7_WIDTH / 8 + 1);
Height = EPD_3IN7_HEIGHT;
EPD_3IN7_SendCommand(0x49);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x4E);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x4F);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_3IN7_SendData(0xff);
}
}
EPD_3IN7_SendCommand(0x4E);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x4F);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_3IN7_SendData(0xff);
}
}
EPD_3IN7_Load_LUT(0);
EPD_3IN7_SendCommand(0x22);
EPD_3IN7_SendData(0xC7);
EPD_3IN7_SendCommand(0x20);
EPD_3IN7_ReadBusy_HIGH();
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_3IN7_1Gray_Clear(void)
{
UWORD i;
UWORD IMAGE_COUNTER = EPD_3IN7_WIDTH * EPD_3IN7_HEIGHT / 8;
EPD_3IN7_SendCommand(0x4E);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x4F);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x24);
for (i = 0; i < IMAGE_COUNTER; i++)
{
EPD_3IN7_SendData(0xff);
}
EPD_3IN7_Load_LUT(2);
EPD_3IN7_SendCommand(0x20);
EPD_3IN7_ReadBusy_HIGH();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_3IN7_4Gray_Display(const UBYTE *Image)
{
UDOUBLE i,j,k;
UBYTE temp1,temp2,temp3;
EPD_3IN7_SendCommand(0x49);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x4E);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x4F);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x24);
for(i=0;i<16800;i++){
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 |= 0x01;//white
else if(temp2 == 0x00)
temp3 |= 0x00; //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 |= 0x01;
else if(temp2 == 0x00) //black
temp3 |= 0x00;
else if(temp2 == 0x80)
temp3 |= 0x00; //gray1
else //0x40
temp3 |= 0x01; //gray2
if(j!=1 || k!=1)
temp3 <<= 1;
temp1 <<= 2;
}
}
EPD_3IN7_SendData(temp3);
}
// new data
EPD_3IN7_SendCommand(0x4E);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x4F);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x26);
for(i=0; i<16800; i++) {
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 |= 0x01;//white
else if(temp2 == 0x00)
temp3 |= 0x00; //black
else if(temp2 == 0x80)
temp3 |= 0x01; //gray1
else //0x40
temp3 |= 0x00; //gray2
temp3 <<= 1;
temp1 <<= 2;
temp2 = temp1&0xC0 ;
if(temp2 == 0xC0) //white
temp3 |= 0x01;
else if(temp2 == 0x00) //black
temp3 |= 0x00;
else if(temp2 == 0x80)
temp3 |= 0x01; //gray1
else //0x40
temp3 |= 0x00; //gray2
if(j!=1 || k!=1)
temp3 <<= 1;
temp1 <<= 2;
}
}
EPD_3IN7_SendData(temp3);
}
EPD_3IN7_Load_LUT(0);
EPD_3IN7_SendCommand(0x22);
EPD_3IN7_SendData(0xC7);
EPD_3IN7_SendCommand(0x20);
EPD_3IN7_ReadBusy_HIGH();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_3IN7_1Gray_Display(const UBYTE *Image)
{
UWORD i;
UWORD IMAGE_COUNTER = EPD_3IN7_WIDTH * EPD_3IN7_HEIGHT / 8;
EPD_3IN7_SendCommand(0x4E);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x4F);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendData(0x00);
EPD_3IN7_SendCommand(0x24);
for (i = 0; i < IMAGE_COUNTER; i++)
{
EPD_3IN7_SendData(Image[i]);
}
EPD_3IN7_Load_LUT(2);
EPD_3IN7_SendCommand(0x20);
EPD_3IN7_ReadBusy_HIGH();
}
/******************************************************************************
function : Sends part the image buffer in RAM to e-Paper and displays
notes:
You can send a part of data to e-Paper,But this function is not recommended
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)
{
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;
EPD_3IN7_SendCommand(0x44);
EPD_3IN7_SendData(Xstart & 0xff);
EPD_3IN7_SendData((Xstart>>8) & 0x03);
EPD_3IN7_SendData(Xend & 0xff);
EPD_3IN7_SendData((Xend>>8) & 0x03);
EPD_3IN7_SendCommand(0x45);
EPD_3IN7_SendData(Ystart & 0xff);
EPD_3IN7_SendData((Ystart>>8) & 0x03);
EPD_3IN7_SendData(Yend & 0xff);
EPD_3IN7_SendData((Yend>>8) & 0x03);
EPD_3IN7_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
EPD_3IN7_SendData(Xstart & 0xFF);
EPD_3IN7_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
EPD_3IN7_SendData(Ystart & 0xFF);
EPD_3IN7_SendData((Ystart >> 8) & 0xFF);
EPD_3IN7_SendCommand(0x24);
for (i = 0; i < IMAGE_COUNTER; i++)
{
EPD_3IN7_SendData(Image[i]);
}
EPD_3IN7_Load_LUT(3);
EPD_3IN7_SendCommand(0x20);
EPD_3IN7_ReadBusy_HIGH();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_3IN7_Sleep(void)
{
EPD_3IN7_SendCommand(0X10); //deep sleep
EPD_3IN7_SendData(0x03);
}

View File

@@ -0,0 +1,59 @@
/*****************************************************************************
* | File : EPD_3IN7.h
* | Author : Waveshare team
* | Function : 3.7inch e-paper
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-07-16
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#ifndef __EPD_3IN7_H_
#define __EPD_3IN7_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_3IN7_WIDTH 280
#define EPD_3IN7_HEIGHT 480
#ifdef __cplusplus
extern "C" {
#endif
void EPD_3IN7_4Gray_Clear(void);
void EPD_3IN7_4Gray_Init(void);
void EPD_3IN7_4Gray_Display(const UBYTE *Image);
void EPD_3IN7_1Gray_Clear(void);
void EPD_3IN7_1Gray_Init(void);
void EPD_3IN7_1Gray_Display(const UBYTE *Image);
void EPD_3IN7_1Gray_Display_Part(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend);
void EPD_3IN7_Sleep(void);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,767 @@
/*****************************************************************************
* | File : EPD_4in2.c
* | Author : Waveshare team
* | Function : 4.2inch e-paper
* | Info :
*----------------
* | This version: V3.1
* | Date : 2019-11-14
* | Info :
* -----------------------------------------------------------------------------
* V3.1(2019-11-14):
* 1.Add 4 grayscale drive and display program
* Add EPD_4IN2_4Gray_lut_vcom[]
* Add EPD_4IN2_4Gray_lut_ww[]
* Add EPD_4IN2_4Gray_lut_bw[]
* Add EPD_4IN2_4Gray_lut_wb
* Add EPD_4IN2_4Gray_lut_bb
* Add EPD_4IN2_Partial_SetLut()
* Add EPD_4IN2_4Gray_lut()
* Add EPD_4IN2_Init_4Gray()
* Add EPD_4IN2_4GrayDisplay(....)
* 2.Add partial refresh display
* Add EPD_4IN2_Partial_lut_vcom1[]
* Add EPD_4IN2_Partial_lut_ww1[]
* Add EPD_4IN2_Partial_lut_bw1[]
* Add EPD_4IN2_Partial_lut_wb1[]
* Add EPD_4IN2_Partial_lut_bb1[]
* Add EPD_4IN2_Partial_SetLut()
* Add EPD_4IN2_PartialDisplay(...)
* Poor display, no display function by default
*
* V3.0(2019-06-13):
* 1.Change:
* lut_vcomDC[] => EPD_4IN2_lut_vcomDC[]
* lut_ww[] => EPD_4IN2_lut_ww[]
* lut_bw[] => EPD_4IN2_lut_bw[]
* lut_wb[] => EPD_4IN2_lut_wb[]
* lut_bb[] => EPD_4IN2_lut_bb[]
* EPD_Reset() => EPD_4IN2_Reset()
* EPD_SendCommand() => EPD_4IN2_SendCommand()
* EPD_SendData() => EPD_4IN2_SendData()
* EPD_WaitUntilIdle() => EPD_4IN2_ReadBusy()
* EPD_SetFullReg() => EPD_4IN2_SetFullReg()
* EPD_SetPartReg() => EPD_4IN2_SetPartReg()
* EPD_TurnOnDisplay() => EPD_4IN2_TurnOnDisplay()
* EPD_Init() => EPD_4IN2_Init()
* EPD_Clear() => EPD_4IN2_Clear()
* EPD_Display() => EPD_4IN2_Display()
* EPD_Sleep() => EPD_4IN2_Sleep()
* 2.remove commands define:
* #define PANEL_SETTING 0x00
* #define POWER_SETTING 0x01
* #define POWER_OFF 0x02
* #define POWER_OFF_SEQUENCE_SETTING 0x03
* #define POWER_ON 0x04
* #define POWER_ON_MEASURE 0x05
* #define BOOSTER_SOFT_START 0x06
* #define DEEP_SLEEP 0x07
* #define DATA_START_TRANSMISSION_1 0x10
* #define DATA_STOP 0x11
* #define DISPLAY_REFRESH 0x12
* #define DATA_START_TRANSMISSION_2 0x13
* #define VCOM_LUT 0x20
* #define W2W_LUT 0x21
* #define B2W_LUT 0x22
* #define W2B_LUT 0x23
* #define B2B_LUT 0x24
* #define PLL_CONTROL 0x30
* #define TEMPERATURE_SENSOR_CALIBRATION 0x40
* #define TEMPERATURE_SENSOR_SELECTION 0x41
* #define TEMPERATURE_SENSOR_WRITE 0x42
* #define TEMPERATURE_SENSOR_READ 0x43
* #define VCOM_AND_DATA_INTERVAL_SETTING 0x50
* #define LOW_POWER_DETECTION 0x51
* #define TCON_SETTING 0x60
* #define RESOLUTION_SETTING 0x61
* #define GET_STATUS 0x71
* #define AUTO_MEASURE_VCOM 0x80
* #define READ_VCOM_VALUE 0x81
* #define VCM_DC_SETTING 0x82
* #define PARTIAL_WINDOW 0x90
* #define PARTIAL_IN 0x91
* #define PARTIAL_OUT 0x92
* #define PROGRAM_MODE 0xA0
* #define ACTIVE_PROGRAM 0xA1
* #define READ_OTP_DATA 0xA2
* #define POWER_SAVING 0xE3
* V2.0(2018-10-30):
* 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8]
* 2.Change:EPD_Display(UBYTE *Image)
* Need to pass parameters: pointer to cached data
#
# 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.
#
******************************************************************************/
#include "EPD_4in2.h"
#include "Debug.h"
static const unsigned char EPD_4IN2_lut_vcom0[] = {
0x00, 0x08, 0x08, 0x00, 0x00, 0x02,
0x00, 0x0F, 0x0F, 0x00, 0x00, 0x01,
0x00, 0x08, 0x08, 0x00, 0x00, 0x02,
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,
};
static const unsigned char EPD_4IN2_lut_ww[] = {
0x50, 0x08, 0x08, 0x00, 0x00, 0x02,
0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
static const unsigned char EPD_4IN2_lut_bw[] = {
0x50, 0x08, 0x08, 0x00, 0x00, 0x02,
0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
static const unsigned char EPD_4IN2_lut_wb[] = {
0xA0, 0x08, 0x08, 0x00, 0x00, 0x02,
0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
0x50, 0x08, 0x08, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
static const unsigned char EPD_4IN2_lut_bb[] = {
0x20, 0x08, 0x08, 0x00, 0x00, 0x02,
0x90, 0x0F, 0x0F, 0x00, 0x00, 0x01,
0x10, 0x08, 0x08, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/******************************partial screen update LUT*********************************/
const unsigned char EPD_4IN2_Partial_lut_vcom1[] ={
0x00, 0x01, 0x20, 0x01, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const unsigned char EPD_4IN2_Partial_lut_ww1[] ={
0x00, 0x01, 0x20, 0x01, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const unsigned char EPD_4IN2_Partial_lut_bw1[] ={
0x20, 0x01, 0x20, 0x01, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const unsigned char EPD_4IN2_Partial_lut_wb1[] ={
0x10, 0x01, 0x20, 0x01, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const unsigned char EPD_4IN2_Partial_lut_bb1[] ={
0x00, 0x01,0x20, 0x01, 0x00, 0x01,
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,
0x00, 0x00,0x00, 0x00, 0x00, 0x00,
};
/******************************gray*********************************/
//0~3 gray
const unsigned char EPD_4IN2_4Gray_lut_vcom[] =
{
0x00 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
0x60 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
0x00 ,0x14 ,0x00 ,0x00 ,0x00 ,0x01,
0x00 ,0x13 ,0x0A ,0x01 ,0x00 ,0x01,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00
};
//R21
const unsigned char EPD_4IN2_4Gray_lut_ww[] ={
0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
0x10 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
0xA0 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
};
//R22H r
const unsigned char EPD_4IN2_4Gray_lut_bw[] ={
0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
0x99 ,0x0C ,0x01 ,0x03 ,0x04 ,0x01,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
};
//R23H w
const unsigned char EPD_4IN2_4Gray_lut_wb[] ={
0x40 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
0x00 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
0x99 ,0x0B ,0x04 ,0x04 ,0x01 ,0x01,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
};
//R24H b
const unsigned char EPD_4IN2_4Gray_lut_bb[] ={
0x80 ,0x0A ,0x00 ,0x00 ,0x00 ,0x01,
0x90 ,0x14 ,0x14 ,0x00 ,0x00 ,0x01,
0x20 ,0x14 ,0x0A ,0x00 ,0x00 ,0x01,
0x50 ,0x13 ,0x01 ,0x00 ,0x00 ,0x01,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,
};
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_4IN2_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(10);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(10);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(10);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(10);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(10);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(10);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_4IN2_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_4IN2_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_4IN2_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
EPD_4IN2_SendCommand(0x71);
while(DEV_Digital_Read(EPD_BUSY_PIN) == 0) { //LOW: idle, HIGH: busy
EPD_4IN2_SendCommand(0x71);
DEV_Delay_ms(100);
}
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_4IN2_TurnOnDisplay(void)
{
EPD_4IN2_SendCommand(0x12);
DEV_Delay_ms(100);
EPD_4IN2_ReadBusy();
}
/******************************************************************************
function : set the look-up tables
parameter:
******************************************************************************/
static void EPD_4IN2_Partial_SetLut(void)
{
unsigned int count;
EPD_4IN2_SendCommand(0x20);
for(count=0;count<44;count++)
{EPD_4IN2_SendData(EPD_4IN2_Partial_lut_vcom1[count]);}
EPD_4IN2_SendCommand(0x21);
for(count=0;count<42;count++)
{EPD_4IN2_SendData(EPD_4IN2_Partial_lut_ww1[count]);}
EPD_4IN2_SendCommand(0x22);
for(count=0;count<42;count++)
{EPD_4IN2_SendData(EPD_4IN2_Partial_lut_bw1[count]);}
EPD_4IN2_SendCommand(0x23);
for(count=0;count<42;count++)
{EPD_4IN2_SendData(EPD_4IN2_Partial_lut_wb1[count]);}
EPD_4IN2_SendCommand(0x24);
for(count=0;count<42;count++)
{EPD_4IN2_SendData(EPD_4IN2_Partial_lut_bb1[count]);}
}
static void EPD_4IN2_SetLut(void)
{
unsigned int count;
EPD_4IN2_SendCommand(0x20);
for(count=0;count<36;count++)
{EPD_4IN2_SendData(EPD_4IN2_lut_vcom0[count]);}
EPD_4IN2_SendCommand(0x21);
for(count=0;count<36;count++)
{EPD_4IN2_SendData(EPD_4IN2_lut_ww[count]);}
EPD_4IN2_SendCommand(0x22);
for(count=0;count<36;count++)
{EPD_4IN2_SendData(EPD_4IN2_lut_bw[count]);}
EPD_4IN2_SendCommand(0x23);
for(count=0;count<36;count++)
{EPD_4IN2_SendData(EPD_4IN2_lut_wb[count]);}
EPD_4IN2_SendCommand(0x24);
for(count=0;count<36;count++)
{EPD_4IN2_SendData(EPD_4IN2_lut_bb[count]);}
}
//LUT download
static void EPD_4IN2_4Gray_lut(void)
{
unsigned int count;
{
EPD_4IN2_SendCommand(0x20); //vcom
for(count=0;count<42;count++)
{EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_vcom[count]);}
EPD_4IN2_SendCommand(0x21); //red not use
for(count=0;count<42;count++)
{EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_ww[count]);}
EPD_4IN2_SendCommand(0x22); //bw r
for(count=0;count<42;count++)
{EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_bw[count]);}
EPD_4IN2_SendCommand(0x23); //wb w
for(count=0;count<42;count++)
{EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_wb[count]);}
EPD_4IN2_SendCommand(0x24); //bb b
for(count=0;count<42;count++)
{EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_bb[count]);}
EPD_4IN2_SendCommand(0x25); //vcom
for(count=0;count<42;count++)
{EPD_4IN2_SendData(EPD_4IN2_4Gray_lut_ww[count]);}
}
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_4IN2_Init_Partial(void)
{
EPD_4IN2_Reset();
EPD_4IN2_SendCommand(0x01); // POWER SETTING
EPD_4IN2_SendData(0x03);
EPD_4IN2_SendData(0x00);
EPD_4IN2_SendData(0x2b);
EPD_4IN2_SendData(0x2b);
EPD_4IN2_SendCommand(0x06); // boost soft start
EPD_4IN2_SendData(0x17); //A
EPD_4IN2_SendData(0x17); //B
EPD_4IN2_SendData(0x17); //C
EPD_4IN2_SendCommand(0x04); // POWER_ON
EPD_4IN2_ReadBusy();
EPD_4IN2_SendCommand(0x00); // panel setting
EPD_4IN2_SendData(0xbf); // KW-BF KWR-AF BWROTP 0f BWOTP 1f
EPD_4IN2_SendCommand(0x30); // PLL setting
EPD_4IN2_SendData(0x3C); // 3A 100HZ 29 150Hz 39 200HZ 31 171HZ
EPD_4IN2_SendCommand(0x61); // resolution setting
EPD_4IN2_SendData(0x01);
EPD_4IN2_SendData(0x90); //128
EPD_4IN2_SendData(0x01); //
EPD_4IN2_SendData(0x2c);
EPD_4IN2_SendCommand(0x82); // vcom_DC setting
EPD_4IN2_SendData(0x12);
EPD_4IN2_SendCommand(0X50); // VCOM AND DATA INTERVAL SETTING
EPD_4IN2_SendData(0x07); // 97white border 77black border VBDF 17|D7 VBDW 97 VBDB 57 VBDF F7 VBDW 77 VBDB 37 VBDR B7
EPD_4IN2_Partial_SetLut();
}
//UC8176C
void EPD_4IN2_Init_Fast(void)
{
EPD_4IN2_Reset();
EPD_4IN2_SendCommand(0x01); //POWER SETTING
EPD_4IN2_SendData (0x03);
EPD_4IN2_SendData (0x00);
EPD_4IN2_SendData (0x2b);
EPD_4IN2_SendData (0x2b);
EPD_4IN2_SendCommand(0x06); //boost soft start
EPD_4IN2_SendData (0x17); //A
EPD_4IN2_SendData (0x17); //B
EPD_4IN2_SendData (0x17); //C
EPD_4IN2_SendCommand(0x04);
EPD_4IN2_ReadBusy();
EPD_4IN2_SendCommand(0x00); //panel setting
EPD_4IN2_SendData(0xbf); //KW-bf KWR-2F BWROTP 0f BWOTP 1f
EPD_4IN2_SendCommand(0x30);
EPD_4IN2_SendData (0x3c); // 3A 100HZ 29 150Hz 39 200HZ 31 171HZ
EPD_4IN2_SendCommand(0x61); //resolution setting
EPD_4IN2_SendData (0x01);
EPD_4IN2_SendData (0x90); //400
EPD_4IN2_SendData (0x01); //300
EPD_4IN2_SendData (0x2c);
EPD_4IN2_SendCommand(0x82); //vcom_DC setting
EPD_4IN2_SendData (0x12);
EPD_4IN2_SendCommand(0X50);
EPD_4IN2_SendData(0x97);
EPD_4IN2_SetLut();
}
void EPD_4IN2_Init_4Gray(void)
{
EPD_4IN2_Reset();
EPD_4IN2_SendCommand(0x01); //POWER SETTING
EPD_4IN2_SendData (0x03);
EPD_4IN2_SendData (0x00); //VGH=20V,VGL=-20V
EPD_4IN2_SendData (0x2b); //VDH=15V
EPD_4IN2_SendData (0x2b); //VDL=-15V
EPD_4IN2_SendData (0x13);
EPD_4IN2_SendCommand(0x06); //booster soft start
EPD_4IN2_SendData (0x17); //A
EPD_4IN2_SendData (0x17); //B
EPD_4IN2_SendData (0x17); //C
EPD_4IN2_SendCommand(0x04);
EPD_4IN2_ReadBusy();
EPD_4IN2_SendCommand(0x00); //panel setting
EPD_4IN2_SendData(0x3f); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_4IN2_SendCommand(0x30); //PLL setting
EPD_4IN2_SendData (0x3c); //100hz
EPD_4IN2_SendCommand(0x61); //resolution setting
EPD_4IN2_SendData (0x01); //400
EPD_4IN2_SendData (0x90);
EPD_4IN2_SendData (0x01); //300
EPD_4IN2_SendData (0x2c);
EPD_4IN2_SendCommand(0x82); //vcom_DC setting
EPD_4IN2_SendData (0x12);
EPD_4IN2_SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_4IN2_SendData(0x97);
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_4IN2_Clear(void)
{
UWORD Width, Height;
Width = (EPD_4IN2_WIDTH % 8 == 0)? (EPD_4IN2_WIDTH / 8 ): (EPD_4IN2_WIDTH / 8 + 1);
Height = EPD_4IN2_HEIGHT;
EPD_4IN2_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2_SendData(0xFF);
}
}
EPD_4IN2_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2_SendData(0xFF);
}
}
EPD_4IN2_SendCommand(0x12); //DISPLAY REFRESH
DEV_Delay_ms(1);
EPD_4IN2_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_4IN2_Display(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_4IN2_WIDTH % 8 == 0)? (EPD_4IN2_WIDTH / 8 ): (EPD_4IN2_WIDTH / 8 + 1);
Height = EPD_4IN2_HEIGHT;
EPD_4IN2_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2_SendData(0x00);
}
}
EPD_4IN2_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2_SendData(Image[i + j * Width]);
}
}
EPD_4IN2_SendCommand(0x12); //DISPLAY REFRESH
DEV_Delay_ms(10);
EPD_4IN2_TurnOnDisplay();
}
void EPD_4IN2_PartialDisplay(UWORD X_start,UWORD Y_start,UWORD X_end,UWORD Y_end, UBYTE *Image)
{
UWORD Width, Height;
static UBYTE DATA[EPD_4IN2_WIDTH * EPD_4IN2_HEIGHT / 8] = {0x00};
Width = (EPD_4IN2_WIDTH % 8 == 0)? (EPD_4IN2_WIDTH / 8 ): (EPD_4IN2_WIDTH / 8 + 1);
Height = EPD_4IN2_HEIGHT;
X_start = (X_start % 8 == 0)? (X_start): (X_start/8*8+8);
X_end = (X_end % 8 == 0)? (X_end): (X_end/8*8+8);
EPD_4IN2_SendCommand(0x91); //This command makes the display enter partial mode
EPD_4IN2_SendCommand(0x90); //resolution setting
EPD_4IN2_SendData ((X_start)/256);
EPD_4IN2_SendData ((X_start)%256); //x-start
EPD_4IN2_SendData ((X_end )/256);
EPD_4IN2_SendData ((X_end )%256-1); //x-end
EPD_4IN2_SendData (Y_start/256);
EPD_4IN2_SendData (Y_start%256); //y-start
EPD_4IN2_SendData (Y_end/256);
EPD_4IN2_SendData (Y_end%256-1); //y-end
EPD_4IN2_SendData (0x28);
EPD_4IN2_SendCommand(0x10); //writes Old data to SRAM for programming
for (UWORD j = 0; j < Y_end - Y_start; j++) {
for (UWORD i = 0; i < (X_end - X_start)/8; i++) {
EPD_4IN2_SendData(DATA[(Y_start + j)*Width + X_start/8 + i]);
}
}
EPD_4IN2_SendCommand(0x13); //writes New data to SRAM.
for (UWORD j = 0; j < Y_end - Y_start; j++) {
for (UWORD i = 0; i < (X_end - X_start)/8; i++) {
EPD_4IN2_SendData(~Image[(Y_start + j)*Width + X_start/8 + i]);
DATA[(Y_start + j)*Width + X_start/8 + i] = ~Image[(Y_start + j)*Width + X_start/8 + i];
}
}
EPD_4IN2_SendCommand(0x12); //DISPLAY REFRESH
DEV_Delay_ms(10); //The delay here is necessary, 200uS at least!!!
EPD_4IN2_TurnOnDisplay();
}
void EPD_4IN2_4GrayDisplay(const UBYTE *Image)
{
UDOUBLE i,j,k,m;
UBYTE temp1,temp2,temp3;
/****Color display description****
white gray1 gray2 black
0x10| 01 01 00 00
0x13| 01 00 01 00
*********************************/
EPD_4IN2_SendCommand(0x10);
// EPD_4IN2_HEIGHT
// EPD_4IN2_WIDTH
for(m = 0; m<EPD_4IN2_HEIGHT;m++)
for(i=0;i<EPD_4IN2_WIDTH/8;i++)
{
temp3=0;
for(j=0;j<2;j++)
{
temp1 = Image[(m*(EPD_4IN2_WIDTH/8)+i)*2+j];
for(k=0;k<2;k++)
{
temp2 = temp1&0xC0 ;
if(temp2 == 0xC0)
temp3 |= 0x01;//white
else if(temp2 == 0x00)
temp3 |= 0x00; //black
else if(temp2 == 0x80)
temp3 |= 0x01; //gray1
else //0x40
temp3 |= 0x00; //gray2
temp3 <<= 1;
temp1 <<= 2;
temp2 = temp1&0xC0 ;
if(temp2 == 0xC0) //white
temp3 |= 0x01;
else if(temp2 == 0x00) //black
temp3 |= 0x00;
else if(temp2 == 0x80)
temp3 |= 0x01; //gray1
else //0x40
temp3 |= 0x00; //gray2
if(j!=1 || k!=1)
temp3 <<= 1;
temp1 <<= 2;
}
}
EPD_4IN2_SendData(temp3);
}
// new data
EPD_4IN2_SendCommand(0x13);
for(m = 0; m<EPD_4IN2_HEIGHT;m++)
for(i=0;i<EPD_4IN2_WIDTH/8;i++)
{
temp3=0;
for(j=0;j<2;j++)
{
temp1 = Image[(m*(EPD_4IN2_WIDTH/8)+i)*2+j];
for(k=0;k<2;k++)
{
temp2 = temp1&0xC0 ;
if(temp2 == 0xC0)
temp3 |= 0x01;//white
else if(temp2 == 0x00)
temp3 |= 0x00; //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 |= 0x01;
else if(temp2 == 0x00) //black
temp3 |= 0x00;
else if(temp2 == 0x80)
temp3 |= 0x00; //gray1
else //0x40
temp3 |= 0x01; //gray2
if(j!=1 || k!=1)
temp3 <<= 1;
temp1 <<= 2;
}
}
EPD_4IN2_SendData(temp3);
}
EPD_4IN2_4Gray_lut();
EPD_4IN2_TurnOnDisplay();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_4IN2_Sleep(void)
{
EPD_4IN2_SendCommand(0x50); // DEEP_SLEEP
EPD_4IN2_SendData(0XF7);
EPD_4IN2_SendCommand(0x02); // POWER_OFF
EPD_4IN2_ReadBusy();
EPD_4IN2_SendCommand(0x07); // DEEP_SLEEP
EPD_4IN2_SendData(0XA5);
}

View File

@@ -0,0 +1,132 @@
/*****************************************************************************
* | File : EPD_4in2.h
* | Author : Waveshare team
* | Function : 4.2inch e-paper
* | Info :
*----------------
* | This version: V3.1
* | Date : 2019-11-14
* | Info :
* -----------------------------------------------------------------------------
* V3.1(2019-11-14):
* 1.Add 4 grayscale drive and display program
* Add EPD_4IN2_4Gray_lut_vcom[]
* Add EPD_4IN2_4Gray_lut_ww[]
* Add EPD_4IN2_4Gray_lut_bw[]
* Add EPD_4IN2_4Gray_lut_wb
* Add EPD_4IN2_4Gray_lut_bb
* Add EPD_4IN2_Partial_SetLut()
* Add EPD_4IN2_4Gray_lut()
* Add EPD_4IN2_Init_4Gray()
* Add EPD_4IN2_4GrayDisplay(....)
* 2.Add partial refresh display
* Add EPD_4IN2_Partial_lut_vcom1[]
* Add EPD_4IN2_Partial_lut_ww1[]
* Add EPD_4IN2_Partial_lut_bw1[]
* Add EPD_4IN2_Partial_lut_wb1[]
* Add EPD_4IN2_Partial_lut_bb1[]
* Add EPD_4IN2_Partial_SetLut()
* Add EPD_4IN2_PartialDisplay(...)
* Poor display, no display function by default
*
* V3.0(2019-06-13):
* 1.Change:
* lut_vcomDC[] => EPD_4IN2_lut_vcomDC[]
* lut_ww[] => EPD_4IN2_lut_ww[]
* lut_bw[] => EPD_4IN2_lut_bw[]
* lut_wb[] => EPD_4IN2_lut_wb[]
* lut_bb[] => EPD_4IN2_lut_bb[]
* EPD_Reset() => EPD_4IN2_Reset()
* EPD_SendCommand() => EPD_4IN2_SendCommand()
* EPD_SendData() => EPD_4IN2_SendData()
* EPD_WaitUntilIdle() => EPD_4IN2_ReadBusy()
* EPD_SetFullReg() => EPD_4IN2_SetFullReg()
* EPD_SetPartReg() => EPD_4IN2_SetPartReg()
* EPD_TurnOnDisplay() => EPD_4IN2_TurnOnDisplay()
* EPD_Init() => EPD_4IN2_Init()
* EPD_Clear() => EPD_4IN2_Clear()
* EPD_Display() => EPD_4IN2_Display()
* EPD_Sleep() => EPD_4IN2_Sleep()
* 2.remove commands define:
* #define PANEL_SETTING 0x00
* #define POWER_SETTING 0x01
* #define POWER_OFF 0x02
* #define POWER_OFF_SEQUENCE_SETTING 0x03
* #define POWER_ON 0x04
* #define POWER_ON_MEASURE 0x05
* #define BOOSTER_SOFT_START 0x06
* #define DEEP_SLEEP 0x07
* #define DATA_START_TRANSMISSION_1 0x10
* #define DATA_STOP 0x11
* #define DISPLAY_REFRESH 0x12
* #define DATA_START_TRANSMISSION_2 0x13
* #define VCOM_LUT 0x20
* #define W2W_LUT 0x21
* #define B2W_LUT 0x22
* #define W2B_LUT 0x23
* #define B2B_LUT 0x24
* #define PLL_CONTROL 0x30
* #define TEMPERATURE_SENSOR_CALIBRATION 0x40
* #define TEMPERATURE_SENSOR_SELECTION 0x41
* #define TEMPERATURE_SENSOR_WRITE 0x42
* #define TEMPERATURE_SENSOR_READ 0x43
* #define VCOM_AND_DATA_INTERVAL_SETTING 0x50
* #define LOW_POWER_DETECTION 0x51
* #define TCON_SETTING 0x60
* #define RESOLUTION_SETTING 0x61
* #define GET_STATUS 0x71
* #define AUTO_MEASURE_VCOM 0x80
* #define READ_VCOM_VALUE 0x81
* #define VCM_DC_SETTING 0x82
* #define PARTIAL_WINDOW 0x90
* #define PARTIAL_IN 0x91
* #define PARTIAL_OUT 0x92
* #define PROGRAM_MODE 0xA0
* #define ACTIVE_PROGRAM 0xA1
* #define READ_OTP_DATA 0xA2
* #define POWER_SAVING 0xE3
* V2.0(2018-10-30):
* 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8]
* 2.Change:EPD_Display(UBYTE *Image)
* Need to pass parameters: pointer to cached data
#
# 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.
#
******************************************************************************/
#ifndef _EPD_4IN2_H_
#define _EPD_4IN2_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_4IN2_WIDTH 400
#define EPD_4IN2_HEIGHT 300
void EPD_4IN2_Init_Fast(void);
void EPD_4IN2_Init_Partial(void);
void EPD_4IN2_Clear(void);
void EPD_4IN2_Display(UBYTE *Image);
void EPD_4IN2_Sleep(void);
void EPD_4IN2_PartialDisplay(UWORD X_start,UWORD Y_start,UWORD X_end,UWORD Y_end, UBYTE *Image);
void EPD_4IN2_Init_4Gray(void);
void EPD_4IN2_4GrayDisplay(const UBYTE *Image);
#endif

View File

@@ -0,0 +1,564 @@
/*****************************************************************************
* | File : EPD_4in2_V2.h
* | Author : Waveshare team
* | Function : 4.2inch e-paper V2
* | Info :
*----------------
* | This version: V1.0
* | Date : 2023-09-12
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#include "EPD_4in2_V2.h"
#include "Debug.h"
const unsigned char LUT_ALL[233]={
0x01, 0x0A, 0x1B, 0x0F, 0x03, 0x01, 0x01,
0x05, 0x0A, 0x01, 0x0A, 0x01, 0x01, 0x01,
0x05, 0x08, 0x03, 0x02, 0x04, 0x01, 0x01,
0x01, 0x04, 0x04, 0x02, 0x00, 0x01, 0x01,
0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
0x01, 0x0A, 0x1B, 0x0F, 0x03, 0x01, 0x01,
0x05, 0x4A, 0x01, 0x8A, 0x01, 0x01, 0x01,
0x05, 0x48, 0x03, 0x82, 0x84, 0x01, 0x01,
0x01, 0x84, 0x84, 0x82, 0x00, 0x01, 0x01,
0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
0x01, 0x0A, 0x1B, 0x8F, 0x03, 0x01, 0x01,
0x05, 0x4A, 0x01, 0x8A, 0x01, 0x01, 0x01,
0x05, 0x48, 0x83, 0x82, 0x04, 0x01, 0x01,
0x01, 0x04, 0x04, 0x02, 0x00, 0x01, 0x01,
0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
0x01, 0x8A, 0x1B, 0x8F, 0x03, 0x01, 0x01,
0x05, 0x4A, 0x01, 0x8A, 0x01, 0x01, 0x01,
0x05, 0x48, 0x83, 0x02, 0x04, 0x01, 0x01,
0x01, 0x04, 0x04, 0x02, 0x00, 0x01, 0x01,
0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
0x01, 0x8A, 0x9B, 0x8F, 0x03, 0x01, 0x01,
0x05, 0x4A, 0x01, 0x8A, 0x01, 0x01, 0x01,
0x05, 0x48, 0x03, 0x42, 0x04, 0x01, 0x01,
0x01, 0x04, 0x04, 0x42, 0x00, 0x01, 0x01,
0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x07, 0x17, 0x41, 0xA8,
0x32, 0x30,
};
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_4IN2_V2_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(100);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(100);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_4IN2_V2_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_4IN2_V2_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_4IN2_V2_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
while(DEV_Digital_Read(EPD_BUSY_PIN) == 1) { //LOW: idle, HIGH: busy
DEV_Delay_ms(10);
}
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_4IN2_V2_TurnOnDisplay(void)
{
EPD_4IN2_V2_SendCommand(0x22);
EPD_4IN2_V2_SendData(0xF7);
EPD_4IN2_V2_SendCommand(0x20);
EPD_4IN2_V2_ReadBusy();
}
static void EPD_4IN2_V2_TurnOnDisplay_Fast(void)
{
EPD_4IN2_V2_SendCommand(0x22);
EPD_4IN2_V2_SendData(0xC7);
EPD_4IN2_V2_SendCommand(0x20);
EPD_4IN2_V2_ReadBusy();
}
static void EPD_4IN2_V2_TurnOnDisplay_Partial(void)
{
EPD_4IN2_V2_SendCommand(0x22);
EPD_4IN2_V2_SendData(0xFF);
EPD_4IN2_V2_SendCommand(0x20);
EPD_4IN2_V2_ReadBusy();
}
static void EPD_4IN2_V2_TurnOnDisplay_4Gray(void)
{
EPD_4IN2_V2_SendCommand(0x22);
EPD_4IN2_V2_SendData(0xCF);
EPD_4IN2_V2_SendCommand(0x20);
EPD_4IN2_V2_ReadBusy();
}
/******************************************************************************
function : Setting the display window
parameter:
******************************************************************************/
static void EPD_4IN2_V2_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
{
EPD_4IN2_V2_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION
EPD_4IN2_V2_SendData((Xstart>>3) & 0xFF);
EPD_4IN2_V2_SendData((Xend>>3) & 0xFF);
EPD_4IN2_V2_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION
EPD_4IN2_V2_SendData(Ystart & 0xFF);
EPD_4IN2_V2_SendData((Ystart >> 8) & 0xFF);
EPD_4IN2_V2_SendData(Yend & 0xFF);
EPD_4IN2_V2_SendData((Yend >> 8) & 0xFF);
}
/******************************************************************************
function : Set Cursor
parameter:
******************************************************************************/
static void EPD_4IN2_V2_SetCursor(UWORD Xstart, UWORD Ystart)
{
EPD_4IN2_V2_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
EPD_4IN2_V2_SendData(Xstart & 0xFF);
EPD_4IN2_V2_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
EPD_4IN2_V2_SendData(Ystart & 0xFF);
EPD_4IN2_V2_SendData((Ystart >> 8) & 0xFF);
}
//LUT download
static void EPD_4IN2_V2_4Gray_lut(void)
{
unsigned char i;
//WS byte 0~152, the content of VS[nX-LUTm], TP[nX], RP[n], SR[nXY], FR[n] and XON[nXY]
EPD_4IN2_V2_SendCommand(0x32);
for(i=0;i<227;i++)
{
EPD_4IN2_V2_SendData(LUT_ALL[i]);
}
//WS byte 153, the content of Option for LUT end
EPD_4IN2_V2_SendCommand(0x3F);
EPD_4IN2_V2_SendData(LUT_ALL[i++]);
//WS byte 154, the content of gate leve
EPD_4IN2_V2_SendCommand(0x03);
EPD_4IN2_V2_SendData(LUT_ALL[i++]);//VGH
//WS byte 155~157, the content of source level
EPD_4IN2_V2_SendCommand(0x04);
EPD_4IN2_V2_SendData(LUT_ALL[i++]);//VSH1
EPD_4IN2_V2_SendData(LUT_ALL[i++]);//VSH2
EPD_4IN2_V2_SendData(LUT_ALL[i++]);//VSL
//WS byte 158, the content of VCOM level
EPD_4IN2_V2_SendCommand(0x2c);
EPD_4IN2_V2_SendData(LUT_ALL[i++]);//VCOM
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_4IN2_V2_Init(void)
{
EPD_4IN2_V2_Reset();
EPD_4IN2_V2_ReadBusy();
EPD_4IN2_V2_SendCommand(0x12); // soft reset
EPD_4IN2_V2_ReadBusy();
EPD_4IN2_V2_SendCommand(0x21); // Display update control
EPD_4IN2_V2_SendData(0x40);
EPD_4IN2_V2_SendData(0x00);
EPD_4IN2_V2_SendCommand(0x3C); //BorderWavefrom
EPD_4IN2_V2_SendData(0x05);
EPD_4IN2_V2_SendCommand(0x11); // data entry mode
EPD_4IN2_V2_SendData(0x03); // X-mode
EPD_4IN2_V2_SetWindows(0, 0, EPD_4IN2_V2_WIDTH-1, EPD_4IN2_V2_HEIGHT-1);
EPD_4IN2_V2_SetCursor(0, 0);
EPD_4IN2_V2_ReadBusy();
}
/******************************************************************************
function : Initialize Fast the e-Paper register
parameter:
******************************************************************************/
void EPD_4IN2_V2_Init_Fast(UBYTE Mode)
{
EPD_4IN2_V2_Reset();
EPD_4IN2_V2_ReadBusy();
EPD_4IN2_V2_SendCommand(0x12); // soft reset
EPD_4IN2_V2_ReadBusy();
EPD_4IN2_V2_SendCommand(0x21);
EPD_4IN2_V2_SendData(0x40);
EPD_4IN2_V2_SendData(0x00);
EPD_4IN2_V2_SendCommand(0x3C);
EPD_4IN2_V2_SendData(0x05);
if(Mode == Seconds_1_5S)
{
//1.5s
EPD_4IN2_V2_SendCommand(0x1A); // Write to temperature register
EPD_4IN2_V2_SendData(0x6E);
}
else if(Mode == Seconds_1S)
{
//1s
EPD_4IN2_V2_SendCommand(0x1A); // Write to temperature register
EPD_4IN2_V2_SendData(0x5A);
}
EPD_4IN2_V2_SendCommand(0x22); // Load temperature value
EPD_4IN2_V2_SendData(0x91);
EPD_4IN2_V2_SendCommand(0x20);
EPD_4IN2_V2_ReadBusy();
EPD_4IN2_V2_SendCommand(0x11); // data entry mode
EPD_4IN2_V2_SendData(0x03); // X-mode
EPD_4IN2_V2_SetWindows(0, 0, EPD_4IN2_V2_WIDTH-1, EPD_4IN2_V2_HEIGHT-1);
EPD_4IN2_V2_SetCursor(0, 0);
EPD_4IN2_V2_ReadBusy();
}
void EPD_4IN2_V2_Init_4Gray(void)
{
EPD_4IN2_V2_Reset();
EPD_4IN2_V2_SendCommand(0x12); //SWRESET
EPD_4IN2_V2_ReadBusy();
EPD_4IN2_V2_SendCommand(0x21);
EPD_4IN2_V2_SendData(0x00);
EPD_4IN2_V2_SendData(0x00);
EPD_4IN2_V2_SendCommand(0x3C);
EPD_4IN2_V2_SendData(0x03);
EPD_4IN2_V2_SendCommand(0x0C); //BTST
EPD_4IN2_V2_SendData(0x8B);//8B
EPD_4IN2_V2_SendData(0x9C);//9C
EPD_4IN2_V2_SendData(0xA4);//96 A4
EPD_4IN2_V2_SendData(0x0F);//0F
EPD_4IN2_V2_4Gray_lut(); //LUT
EPD_4IN2_V2_SendCommand(0x11); // data entry mode
EPD_4IN2_V2_SendData(0x03); // X-mode
EPD_4IN2_V2_SetWindows(0, 0, EPD_4IN2_V2_WIDTH-1, EPD_4IN2_V2_HEIGHT-1);
EPD_4IN2_V2_SetCursor(0, 0);
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_4IN2_V2_Clear(void)
{
UWORD Width, Height;
Width = (EPD_4IN2_V2_WIDTH % 8 == 0)? (EPD_4IN2_V2_WIDTH / 8 ): (EPD_4IN2_V2_WIDTH / 8 + 1);
Height = EPD_4IN2_V2_HEIGHT;
EPD_4IN2_V2_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2_V2_SendData(0xFF);
}
}
EPD_4IN2_V2_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2_V2_SendData(0xFF);
}
}
EPD_4IN2_V2_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_4IN2_V2_Display(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_4IN2_V2_WIDTH % 8 == 0)? (EPD_4IN2_V2_WIDTH / 8 ): (EPD_4IN2_V2_WIDTH / 8 + 1);
Height = EPD_4IN2_V2_HEIGHT;
EPD_4IN2_V2_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2_V2_SendData(Image[i + j * Width]);
}
}
EPD_4IN2_V2_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2_V2_SendData(Image[i + j * Width]);
}
}
EPD_4IN2_V2_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and fast displays
parameter:
******************************************************************************/
void EPD_4IN2_V2_Display_Fast(UBYTE *Image)
{
UWORD Width, Height;
Width = (EPD_4IN2_V2_WIDTH % 8 == 0)? (EPD_4IN2_V2_WIDTH / 8 ): (EPD_4IN2_V2_WIDTH / 8 + 1);
Height = EPD_4IN2_V2_HEIGHT;
EPD_4IN2_V2_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2_V2_SendData(Image[i + j * Width]);
}
}
EPD_4IN2_V2_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2_V2_SendData(Image[i + j * Width]);
}
}
EPD_4IN2_V2_TurnOnDisplay_Fast();
}
void EPD_4IN2_V2_Display_4Gray(UBYTE *Image)
{
UDOUBLE i,j,k,m;
UBYTE temp1,temp2,temp3;
/****Color display description****
white gray2 gray1 black
0x10| 01 01 00 00
0x13| 01 00 01 00
*********************************/
EPD_4IN2_V2_SendCommand(0x24);
// EPD_4IN2_HEIGHT
// EPD_4IN2_WIDTH
for(m = 0; m<EPD_4IN2_V2_HEIGHT;m++)
for(i=0;i<EPD_4IN2_V2_WIDTH/8;i++)
{
temp3=0;
for(j=0;j<2;j++)
{
temp1 = Image[(m*(EPD_4IN2_V2_WIDTH/8)+i)*2+j];
for(k=0;k<2;k++)
{
temp2 = temp1&0xC0 ;
if(temp2 == 0xC0)
temp3 |= 0x01;//white
else if(temp2 == 0x00)
temp3 |= 0x00; //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 |= 0x01;
else if(temp2 == 0x00) //black
temp3 |= 0x00;
else if(temp2 == 0x80)
temp3 |= 0x00; //gray1
else //0x40
temp3 |= 0x01; //gray2
if(j!=1 || k!=1)
temp3 <<= 1;
temp1 <<= 2;
}
}
EPD_4IN2_V2_SendData(temp3);
}
// new data
EPD_4IN2_V2_SendCommand(0x26);
for(m = 0; m<EPD_4IN2_V2_HEIGHT;m++)
for(i=0;i<EPD_4IN2_V2_WIDTH/8;i++)
{
temp3=0;
for(j=0;j<2;j++)
{
temp1 = Image[(m*(EPD_4IN2_V2_WIDTH/8)+i)*2+j];
for(k=0;k<2;k++)
{
temp2 = temp1&0xC0 ;
if(temp2 == 0xC0)
temp3 |= 0x01;//white
else if(temp2 == 0x00)
temp3 |= 0x00; //black
else if(temp2 == 0x80)
temp3 |= 0x01; //gray1
else //0x40
temp3 |= 0x00; //gray2
temp3 <<= 1;
temp1 <<= 2;
temp2 = temp1&0xC0 ;
if(temp2 == 0xC0) //white
temp3 |= 0x01;
else if(temp2 == 0x00) //black
temp3 |= 0x00;
else if(temp2 == 0x80)
temp3 |= 0x01; //gray1
else //0x40
temp3 |= 0x00; //gray2
if(j!=1 || k!=1)
temp3 <<= 1;
temp1 <<= 2;
}
}
EPD_4IN2_V2_SendData(temp3);
}
EPD_4IN2_V2_TurnOnDisplay_4Gray();
}
// Send partial data for partial refresh
void EPD_4IN2_V2_PartialDisplay(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;
EPD_4IN2_V2_SendCommand(0x3C); //BorderWavefrom,
EPD_4IN2_V2_SendData(0x80);
EPD_4IN2_V2_SendCommand(0x21);
EPD_4IN2_V2_SendData(0x00);
EPD_4IN2_V2_SendData(0x00);
EPD_4IN2_V2_SendCommand(0x3C);
EPD_4IN2_V2_SendData(0x80);
EPD_4IN2_V2_SendCommand(0x44); // set RAM x address start/end, in page 35
EPD_4IN2_V2_SendData(Xstart & 0xff); // RAM x address start at 00h;
EPD_4IN2_V2_SendData(Xend & 0xff); // RAM x address end at 0fh(15+1)*8->128
EPD_4IN2_V2_SendCommand(0x45); // set RAM y address start/end, in page 35
EPD_4IN2_V2_SendData(Ystart & 0xff); // RAM y address start at 0127h;
EPD_4IN2_V2_SendData((Ystart>>8) & 0x01); // RAM y address start at 0127h;
EPD_4IN2_V2_SendData(Yend & 0xff); // RAM y address end at 00h;
EPD_4IN2_V2_SendData((Yend>>8) & 0x01);
EPD_4IN2_V2_SendCommand(0x4E); // set RAM x address count to 0;
EPD_4IN2_V2_SendData(Xstart & 0xff);
EPD_4IN2_V2_SendCommand(0x4F); // set RAM y address count to 0X127;
EPD_4IN2_V2_SendData(Ystart & 0xff);
EPD_4IN2_V2_SendData((Ystart>>8) & 0x01);
EPD_4IN2_V2_SendCommand(0x24);
for (i = 0; i < IMAGE_COUNTER; i++) {
EPD_4IN2_V2_SendData(Image[i]);
}
EPD_4IN2_V2_TurnOnDisplay_Partial();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_4IN2_V2_Sleep(void)
{
EPD_4IN2_V2_SendCommand(0x10); // DEEP_SLEEP
EPD_4IN2_V2_SendData(0x01);
DEV_Delay_ms(200);
}

View File

@@ -0,0 +1,56 @@
/*****************************************************************************
* | File : EPD_4in2_V2.h
* | Author : Waveshare team
* | Function : 4.2inch e-paper V2
* | Info :
*----------------
* | This version: V1.0
* | Date : 2023-09-12
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#ifndef _EPD_4IN2_V2_H_
#define _EPD_4IN2_V2_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_4IN2_V2_WIDTH 400
#define EPD_4IN2_V2_HEIGHT 300
#define Seconds_1_5S 0
#define Seconds_1S 1
#define KEY0 15
#define KEY1 17
void EPD_4IN2_V2_Init(void);
void EPD_4IN2_V2_Init_Fast(UBYTE Mode);
void EPD_4IN2_V2_Init_4Gray(void);
void EPD_4IN2_V2_Clear(void);
void EPD_4IN2_V2_Display(UBYTE *Image);
void EPD_4IN2_V2_Display_Fast(UBYTE *Image);
void EPD_4IN2_V2_Display_4Gray(UBYTE *Image);
void EPD_4IN2_V2_PartialDisplay(UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend);
void EPD_4IN2_V2_Sleep(void);
#endif

View File

@@ -0,0 +1,366 @@
/*****************************************************************************
* | File : EPD_4in2b_V2.c
* | Author : Waveshare team
* | Function : 4.2inch e-paper b V2
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-11-25
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#include "EPD_4in2b_V2.h"
#include "Debug.h"
static uint8_t flag=0;
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_4IN2B_V2_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_4IN2B_V2_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_4IN2B_V2_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_4IN2B_V2_ReadBusy_old(void)
{
Debug("e-Paper busy\r\n");
do{
EPD_4IN2B_V2_SendCommand(0x71);
DEV_Delay_ms(20);
}while(!(DEV_Digital_Read(EPD_BUSY_PIN))); //0: busy, 1: idle
DEV_Delay_ms(20);
Debug("e-Paper busy release\r\n");
}
void EPD_4IN2B_V2_ReadBusy_new(void)
{
Debug("e-Paper busy\r\n");
while(DEV_Digital_Read(EPD_BUSY_PIN) == 1) { //LOW: idle, HIGH: busy
DEV_Delay_ms(10);
}
Debug("e-Paper busy release\r\n");
}
void EPD_4IN2B_V2_ReadBusy(void)
{
if(flag == 0)
EPD_4IN2B_V2_ReadBusy_new();
else
EPD_4IN2B_V2_ReadBusy_old();
}
/******************************************************************************
function : Setting the display window
parameter:
******************************************************************************/
static void EPD_4IN2B_V2_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
{
EPD_4IN2B_V2_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION
EPD_4IN2B_V2_SendData((Xstart>>3) & 0xFF);
EPD_4IN2B_V2_SendData((Xend>>3) & 0xFF);
EPD_4IN2B_V2_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION
EPD_4IN2B_V2_SendData(Ystart & 0xFF);
EPD_4IN2B_V2_SendData((Ystart >> 8) & 0xFF);
EPD_4IN2B_V2_SendData(Yend & 0xFF);
EPD_4IN2B_V2_SendData((Yend >> 8) & 0xFF);
}
/******************************************************************************
function : Set Cursor
parameter:
******************************************************************************/
static void EPD_4IN2B_V2_SetCursor(UWORD Xstart, UWORD Ystart)
{
EPD_4IN2B_V2_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
EPD_4IN2B_V2_SendData((Xstart>>3) & 0xFF);
EPD_4IN2B_V2_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
EPD_4IN2B_V2_SendData(Ystart & 0xFF);
EPD_4IN2B_V2_SendData((Ystart >> 8) & 0xFF);
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_4IN2B_V2_Init_old(void)
{
EPD_4IN2B_V2_Reset();
EPD_4IN2B_V2_ReadBusy();
EPD_4IN2B_V2_SendCommand(0x04); // soft reset
EPD_4IN2B_V2_ReadBusy();
EPD_4IN2B_V2_SendCommand(0x00); //BorderWavefrom
EPD_4IN2B_V2_SendData(0x0F);
}
void EPD_4IN2B_V2_Init_new(void)
{
EPD_4IN2B_V2_Reset();
EPD_4IN2B_V2_ReadBusy();
EPD_4IN2B_V2_SendCommand(0x12); // soft reset
EPD_4IN2B_V2_ReadBusy();
// EPD_4IN2B_V2_SendCommand(0x01); //Driver output control
// EPD_4IN2B_V2_SendData((EPD_4IN2B_V2_HEIGHT-1)%256);
// EPD_4IN2B_V2_SendData((EPD_4IN2B_V2_HEIGHT-1)/256);
// EPD_4IN2B_V2_SendData(0x00);
EPD_4IN2B_V2_SendCommand(0x3C); //BorderWavefrom
EPD_4IN2B_V2_SendData(0x05);
EPD_4IN2B_V2_SendCommand(0x18); //Read built-in temperature sensor
EPD_4IN2B_V2_SendData(0x80);
EPD_4IN2B_V2_SendCommand(0x11); // data entry mode
EPD_4IN2B_V2_SendData(0x03); // X-mode
EPD_4IN2B_V2_SetWindows(0, 0, EPD_4IN2B_V2_WIDTH-1, EPD_4IN2B_V2_HEIGHT-1);
EPD_4IN2B_V2_SetCursor(0, 0);
EPD_4IN2B_V2_ReadBusy();
}
void EPD_4IN2B_V2_Init()
{
uint8_t i=0;
EPD_4IN2B_V2_Reset();
DEV_GPIO_Init_1();
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_SPI_SendData(0x2F);
DEV_Delay_ms(50);
DEV_Digital_Write(EPD_DC_PIN, 1);
i = DEV_SPI_ReadData();
printf("%02x\n",i);
DEV_SPI_Init();
if(i == 0x01)
{
flag = 0;
EPD_4IN2B_V2_Init_new();
}
else
{
flag = 1;
EPD_4IN2B_V2_Init_old();
}
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_4IN2B_V2_Clear_old(void)
{
UWORD Width, Height;
Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
Height = EPD_4IN2B_V2_HEIGHT;
EPD_4IN2B_V2_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(0xFF);
}
}
EPD_4IN2B_V2_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(0x00);
}
}
EPD_4IN2B_V2_SendCommand(0x12);
DEV_Delay_ms(100);
EPD_4IN2B_V2_ReadBusy();
}
void EPD_4IN2B_V2_Clear_new(void)
{
UWORD Width, Height;
Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
Height = EPD_4IN2B_V2_HEIGHT;
EPD_4IN2B_V2_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(0xFF);
}
}
EPD_4IN2B_V2_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(0x00);
}
}
EPD_4IN2B_V2_SendCommand(0x22);
EPD_4IN2B_V2_SendData(0xF7);
EPD_4IN2B_V2_SendCommand(0x20);
EPD_4IN2B_V2_ReadBusy();
}
void EPD_4IN2B_V2_Clear(void)
{
if(flag == 0)
EPD_4IN2B_V2_Clear_new();
else
EPD_4IN2B_V2_Clear_old();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_4IN2B_V2_Display_old(const UBYTE *blackimage, const UBYTE *ryimage)
{
UWORD Width, Height;
Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
Height = EPD_4IN2B_V2_HEIGHT;
EPD_4IN2B_V2_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(blackimage[i + j * Width]);
}
}
EPD_4IN2B_V2_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(~ryimage[i + j * Width]);
}
}
EPD_4IN2B_V2_SendCommand(0x12);
DEV_Delay_ms(100);
EPD_4IN2B_V2_ReadBusy();
}
void EPD_4IN2B_V2_Display_new(const UBYTE *blackimage, const UBYTE *ryimage)
{
UWORD Width, Height;
Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
Height = EPD_4IN2B_V2_HEIGHT;
EPD_4IN2B_V2_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(blackimage[i + j * Width]);
}
}
EPD_4IN2B_V2_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(~ryimage[i + j * Width]);
}
}
EPD_4IN2B_V2_SendCommand(0x22);
EPD_4IN2B_V2_SendData(0xF7);
EPD_4IN2B_V2_SendCommand(0x20);
EPD_4IN2B_V2_ReadBusy();
}
void EPD_4IN2B_V2_Display(const UBYTE *blackimage, const UBYTE *ryimage)
{
if(flag == 0)
EPD_4IN2B_V2_Display_new(blackimage, ryimage);
else
EPD_4IN2B_V2_Display_old(blackimage, ryimage);
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_4IN2B_V2_Sleep_old(void)
{
EPD_4IN2B_V2_SendCommand(0X50);
EPD_4IN2B_V2_SendData(0xf7);
EPD_4IN2B_V2_SendCommand(0x02);
EPD_4IN2B_V2_ReadBusy();
EPD_4IN2B_V2_SendCommand(0x07);
EPD_4IN2B_V2_SendData(0XA5);
}
void EPD_4IN2B_V2_Sleep_new(void)
{
EPD_4IN2B_V2_SendCommand(0X10); //deep sleep
EPD_4IN2B_V2_SendData(0x03);
}
void EPD_4IN2B_V2_Sleep(void)
{
if(flag == 0)
EPD_4IN2B_V2_Sleep_new();
else
EPD_4IN2B_V2_Sleep_old();
}

View File

@@ -0,0 +1,48 @@
/*****************************************************************************
* | File : EPD_4in2b_V2.h
* | Author : Waveshare team
* | Function : 4.2inch e-paper b&c
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-11-25
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#ifndef __EPD_4IN2B_V2_H_
#define __EPD_4IN2B_V2_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_4IN2B_V2_WIDTH 400
#define EPD_4IN2B_V2_HEIGHT 300
#define KEY0 15
#define KEY1 17
void EPD_4IN2B_V2_Init(void);
void EPD_4IN2B_V2_Clear(void);
void EPD_4IN2B_V2_Display(const UBYTE *blackimage, const UBYTE *ryimage);
void EPD_4IN2B_V2_Sleep(void);
#endif

View File

@@ -0,0 +1,364 @@
/*****************************************************************************
* | File : EPD_4in2b_V2.c
* | Author : Waveshare team
* | Function : 4.2inch e-paper b V2
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-11-25
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#include "EPD_4in2b_V2_old.h"
#include "Debug.h"
static uint8_t flag=0;
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_4IN2B_V2_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_4IN2B_V2_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_SendData(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_4IN2B_V2_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_SendData(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
static void EPD_4IN2B_V2_ReadBusy_old(void)
{
Debug("e-Paper busy\r\n");
do{
EPD_4IN2B_V2_SendCommand(0x71);
DEV_Delay_ms(20);
}while(!(DEV_Digital_Read(EPD_BUSY_PIN))); //0: busy, 1: idle
DEV_Delay_ms(20);
Debug("e-Paper busy release\r\n");
}
static void EPD_4IN2B_V2_ReadBusy_new(void)
{
Debug("e-Paper busy\r\n");
while(DEV_Digital_Read(EPD_BUSY_PIN) == 1) { //LOW: idle, HIGH: busy
DEV_Delay_ms(10);
}
Debug("e-Paper busy release\r\n");
}
static void EPD_4IN2B_V2_ReadBusy(void)
{
if(flag == 0)
EPD_4IN2B_V2_ReadBusy_new();
else
EPD_4IN2B_V2_ReadBusy_old();
}
/******************************************************************************
function : Setting the display window
parameter:
******************************************************************************/
static void EPD_4IN2B_V2_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
{
EPD_4IN2B_V2_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION
EPD_4IN2B_V2_SendData((Xstart>>3) & 0xFF);
EPD_4IN2B_V2_SendData((Xend>>3) & 0xFF);
EPD_4IN2B_V2_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION
EPD_4IN2B_V2_SendData(Ystart & 0xFF);
EPD_4IN2B_V2_SendData((Ystart >> 8) & 0xFF);
EPD_4IN2B_V2_SendData(Yend & 0xFF);
EPD_4IN2B_V2_SendData((Yend >> 8) & 0xFF);
}
/******************************************************************************
function : Set Cursor
parameter:
******************************************************************************/
static void EPD_4IN2B_V2_SetCursor(UWORD Xstart, UWORD Ystart)
{
EPD_4IN2B_V2_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
EPD_4IN2B_V2_SendData((Xstart>>3) & 0xFF);
EPD_4IN2B_V2_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
EPD_4IN2B_V2_SendData(Ystart & 0xFF);
EPD_4IN2B_V2_SendData((Ystart >> 8) & 0xFF);
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_4IN2B_V2_Init_old_1(void)
{
EPD_4IN2B_V2_Reset();
EPD_4IN2B_V2_ReadBusy();
EPD_4IN2B_V2_SendCommand(0x04); // soft reset
EPD_4IN2B_V2_ReadBusy();
EPD_4IN2B_V2_SendCommand(0x00); //BorderWavefrom
EPD_4IN2B_V2_SendData(0x0F);
}
void EPD_4IN2B_V2_Init_new_1(void)
{
EPD_4IN2B_V2_Reset();
EPD_4IN2B_V2_ReadBusy();
EPD_4IN2B_V2_SendCommand(0x12); // soft reset
EPD_4IN2B_V2_ReadBusy();
// EPD_4IN2B_V2_SendCommand(0x01); //Driver output control
// EPD_4IN2B_V2_SendData((EPD_4IN2B_V2_HEIGHT-1)%256);
// EPD_4IN2B_V2_SendData((EPD_4IN2B_V2_HEIGHT-1)/256);
// EPD_4IN2B_V2_SendData(0x00);
EPD_4IN2B_V2_SendCommand(0x3C); //BorderWavefrom
EPD_4IN2B_V2_SendData(0x05);
EPD_4IN2B_V2_SendCommand(0x18); //Read built-in temperature sensor
EPD_4IN2B_V2_SendData(0x80);
EPD_4IN2B_V2_SendCommand(0x11); // data entry mode
EPD_4IN2B_V2_SendData(0x03); // X-mode
EPD_4IN2B_V2_SetWindows(0, 0, EPD_4IN2B_V2_WIDTH-1, EPD_4IN2B_V2_HEIGHT-1);
EPD_4IN2B_V2_SetCursor(0, 0);
EPD_4IN2B_V2_ReadBusy();
}
void EPD_4IN2B_V2_Init_1()
{
uint8_t i=0;
EPD_4IN2B_V2_Reset();
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_SPI_SendData(0x2F);
DEV_Delay_ms(50);
DEV_Digital_Write(EPD_DC_PIN, 1);
i = DEV_SPI_ReadData();
// printf("%02x\n",i);
if(i == 0x01)
{
flag = 0;
EPD_4IN2B_V2_Init_new_1();
}
else
{
flag = 1;
EPD_4IN2B_V2_Init_old_1();
}
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_4IN2B_V2_Clear_old_1(void)
{
UWORD Width, Height;
Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
Height = EPD_4IN2B_V2_HEIGHT;
EPD_4IN2B_V2_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(0xFF);
}
}
EPD_4IN2B_V2_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(0xFF);
}
}
EPD_4IN2B_V2_SendCommand(0x12);
DEV_Delay_ms(100);
EPD_4IN2B_V2_ReadBusy();
}
void EPD_4IN2B_V2_Clear_new_1(void)
{
UWORD Width, Height;
Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
Height = EPD_4IN2B_V2_HEIGHT;
EPD_4IN2B_V2_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(0xFF);
}
}
EPD_4IN2B_V2_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(0x00);
}
}
EPD_4IN2B_V2_SendCommand(0x22);
EPD_4IN2B_V2_SendData(0xF7);
EPD_4IN2B_V2_SendCommand(0x20);
EPD_4IN2B_V2_ReadBusy();
}
void EPD_4IN2B_V2_Clear_1(void)
{
if(flag == 0)
EPD_4IN2B_V2_Clear_new_1();
else
EPD_4IN2B_V2_Clear_old_1();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_4IN2B_V2_Display_old_1(const UBYTE *blackimage, const UBYTE *ryimage)
{
UWORD Width, Height;
Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
Height = EPD_4IN2B_V2_HEIGHT;
EPD_4IN2B_V2_SendCommand(0x10);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(blackimage[i + j * Width]);
}
}
EPD_4IN2B_V2_SendCommand(0x13);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(ryimage[i + j * Width]);
}
}
EPD_4IN2B_V2_SendCommand(0x12);
DEV_Delay_ms(100);
EPD_4IN2B_V2_ReadBusy();
}
void EPD_4IN2B_V2_Display_new_1(const UBYTE *blackimage, const UBYTE *ryimage)
{
UWORD Width, Height;
Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
Height = EPD_4IN2B_V2_HEIGHT;
EPD_4IN2B_V2_SendCommand(0x24);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(blackimage[i + j * Width]);
}
}
EPD_4IN2B_V2_SendCommand(0x26);
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_4IN2B_V2_SendData(~ryimage[i + j * Width]);
}
}
EPD_4IN2B_V2_SendCommand(0x22);
EPD_4IN2B_V2_SendData(0xF7);
EPD_4IN2B_V2_SendCommand(0x20);
EPD_4IN2B_V2_ReadBusy();
}
void EPD_4IN2B_V2_Display_1(const UBYTE *blackimage, const UBYTE *ryimage)
{
if(flag == 0)
EPD_4IN2B_V2_Display_new_1(blackimage, ryimage);
else
EPD_4IN2B_V2_Display_old_1(blackimage, ryimage);
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_4IN2B_V2_Sleep_old_1(void)
{
EPD_4IN2B_V2_SendCommand(0X50);
EPD_4IN2B_V2_SendData(0xf7);
EPD_4IN2B_V2_SendCommand(0x02);
EPD_4IN2B_V2_ReadBusy();
EPD_4IN2B_V2_SendCommand(0x07);
EPD_4IN2B_V2_SendData(0XA5);
}
void EPD_4IN2B_V2_Sleep_new_1(void)
{
EPD_4IN2B_V2_SendCommand(0X10); //deep sleep
EPD_4IN2B_V2_SendData(0x03);
}
void EPD_4IN2B_V2_Sleep_1(void)
{
if(flag == 0)
EPD_4IN2B_V2_Sleep_new_1();
else
EPD_4IN2B_V2_Sleep_old_1();
}

View File

@@ -0,0 +1,45 @@
/*****************************************************************************
* | File : EPD_4in2b_V2.h
* | Author : Waveshare team
* | Function : 4.2inch e-paper b&c
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-11-25
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#ifndef __EPD_4IN2B_V2_OLD_H_
#define __EPD_4IN2B_V2_OLD_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_4IN2B_V2_WIDTH 400
#define EPD_4IN2B_V2_HEIGHT 300
void EPD_4IN2B_V2_Init_1(void);
void EPD_4IN2B_V2_Clear_1(void);
void EPD_4IN2B_V2_Display_1(const UBYTE *blackimage, const UBYTE *ryimage);
void EPD_4IN2B_V2_Sleep_1(void);
#endif

View File

@@ -0,0 +1,225 @@
/*****************************************************************************
* | File : EPD_2in9_V2.c
* | Author : Waveshare team
* | Function : 2.9inch e-paper V2
* | Info :
*----------------
* | This version: V1.0
* | Date : 2021-06-03
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#include "EPD_5in65f.h"
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_5IN65F_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_5IN65F_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_5IN65F_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
static void EPD_5IN65F_BusyHigh(void)// If BUSYN=0 then waiting
{
while(!(DEV_Digital_Read(EPD_BUSY_PIN)));
}
static void EPD_5IN65F_BusyLow(void)// If BUSYN=1 then waiting
{
while(DEV_Digital_Read(EPD_BUSY_PIN));
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_5IN65F_Init(void)
{
EPD_5IN65F_Reset();
EPD_5IN65F_BusyHigh();
EPD_5IN65F_SendCommand(0x00);
EPD_5IN65F_SendData(0xEF);
EPD_5IN65F_SendData(0x08);
EPD_5IN65F_SendCommand(0x01);
EPD_5IN65F_SendData(0x37);
EPD_5IN65F_SendData(0x00);
EPD_5IN65F_SendData(0x23);
EPD_5IN65F_SendData(0x23);
EPD_5IN65F_SendCommand(0x03);
EPD_5IN65F_SendData(0x00);
EPD_5IN65F_SendCommand(0x06);
EPD_5IN65F_SendData(0xC7);
EPD_5IN65F_SendData(0xC7);
EPD_5IN65F_SendData(0x1D);
EPD_5IN65F_SendCommand(0x30);
EPD_5IN65F_SendData(0x3C);
EPD_5IN65F_SendCommand(0x41);
EPD_5IN65F_SendData(0x00);
EPD_5IN65F_SendCommand(0x50);
EPD_5IN65F_SendData(0x37);
EPD_5IN65F_SendCommand(0x60);
EPD_5IN65F_SendData(0x22);
EPD_5IN65F_SendCommand(0x61);
EPD_5IN65F_SendData(0x02);
EPD_5IN65F_SendData(0x58);
EPD_5IN65F_SendData(0x01);
EPD_5IN65F_SendData(0xC0);
EPD_5IN65F_SendCommand(0xE3);
EPD_5IN65F_SendData(0xAA);
DEV_Delay_ms(100);
EPD_5IN65F_SendCommand(0x50);
EPD_5IN65F_SendData(0x37);
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_5IN65F_Clear(UBYTE color)
{
EPD_5IN65F_SendCommand(0x61);//Set Resolution setting
EPD_5IN65F_SendData(0x02);
EPD_5IN65F_SendData(0x58);
EPD_5IN65F_SendData(0x01);
EPD_5IN65F_SendData(0xC0);
EPD_5IN65F_SendCommand(0x10);
for(int i=0; i<EPD_5IN65F_WIDTH/2; i++) {
for(int j=0; j<EPD_5IN65F_HEIGHT; j++)
EPD_5IN65F_SendData((color<<4)|color);
}
EPD_5IN65F_SendCommand(0x04);//0x04
EPD_5IN65F_BusyHigh();
EPD_5IN65F_SendCommand(0x12);//0x12
EPD_5IN65F_BusyHigh();
EPD_5IN65F_SendCommand(0x02); //0x02
EPD_5IN65F_BusyLow();
DEV_Delay_ms(500);
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_5IN65F_Display(const UBYTE *image)
{
unsigned long i,j;
EPD_5IN65F_SendCommand(0x61);//Set Resolution setting
EPD_5IN65F_SendData(0x02);
EPD_5IN65F_SendData(0x58);
EPD_5IN65F_SendData(0x01);
EPD_5IN65F_SendData(0xC0);
EPD_5IN65F_SendCommand(0x10);
for(i=0; i<EPD_5IN65F_HEIGHT; i++) {
for(j=0; j<EPD_5IN65F_WIDTH/2; j++)
EPD_5IN65F_SendData(image[j+((EPD_5IN65F_WIDTH/2)*i)]);
}
EPD_5IN65F_SendCommand(0x04);//0x04
EPD_5IN65F_BusyHigh();
EPD_5IN65F_SendCommand(0x12);//0x12
EPD_5IN65F_BusyHigh();
EPD_5IN65F_SendCommand(0x02); //0x02
EPD_5IN65F_BusyLow();
DEV_Delay_ms(200);
}
/******************************************************************************
function : Sends the part image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_5IN65F_Display_part(const UBYTE *image, UWORD xstart, UWORD ystart,
UWORD image_width, UWORD image_heigh)
{
unsigned long i,j;
EPD_5IN65F_SendCommand(0x61);//Set Resolution setting
EPD_5IN65F_SendData(0x02);
EPD_5IN65F_SendData(0x58);
EPD_5IN65F_SendData(0x01);
EPD_5IN65F_SendData(0xC0);
EPD_5IN65F_SendCommand(0x10);
for(i=0; i<EPD_5IN65F_HEIGHT; i++) {
for(j=0; j< EPD_5IN65F_WIDTH/2; j++) {
if(i<image_heigh+ystart && i>=ystart && j<(image_width+xstart)/2 && j>=xstart/2) {
EPD_5IN65F_SendData(image[(j-xstart/2) + (image_width/2*(i-ystart))]);
}
else {
EPD_5IN65F_SendData(0x11);
}
}
}
EPD_5IN65F_SendCommand(0x04);//0x04
EPD_5IN65F_BusyHigh();
EPD_5IN65F_SendCommand(0x12);//0x12
EPD_5IN65F_BusyHigh();
EPD_5IN65F_SendCommand(0x02); //0x02
EPD_5IN65F_BusyLow();
DEV_Delay_ms(200);
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_5IN65F_Sleep(void)
{
DEV_Delay_ms(100);
EPD_5IN65F_SendCommand(0x07);
EPD_5IN65F_SendData(0xA5);
DEV_Delay_ms(100);
DEV_Digital_Write(EPD_RST_PIN, 0); // Reset
}

View File

@@ -0,0 +1,65 @@
/*****************************************************************************
* | File : EPD_2in9_V2.h
* | Author : Waveshare team
* | Function : 2.9inch e-paper V2
* | Info :
*----------------
* | This version: V1.0
* | Date : 2021-06-03
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#ifndef __EPD_5IN65F_H__
#define __EPD_5IN65F_H__
#include "DEV_Config.h"
/**********************************
Color Index
**********************************/
#define EPD_5IN65F_BLACK 0x0 /// 000
#define EPD_5IN65F_WHITE 0x1 /// 001
#define EPD_5IN65F_GREEN 0x2 /// 010
#define EPD_5IN65F_BLUE 0x3 /// 011
#define EPD_5IN65F_RED 0x4 /// 100
#define EPD_5IN65F_YELLOW 0x5 /// 101
#define EPD_5IN65F_ORANGE 0x6 /// 110
#define EPD_5IN65F_CLEAN 0x7 /// 111 unavailable Afterimage
#define EPD_5IN65F_WIDTH 600
#define EPD_5IN65F_HEIGHT 448
#define KEY0 15
#define KEY1 17
#define KEY2 2
void EPD_5IN65F_Clear(UBYTE color);
void EPD_5IN65F_Sleep(void);
void EPD_5IN65F_Display(const UBYTE *image);
void EPD_5IN65F_Init(void);
void EPD_5IN65F_Display_part(const UBYTE *image, UWORD xstart, UWORD ystart, UWORD image_width, UWORD image_heigh);
#endif

View File

@@ -0,0 +1,195 @@
/*****************************************************************************
* | File : EPD_5in83_V2.c
* | Author : Waveshare team
* | Function : 5.83inch e-paper V2
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-11-23
* | Info :
* -----------------------------------------------------------------------------
#
# 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.
#
******************************************************************************/
#include "EPD_5in83_V2.h"
#include "Debug.h"
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_5in83_V2_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(5);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_5in83_V2_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_5in83_V2_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
static void EPD_5in83_V2_ReadBusy(void)
{
Debug("e-Paper busy\r\n");
do {
EPD_5in83_V2_SendCommand(0x71);
DEV_Delay_ms(10);
}
while(!DEV_Digital_Read(EPD_BUSY_PIN));
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_5in83_V2_TurnOnDisplay(void)
{
EPD_5in83_V2_SendCommand(0x12); //DISPLAY REFRESH
DEV_Delay_ms(100); //!!!The delay here is necessary, 200uS at least!!!
EPD_5in83_V2_ReadBusy(); //waiting for the electronic paper IC to release the idle signal
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
void EPD_5in83_V2_Init(void)
{
EPD_5in83_V2_Reset();
EPD_5in83_V2_SendCommand(0x01); //POWER SETTING
EPD_5in83_V2_SendData (0x07);
EPD_5in83_V2_SendData (0x07); //VGH=20V,VGL=-20V
EPD_5in83_V2_SendData (0x3f); //VDH=15V
EPD_5in83_V2_SendData (0x3f); //VDL=-15V
EPD_5in83_V2_SendCommand(0x04); //POWER ON
DEV_Delay_ms(100);
EPD_5in83_V2_ReadBusy(); //waiting for the electronic paper IC to release the idle signal
EPD_5in83_V2_SendCommand(0X00); //PANNEL SETTING
EPD_5in83_V2_SendData(0x1F); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_5in83_V2_SendCommand(0x61); //tres
EPD_5in83_V2_SendData (0x02); //source 648
EPD_5in83_V2_SendData (0x88);
EPD_5in83_V2_SendData (0x01); //gate 480
EPD_5in83_V2_SendData (0xE0);
EPD_5in83_V2_SendCommand(0X15);
EPD_5in83_V2_SendData(0x00);
EPD_5in83_V2_SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_5in83_V2_SendData(0x10);
EPD_5in83_V2_SendData(0x07);
EPD_5in83_V2_SendCommand(0X60); //TCON SETTING
EPD_5in83_V2_SendData(0x22);
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_5in83_V2_Clear(void)
{
UWORD Width, Height, i;
Width = (EPD_5in83_V2_WIDTH % 8 == 0)? (EPD_5in83_V2_WIDTH / 8 ): (EPD_5in83_V2_WIDTH / 8 + 1);
Height = EPD_5in83_V2_HEIGHT;
EPD_5in83_V2_SendCommand(0x10);
for(i=0; i<Width*Height; i++) {
EPD_5in83_V2_SendData(0x00);
}
EPD_5in83_V2_SendCommand(0x13);
for(i=0; i<Width*Height; i++) {
EPD_5in83_V2_SendData(0x00);
}
EPD_5in83_V2_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_5in83_V2_Display(UBYTE *Image)
{
UWORD Width, Height, i, j;
Width = (EPD_5in83_V2_WIDTH % 8 == 0)? (EPD_5in83_V2_WIDTH / 8 ): (EPD_5in83_V2_WIDTH / 8 + 1);
Height = EPD_5in83_V2_HEIGHT;
EPD_5in83_V2_SendCommand(0x10);
for(i=0;i<Height;i++) {
for(j=0; j<Width; j++) {
EPD_5in83_V2_SendData(0x00);
}
}
EPD_5in83_V2_SendCommand(0x13);
for(i=0;i<Height;i++) {
for(j=0; j<Width; j++) {
EPD_5in83_V2_SendData(~Image[i*Width + j]);
}
}
EPD_5in83_V2_TurnOnDisplay();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_5in83_V2_Sleep(void)
{
EPD_5in83_V2_SendCommand(0X02); //power off
EPD_5in83_V2_ReadBusy(); //waiting for the electronic paper IC to release the idle signal
EPD_5in83_V2_SendCommand(0X07); //deep sleep
EPD_5in83_V2_SendData(0xA5);
}

View File

@@ -0,0 +1,44 @@
/*****************************************************************************
* | File : EPD_5in83_V2.h
* | Author : Waveshare team
* | Function : 5.83inch e-paper V2
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-11-23
* | Info :
#
# 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.
#
******************************************************************************/
#ifndef __EPD_5in83_V2_H_
#define __EPD_5in83_V2_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_5in83_V2_WIDTH 648
#define EPD_5in83_V2_HEIGHT 480
void EPD_5in83_V2_Init(void);
void EPD_5in83_V2_Clear(void);
void EPD_5in83_V2_Display(UBYTE *Image);
void EPD_5in83_V2_Sleep(void);
#endif

View File

@@ -0,0 +1,204 @@
/*****************************************************************************
* | File : EPD_5in83b_V2.c
* | Author : Waveshare team
* | Function : Electronic paper driver
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-07-04
* | Info :
******************************************************************************
# 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.
#
******************************************************************************/
#include "EPD_5in83b_V2.h"
#include "Debug.h"
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_5IN83B_V2_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_5IN83B_V2_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_5IN83B_V2_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_5IN83B_V2_WaitUntilIdle(void)
{
Debug("e-Paper busy\r\n");
UBYTE busy;
do
{
EPD_5IN83B_V2_SendCommand(0x71);
busy = DEV_Digital_Read(EPD_BUSY_PIN);
busy =!(busy & 0x01);
}
while(busy);
DEV_Delay_ms(200);
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_5IN83B_V2_TurnOnDisplay(void)
{
EPD_5IN83B_V2_SendCommand(0x12); //DISPLAY REFRESH
DEV_Delay_ms(100); //!!!The delay here is necessary, 200uS at least!!!
EPD_5IN83B_V2_WaitUntilIdle(); //waiting for the electronic paper IC to release the idle signal
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
UBYTE EPD_5IN83B_V2_Init(void)
{
EPD_5IN83B_V2_Reset();
EPD_5IN83B_V2_SendCommand(0x01); //POWER SETTING
EPD_5IN83B_V2_SendData (0x07);
EPD_5IN83B_V2_SendData (0x07); //VGH=20V,VGL=-20V
EPD_5IN83B_V2_SendData (0x3f); //VDH=15V
EPD_5IN83B_V2_SendData (0x3f); //VDL=-15V
EPD_5IN83B_V2_SendCommand(0x04); //POWER ON
DEV_Delay_ms(100);
EPD_5IN83B_V2_WaitUntilIdle(); //waiting for the electronic paper IC to release the idle signal
EPD_5IN83B_V2_SendCommand(0X00); //PANNEL SETTING
EPD_5IN83B_V2_SendData(0x0F); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_5IN83B_V2_SendCommand(0x61); //tres
EPD_5IN83B_V2_SendData (0x02); //source 648
EPD_5IN83B_V2_SendData (0x88);
EPD_5IN83B_V2_SendData (0x01); //gate 480
EPD_5IN83B_V2_SendData (0xe0);
EPD_5IN83B_V2_SendCommand(0X15);
EPD_5IN83B_V2_SendData(0x00);
EPD_5IN83B_V2_SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_5IN83B_V2_SendData(0x11);
EPD_5IN83B_V2_SendData(0x07);
EPD_5IN83B_V2_SendCommand(0X60); //TCON SETTING
EPD_5IN83B_V2_SendData(0x22);
return 0;
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_5IN83B_V2_Clear(void)
{
UWORD Width, Height;
Width =(EPD_5IN83B_V2_WIDTH % 8 == 0)?(EPD_5IN83B_V2_WIDTH / 8 ):(EPD_5IN83B_V2_WIDTH / 8 + 1);
Height = EPD_5IN83B_V2_HEIGHT;
UWORD i;
EPD_5IN83B_V2_SendCommand(0x10);
for(i=0; i<Width*Height; i++) {
EPD_5IN83B_V2_SendData(0xff);
}
EPD_5IN83B_V2_SendCommand(0x13);
for(i=0; i<Width*Height; i++) {
EPD_5IN83B_V2_SendData(0x00);
}
EPD_5IN83B_V2_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_5IN83B_V2_Display(const UBYTE *blackimage, const UBYTE *ryimage)
{
UDOUBLE Width, Height;
Width =(EPD_5IN83B_V2_WIDTH % 8 == 0)?(EPD_5IN83B_V2_WIDTH / 8 ):(EPD_5IN83B_V2_WIDTH / 8 + 1);
Height = EPD_5IN83B_V2_HEIGHT;
//send black data
EPD_5IN83B_V2_SendCommand(0x10);
for (UDOUBLE j = 0; j < Height; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
EPD_5IN83B_V2_SendData(blackimage[i + j * Width]);
}
}
//send red data
EPD_5IN83B_V2_SendCommand(0x13);
for (UDOUBLE j = 0; j < Height; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
EPD_5IN83B_V2_SendData(~ryimage[i + j * Width]);
}
}
EPD_5IN83B_V2_TurnOnDisplay();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_5IN83B_V2_Sleep(void)
{
EPD_5IN83B_V2_SendCommand(0X02); //power off
EPD_5IN83B_V2_WaitUntilIdle(); //waiting for the electronic paper IC to release the idle signal
EPD_5IN83B_V2_SendCommand(0X07); //deep sleep
EPD_5IN83B_V2_SendData(0xA5);
}

View File

@@ -0,0 +1,46 @@
/*****************************************************************************
* | File : EPD_5in83b_V2.h
* | Author : Waveshare team
* | Function : Electronic paper driver
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-07-04
* | Info :
******************************************************************************
#
# 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.
#
******************************************************************************/
#ifndef _EPD_5IN83B_V2_h_
#define _EPD_5IN83B_V2_h_
#include "DEV_Config.h"
// Display resolution
#define EPD_5IN83B_V2_WIDTH 648
#define EPD_5IN83B_V2_HEIGHT 480
UBYTE EPD_5IN83B_V2_Init(void);
void EPD_5IN83B_V2_Clear(void);
void EPD_5IN83B_V2_Display(const UBYTE *blackimage, const UBYTE *ryimage);
void EPD_5IN83B_V2_Sleep(void);
#endif

View File

@@ -0,0 +1,464 @@
/*****************************************************************************
* | File : EPD_7in5.c
* | Author : Waveshare team
* | Function : Electronic paper driver
* | Info :
*----------------
* | This version: V3.0
* | Date : 2023-12-18
* | Info :
*****************************************************************************
#
# 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.
#
******************************************************************************/
#include "EPD_7in5_V2.h"
#include "Debug.h"
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(20);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(20);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
static void EPD_SendData2(UBYTE *pData, UDOUBLE len)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_Write_nByte(pData, len);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
static void EPD_WaitUntilIdle(void)
{
Debug("e-Paper busy\r\n");
do{
DEV_Delay_ms(5);
}while(!(DEV_Digital_Read(EPD_BUSY_PIN)));
DEV_Delay_ms(5);
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_7IN5_V2_TurnOnDisplay(void)
{
EPD_SendCommand(0x12); //DISPLAY REFRESH
DEV_Delay_ms(100); //!!!The delay here is necessary, 200uS at least!!!
EPD_WaitUntilIdle();
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
UBYTE EPD_7IN5_V2_Init(void)
{
EPD_Reset();
EPD_SendCommand(0x01); //POWER SETTING
EPD_SendData(0x07);
EPD_SendData(0x07); //VGH=20V,VGL=-20V
EPD_SendData(0x3f); //VDH=15V
EPD_SendData(0x3f); //VDL=-15V
//Enhanced display drive(Add 0x06 command)
EPD_SendCommand(0x06); //Booster Soft Start
EPD_SendData(0x17);
EPD_SendData(0x17);
EPD_SendData(0x28);
EPD_SendData(0x17);
EPD_SendCommand(0x04); //POWER ON
DEV_Delay_ms(100);
EPD_WaitUntilIdle(); //waiting for the electronic paper IC to release the idle signal
EPD_SendCommand(0X00); //PANNEL SETTING
EPD_SendData(0x1F); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_SendCommand(0x61); //tres
EPD_SendData(0x03); //source 800
EPD_SendData(0x20);
EPD_SendData(0x01); //gate 480
EPD_SendData(0xE0);
EPD_SendCommand(0X15);
EPD_SendData(0x00);
/*
If the screen appears gray, use the annotated initialization command
*/
EPD_SendCommand(0X50);
EPD_SendData(0x10);
EPD_SendData(0x07);
// EPD_SendCommand(0X50);
// EPD_SendData(0x10);
// EPD_SendData(0x17);
// EPD_SendCommand(0X52);
// EPD_SendData(0x03);
EPD_SendCommand(0X60); //TCON SETTING
EPD_SendData(0x22);
return 0;
}
UBYTE EPD_7IN5_V2_Init_Fast(void)
{
EPD_Reset();
EPD_SendCommand(0X00); //PANNEL SETTING
EPD_SendData(0x1F); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
/*
If the screen appears gray, use the annotated initialization command
*/
EPD_SendCommand(0X50);
EPD_SendData(0x10);
EPD_SendData(0x07);
// EPD_SendCommand(0X50);
// EPD_SendData(0x10);
// EPD_SendData(0x17);
// EPD_SendCommand(0X52);
// EPD_SendData(0x03);
EPD_SendCommand(0x04); //POWER ON
DEV_Delay_ms(100);
EPD_WaitUntilIdle(); //waiting for the electronic paper IC to release the idle signal
//Enhanced display drive(Add 0x06 command)
EPD_SendCommand(0x06); //Booster Soft Start
EPD_SendData (0x27);
EPD_SendData (0x27);
EPD_SendData (0x18);
EPD_SendData (0x17);
EPD_SendCommand(0xE0);
EPD_SendData(0x02);
EPD_SendCommand(0xE5);
EPD_SendData(0x5A);
return 0;
}
UBYTE EPD_7IN5_V2_Init_Part(void)
{
EPD_Reset();
EPD_SendCommand(0X00); //PANNEL SETTING
EPD_SendData(0x1F); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_SendCommand(0x04); //POWER ON
DEV_Delay_ms(100);
EPD_WaitUntilIdle(); //waiting for the electronic paper IC to release the idle signal
EPD_SendCommand(0xE0);
EPD_SendData(0x02);
EPD_SendCommand(0xE5);
EPD_SendData(0x6E);
return 0;
}
/*
The feature will only be available on screens sold after 24/10/23
*/
UBYTE EPD_7IN5_V2_Init_4Gray(void)
{
EPD_Reset();
EPD_SendCommand(0X00); //PANNEL SETTING
EPD_SendData(0x1F); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_SendCommand(0X50);
EPD_SendData(0x10);
EPD_SendData(0x07);
EPD_SendCommand(0x04); //POWER ON
DEV_Delay_ms(100);
EPD_WaitUntilIdle(); //waiting for the electronic paper IC to release the idle signal
EPD_SendCommand(0x06); //Booster Soft Start
EPD_SendData (0x27);
EPD_SendData (0x27);
EPD_SendData (0x18);
EPD_SendData (0x17);
EPD_SendCommand(0xE0);
EPD_SendData(0x02);
EPD_SendCommand(0xE5);
EPD_SendData(0x5F);
return 0;
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_7IN5_V2_Clear(void)
{
UWORD Width, Height;
Width =(EPD_7IN5_V2_WIDTH % 8 == 0)?(EPD_7IN5_V2_WIDTH / 8 ):(EPD_7IN5_V2_WIDTH / 8 + 1);
Height = EPD_7IN5_V2_HEIGHT;
UBYTE image[EPD_7IN5_V2_WIDTH / 8] = {0x00};
UWORD i;
EPD_SendCommand(0x10);
for(i=0; i<Width; i++) {
image[i] = 0xFF;
}
for(i=0; i<Height; i++)
{
EPD_SendData2(image, Width);
}
EPD_SendCommand(0x13);
for(i=0; i<Width; i++) {
image[i] = 0x00;
}
for(i=0; i<Height; i++)
{
EPD_SendData2(image, Width);
}
EPD_7IN5_V2_TurnOnDisplay();
}
void EPD_7IN5_V2_ClearBlack(void)
{
UWORD Width, Height;
Width =(EPD_7IN5_V2_WIDTH % 8 == 0)?(EPD_7IN5_V2_WIDTH / 8 ):(EPD_7IN5_V2_WIDTH / 8 + 1);
Height = EPD_7IN5_V2_HEIGHT;
UBYTE image[EPD_7IN5_V2_WIDTH / 8] = {0x00};
UWORD i;
EPD_SendCommand(0x10);
for(i=0; i<Width; i++) {
image[i] = 0x00;
}
for(i=0; i<Height; i++)
{
EPD_SendData2(image, Width);
}
EPD_SendCommand(0x13);
for(i=0; i<Width; i++) {
image[i] = 0xFF;
}
for(i=0; i<Height; i++)
{
EPD_SendData2(image, Width);
}
EPD_7IN5_V2_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_7IN5_V2_Display(UBYTE *blackimage)
{
UDOUBLE Width, Height;
Width =(EPD_7IN5_V2_WIDTH % 8 == 0)?(EPD_7IN5_V2_WIDTH / 8 ):(EPD_7IN5_V2_WIDTH / 8 + 1);
Height = EPD_7IN5_V2_HEIGHT;
EPD_SendCommand(0x10);
for (UDOUBLE j = 0; j < Height; j++) {
EPD_SendData2((UBYTE *)(blackimage+j*Width), Width);
}
EPD_SendCommand(0x13);
for (UDOUBLE j = 0; j < Height; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
blackimage[i + j * Width] = ~blackimage[i + j * Width];
}
}
for (UDOUBLE j = 0; j < Height; j++) {
EPD_SendData2((UBYTE *)(blackimage+j*Width), Width);
}
EPD_7IN5_V2_TurnOnDisplay();
}
void EPD_7IN5_V2_Display_Part(UBYTE *blackimage,UDOUBLE x_start, UDOUBLE y_start, UDOUBLE x_end, UDOUBLE y_end)
{
UDOUBLE Width, Height;
Width =((x_end - x_start) % 8 == 0)?((x_end - x_start) / 8 ):((x_end - x_start) / 8 + 1);
Height = y_end - y_start;
EPD_SendCommand(0x50);
EPD_SendData(0xA9);
EPD_SendData(0x07);
EPD_SendCommand(0x91); //This command makes the display enter partial mode
EPD_SendCommand(0x90); //resolution setting
EPD_SendData (x_start/256);
EPD_SendData (x_start%256); //x-start
EPD_SendData (x_end/256);
EPD_SendData (x_end%256-1); //x-end
EPD_SendData (y_start/256); //
EPD_SendData (y_start%256); //y-start
EPD_SendData (y_end/256);
EPD_SendData (y_end%256-1); //y-end
EPD_SendData (0x01);
EPD_SendCommand(0x13);
for (UDOUBLE j = 0; j < Height; j++) {
EPD_SendData2((UBYTE *)(blackimage+j*Width), Width);
}
EPD_7IN5_V2_TurnOnDisplay();
}
void EPD_7IN5_V2_Display_4Gray(const UBYTE *Image)
{
UDOUBLE i,j,k;
UBYTE temp1,temp2,temp3;
// old data
EPD_SendCommand(0x10);
for(i=0; i<48000; i++) {
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_SendData(temp3);
// printf("%x",temp3);
}
EPD_SendCommand(0x13); //write RAM for black(0)/white (1)
for(i=0; i<48000; 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_SendData(temp3);
// printf("%x",temp3);
}
EPD_7IN5_V2_TurnOnDisplay();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_7IN5_V2_Sleep(void)
{
EPD_SendCommand(0x50);
EPD_SendData(0XF7);
EPD_SendCommand(0X02); //power off
EPD_WaitUntilIdle();
EPD_SendCommand(0X07); //deep sleep
EPD_SendData(0xA5);
}

View File

@@ -0,0 +1,54 @@
/*****************************************************************************
* | File : EPD_7in5_V2.h
* | Author : Waveshare team
* | Function : Electronic paper driver
* | Info :
*----------------
* | This version: V3.0
* | Date : 2023-12-18
* | Info :
* 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8]
* 2.Change:EPD_Display(UBYTE *Image)
* Need to pass parameters: pointer to cached data
#
# 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.
#
******************************************************************************/
#ifndef _EPD_7IN5_V2_H_
#define _EPD_7IN5_V2_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_7IN5_V2_WIDTH 800
#define EPD_7IN5_V2_HEIGHT 480
UBYTE EPD_7IN5_V2_Init(void);
UBYTE EPD_7IN5_V2_Init_Fast(void);
UBYTE EPD_7IN5_V2_Init_Part(void);
UBYTE EPD_7IN5_V2_Init_4Gray(void);
void EPD_7IN5_V2_Clear(void);
void EPD_7IN5_V2_ClearBlack(void);
void EPD_7IN5_V2_Display(UBYTE *blackimage);
void EPD_7IN5_V2_Display_Part(UBYTE *blackimage,UDOUBLE x_start, UDOUBLE y_start, UDOUBLE x_end, UDOUBLE y_end);
void EPD_7IN5_V2_Display_4Gray(const UBYTE *Image);
void EPD_7IN5_V2_Sleep(void);
#endif

View File

@@ -0,0 +1,696 @@
/*****************************************************************************
* | File : EPD_7in5.c
* | Author : Waveshare team
* | Function : Electronic paper driver
* | Info :
*----------------
* | This version: V1.0
* | Date : 2023-12-18
* | Info :
*****************************************************************************
#
# 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.
#
******************************************************************************/
#include "EPD_7in5_V2_old.h"
#include "Debug.h"
UBYTE Voltage_Frame_7IN5_V2[]={
0x6, 0x3F, 0x3F, 0x11, 0x24, 0x7, 0x17,
};
UBYTE LUT_VCOM_7IN5_V2[]={
0x0, 0xF, 0xF, 0x0, 0x0, 0x1,
0x0, 0xF, 0x1, 0xF, 0x1, 0x2,
0x0, 0xF, 0xF, 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,
};
UBYTE LUT_WW_7IN5_V2[]={
0x10, 0xF, 0xF, 0x0, 0x0, 0x1,
0x84, 0xF, 0x1, 0xF, 0x1, 0x2,
0x20, 0xF, 0xF, 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,
};
UBYTE LUT_BW_7IN5_V2[]={
0x10, 0xF, 0xF, 0x0, 0x0, 0x1,
0x84, 0xF, 0x1, 0xF, 0x1, 0x2,
0x20, 0xF, 0xF, 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,
};
UBYTE LUT_WB_7IN5_V2[]={
0x80, 0xF, 0xF, 0x0, 0x0, 0x1,
0x84, 0xF, 0x1, 0xF, 0x1, 0x2,
0x40, 0xF, 0xF, 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,
};
UBYTE LUT_BB_7IN5_V2[]={
0x80, 0xF, 0xF, 0x0, 0x0, 0x1,
0x84, 0xF, 0x1, 0xF, 0x1, 0x2,
0x40, 0xF, 0xF, 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,
};
const unsigned char
Lut_all_fresh[]={0x67, 0xBF, 0x3F, 0x0D, 0x00, 0x1C,
//VCOM
0x00, 0x32, 0x32, 0x00, 0x00, 0x01,
0x00, 0x0A, 0x0A, 0x00, 0x00, 0x00,
0x00, 0x28, 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,
//WW
0x60, 0x32, 0x32, 0x00, 0x00, 0x01,
0x60, 0x0A, 0x0A, 0x00, 0x00, 0x00,
0x80, 0x28, 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,
//BW
0x60, 0x32, 0x32, 0x00, 0x00, 0x01,
0x60, 0x0A, 0x0A, 0x00, 0x00, 0x00,
0x80, 0x28, 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,
//WB
0x90, 0x32, 0x32, 0x00, 0x00, 0x01,
0x60, 0x0A, 0x0A, 0x00, 0x00, 0x00,
0x40, 0x28, 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,
//BB
0x90, 0x32, 0x32, 0x00, 0x00, 0x01,
0x60, 0x0A, 0x0A, 0x00, 0x00, 0x00,
0x40, 0x28, 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,
//Reserved
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF,
};
const unsigned char
Lut_partial[]={0x67, 0xBF, 0x3F, 0x0D, 0x00, 0x1C,
//VCOM
0x00, 0x14, 0x02, 0x00, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
//WW
0x20, 0x14, 0x02, 0x00, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
//BW
0x80, 0x14, 0x02, 0x00, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
//WB
0x40, 0x14, 0x02, 0x00, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
//BB
0x00, 0x14, 0x02, 0x00, 0x00, 0x01,
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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
//Reserved
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF,
};
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(20);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(20);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
static void EPD_SendData2(UBYTE *pData, UDOUBLE len)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_Write_nByte(pData, len);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
static void EPD_WaitUntilIdle(void)
{
Debug("e-Paper busy\r\n");
do{
DEV_Delay_ms(5);
}while(!(DEV_Digital_Read(EPD_BUSY_PIN)));
DEV_Delay_ms(5);
Debug("e-Paper busy release\r\n");
}
static void EPD_7IN5_V2_LUT(UBYTE* lut_vcom, UBYTE* lut_ww, UBYTE* lut_bw, UBYTE* lut_wb, UBYTE* lut_bb)
{
UBYTE count;
EPD_SendCommand(0x20); //VCOM
for(count=0; count<42; count++)
EPD_SendData(lut_vcom[count]);
EPD_SendCommand(0x21); //LUTBW
for(count=0; count<42; count++)
EPD_SendData(lut_ww[count]);
EPD_SendCommand(0x22); //LUTBW
for(count=0; count<42; count++)
EPD_SendData(lut_bw[count]);
EPD_SendCommand(0x23); //LUTWB
for(count=0; count<42; count++)
EPD_SendData(lut_wb[count]);
EPD_SendCommand(0x24); //LUTBB
for(count=0; count<42; count++)
EPD_SendData(lut_bb[count]);
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_7IN5_V2_TurnOnDisplay(void)
{
EPD_SendCommand(0x12); //DISPLAY REFRESH
DEV_Delay_ms(100); //!!!The delay here is necessary, 200uS at least!!!
EPD_WaitUntilIdle();
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
UBYTE EPD_7IN5_V2_Init_old(void)
{
EPD_Reset();
// EPD_SendCommand(0x01); //POWER SETTING
// EPD_SendData(0x07);
// EPD_SendData(0x07); //VGH=20V,VGL=-20V
// EPD_SendData(0x3f); //VDH=15V
// EPD_SendData(0x3f); //VDL=-15V
EPD_SendCommand(0x01); // power setting
EPD_SendData(0x17); // 1-0=11: internal power
EPD_SendData(*(Voltage_Frame_7IN5_V2+6)); // VGH&VGL
EPD_SendData(*(Voltage_Frame_7IN5_V2+1)); // VSH
EPD_SendData(*(Voltage_Frame_7IN5_V2+2)); // VSL
EPD_SendData(*(Voltage_Frame_7IN5_V2+3)); // VSHR
EPD_SendCommand(0x82); // VCOM DC Setting
EPD_SendData(*(Voltage_Frame_7IN5_V2+4)); // VCOM
EPD_SendCommand(0x06); // Booster Setting
EPD_SendData(0x27);
EPD_SendData(0x27);
EPD_SendData(0x2F);
EPD_SendData(0x17);
EPD_SendCommand(0x30); // OSC Setting
EPD_SendData(*(Voltage_Frame_7IN5_V2+0)); // 2-0=100: N=4 ; 5-3=111: M=7 ; 3C=50Hz 3A=100HZ
EPD_SendCommand(0x04); //POWER ON
DEV_Delay_ms(100);
EPD_WaitUntilIdle();
EPD_SendCommand(0X00); //PANNEL SETTING
EPD_SendData(0x3F); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_SendCommand(0x61); //tres
EPD_SendData(0x03); //source 800
EPD_SendData(0x20);
EPD_SendData(0x01); //gate 480
EPD_SendData(0xE0);
EPD_SendCommand(0X15);
EPD_SendData(0x00);
EPD_SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_SendData(0x10);
EPD_SendData(0x00);
EPD_SendCommand(0X60); //TCON SETTING
EPD_SendData(0x22);
EPD_SendCommand(0x65); // Resolution setting
EPD_SendData(0x00);
EPD_SendData(0x00);//800*480
EPD_SendData(0x00);
EPD_SendData(0x00);
EPD_7IN5_V2_LUT(LUT_VCOM_7IN5_V2, LUT_WW_7IN5_V2, LUT_BW_7IN5_V2, LUT_WB_7IN5_V2, LUT_BB_7IN5_V2);
return 0;
}
void Epaper_LUT_By_MCU_old( UBYTE* wavedata)
{
UBYTE count;
UBYTE VCEND,BDEND,EVS,XON,PLL;
VCEND=wavedata[0]&0x08;
BDEND=(wavedata[1]&0xC0)>>6;
EVS=VCEND|BDEND;
PLL=(wavedata[0]&0xF0)>>4;
XON=wavedata[2]&0xC0;
EPD_SendCommand(0x52); //EVS
EPD_SendData(EVS);
EPD_SendCommand(0x30); //PLL setting
EPD_SendData(PLL);
EPD_SendCommand(0x01); //Set VGH VGL VSH VSL VSHR
EPD_SendData (0x17);
EPD_SendData ((*wavedata++)&0x07); //VGH/VGL Voltage Level selection
EPD_SendData ((*wavedata++)&0x3F); //VSH for black
EPD_SendData ((*wavedata++)&0x3F); //VSL for white
EPD_SendData ((*wavedata++)&0x3F); //VSHR for red
EPD_SendCommand(0x2A); //LUTOPT
EPD_SendData(XON);
EPD_SendData(*wavedata++);
EPD_SendCommand(0x82); //VCOM_DC setting
EPD_SendData (*wavedata++); //Vcom value
EPD_SendCommand(0x20);
for(count=0;count<42;count++)
EPD_SendData(*wavedata++);
EPD_SendCommand(0x21);
for(count=0;count<42;count++)
EPD_SendData(*wavedata++);
EPD_SendCommand(0x22);
for(count=0;count<42;count++)
EPD_SendData(*wavedata++);
EPD_SendCommand(0x23);
for(count=0;count<42;count++)
EPD_SendData(*wavedata++);
EPD_SendCommand(0x24);
for(count=0;count<42;count++)
EPD_SendData(*wavedata++);
}
UBYTE EPD_7IN5_V2_Init2_old(void)
{
EPD_Reset();
EPD_SendCommand(0x00); // Panel setting
EPD_SendData(0x3F);
EPD_SendCommand(0x06); // Booster Setting
EPD_SendData(0x17);
EPD_SendData(0x17);
EPD_SendData(0x28);
EPD_SendData(0x18);
EPD_SendCommand(0x50); // VCOM and DATA interval setting
EPD_SendData(0x22);
EPD_SendData(0x07);
EPD_SendCommand(0x60); // TCON setting
EPD_SendData(0x22); // S-G G-S
EPD_SendCommand(0x61); // Resolution setting
EPD_SendData(0x03);//800*480
EPD_SendData(0x20);
EPD_SendData(0x01);
EPD_SendData(0xE0);
EPD_SendCommand(0x65); // Resolution setting
EPD_SendData(0x00);
EPD_SendData(0x00);
EPD_SendData(0x00);
EPD_SendData(0x00);
EPD_SendCommand(0x04); //POWER ON
DEV_Delay_ms(100);
EPD_WaitUntilIdle();
return 0;
}
UBYTE EPD_7IN5_V2_Init_Fast_old(void)
{
EPD_7IN5_V2_Init2_old();
Epaper_LUT_By_MCU_old((UBYTE*)Lut_all_fresh);
return 0;
}
UBYTE EPD_7IN5_V2_Init_Partial_old(void)
{
EPD_7IN5_V2_Init2_old();
Epaper_LUT_By_MCU_old((UBYTE*)Lut_partial);
return 0;
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_7IN5_V2_Clear_old(void)
{
UWORD Width, Height;
Width =(EPD_7IN5_V2_WIDTH % 8 == 0)?(EPD_7IN5_V2_WIDTH / 8 ):(EPD_7IN5_V2_WIDTH / 8 + 1);
Height = EPD_7IN5_V2_HEIGHT;
UBYTE image[EPD_7IN5_V2_WIDTH / 8] = {0x00};
UWORD i;
EPD_SendCommand(0x10);
for(i=0; i<Width; i++) {
image[i] = 0xFF;
}
for(i=0; i<Height; i++)
{
EPD_SendData2(image, Width);
}
EPD_SendCommand(0x13);
for(i=0; i<Width; i++) {
image[i] = 0x00;
}
for(i=0; i<Height; i++)
{
EPD_SendData2(image, Width);
}
EPD_7IN5_V2_TurnOnDisplay();
}
void EPD_7IN5_V2_ClearBlack_old(void)
{
UWORD Width, Height;
Width =(EPD_7IN5_V2_WIDTH % 8 == 0)?(EPD_7IN5_V2_WIDTH / 8 ):(EPD_7IN5_V2_WIDTH / 8 + 1);
Height = EPD_7IN5_V2_HEIGHT;
UBYTE image[EPD_7IN5_V2_WIDTH / 8] = {0x00};
UWORD i;
EPD_SendCommand(0x10);
for(i=0; i<Width; i++) {
image[i] = 0x00;
}
for(i=0; i<Height; i++)
{
EPD_SendData2(image, Width);
}
EPD_SendCommand(0x13);
for(i=0; i<Width; i++) {
image[i] = 0xFF;
}
for(i=0; i<Height; i++)
{
EPD_SendData2(image, Width);
}
EPD_7IN5_V2_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_7IN5_V2_Display_old(const UBYTE *blackimage)
{
UDOUBLE Width, Height;
Width =(EPD_7IN5_V2_WIDTH % 8 == 0)?(EPD_7IN5_V2_WIDTH / 8 ):(EPD_7IN5_V2_WIDTH / 8 + 1);
Height = EPD_7IN5_V2_HEIGHT;
EPD_SendCommand(0x10);
for (UDOUBLE j = 0; j < Height; j++) {
EPD_SendData2((UBYTE *)(blackimage+j*Width), Width);
}
EPD_SendCommand(0x13);
for (UDOUBLE j = 0; j < Height; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
EPD_SendData(~blackimage[i + j * Width]) ;
}
}
EPD_7IN5_V2_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_7IN5_V2_SendHalfImage_old(const UBYTE *Image)
{
UDOUBLE Width, Height;
Width =(EPD_7IN5_V2_WIDTH % 8 == 0)?(EPD_7IN5_V2_WIDTH / 8 ):(EPD_7IN5_V2_WIDTH / 8 + 1);
Height = EPD_7IN5_V2_HEIGHT;
EPD_SendCommand(0x10);
for (UDOUBLE j = 0; j < Height / 2; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
EPD_SendData(Image[i + j * Width]);
}
}
for (UDOUBLE j = 0; j < Height / 2; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
EPD_SendData(0xFF);
}
}
EPD_SendCommand(0x13);
for (UDOUBLE j = 0; j < Height / 2; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
EPD_SendData(~Image[i + j * Width]);
}
}
for (UDOUBLE j = 0; j < Height / 2; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
EPD_SendData(0x00);
}
}
EPD_7IN5_V2_TurnOnDisplay();
}
void EPD_7IN5_V2_WritePicture_old(const UBYTE *Image)
{
UDOUBLE Width, Height;
Width =(EPD_7IN5_V2_WIDTH % 8 == 0)?(EPD_7IN5_V2_WIDTH / 8 ):(EPD_7IN5_V2_WIDTH / 8 + 1);
Height = EPD_7IN5_V2_HEIGHT;
EPD_SendCommand(0x10);
for (UDOUBLE j = 0; j < Height / 2; j++) {
for (UDOUBLE i = 0; i < Width/2; i++) {
EPD_SendData(Image[i + j * Width/2]);
}
for (UDOUBLE i = 0; i < Width/2; i++) {
EPD_SendData(0xff);
}
}
for (UDOUBLE j = 0; j < Height / 2; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
EPD_SendData(0xFF);
}
}
EPD_SendCommand(0x13);
for (UDOUBLE j = 0; j < Height / 2; j++) {
for (UDOUBLE i = 0; i < Width/2; i++) {
EPD_SendData(~Image[i + j * Width/2]);
}
for (UDOUBLE i = 0; i < Width/2; i++) {
EPD_SendData(0x00);
}
}
for (UDOUBLE j = 0; j < Height / 2; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
EPD_SendData(0x00);
}
}
EPD_7IN5_V2_TurnOnDisplay();
}
void EPD_7IN5_V2_DisplayPart_old(const UBYTE *Image, UWORD xstart, UWORD ystart, UWORD image_width, UWORD image_heigh)
{
unsigned long i, j;
UWORD Width, Height;
Width = (EPD_7IN5_V2_WIDTH % 8 == 0)? (EPD_7IN5_V2_WIDTH / 8 ): (EPD_7IN5_V2_WIDTH / 8 + 1);
Height = EPD_7IN5_V2_HEIGHT;
EPD_SendCommand(0x10);
for(i=0; i<Height; i++) {
for(j=0; j<Width; j++) {
if(i<image_heigh+ystart && i>=ystart && j<(image_width+xstart)/2 && j>=xstart/2) {
EPD_SendData(Image[(j-xstart/2) + (image_width/2*(i-ystart))]);
}
else {
EPD_SendData(0xff);
}
}
}
EPD_7IN5_V2_TurnOnDisplay();
}
void EPD_7IN5_V2_Display_Partial_old(UBYTE *blackimage,UDOUBLE x_start, UDOUBLE y_start, UDOUBLE x_end, UDOUBLE y_end)
{
UDOUBLE Width, Height;
Width =((x_end - x_start) % 8 == 0)?((x_end - x_start) / 8 ):((x_end - x_start) / 8 + 1);
Height = y_end - y_start;
EPD_SendCommand(0x91); //This command makes the display enter partial mode
EPD_SendCommand(0x90); //resolution setting
EPD_SendData(x_start/256);
EPD_SendData(x_start%256); //x-start
EPD_SendData((x_end-1)/256);
EPD_SendData((x_end-1)%256); //x-end
EPD_SendData(y_start/256); //
EPD_SendData(y_start%256); //y-start
EPD_SendData((y_end-1)/256);
EPD_SendData((y_end-1)%256); //y-end
EPD_SendData(0x01);
// for (UDOUBLE j = 0; j < Height; j++) {
// for (UDOUBLE i = 0; i < Width; i++) {
// blackimage[i+j*Width] = ~blackimage[i+j*Width];
// }
// }
EPD_SendCommand(0x13);
for (UDOUBLE j = 0; j < Height; j++) {
EPD_SendData2((UBYTE *)(blackimage+j*Width), Width);
}
EPD_7IN5_V2_TurnOnDisplay();
EPD_SendCommand(0x92);
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_7IN5_V2_Sleep_old(void)
{
EPD_SendCommand(0X02); //power off
EPD_WaitUntilIdle();
EPD_SendCommand(0X07); //deep sleep
EPD_SendData(0xA5);
}

View File

@@ -0,0 +1,56 @@
/*****************************************************************************
* | File : EPD_7in5_V2.h
* | Author : Waveshare team
* | Function : Electronic paper driver
* | Info :
*----------------
* | This version: V1.0
* | Date : 2023-12-18
* | Info :
* 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8]
* 2.Change:EPD_Display(UBYTE *Image)
* Need to pass parameters: pointer to cached data
#
# 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.
#
******************************************************************************/
#ifndef _EPD_7IN5_V2_OLD_H_
#define _EPD_7IN5_V2_OLD_H_
#include "Debug.h"
#include "DEV_Config.h"
// Display resolution
#define EPD_7IN5_V2_WIDTH 800
#define EPD_7IN5_V2_HEIGHT 480
UBYTE EPD_7IN5_V2_Init_old(void);
UBYTE EPD_7IN5_V2_Init_Fast_old(void);
UBYTE EPD_7IN5_V2_Init_Partial_old(void);
void EPD_7IN5_V2_Clear_old(void);
void EPD_7IN5_V2_ClearBlack_old(void);
void EPD_7IN5_V2_Display_old(const UBYTE *blackimage);
void EPD_7IN5_V2_SendHalfImage_old(const UBYTE *Image);
void EPD_7IN5_V2_WritePicture_old(const UBYTE *Image);
void EPD_7IN5_V2_DisplayPart_old(const UBYTE *Image, UWORD xstart, UWORD ystart, UWORD image_width, UWORD image_heigh);
void EPD_7IN5_V2_Display_Partial_old(UBYTE *blackimage,UDOUBLE x_start, UDOUBLE y_start, UDOUBLE x_end, UDOUBLE y_end);
void EPD_7IN5_V2_Sleep_old(void);
#endif

View File

@@ -0,0 +1,365 @@
/*****************************************************************************
* | File : EPD_7IN5B_V2.c
* | Author : Waveshare team
* | Function : Electronic paper driver
* | Info :
*----------------
* | This version: V1.0
* | Date : 2024-08-07
* | Info :
******************************************************************************
# 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.
#
******************************************************************************/
#include "EPD_7in5b_V2.h"
#include "Debug.h"
#include <time.h>
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_7IN5B_V2_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(5);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_7IN5B_V2_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_7IN5B_V2_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
void EPD_7IN5B_V2_WaitUntilIdle(void)
{
Debug("e-Paper busy\r\n");
while(!(DEV_Digital_Read(EPD_BUSY_PIN)));
DEV_Delay_ms(20);
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_7IN5B_V2_TurnOnDisplay(void)
{
EPD_7IN5B_V2_SendCommand(0x12); //DISPLAY REFRESH
DEV_Delay_ms(10); //!!!The delay here is necessary, 200uS at least!!!
EPD_7IN5B_V2_WaitUntilIdle();
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
UBYTE EPD_7IN5B_V2_Init(void)
{
EPD_7IN5B_V2_Reset();
EPD_7IN5B_V2_SendCommand(0x01); //POWER SETTING
EPD_7IN5B_V2_SendData(0x07);
EPD_7IN5B_V2_SendData(0x07); //VGH=20V,VGL=-20V
EPD_7IN5B_V2_SendData(0x3f); //VDH=15V
EPD_7IN5B_V2_SendData(0x3f); //VDL=-15V
//Enhanced display drive(Add 0x06 command)
EPD_7IN5B_V2_SendCommand(0x06); //Booster Soft Start
EPD_7IN5B_V2_SendData(0x17);
EPD_7IN5B_V2_SendData(0x17);
EPD_7IN5B_V2_SendData(0x28);
EPD_7IN5B_V2_SendData(0x17);
EPD_7IN5B_V2_SendCommand(0x04); //POWER ON
DEV_Delay_ms(100);
EPD_7IN5B_V2_WaitUntilIdle();
EPD_7IN5B_V2_SendCommand(0X00); //PANNEL SETTING
EPD_7IN5B_V2_SendData(0x0F); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_7IN5B_V2_SendCommand(0x61); //tres
EPD_7IN5B_V2_SendData(0x03); //source 800
EPD_7IN5B_V2_SendData(0x20);
EPD_7IN5B_V2_SendData(0x01); //gate 480
EPD_7IN5B_V2_SendData(0xE0);
EPD_7IN5B_V2_SendCommand(0X15);
EPD_7IN5B_V2_SendData(0x00);
EPD_7IN5B_V2_SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_7IN5B_V2_SendData(0x11);
EPD_7IN5B_V2_SendData(0x07);
EPD_7IN5B_V2_SendCommand(0X60); //TCON SETTING
EPD_7IN5B_V2_SendData(0x22);
return 0;
}
UBYTE EPD_7IN5B_V2_Init_Fast(void)
{
EPD_7IN5B_V2_Reset();
EPD_7IN5B_V2_SendCommand(0X00); //PANNEL SETTING
EPD_7IN5B_V2_SendData(0x0F); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_7IN5B_V2_SendCommand(0x04); //POWER ON
DEV_Delay_ms(100);
EPD_7IN5B_V2_WaitUntilIdle();
//Enhanced display drive(Add 0x06 command)
EPD_7IN5B_V2_SendCommand(0x06); //Booster Soft Start
EPD_7IN5B_V2_SendData(0x27);
EPD_7IN5B_V2_SendData(0x27);
EPD_7IN5B_V2_SendData(0x18);
EPD_7IN5B_V2_SendData(0x17);
EPD_7IN5B_V2_SendCommand(0xE0);
EPD_7IN5B_V2_SendData(0x02);
EPD_7IN5B_V2_SendCommand(0xE5);
EPD_7IN5B_V2_SendData(0x5A);
EPD_7IN5B_V2_SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_7IN5B_V2_SendData(0x11);
EPD_7IN5B_V2_SendData(0x07);
return 0;
}
UBYTE EPD_7IN5B_V2_Init_Part(void)
{
EPD_7IN5B_V2_Reset();
EPD_7IN5B_V2_SendCommand(0X00); //PANNEL SETTING
EPD_7IN5B_V2_SendData(0x1F); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_7IN5B_V2_SendCommand(0x04); //POWER ON
DEV_Delay_ms(100);
EPD_7IN5B_V2_WaitUntilIdle();
EPD_7IN5B_V2_SendCommand(0xE0);
EPD_7IN5B_V2_SendData(0x02);
EPD_7IN5B_V2_SendCommand(0xE5);
EPD_7IN5B_V2_SendData(0x6E);
EPD_7IN5B_V2_SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_7IN5B_V2_SendData(0xA9);
EPD_7IN5B_V2_SendData(0x07);
return 0;
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_7IN5B_V2_Clear(void)
{
UWORD Width, Height;
Width =(EPD_7IN5B_V2_WIDTH % 8 == 0)?(EPD_7IN5B_V2_WIDTH / 8 ):(EPD_7IN5B_V2_WIDTH / 8 + 1);
Height = EPD_7IN5B_V2_HEIGHT;
UWORD i;
EPD_7IN5B_V2_SendCommand(0x10);
for(i=0; i<Width*Height; i++) {
EPD_7IN5B_V2_SendData(0xff);
}
EPD_7IN5B_V2_SendCommand(0x13);
for(i=0; i<Width*Height; i++) {
EPD_7IN5B_V2_SendData(0x00);
}
EPD_7IN5B_V2_TurnOnDisplay();
}
void EPD_7IN5B_V2_ClearRed(void)
{
UWORD Width, Height;
Width =(EPD_7IN5B_V2_WIDTH % 8 == 0)?(EPD_7IN5B_V2_WIDTH / 8 ):(EPD_7IN5B_V2_WIDTH / 8 + 1);
Height = EPD_7IN5B_V2_HEIGHT;
UWORD i;
EPD_7IN5B_V2_SendCommand(0x10);
for(i=0; i<Width*Height; i++) {
EPD_7IN5B_V2_SendData(0xff);
}
EPD_7IN5B_V2_SendCommand(0x13);
for(i=0; i<Width*Height; i++) {
EPD_7IN5B_V2_SendData(0xff);
}
EPD_7IN5B_V2_TurnOnDisplay();
}
void EPD_7IN5B_V2_ClearBlack(void)
{
UWORD Width, Height;
Width =(EPD_7IN5B_V2_WIDTH % 8 == 0)?(EPD_7IN5B_V2_WIDTH / 8 ):(EPD_7IN5B_V2_WIDTH / 8 + 1);
Height = EPD_7IN5B_V2_HEIGHT;
UWORD i;
EPD_7IN5B_V2_SendCommand(0x10);
for(i=0; i<Width*Height; i++) {
EPD_7IN5B_V2_SendData(0x00);
}
EPD_7IN5B_V2_SendCommand(0x13);
for(i=0; i<Width*Height; i++) {
EPD_7IN5B_V2_SendData(0x00);
}
EPD_7IN5B_V2_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_7IN5B_V2_Display(const UBYTE *blackimage, const UBYTE *ryimage)
{
UDOUBLE Width, Height;
Width =(EPD_7IN5B_V2_WIDTH % 8 == 0)?(EPD_7IN5B_V2_WIDTH / 8 ):(EPD_7IN5B_V2_WIDTH / 8 + 1);
Height = EPD_7IN5B_V2_HEIGHT;
//send black data
EPD_7IN5B_V2_SendCommand(0x10);
for (UDOUBLE j = 0; j < Height; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
EPD_7IN5B_V2_SendData(blackimage[i + j * Width]);
}
}
//send red data
EPD_7IN5B_V2_SendCommand(0x13);
for (UDOUBLE j = 0; j < Height; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
EPD_7IN5B_V2_SendData(~ryimage[i + j * Width]);
}
}
EPD_7IN5B_V2_TurnOnDisplay();
}
void EPD_7IN5B_V2_Display_Base_color(UBYTE color)
{
UWORD Width, Height;
Width =(EPD_7IN5B_V2_WIDTH % 8 == 0)?(EPD_7IN5B_V2_WIDTH / 8 ):(EPD_7IN5B_V2_WIDTH / 8 + 1);
Height = EPD_7IN5B_V2_HEIGHT;
EPD_7IN5B_V2_SendCommand(0x10); //Write Black and White image to RAM
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_7IN5B_V2_SendData(~color);
}
}
EPD_7IN5B_V2_SendCommand(0x13); //Write Black and White image to RAM
for (UWORD j = 0; j < Height; j++) {
for (UWORD i = 0; i < Width; i++) {
EPD_7IN5B_V2_SendData(color);
}
}
// EPD_7IN5B_V2_TurnOnDisplay();
}
void EPD_7IN5B_V2_Display_Partial(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
{
UDOUBLE Width, Height;
Width =((Xend - Xstart) % 8 == 0)?((Xend - Xstart) / 8 ):((Xend - Xstart) / 8 + 1);
Height = Yend - Ystart;
//Reset
// EPD_7IN5B_V2_Reset();
// EPD_7IN5B_V2_SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
// EPD_7IN5B_V2_SendData(0xA9);
// EPD_7IN5B_V2_SendData(0x07);
EPD_7IN5B_V2_SendCommand(0x91); //BorderWavefrom
EPD_7IN5B_V2_SendCommand(0x90);
EPD_7IN5B_V2_SendData(Xstart/256);
EPD_7IN5B_V2_SendData(Xstart%256); //x-start
EPD_7IN5B_V2_SendData(Xend/256);
EPD_7IN5B_V2_SendData(Xend%256-1); //x-end
EPD_7IN5B_V2_SendData(Ystart/256); //
EPD_7IN5B_V2_SendData(Ystart%256); //y-start
EPD_7IN5B_V2_SendData(Yend/256);
EPD_7IN5B_V2_SendData(Yend%256-1); //y-end
EPD_7IN5B_V2_SendData(0x01);
EPD_7IN5B_V2_SendCommand(0x10); //Write Black and White image to RAM
for (UDOUBLE j = 0; j < Height; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
EPD_7IN5B_V2_SendData(0xff);
}
}
EPD_7IN5B_V2_SendCommand(0x13); //Write Black and White image to RAM
for (UDOUBLE j = 0; j < Height; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
EPD_7IN5B_V2_SendData(Image[i + j * Width]);
}
}
EPD_7IN5B_V2_TurnOnDisplay();
EPD_7IN5B_V2_SendCommand(0x92);
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_7IN5B_V2_Sleep(void)
{
EPD_7IN5B_V2_SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_7IN5B_V2_SendData(0xF7); //WBmode:VBDF 17|D7 VBDW 97 VBDB 57 WBRmode:VBDF F7 VBDW 77 VBDB 37 VBDR B7
EPD_7IN5B_V2_SendCommand(0X02); //power off
EPD_7IN5B_V2_WaitUntilIdle();
EPD_7IN5B_V2_SendCommand(0X07); //deep sleep
EPD_7IN5B_V2_SendData(0xA5);
}

View File

@@ -0,0 +1,54 @@
/*****************************************************************************
* | File : EPD_7in5_B.h
* | Author : Waveshare team
* | Function : Electronic paper driver
* | Info :
*----------------
* | This version: V2.0
* | Date : 2024-08-07
* | Info :
* 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8]
* 2.Change:EPD_Display(UBYTE *Image)
* Need to pass parameters: pointer to cached data
#
# 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.
#
******************************************************************************/
#ifndef _EPD_7IN5B_V2_H_
#define _EPD_7IN5B_V2_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_7IN5B_V2_WIDTH 800
#define EPD_7IN5B_V2_HEIGHT 480
UBYTE EPD_7IN5B_V2_Init(void);
UBYTE EPD_7IN5B_V2_Init_Fast(void);
UBYTE EPD_7IN5B_V2_Init_Part(void);
void EPD_7IN5B_V2_Clear(void);
void EPD_7IN5B_V2_ClearRed(void);
void EPD_7IN5B_V2_ClearBlack(void);
void EPD_7IN5B_V2_Display(const UBYTE *blackimage, const UBYTE *ryimage);
void EPD_7IN5B_V2_Display_Fast(const UBYTE *blackimage);
void EPD_7IN5B_V2_Display_Base_color(UBYTE color);
void EPD_7IN5B_V2_Display_Partial(const UBYTE *Image, UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend);
void EPD_7IN5B_V2_Sleep(void);
#endif

View File

@@ -0,0 +1,247 @@
/*****************************************************************************
* | File : EPD_7IN5B_V2.c
* | Author : Waveshare team
* | Function : Electronic paper driver
* | Info :
*----------------
* | This version: V1.0
* | Date : 2020-11-30
* | Info :
******************************************************************************
# 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.
#
******************************************************************************/
#include "EPD_7in5b_V2_old.h"
#include "Debug.h"
/******************************************************************************
function : Software reset
parameter:
******************************************************************************/
static void EPD_7IN5B_V2_Reset(void)
{
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
DEV_Digital_Write(EPD_RST_PIN, 0);
DEV_Delay_ms(2);
DEV_Digital_Write(EPD_RST_PIN, 1);
DEV_Delay_ms(200);
}
/******************************************************************************
function : send command
parameter:
Reg : Command register
******************************************************************************/
static void EPD_7IN5B_V2_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(EPD_DC_PIN, 0);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void EPD_7IN5B_V2_SendData(UBYTE Data)
{
DEV_Digital_Write(EPD_DC_PIN, 1);
DEV_Digital_Write(EPD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
DEV_Digital_Write(EPD_CS_PIN, 1);
}
/******************************************************************************
function : Wait until the busy_pin goes LOW
parameter:
******************************************************************************/
static void EPD_7IN5B_V2_WaitUntilIdle(void)
{
Debug("e-Paper busy\r\n");
do {
DEV_Delay_ms(20);
}while(!(DEV_Digital_Read(EPD_BUSY_PIN)));
DEV_Delay_ms(20);
Debug("e-Paper busy release\r\n");
}
/******************************************************************************
function : Turn On Display
parameter:
******************************************************************************/
static void EPD_7IN5B_V2_TurnOnDisplay(void)
{
EPD_7IN5B_V2_SendCommand(0x12); //DISPLAY REFRESH
DEV_Delay_ms(100); //!!!The delay here is necessary, 200uS at least!!!
EPD_7IN5B_V2_WaitUntilIdle();
}
/******************************************************************************
function : Initialize the e-Paper register
parameter:
******************************************************************************/
UBYTE EPD_7IN5B_V2_Init_old(void)
{
EPD_7IN5B_V2_Reset();
EPD_7IN5B_V2_SendCommand(0x01); //POWER SETTING
EPD_7IN5B_V2_SendData(0x07);
EPD_7IN5B_V2_SendData(0x07); //VGH=20V,VGL=-20V
EPD_7IN5B_V2_SendData(0x3f); //VDH=15V
EPD_7IN5B_V2_SendData(0x3f); //VDL=-15V
EPD_7IN5B_V2_SendCommand(0x04); //POWER ON
DEV_Delay_ms(100);
EPD_7IN5B_V2_WaitUntilIdle();
EPD_7IN5B_V2_SendCommand(0X00); //PANNEL SETTING
EPD_7IN5B_V2_SendData(0x0F); //KW-3f KWR-2F BWROTP 0f BWOTP 1f
EPD_7IN5B_V2_SendCommand(0x61); //tres
EPD_7IN5B_V2_SendData(0x03); //source 800
EPD_7IN5B_V2_SendData(0x20);
EPD_7IN5B_V2_SendData(0x01); //gate 480
EPD_7IN5B_V2_SendData(0xE0);
EPD_7IN5B_V2_SendCommand(0X15);
EPD_7IN5B_V2_SendData(0x00);
EPD_7IN5B_V2_SendCommand(0X50); //VCOM AND DATA INTERVAL SETTING
EPD_7IN5B_V2_SendData(0x11);
EPD_7IN5B_V2_SendData(0x07);
EPD_7IN5B_V2_SendCommand(0X60); //TCON SETTING
EPD_7IN5B_V2_SendData(0x22);
EPD_7IN5B_V2_SendCommand(0x65); // Resolution setting
EPD_7IN5B_V2_SendData(0x00);
EPD_7IN5B_V2_SendData(0x00);//800*480
EPD_7IN5B_V2_SendData(0x00);
EPD_7IN5B_V2_SendData(0x00);
return 0;
}
/******************************************************************************
function : Clear screen
parameter:
******************************************************************************/
void EPD_7IN5B_V2_Clear_old(void)
{
UWORD Width, Height;
Width =(EPD_7IN5B_V2_WIDTH % 8 == 0)?(EPD_7IN5B_V2_WIDTH / 8 ):(EPD_7IN5B_V2_WIDTH / 8 + 1);
Height = EPD_7IN5B_V2_HEIGHT;
UWORD i;
EPD_7IN5B_V2_SendCommand(0x10);
for(i=0; i<Width*Height; i++) {
EPD_7IN5B_V2_SendData(0xff);
}
EPD_7IN5B_V2_SendCommand(0x13);
for(i=0; i<Width*Height; i++) {
EPD_7IN5B_V2_SendData(0x00);
}
EPD_7IN5B_V2_TurnOnDisplay();
}
void EPD_7IN5B_V2_ClearRed_old(void)
{
UWORD Width, Height;
Width =(EPD_7IN5B_V2_WIDTH % 8 == 0)?(EPD_7IN5B_V2_WIDTH / 8 ):(EPD_7IN5B_V2_WIDTH / 8 + 1);
Height = EPD_7IN5B_V2_HEIGHT;
UWORD i;
EPD_7IN5B_V2_SendCommand(0x10);
for(i=0; i<Width*Height; i++) {
EPD_7IN5B_V2_SendData(0xff);
}
EPD_7IN5B_V2_SendCommand(0x13);
for(i=0; i<Width*Height; i++) {
EPD_7IN5B_V2_SendData(0xff);
}
EPD_7IN5B_V2_TurnOnDisplay();
}
void EPD_7IN5B_V2_ClearBlack_old(void)
{
UWORD Width, Height;
Width =(EPD_7IN5B_V2_WIDTH % 8 == 0)?(EPD_7IN5B_V2_WIDTH / 8 ):(EPD_7IN5B_V2_WIDTH / 8 + 1);
Height = EPD_7IN5B_V2_HEIGHT;
UWORD i;
EPD_7IN5B_V2_SendCommand(0x10);
for(i=0; i<Width*Height; i++) {
EPD_7IN5B_V2_SendData(0x00);
}
EPD_7IN5B_V2_SendCommand(0x13);
for(i=0; i<Width*Height; i++) {
EPD_7IN5B_V2_SendData(0x00);
}
EPD_7IN5B_V2_TurnOnDisplay();
}
/******************************************************************************
function : Sends the image buffer in RAM to e-Paper and displays
parameter:
******************************************************************************/
void EPD_7IN5B_V2_Display_old(const UBYTE *blackimage, const UBYTE *ryimage)
{
UDOUBLE Width, Height;
Width =(EPD_7IN5B_V2_WIDTH % 8 == 0)?(EPD_7IN5B_V2_WIDTH / 8 ):(EPD_7IN5B_V2_WIDTH / 8 + 1);
Height = EPD_7IN5B_V2_HEIGHT;
//send black data
EPD_7IN5B_V2_SendCommand(0x10);
for (UDOUBLE j = 0; j < Height; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
EPD_7IN5B_V2_SendData(blackimage[i + j * Width]);
}
}
//send red data
EPD_7IN5B_V2_SendCommand(0x13);
for (UDOUBLE j = 0; j < Height; j++) {
for (UDOUBLE i = 0; i < Width; i++) {
EPD_7IN5B_V2_SendData(~ryimage[i + j * Width]);
}
}
EPD_7IN5B_V2_TurnOnDisplay();
}
/******************************************************************************
function : Enter sleep mode
parameter:
******************************************************************************/
void EPD_7IN5B_V2_Sleep_old(void)
{
EPD_7IN5B_V2_SendCommand(0X02); //power off
EPD_7IN5B_V2_WaitUntilIdle();
EPD_7IN5B_V2_SendCommand(0X07); //deep sleep
EPD_7IN5B_V2_SendData(0xA5);
}

View File

@@ -0,0 +1,50 @@
/*****************************************************************************
* | File : EPD_7in5.h
* | Author : Waveshare team
* | Function : Electronic paper driver
* | Info :
*----------------
* | This version: V2.0
* | Date : 2018-11-09
* | Info :
* 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8]
* 2.Change:EPD_Display(UBYTE *Image)
* Need to pass parameters: pointer to cached data
#
# 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.
#
******************************************************************************/
#ifndef _EPD_7IN5B_V2_OLD_H_
#define _EPD_7IN5B_V2_OLD_H_
#include "DEV_Config.h"
// Display resolution
#define EPD_7IN5B_V2_WIDTH 800
#define EPD_7IN5B_V2_HEIGHT 480
UBYTE EPD_7IN5B_V2_Init_old(void);
void EPD_7IN5B_V2_Clear_old(void);
void EPD_7IN5B_V2_ClearRed_old(void);
void EPD_7IN5B_V2_ClearBlack_old(void);
void EPD_7IN5B_V2_Display_old(const UBYTE *blackimage, const UBYTE *ryimage);
void EPD_7IN5B_V2_Sleep_old(void);
#endif