STM32之LCD液晶屏(ILI9341)显示图片

前言

本文章基于STM32F103VET6,参考野火的驱动程序,用LCD液晶屏显示静态图像。

有纰漏请指出,转载请说明。

学习交流请发邮件 1280253714@qq.com

编程要点

  1. 显示一个像素点

  1. 将rgb888图片转为rgb555

  1. 输出rgb555的C语言数组

  1. 数组的每一个元素对应一个像素点的rgb三个通道的数据,用stm32的FSMC模拟8080时序,与ili9341进行通信,ili9341再驱动液晶屏显示图片

代码分析

  1. 显示一个像素点
void ILI9341_SetPointPixelNew ( uint16_t usX, uint16_t usY,uint16_t currentFillColor)    
{    
    if ( ( usX < LCD_X_LENGTH ) && ( usY < LCD_Y_LENGTH ) )
  {
        ILI9341_SetCursor ( usX, usY );
        
        ILI9341_FillColor ( 1, currentFillColor );
    }    
}

void LCD_showPointPixel(void)
{
    ILI9341_SetPointPixelNew(10,10,0xf800);
    Delay(0xFFFFFF);
}

(为了方便看清,这里实际上显示了四个点)

2. 将rgb888图片转为rgb555(MATLAB)

x=60
y=80
img888=imread("E:\MATLAB\bin\my_MATLAB_Doc\img\color.png");

scaleR=31/255;  
scaleG=63/255;
scaleB=31/255;

img565=zeros(x,y);

for i=1:x
    for j=1:y
        r5=0;
        g6=0;
        b5=0;
        r5=round(double(img888(i,j,1))*scaleR);
        g6=round(double(img888(i,j,2))*scaleG);
        b5=round(double(img888(i,j,3))*scaleB);
        r5L11=bitshift(r5,11);  %r左移11位
        g6L5=bitshift(g6,5);    %g左移5位
        img565(i,j)=r5L11+g6L5+b5;
    end
end
img565=dec2hex(uint16(img565));

3.输出rgb555的C语言数组(MATLAB)

%生成C语言数组
str="{0x"
a=dec2hex(img565(1))
for i=1:x*y
    for j=1:4
        str=strcat(str,img565(i,j));            
    end
    str=strcat(str,",0x");
end
str=strcat(str,'}');
writematrix(str,"E:\MATLAB\bin\my_MATLAB_Doc\img\createArray.txt")

因为数组存放于SRAM,只有64K的空间,故只生成60*80大小的图片

4. 数组的每一个元素对应一个像素点的rgb三个通道的数据,用stm32的FSMC模拟8080时序,与ili9341进行通信,ili9341再驱动液晶屏显示图片.

uint16_t PictureData [ ] ={0x95DA,0x95DA,0x95DA,0x95DA...} //省略

void ILI9341_ShowPicture(uint16_t usX, uint16_t usY,uint16_t pic565[])
{
    uint32_t i=0;
    uint8_t x=0;
    uint8_t y=0;
    for(x=0;x<usX;x++)
    {
        for(y=0;y<usY;y++)
        {
            if ( ( x < LCD_X_LENGTH ) && ( y < LCD_Y_LENGTH ) )
            {
                ILI9341_SetCursor ( x, y );    
                ILI9341_FillColor ( 1, pic565[i] );
            }    
            i++;
        }
    }
}

int main ( void )
{

    ILI9341_Init ();         //LCD 初始化
    USART_Config();        

    //其中0、3、5、6 模式适合从左至右显示文字,
    //不推荐使用其它模式显示文字    其它模式显示文字会有镜像效果            
    //其中 6 模式为大部分液晶例程的默认显示方向  
  ILI9341_GramScan ( 3 );
    while ( 1 )
    {
        LCD_showPicture();
    }
}


void LCD_showPicture(void)
{
    ILI9341_ShowPicture(80,60,PictureData);
    Delay(0xFFFFFF);
}

物联沃分享整理
物联沃-IOTWORD物联网 » STM32之LCD液晶屏(ILI9341)显示图片

发表评论