野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9925|回复: 2

[求助]使用野火3.2寸液晶显示屏,不能正常显示图片。

[复制链接]
发表于 2017-10-17 20:12:56 | 显示全部楼层 |阅读模式

咨询求助:

问题描述: 使用野火3.2寸液晶显示屏,不能正常显示图片。
硬件环境: STM32F103VCT6 +野火3.2寸显示屏  (STM32 配置成为FSMC工作模式)
软件环境: MDK4.74

具体测试过程:
        1. STM32F103配置成为FSMC模式,显示屏能够正常显示单色。
        2. 参考网站上提供的“22、FSMC-液晶屏显示BMP图片”例程上进行修改,由于硬件设计上没有配置SD卡,配置了SPI NorFlash要用于存储其他数据,没有用文件系统。
           通过软件将bmp源文件数据格式读取出来,形成一个数组数据,保存为.h文件加入工程中(图标很小,所以形成的数据量少)
        3. 修改后显示屏能够正常显示16*16的英文字符。
        4. 刷图片则不能正确显示,图片大小是正确的,但内容一团乱麻。我确保源文件内容正确,因为BMP格式分析上的数据都可以对应上。
        5. 麻烦前辈们指点指点。
        6. 主要修改如下函数。
        void Lcd_show_bmp(unsigned short int x, unsigned short int y)
{
        int i, j, k;
        int width, height, l_width;

        BYTE red,green,blue;
        BITMAPFILEHEADER bitHead;
        BITMAPINFOHEADER bitInfoHead;
        WORD fileType;
        u8 *p;
        unsigned int read_num;
        unsigned char tmp_name[20];
        unsigned int a=0;
        rt_uint32_t b=0;
        u32 len=0;
/*-------------------------------------------------------------------------------------------------------*/

                //BMP_DEBUG_PRINTF("Open file success\r\n");

                /* 读取文件头信息  两个字节*/         
                //f_read(&bmpfsrc,&fileType,sizeof(WORD),&read_num);                     //注释掉文件读取函数,直接取数据
                        rt_memcpy(&fileType,&gImage_output1[0],sizeof(WORD));
                /* 判断是不是bmp文件 "BM" 2字节*/
                if(fileType != 0x4d42)
                {
                        BMP_DEBUG_PRINTF("file is not .bmp file!\r\n");
                        return;
                }
                else
                {
                        BMP_DEBUG_PRINTF("Ok this is .bmp file\r\n");       
                }
       
                /* 读取BMP文件头信息,12字节*/
        //        f_read(&bmpfsrc,&bitHead,sizeof(tagBITMAPFILEHEADER),&read_num);         //注释掉文件读取函数,直接取数据
                rt_memcpy(&bitHead,&gImage_output1[2],sizeof(tagBITMAPFILEHEADER));


                showBmpHead(&bitHead);

                /* 读取位图信息头信息 ,40字节*/
                //f_read(&bmpfsrc,&bitInfoHead,sizeof(BITMAPINFOHEADER),&read_num);                   //注释掉文件读取函数,直接取数据
                rt_memcpy(&bitInfoHead,&gImage_output1[2+12],sizeof(BITMAPINFOHEADER));

                showBmpInforHead(&bitInfoHead);
//                b=53;
//   
///*-------------------------------------------------------------------------------------------------------*/
        width = bitInfoHead.biWidth;
        height = bitInfoHead.biHeight;

        /* 计算位图的实际宽度并确保它为32的倍数        */
        l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);       

        if(l_width > 960)
        {
                BMP_DEBUG_PRINTF("\n SORRY, PIC IS TOO BIG (<=320)\n");
                return;
        }
//       
        /* 设置Lcd Gram 扫描方向为: 右下角->左上角 */
        Lcd_GramScan( 3 );
       
        /* 开一个图片大小的窗口*/
        LCD_OpenWindow(x, y, width, height);
       
       
        /* 判断是否是24bit真彩色图 */
       
        if(bitInfoHead.biBitCount >= 24)
        {
                for(i=0;i< height; i++)
                {          
                        /* 读取一行bmp的数据到数组pColorData里面 */
                        #if 0
                                for(j=0; j< l_width; j++)                                                                                                                
                                {               
                                //        f_read(&bmpfsrc,pColorData+j,1,&read_num);
                                        a=1;
                                }            
                        #elif 1                               
                                //f_read(&bmpfsrc,pColorData,l_width/2,&read_num);
                                //f_read(&bmpfsrc,pColorData+l_width/2,l_width/2,&read_num);
                                rt_memcpy(pColorData,&gImage_output1[b+i*width],l_width);
                                //j=a;
                        #else
                                //f_read(&bmpfsrc,pColorData,l_width,&read_num);
                                //a=j;
                        #endif

                        for(j=0; j<width; j++)                                                                                            //一行有效信息
                        {
                                k = j*3;                                                                                                                                         //一行中第K个像素的起点
                                red = pColorData[k+2];
                                green = pColorData[k+1];
                                blue =         pColorData[k];
                                LCD_WR_Data(RGB24TORGB16(red,green,blue)); //写入LCD-GRAM
                        }            
                }                                                                                                                                                                                              
        }   
        else
        {        
                BMP_DEBUG_PRINTF("SORRY, THIS PIC IS NOT A 24BITS REAL COLOR");
                return ;
        }
        //f_close(&bmpfsrc);   

}


回复

使用道具 举报

 楼主| 发表于 2017-10-17 23:36:47 | 显示全部楼层
已经解决问题。
是数据寻址不对,需要从文件的最底端开始取数据。
回复 支持 反对

使用道具 举报

发表于 2017-10-18 10:40:32 | 显示全部楼层
swordlife 发表于 2017-10-17 23:36
已经解决问题。
是数据寻址不对,需要从文件的最底端开始取数据。

嗯,bmp文件解码最后的是最前的数据
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-20 12:37 , Processed in 0.030443 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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