由于本人是纯小白,在github上下载了大佬tsl0092的一个开源代码,此代码为蓝牙nrf52811为主控的墨水屏日历及时间显示代码,日历是每天全刷一次,非常好,时间是每分钟全刷一次,感觉有点不实用,每分钟都要闪几秒,而且非常耗电,大佬也不愿开放局刷代码,对于我这种完全一窍不通,又菜又爱玩的小白来讲,想改一下,真是无从下手,虽然在大佬眼中,中分分钟的事,但我得花一年才能搞好。下面是我通过研究代码,结合ia,修改的代码,还没完全验证,先记录下来备用,请高手指点,不胜感激!
将电子纸每分钟全刷改为局刷的实现方案
要将现有的每分钟全屏幕刷新改为局部刷新,需要从显示模式控制、更新逻辑和驱动层接口三个层面进行修改。以下是详细的修改方案:
一、数据结构与模式定义调整
首先需要在数据结构中添加局刷相关的标志位,并扩展显示模式定义:
// 扩展显示模式定义,新增局刷时钟模式
typedef enum {
MODE_NONE = 0,
MODE_CALENDAR = 1,
MODE_CLOCK = 2,
MODE_CLOCK_PARTIAL = 3 // 新增:局刷时钟模式
} display_mode_t;
// 在ble_epd_t结构体中添加局刷标志
typedef struct {
// 原有字段...
display_mode_t display_mode; // 显示模式
bool use_partial_update; // 新增:局刷启用标志
// 其他字段...
} ble_epd_t;
修改说明:
- 新增
MODE_CLOCK_PARTIAL模式用于局刷时钟显示 - 添加
use_partial_update标志位,可动态控制是否使用局刷
二、定时器更新逻辑修改
核心的定时器函数需要调整更新条件和模式判断:
原函数代码:
void ble_epd_on_timer(ble_epd_t * p_epd, uint32_t timestamp, bool force_update)
{
// Update calendar on 00:00:00, clock on every minute
if (force_update ||
(p_epd->display_mode == MODE_CALENDAR && timestamp % 86400 == 0) ||
(p_epd->display_mode == MODE_CLOCK && timestamp % 60 == 0)) {
epd_gui_update_event_t event = { p_epd, timestamp };
app_sched_event_put(&event, sizeof(epd_gui_update_event_t), epd_gui_update);
}
}
修改后的函数:
void ble_epd_on_timer(ble_epd_t * p_epd, uint32_t timestamp, bool force_update)
{
bool need_update = false;
// 判断更新条件(新增局刷模式逻辑)
if (force_update) {
need_update = true;
// 强制更新时使用全刷
p_epd->use_partial_update = false;
}
else if (p_epd->display_mode == MODE_CALENDAR && timestamp % 86400 == 0) {
need_update = true;
// 日历模式仍使用全刷
p_epd->use_partial_update = false;
}
else if ((p_epd->display_mode == MODE_CLOCK || p_epd->display_mode == MODE_CLOCK_PARTIAL) && timestamp % 60 == 0) {
need_update = true;
// 局刷时钟模式启用局刷
p_epd->use_partial_update = (p_epd->display_mode == MODE_CLOCK_PARTIAL);
}
if (need_update) {
epd_gui_update_event_t event = { p_epd, timestamp };
app_sched_event_put(&event, sizeof(epd_gui_update_event_t), epd_gui_update);
}
}
关键修改点:
- 新增
MODE_CLOCK_PARTIAL模式判断 - 根据模式设置
use_partial_update标志 - 强制更新时始终使用全刷(确保关键数据正确显示)
- 日历模式仍保持每日全刷(日历信息变化范围大,局刷难度高)
三、界面更新函数修改
需要在界面更新函数中根据局刷标志选择不同的刷新方式:
原函数代码:
static void epd_gui_update(void * p_event_data, uint16_t event_size)



![表情[ciya]-ChipDebug](https://chipdebug.com/wp-content/themes/zibll/img/smilies/ciya.gif)


