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

前言

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

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

学习交流请发邮件 [email protected]

编程要点

  1. 显示一个像素点

  1. 将rgb888图片转为rgb555

  1. 输出rgb555的C语言数组

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

代码分析

    • 显示一个像素点

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);
}
STM32之LCD液晶屏(ILI9341)显示图片_第1张图片

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

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

STM32之LCD液晶屏(ILI9341)显示图片_第2张图片
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")
STM32之LCD液晶屏(ILI9341)显示图片_第3张图片

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

STM32之LCD液晶屏(ILI9341)显示图片_第4张图片
STM32之LCD液晶屏(ILI9341)显示图片_第5张图片

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
STM32之LCD液晶屏(ILI9341)显示图片_第6张图片

你可能感兴趣的:(matlab,图像处理,stm32)