华芯微特开发论坛

 找回密码
 立即注册
搜索
热搜: SWM341 资料
查看: 1010|回复: 0

在SWM32S裸机驱动TFT显示屏环境下提高刷新速率的方法

[复制链接]

1

主题

4

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2024-1-6 11:13:36 | 显示全部楼层 |阅读模式
  最近一个项目用到了SWM32S,外接一个800*480的TFT屏幕,不带触摸功能。没有使用图像驱动GUI,比如LVGL,emwin等。
  在实际使用中发现单独打点刷新很慢,主要是因为每次显示的时候都要读一次那个点所在存储空间的变量值,导致刷新就很慢,驱动函数如下。
void SWM32S_PutPixel(uint16_t _usX, uint16_t _usY, uint16_t _usColor)
{
uint32_t index = 0;
{
   index = (uint32_t)_usY * g_LcdWidth + _usX;
}
       
if (index < g_LcdHeight * g_LcdWidth)
{
   uint32_t temp;
   temp = lcdbuf_show[s_CurrentLayer][(_usY*LCD_HDOT+_usX) / 2];
   temp &= ~(0xFFFF << ((_usX%2) == 0 ? 0 : 16));
   temp |=  (_usColor      << ((_usX%2) == 0 ? 0 : 16));
   lcdbuf_show[s_CurrentLayer][(_usY*LCD_HDOT+_usX) / 2] = temp;  
}
}


后来我改写了一个显示两个点的函数,这个函数可以显示X轴上相邻的两个点。这个函数在填充矩形非常有有用,能明显的提高刷新速度。
void SWM32S_PutDoubelPixel(uint16_t _usX, uint16_t _usY, uint32_t _usColor)
{
uint32_t index = 0;
{
   index = (uint32_t)_usY * g_LcdWidth + _usX;
}
       
if (index < g_LcdHeight * g_LcdWidth)
{
   lcdbuf_show[s_CurrentLayer][(_usY*LCD_HDOT+_usX) / 2] = _usColor;  
}
}



矩形填充函数
void SWM32S_FillRect(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth, uint16_t _usColor)
{
uint16_t i,j;
for(j=0;j<_usHeight;j++)
   for(i=0;i<_usWidth;)
   {
     if(i==0)  /*第一个点*/  
     {
       if(((_usX+i)%2==0)&&((i+1)<_usWidth))
       {
         SWM32S_PutDoubelPixel(_usX+i,_usY+j,(uint32_t)(_usColor<<16)|_usColor);
         i=i+2;
        }
        else
        {
          SWM32S_PutPixel(_usX+i,_usY+j,_usColor);
          i++;
        }
      }  
      else
      {
        if(((i+1)<_usWidth))
        {
          SWM32S_PutDoubelPixel(_usX+i,_usY+j,(uint32_t)(_usColor<<16)|_usColor);
          i=i+2;
        }
        else
        {
          SWM32S_PutPixel(_usX+i,_usY+j,_usColor);
          i++;
        }
     }        
   }
}





画横线函数
void SWM32S_DrawHLine(uint16_t _usX, uint16_t _usY, uint16_t _usLen , uint16_t _usColor)
{
  uint16_t i;
  for (i = 0; i < _usLen; i++)
  {       
    if(i==0)  /*第一个点*/  
    {
      if(((_usX+i)%2==0)&&((i+1)<_usLen))
      {
        SWM32S_PutDoubelPixel(_usX+i,_usY,(uint32_t)(_usColor<<16)|_usColor);
        i=i+2;
      }
      else
      {
        SWM32S_PutPixel(_usX+i,_usY,_usColor);
        i++;
      }
    }  
    else
    {
      if(((i+1)<_usLen))
      {
        SWM32S_PutDoubelPixel(_usX+i,_usY,(uint32_t)(_usColor<<16)|_usColor);
        i=i+2;
      }
      else
      {
        SWM32S_PutPixel(_usX+i,_usY,_usColor);
        i++;
      }
    }
  }
}










回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|华芯微特开发论坛

GMT+8, 2025-1-10 06:33 , Processed in 0.031385 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表