问答

汇集网友智慧,解决技术难题

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

单片机 LCD 屏幕 ips

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

zmkukude2022-10-02
本帖最后由 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  注
回答 +关注 14
3271人浏览 5人回答问题 分享 举报
5 个回答
  • 可以试试:
    1. 提高spi速度,用DMA写入会提高减少写的时间。
    2. 在内存开缓存,显示内容准备好后,再写入。
  • 这个关键在ST7789的写显存速度,显示一个字符和清屏一样,都是把显存写1或写0,清屏要全部显存写一遍,速度会慢。我在用的1.3存屏就是这个芯片,卖家给的例程,F411,96Mhz时钟,硬件SPI,清屏时能看出刷屏过程。
    zmkukude 2022-10-3 15:59 回复TA
    是的,主要是这个刷屏过程很不美观,太慢了,所以想问问有什么别的方法 
  • 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个字的边边角角。 
  • 没有用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
    有的放矢,有写过的地方才清屏,会快得多. 
  • 上图看看“重叠”是怎么个情况。再把代码也弄上来。用DMA没?
    zmkukude 2022-10-3 09:20 回复TA
    已发在帖子里,没有用DMA 

您需要登录后才可以回复 登录 | 注册