Skip to content

Commit b681a0f

Browse files
committed
add:add support for 2.9inch BWRY epaper.(JD79667)
1 parent eda17e6 commit b681a0f

File tree

12 files changed

+412
-5
lines changed

12 files changed

+412
-5
lines changed

Extensions/EPaper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class EPaper : public TFT_eSprite
1414
#endif
1515
void sleep();
1616
void wake();
17-
17+
1818
using GetTempCallback = std::function<float()>;
1919
using GetHumiCallback = std::function<float()>;
2020
void setTemp(GetTempCallback callback);

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ To simplify the hardware setup, we provide an online tool that helps you quickly
3636
- ED2208-based displays
3737
- ED103TC2-based displays
3838
- T133A01-based displays
39+
- JD79667_based displays
3940
> Note: When using a large-sized screen, please make sure to enable the PSRAM option in time. Otherwise, you will receive a prompt indicating a memory error!
4041
## E-Paper Implementation
4142

TFT_Drivers/JD79667_Defines.h

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
#ifndef EPD_WIDTH
2+
#define EPD_WIDTH 128
3+
#endif
4+
5+
#ifndef EPD_HEIGHT
6+
#define EPD_HEIGHT 296
7+
#endif
8+
9+
#ifndef TFT_WIDTH
10+
#define TFT_WIDTH EPD_WIDTH
11+
#endif
12+
13+
#ifndef TFT_HEIGHT
14+
#define TFT_HEIGHT EPD_HEIGHT
15+
#endif
16+
17+
#define EPD_COLOR_DEPTH 4
18+
19+
20+
21+
#define EPD_NOP 0xFF // No operation command (not supported)
22+
#define EPD_PNLSET 0x00 // Panel setting (R00H PSR)
23+
#define EPD_DISPON 0x04 // Power on (R04H PON)
24+
#define EPD_DISPOFF 0x02 // Power off (R02H POF)
25+
#define EPD_SLPIN 0x07 // Enter deep sleep (R07H DSLP)
26+
#define EPD_SLPOUT 0xFF // Exit sleep (not supported, requires wake-up)
27+
#define EPD_PTLIN 0x91 // Partial display in (R91H PTIN)
28+
#define EPD_PTLOUT 0x92 // Partial display out (R92H PTOUT)
29+
#define EPD_PTLW 0x90 // Partial display window setting (R90H PTL)
30+
31+
#define TFT_SWRST 0xFF // Software reset (not supported)
32+
#define TFT_CASET 0xFF // Column address setting (not supported)
33+
#define TFT_PASET 0xFF // Page address setting (not supported)
34+
#define TFT_RAMWR 0x13 // Write RAM (R13H DTM2, red data)
35+
#define TFT_RAMRD 0xFF // Read RAM (not supported)
36+
#define TFT_INVON 0xFF // Display inversion on (not supported)
37+
#define TFT_INVOFF 0xFF // Display inversion off (not supported)
38+
#define TFT_INIT_DELAY 0 // Initialization delay (none)
39+
40+
#ifdef TFT_BUSY
41+
#define CHECK_BUSY() \
42+
do \
43+
{ \
44+
while (!digitalRead(TFT_BUSY)) \
45+
; \
46+
} while (0)
47+
#else
48+
#define CHECK_BUSY()
49+
#endif
50+
51+
#define EPD_INIT() \
52+
do \
53+
{ \
54+
writecommand(0x4D);\
55+
writedata(0x78);\
56+
writecommand(0x00); \
57+
writedata(0x0F);\
58+
writedata(0x29);\
59+
writecommand(0x01); \
60+
writedata(0x07);\
61+
writedata(0x00);\
62+
writecommand(0x03); \
63+
writedata(0x10);\
64+
writedata(0x54);\
65+
writedata(0x44);\
66+
writecommand(0x06); \
67+
writedata(0x05);\
68+
writedata(0x00);\
69+
writedata(0x3F);\
70+
writedata(0x0A);\
71+
writedata(0x25);\
72+
writedata(0x12);\
73+
writedata(0x1A); \
74+
writecommand(0x50);\
75+
writedata(0x37);\
76+
writecommand(0x60); \
77+
writedata(0x02);\
78+
writedata(0x02);\
79+
writecommand(0x61); \
80+
writedata(128/256); \
81+
writedata(128%256); \
82+
writedata(296/256); \
83+
writedata(296%256); \
84+
writecommand(0xE7);\
85+
writedata(0x1C);\
86+
writecommand(0xE3); \
87+
writedata(0x22);\
88+
writecommand(0xB4);\
89+
writedata(0xD0);\
90+
writecommand(0xB5);\
91+
writedata(0x03);\
92+
writecommand(0xE9);\
93+
writedata(0x01); \
94+
writecommand(0x30);\
95+
writedata(0x08); \
96+
writecommand(0x04);\
97+
CHECK_BUSY(); \
98+
} while (0)
99+
100+
#define EPD_UPDATE() \
101+
do \
102+
{ \
103+
writecommand(0x12); \
104+
writedata(0x00); \
105+
CHECK_BUSY(); \
106+
} while (0)
107+
108+
#define EPD_SLEEP() \
109+
do \
110+
{ \
111+
writecommand(0x02); \
112+
CHECK_BUSY(); \
113+
delay(100); \
114+
writecommand(0x07); \
115+
writedata(0xA5); \
116+
} while (0)
117+
118+
#define EPD_WAKEUP() \
119+
do \
120+
{ \
121+
digitalWrite(TFT_RST, LOW); \
122+
delay(20); \
123+
digitalWrite(TFT_RST, HIGH); \
124+
delay(20); \
125+
CHECK_BUSY(); \
126+
EPD_INIT(); \
127+
} while (0)
128+
129+
#define EPD_SET_WINDOW(x1, y1, x2, y2) \
130+
do \
131+
{ \
132+
} while (0)
133+
134+
#define COLOR_GET(color) ( \
135+
(color) == 0x00 ? 0x01 : \
136+
(color) == 0x01 ? 0x02 : \
137+
(color) == 0x02 ? 0x03 : \
138+
(color) == 0x03 ? 0x00 : \
139+
0x00 \
140+
)
141+
142+
#define EPD_PUSH_NEW_COLORS(w, h, colors) \
143+
do \
144+
{ \
145+
uint16_t bytes_per_row = (w) / 2; \
146+
uint8_t temp1, temp2, temp3, temp4; \
147+
writecommand(0x10); \
148+
for (uint16_t row = 0; row < (h) ; row++) \
149+
{ \
150+
for(uint16_t col = 0; col < bytes_per_row; col+=2) \
151+
{ \
152+
uint8_t b = (colors[bytes_per_row *row+col ]) ; \
153+
uint8_t c = (colors[bytes_per_row *row+col + 1]) ; \
154+
temp1 = (b >> 4) & 0x0F;\
155+
temp2 = b & 0x0F;\
156+
temp3 = (c >> 4) & 0x0F;\
157+
temp4 = c & 0x0F;\
158+
writedata(((COLOR_GET(temp1) <<6)|( COLOR_GET(temp2) << 4 ) |( COLOR_GET(temp3) << 2 ) |( COLOR_GET(temp4) << 0 )));\
159+
} \
160+
} \
161+
} while (0)
162+
163+
#define EPD_PUSH_NEW_COLORS_FLIP(w, h, colors) \
164+
do \
165+
{ \
166+
uint16_t bytes_per_row = (w) / 2; \
167+
uint8_t temp1, temp2, temp3, temp4; \
168+
writecommand(0x10); \
169+
for (uint16_t row = 0; row < (h); row++) \
170+
{ \
171+
uint16_t start = row * bytes_per_row; \
172+
for (uint16_t col = 0; col < bytes_per_row; col+=2) \
173+
{ \
174+
uint8_t b = (colors[bytes_per_row *row + (bytes_per_row - 1 - col)]) ;\
175+
uint8_t c = (colors[bytes_per_row *row + (bytes_per_row - 1 - col) - 1]) ;\
176+
temp1 = (b >> 4) & 0x0F;\
177+
temp2 = b & 0x0F;\
178+
temp3 = (c >> 4) & 0x0F;\
179+
temp4 = c & 0x0F;\
180+
writedata(((COLOR_GET(temp1) <<6)|( COLOR_GET(temp2) << 4 ) |( COLOR_GET(temp3) << 2 ) |( COLOR_GET(temp4) << 0 )));\
181+
} \
182+
} \
183+
} while (0)
184+
185+
#define EPD_PUSH_OLD_COLORS(w, h, colors) \
186+
do \
187+
{ \
188+
} while (0)
189+
190+
#define EPD_PUSH_OLD_COLORS_FLIP(w, h, colors) \
191+
do \
192+
{ \
193+
\
194+
} while (0)
195+
196+
#define EPD_SET_TEMP(temp) \
197+
do \
198+
{ \
199+
} while (0)

TFT_Drivers/JD79667_Init.h

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// JD79686B_Init.h
2+
{
3+
#ifdef TFT_BUSY
4+
pinMode(TFT_BUSY, INPUT);
5+
#endif
6+
digitalWrite(TFT_RST, LOW);
7+
delay(20);
8+
digitalWrite(TFT_RST, HIGH);
9+
delay(50);
10+
CHECK_BUSY();
11+
writecommand(0x4D);
12+
writedata(0x78);
13+
14+
writecommand(0x00); //PSR
15+
writedata(0x0F);
16+
writedata(0x29);
17+
18+
writecommand(0x01); //PWRR
19+
writedata(0x07);
20+
writedata(0x00);
21+
22+
writecommand(0x03); //POFS
23+
writedata(0x10);
24+
writedata(0x54);
25+
writedata(0x44);
26+
27+
writecommand(0x06); //BTST_P
28+
writedata(0x05);
29+
writedata(0x00);
30+
writedata(0x3F);
31+
writedata(0x0A);
32+
writedata(0x25);
33+
writedata(0x12);
34+
writedata(0x1A);
35+
36+
writecommand(0x50); //CDI
37+
writedata(0x37);
38+
39+
writecommand(0x60); //TCON
40+
writedata(0x02);
41+
writedata(0x02);
42+
43+
writecommand(0x61); //TRES
44+
writedata(128/256); // Source_BITS_H
45+
writedata(128%256); // Source_BITS_L
46+
writedata(296/256); // Gate_BITS_H
47+
writedata(296%256); // Gate_BITS_L
48+
49+
writecommand(0xE7);
50+
writedata(0x1C);
51+
52+
writecommand(0xE3);
53+
writedata(0x22);
54+
55+
writecommand(0xB4);
56+
writedata(0xD0);
57+
writecommand(0xB5);
58+
writedata(0x03);
59+
60+
writecommand(0xE9);
61+
writedata(0x01);
62+
63+
writecommand(0x30);
64+
writedata(0x08);
65+
66+
writecommand(0x04);
67+
CHECK_BUSY();
68+
}

TFT_Drivers/JD79667_Rotation.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// JD79686B_Rotation.h
2+
rotation = m % 4;
3+
4+
writecommand(EPD_PNLSET);
5+
switch (rotation) {
6+
case 0: // Portrait
7+
writedata(0x1F); // 0b00011111
8+
_width = _init_width;
9+
_height = _init_height;
10+
break;
11+
case 1: // Landscape (Portrait + 90)
12+
writedata(0x1B); // 0b00011011
13+
_width = _init_height;
14+
_height = _init_width;
15+
break;
16+
case 2: // Inverted Portrait
17+
writedata(0x13); // 0b00010011
18+
_width = _init_width;
19+
_height = _init_height;
20+
break;
21+
case 3: // Landscape (Portrait + 270)
22+
writedata(0x17); // 0b00010111
23+
_width = _init_height;
24+
_height = _init_width;
25+
break;
26+
}

TFT_eSPI.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,6 +804,9 @@ void TFT_eSPI::init(uint8_t tc)
804804
#elif defined (T133A01_DRIVER)
805805
#include "TFT_Drivers/T133A01_Init.h"
806806

807+
#elif defined (JD79667_DRIVER)
808+
#include "TFT_Drivers/JD79667_Init.h"
809+
807810
#endif
808811

809812
#ifdef TFT_INVERSION_ON
@@ -935,6 +938,9 @@ void TFT_eSPI::setRotation(uint8_t m)
935938
#elif defined (ED103TC2_DRIVER)
936939
#include "TFT_Drivers/ED103TC2_Rotation.h"
937940

941+
#elif defined (JD79667_DRIVER)
942+
#include "TFT_Drivers/JD79667_Rotation.h"
943+
938944
#endif
939945

940946
delayMicroseconds(10);

TFT_eSPI.h

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,6 @@ const PROGMEM fontinfo fontdata[] = {
318318
#define TFT_YELLOW 0X2
319319
#define TFT_GREEN 0X6
320320
#define TFT_RED 0XB
321-
322321
//In the 6-color mode, other colors will be mapped to similar ones.
323322
#define TFT_NAVY TFT_BLUE
324323
#define TFT_DARKGREEN TFT_GREEN
@@ -338,6 +337,32 @@ const PROGMEM fontinfo fontdata[] = {
338337
#define TFT_SILVER TFT_WHITE
339338
#define TFT_SKYBLUE TFT_BLUE
340339
#define TFT_VIOLET TFT_BLUE
340+
#elif defined (USE_BWRY_EPAPER)
341+
#define TFT_WHITE 0X00
342+
#define TFT_YELLOW 0X01
343+
#define TFT_RED 0X02
344+
#define TFT_BLACK 0X03
345+
346+
#define TFT_BLUE TFT_YELLOW
347+
#define TFT_GREEN TFT_YELLOW
348+
#define TFT_NAVY TFT_BLUE
349+
#define TFT_DARKGREEN TFT_GREEN
350+
#define TFT_DARKCYAN TFT_GREEN
351+
#define TFT_MAROON TFT_RED
352+
#define TFT_PURPLE TFT_BLUE
353+
#define TFT_OLIVE TFT_YELLOW
354+
#define TFT_LIGHTGREY TFT_WHITE
355+
#define TFT_DARKGREY TFT_BLACK
356+
#define TFT_CYAN TFT_GREEN
357+
#define TFT_MAGENTA TFT_RED
358+
#define TFT_ORANGE TFT_YELLOW
359+
#define TFT_GREENYELLOW TFT_GREEN
360+
#define TFT_PINK TFT_RED
361+
#define TFT_BROWN TFT_YELLOW
362+
#define TFT_GOLD TFT_YELLOW
363+
#define TFT_SILVER TFT_WHITE
364+
#define TFT_SKYBLUE TFT_BLUE
365+
#define TFT_VIOLET TFT_BLUE
341366
#else
342367
// Default color definitions
343368
#define TFT_BLACK 0x0000 /* 0, 0, 0 */

User_Setup_Select.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,10 @@
158158
#elif defined (ED103TC2_DRIVER)
159159
#include "TFT_Drivers/IT8951_Defines.h"
160160
#include "TFT_Drivers/ED103TC2_Defines.h"
161-
#define TFT_DRIVER 0x1032
161+
#define TFT_DRIVER 0x1032
162+
#elif defined (JD79667_DRIVER)
163+
#include "TFT_Drivers/JD79667_Defines.h"
164+
#define TFT_DRIVER 0x2904
162165
// <<<<<<<<<<<<<<<<<<<<<<<< ADD NEW DRIVER HERE
163166
// XYZZY_init.h and XYZZY_rotation.h must also be added in TFT_eSPI.cpp
164167
#elif defined (XYZZY_DRIVER)

User_Setups/Dynamic_Setup.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,10 @@
310310
#define TCON_ENABLE
311311
#define ENABLE_EPAPER_BOARD_PIN_SETUPS
312312
#include <User_Setups/Setup511_Seeed_XIAO_EPaper_10inch3.h> // Setup file for Seeed XIAO with 10.3inch ePaper
313+
#elif BOARD_SCREEN_COMBO == 512
314+
#define USE_BWRY_EPAPER
315+
#define ENABLE_EPAPER_BOARD_PIN_SETUPS
316+
#include <User_Setups/Setup512_Seeed_XIAO_EPaper_2inch9_BWRY.h>
313317
#elif BOARD_SCREEN_COMBO == 520
314318
#define ENABLE_EPAPER_BOARD_PIN_SETUPS
315319
#include <User_Setups/Setup520_Seeed_reTerminal_E1001.h>

0 commit comments

Comments
 (0)