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

前言

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

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

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

编程要点

  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);
}

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

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);
}

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值