打印

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

[复制链接]
3147|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zmkukude|  楼主 | 2022-10-2 18:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tyw 于 2022-10-2 19:44 编辑

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

Arduino esp8266 1.3寸TFT屏(st7789驱动)显示图片教程.pdf (2.27 MB)
玩转 ESP32 Arduino(二十八) TFT_eSPI库驱动ST7789_.pdf (2.11 MB)
STM32 SPI驱动ST7789 LCD ISP TFT液晶屏幕.pdf (14.1 MB)
st7789s-g4a 应用说明.pdf (3.71 MB)
ST7789V_SPEC_V1.pdf (44.88 MB)
ST7789V 310页.pdf (3.15 MB)


               tyw  注

使用特权

评论回复
评论
tyw 2022-10-2 19:46 回复TA
去啃资料,看看有没有清屏命令 

相关帖子

沙发
LcwSwust| | 2022-10-2 20:16 | 只看该作者
上图看看“重叠”是怎么个情况。再把代码也弄上来。用DMA没?

使用特权

评论回复
评论
zmkukude 2022-10-3 09:20 回复TA
已发在帖子里,没有用DMA 
板凳
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 回复TA
有的放矢,有写过的地方才清屏,会快得多. 
地板
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 用非叠加模式看看

使用特权

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

使用特权

评论回复
评论
zmkukude 2022-10-3 15:59 回复TA
是的,主要是这个刷屏过程很不美观,太慢了,所以想问问有什么别的方法 
6
jekey| | 2022-10-4 08:43 | 只看该作者
可以试试:
1. 提高spi速度,用DMA写入会提高减少写的时间。
2. 在内存开缓存,显示内容准备好后,再写入。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

15

帖子

1

粉丝