墨水屏局部刷新原理
墨水屏通过电泳技术控制带电颜料颗粒移动实现显示。局部刷新指仅更新屏幕部分区域而非全屏刷新,可降低闪烁和功耗,延长屏幕寿命。
开窗局部刷新实现方法
静态分区刷新
将屏幕划分为固定区域(如16×16像素块),仅刷新内容变化的区块。需硬件支持分区寻址,软件需标记脏区域。
需要用到驱动IC的开窗指令
// 启用窗口模式
SPI_Cmd(0x91);
// 设置窗口范围
SPI_Cmd(0x90);
SPI_Data(x_st);
SPI_Data(x_end);
SPI_Data(y_st_high);
SPI_Data(y_st_low);
SPI_Data(y_end_high);
SPI_Data(y_end_low);
SPI_Data(1);
printf("图片数据写入.....\n");
//写入R13H 显示寄存器
SPI_Cmd(0x13);
// 循环写入指定数据
for(i=0;i< (x*y)/8;i++)
{
SPI_Data(data);
}
printf("图片数据写入完成.....\n");
Display_Update(); // 调用刷新函数更新屏幕
// 关闭窗口模式
SPI_Cmd(0x92);
波形局部刷新实现方法
![图片[1]-墨水屏的局部刷新及参考程序-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2025/12/20251208093411997-31765157651.png?v=1765157651)
如图所示,LUT中B2B和W2W始终(GND),不进行高低电平的变换,可以实现刷新过程中,前后两张图,不变的地方不会进行波形驱动;LUT中B2W和W2B存在低电平和高电平的驱动,所以刷新过程中,前后两张图,变化的地方会进行波形驱动,进行内容更改。
波形优化技术
局部刷新需配合特定驱动波形(Waveform),避免残影。多数厂商提供优化波形库,如:
- 全刷波形(Full Update):用于初始化或深度清理残影
- 局部波形(Partial Update):高频使用但可能累积残影
注意事项
- 残影控制:局部刷新多次后需全刷清除残留电荷,通常每5-10次局部刷新插入1次全刷。
- 刷新速度:局部刷新速度受区域大小影响,通常比全刷快50%-80%。
- 硬件限制:部分低端墨水屏仅支持全刷,需查阅数据手册确认。
应用场景
- 电子书翻页:仅刷新文字行变化区域
- 智能手表表盘:更新数字或图标时避免全屏闪烁
- 电子价签:价格变动时局部刷新,降低功耗
驱动参考程序:
// 主函数
void main(void)
{
Hardware_reset(); //硬件复位
IC_initial(); //IC初始化
while(1) //循环体
{
if(flag == 0) //判定变量 flag 的值是否为 0
{
lut_find(GC); //调用全刷波形,进行残影清除
}
else
{
lut_find(DU); //调用局刷波形
}
switch(flag) //根据flag的值选择某一块语句执行
{
case 0:first_dis_pic(gImage_0); //刷新第一张图
break; //跳出本次循环
case 1:dis_pic(gImage_1,gImage_0); //局刷第二张图
break; //跳出本次循环
case 2:dis_pic(gImage_1_1,gImage_1);
break;
case 3:dis_pic(gImage_1_2,gImage_1_1);
break;
case 4:dis_pic(gImage_1_3,gImage_1_2);
break;
case 5:dis_pic(gImage_1_4,gImage_1_3);
break;
case 6:dis_pic(gImage_1_5,gImage_1_4);
break;
case 7:dis_pic(gImage_2,gImage_1_5);
break;
case 8:dis_pic(gImage_2_1,gImage_2);
break;
case 9:dis_pic(gImage_2_2,gImage_2_1);
flag = 0;
break;
}
}
}
//系统初始化
void IC_initial(void)
{
//IC的板块及模式选择
MCU_S8_S9_write_cmd(0x00); //panel setting
MCU_S8_S9_write_data(0xFF);
MCU_S8_S9_write_data(0x0D);
//IC的供电寄存器设置
MCU_S8_S9_write_cmd(0x01); //Power setting Register
MCU_S8_S9_write_data(0x03);
MCU_S8_S9_write_data(0x00);
MCU_S8_S9_write_data(0x3F); //VSH 15V
MCU_S8_S9_write_data(0x3F); //VSL -15
MCU_S8_S9_write_data(0x00);
//驱动强度设定
MCU_S8_S9_write_cmd(0x06); //BOOST ,驱动强度设定
MCU_S8_S9_write_data(0x17);
MCU_S8_S9_write_data(0x17);
MCU_S8_S9_write_data(0x16);
//IC的振荡频率设置
MCU_S8_S9_write_cmd(0x30); //Frame rate
MCU_S8_S9_write_data(0x13); //100hz 0x13
//VCOM和DATA间隔设置寄存器(设定border和数据中0或1代表的像素)
MCU_S8_S9_write_cmd(0x50);
MCU_S8_S9_write_data(0x07);
//分辨率设置,刷新尺寸
MCU_S8_S9_write_cmd(0x61);
MCU_S8_S9_write_data(0x128);
MCU_S8_S9_write_data(0x00);
MCU_S8_S9_write_data(0x250);
//VCOM的设定
MCU_S8_S9_write_cmd(0x82); //VCOM
MCU_S8_S9_write_data(0x00);
//刷新省电设置
MCU_S8_S9_write_cmd(0xE3); //Power Saving Register
MCU_S8_S9_write_data(0x00);
//波形表中XON的设置
MCU_S8_S9_write_cmd(0x2A); //LUT Option Register
MCU_S8_S9_write_data(0x00);
MCU_S8_S9_write_data(0x00);
MCU_S8_S9_write_data(0x00);
MCU_S8_S9_write_data(0xFF);
MCU_S8_S9_write_data(0x03);
//通电
MCU_S8_S9_write_cmd(0x04); //上电
lcd_chkstatus();
}
//图片更新
void update()
{
MCU_S8_S9_write_cmd(0x04); //通电
lcd_chkstatus();
MCU_S8_S9_write_cmd(0x12); //刷新
lcd_chkstatus();
MCU_S8_S9_write_cmd(0x02); //断电
lcd_chkstatus();
}
//显示图片
void dis_pic(unsigned char *new_dat,unsigned char *old_dat)
{
unsigned int i=0;
MCU_S8_S9_write_cmd(0x10);
for(i=0;i<4000;i++)
{
MCU_S8_S9_write_data(old_dat[i]); //输入数据为旧图片数据
}
MCU_S8_S9_write_cmd(0x13);
for(i=0;i<4000;i++)
{
MCU_S8_S9_write_data(new_dat[i]); //输入数据为新图片数据
}
flag++; //变量 flag+1
update();
}
//显示图片
void first_dis_pic(unsigned char *new_dat)
{
unsigned int i=0;
MCU_S8_S9_write_cmd(0x10);
for(i=0;i<4000;i++)
{
MCU_S8_S9_write_data(0x00); //输入数据为全 0
}
MCU_S8_S9_write_cmd(0x13);
for(i=0;i<4000;i++)
{
MCU_S8_S9_write_data(new_dat[i]); //输入数据为新图片数据
}
flag =1; //变量flag 赋值为 1
update();
}
void lut_find(unsigned char *lut)
{
unsigned int count;
static int change = 0
//lutVCOM
MCU_S8_S9_write_cmd(0x20); //波形数据存入0X20寄存器,为VCOM
for(count=0;count<56;count++)
MCU_S8_S9_write_data(lut[count]);
//lutWW
MCU_S8_S9_write_cmd(0x21); //波形数据存入0X21寄存器,为LUTWW
for(count=56;count<112;count++)
MCU_S8_S9_write_data(lut[count]);
if(change == 0)
{
//lutBW
MCU_S8_S9_write_cmd(0x22); //波形数据存入0X22寄存器,为LUTKW
for(count=112;count<168;count++)
MCU_S8_S9_write_data(lut[count]);
//lutWB
MCU_S8_S9_write_cmd(0x23); //波形数据存入0X23寄存器,为LUTWK
for(count=168;count<224;count++)
MCU_S8_S9_write_data(lut[count]);
change = 1;
}
else
{
//lutBW
MCU_S8_S9_write_cmd(0x23); //波形数据存入0X22寄存器,为LUTKW
for(count=112;count<168;count++)
MCU_S8_S9_write_data(lut[count]);
//lutWB
MCU_S8_S9_write_cmd(0x22); //波形数据存入0X23寄存器,为LUTWK
for(count=168;count<224;count++)
MCU_S8_S9_write_data(lut[count]);
change = 0;
}
//lutBB
MCU_S8_S9_write_cmd(0x24); //波形数据存入0X24寄存器,为LUTKK
for(count=224;count<280;count++)
MCU_S8_S9_write_data(lut[count]);
}





没有回复内容