由于本人是纯小白,在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) { epd_gui_update_event_t *event = (epd_gui_updat





没有回复内容