墨水屏的局部刷新及参考程序-ELink墨水屏电子纸社区-FPGA CPLD-ChipDebug

墨水屏的局部刷新及参考程序

墨水屏局部刷新原理

墨水屏通过电泳技术控制带电颜料颗粒移动实现显示。局部刷新指仅更新屏幕部分区域而非全屏刷新,可降低闪烁和功耗,延长屏幕寿命。

开窗局部刷新实现方法

静态分区刷新
将屏幕划分为固定区域(如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

如图所示,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]);
}

请登录后发表评论

    没有回复内容