|
最近一个项目用到了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++;
}
}
}
}
|
|