ST7789-LCD驱动 如何用清屏切换两个页面不产生重叠

[复制链接]
 楼主| zmkukude 发表于 2022-10-2 18:54 | 显示全部楼层 |阅读模式
本帖最后由 tyw 于 2022-10-2 19:44 编辑

我发现第二页显示的时候,第一页还在那,两者会产生重叠,所以需要在每次展示新的一页之前,将lcd清屏,但是清屏函数是用字节一位一位去写就很慢,请问还有什么其他方法吗









               tyw  注

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

tyw
去啃资料,看看有没有清屏命令  发表于 2022-10-2 19:46
LcwSwust 发表于 2022-10-2 20:16 | 显示全部楼层
上图看看“重叠”是怎么个情况。再把代码也弄上来。用DMA没?

评论

已发在帖子里,没有用DMA  发表于 2022-10-3 09:20
 楼主| zmkukude 发表于 2022-10-3 09:20 | 显示全部楼层

ST7789-LCD驱动 如何用清屏切换两个页面不产生重叠

没有用DMA,用的是模拟SPI
清屏函数如下,就是用全白就填满屏幕
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
{              
        u16 i,j;
        LCD_Address_Set(xsta,ysta,xend-1,yend-1);//设置显示范围
        for(i=ysta;i<yend;i++)
        {                                                                                                                           
                for(j=xsta;j<xend;j++)
                {
                        LCD_WR_DATA(color);
                }
        }
}
写函数如下
void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode)
{
        u16 temp,sizex,t,m=0;
        u16 i,TypefaceNum;//一个字符所占字节大小
        u16 x0=x;
        sizex=sizey/2;
        TypefaceNum=(sizex/8+((sizex%8)?1:0))*sizey;
        num=num-' ';    //得到偏移后的值
        LCD_Address_Set(x,y,x+sizex-1,y+sizey-1);  //设置光标位置
        for(i=0;i<TypefaceNum;i++)
        {
                if(sizey==12)temp=ascii_1206[num][i];                     //调用6x12字体
                else if(sizey==16)temp=ascii_1608[num][i];                 //调用8x16字体
                else if(sizey==24)temp=ascii_2412[num][i];                 //调用12x24字体
                else if(sizey==32)temp=ascii_3216[num][i];                 //调用16x32字体
                else if(sizey==48)temp=ascii_4824[num][i];                 //调用24x48字体
                else return;
                for(t=0;t<8;t++)
                {
                        if(!mode)//非叠加模式
                        {
                                if(temp&(0x01<<t))LCD_WR_DATA(fc);
                                else LCD_WR_DATA(bc);
                                m++;
                                if(m%sizex==0)
                                {
                                        m=0;
                                        break;
                                }
                        }
                        else//叠加模式
                        {
                                if(temp&(0x01<<t))LCD_DrawPoint(x,y,fc);//画一个点
                                x++;
                                if((x-x0)==sizex)
                                {
                                        x=x0;
                                        y++;
                                        break;
                                }
                        }
                }
        }                      
}

重叠就是我一直在往屏幕写,没有清屏,导致他们都出现了,叠加在一起,现在就是这个清屏很慢,导致不美观,有没有什么其他的办法呢

评论

tyw
有的放矢,有写过的地方才清屏,会快得多.  发表于 2022-10-3 16:23
LcwSwust 发表于 2022-10-3 09:25 | 显示全部楼层
zmkukude 发表于 2022-10-3 09:20
没有用DMA,用的是模拟SPI
清屏函数如下,就是用全白就填满屏幕
void LCD_Fill(u16 xsta,u16 ysta,u16 xend ...

LCD_ShowChar 用非叠加模式看看

评论

@zmkukude :这简单啊,3个字的加两个空格把多余的覆盖掉呗。  发表于 2022-10-3 19:05
非叠加模式试了一下也不行,比如我第一页4个字,第二页3个字,3个字会盖在4个字上面完全显示,但是没盖住的地方还是4个字的边边角角。  发表于 2022-10-3 15:58
资深技术 发表于 2022-10-3 10:32 | 显示全部楼层
这个关键在ST7789的写显存速度,显示一个字符和清屏一样,都是把显存写1或写0,清屏要全部显存写一遍,速度会慢。我在用的1.3存屏就是这个芯片,卖家给的例程,F411,96Mhz时钟,硬件SPI,清屏时能看出刷屏过程。

评论

是的,主要是这个刷屏过程很不美观,太慢了,所以想问问有什么别的方法  发表于 2022-10-3 15:59
jekey 发表于 2022-10-4 08:43 | 显示全部楼层
可以试试:
1. 提高spi速度,用DMA写入会提高减少写的时间。
2. 在内存开缓存,显示内容准备好后,再写入。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

15

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部