读取SD卡图片bin文件显示LCD上

读取SD卡bin文件显示图片

image-20210710130755511
Coding

环境搭建:

  • 硬件平台:STM32H750XBH6
  • 开发环境:STM32CubeMX V6.8.1+KEIL V5.28.0.0
  • STM32H750固件版本:package V1.11.0
  • 仿真下载驱动:ST-Link

前言:STM32H750XBH6 的flash只有128K,存储图片数组显然是不够的,使用sd卡存储图片的二进制bin文件,读取文件并显示在lcd上,这里不使用硬解码图片,还没有学习到,另外读取sd卡的bin文件还可以做一个简易bootloader,直接sd卡启动是吧,学习这部分还是有必要的

以下分为两个部分进行,

初步实现 :读取sd卡bin文件保存在一个buffer,buffer刷写到LCD上

这里还是使用了flash,过大的bin文件,buffer无法全部放下,先使用一个小图片制作bin文件,能够显示在lcd上成功一大半了

最终实现 :一行行刷写在LCD上,buffer仅需要一行显示像素大小 作为缓冲

800*480 16位色的屏幕,一帧显示需要750K 使用这么大的缓冲区不现实,我的flash才128k

这里仅使用一行buffer作为缓冲,一行行刷,比如我的屏幕800*480 16位色, 刷一行的buffer需要 1600字节,使用到的flash 只占用1k到2k 大小

图片bin文件制作

image-20230826121140954

我们还可以生成一个.h文件做对比,查看我们生成的bin文件是否对应

image-20230826121248299

查看看.h文件生成的数组

image-20230826121623825

查看bin文件

我们使用16进制文件查看,上面的数组保存的是十六进制格式

可以看到是与之一一对应的

,

将该bin文件放入sd卡中

我这里是放在picture/pic.bin

读取bin文件验证是否正确读取

image-20230826122732028

查看串口数据

image-20230826123014829

13*16+6=214 (验证正确)

image-20230826123218689

刷写到LCD上

image-20230826123357098

成功显示这里就不贴图了

最终实现 :一行行刷写在LCD上

制作800*480 16位的bin文件

image-20230826191121788

image-20230826125004606

一行行刷写

  
 #define BUFFER_SIZE 1600   //800*2
  #define TOTAL_READ 768000  //800*480*2
	

void sd_picture_on_lcd_unit(void)
{
	
	lcd_clear(WHITE);
	lcd_init();
	g_point_color=RED; /*画笔颜色*/ 
	lcd_display_dir(1);		//屏幕显示方向:0竖屏,1横屏
	lcd_clear(WHITE);
	
	mount_sd();/*挂载sd卡*/

    uint8_t buffer[BUFFER_SIZE];
    uint32_t totalBytesRead = 0;

   for (int i = 0; i <= (TOTAL_READ / BUFFER_SIZE); i++) {
    uint32_t bytesReadThisTime = readFileContent("picture/pic01.bin", buffer, BUFFER_SIZE+1, totalBytesRead);

    if (bytesReadThisTime != 1) { // 如果readFileContent返回1,则表示有错误
        totalBytesRead += (bytesReadThisTime);
    } else {
        // 错误处理
        break;
    }
		LCD_DrawBitmap(0, i, 800, 1, (uint16_t*)buffer);

   
}
		
	}

刷写得到图片如下所示

我这就纳闷了,为什么会是这样的,前面部分颜色完全不对,还有哪里来的紫色,我开始考虑是不是某部分数据丢失,多次复位依然是这样的,我把重点转向写的程序,改过去改过来还是没用

image-20230826191325088

换一张图片试试??

原图如下

刷写上如下

这时候想到了问题所在,这里的汉字以及下面的一些图标都没有问题,问题出现在了颜色上,应该是24位图转16位图出现了问题

image-20230826191924189

我使用win自带的画图软件将原图24转为16位的(转换结果如下)

原来如此,这NM跟原图差这么多,刷写在LCD上的颜色与下面不同应该是软件位图转换算法不一致

image-20230826192558709

既然这样,那我找找16位图吧,实在找不到了,用一个比较简约的24位转16做替代吧

image-20230826193046597

刷写显示如下

还是能看的(有部分不一致为软件算法导致,可忽略,还是24位真彩显示好啊)

image-20230826193207661

以下是一个用于读取SD卡图片显示LCD上的代码示例: ``` #include <SD.h> #include <Adafruit_ILI9341.h> #include <Adafruit_GFX.h> #define TFT_CS 10 #define TFT_RST 9 #define TFT_DC 8 Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST); void setup() { // 初始化SD卡 if (!SD.begin(4)) { tft.println("SD卡初始化失败"); return; } // 初始化LCD tft.begin(); tft.fillScreen(ILI9341_BLACK); tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK); tft.setTextSize(2); tft.setCursor(10, 10); tft.println("正在读取图片..."); // 打开图片文件 File imageFile = SD.open("image.bmp"); if (!imageFile) { tft.println("打开图片失败"); return; } // 读取图片文件头信息 uint32_t imageSize = imageFile.size(); uint32_t imageOffset = (uint32_t)imageFile.position(); uint32_t imageStart = imageOffset + 54; // 假设图片文件头为54字节 // 将文件指针移到图片数据开始处 imageFile.seek(imageStart); // 读取图片数据并在LCD显示 uint16_t imageColor; for (uint32_t i = imageStart; i < imageSize; i += 2) { uint8_t colorBuf[2] = {0}; imageFile.read(colorBuf, 2); imageColor = makeColor(colorBuf[0], colorBuf[1]); // 自定义函数用于将两个字节转换为16位颜色值 tft.drawPixel(x, y, imageColor); // 更新坐标 x++; if (x >= tft.width()) { x = 0; y++; } } // 关闭文件 imageFile.close(); tft.println("图片读取完成"); } void loop() { // 程序循环主体 } uint16_t makeColor(uint8_t r, uint8_t g, uint8_t b) { return tft.color565(r, g, b); } ``` 以上代码使用了Arduino的SD库和Adafruit公司的ILI9341库来实现对SD卡图片读取以及在LCD上的显示。首先,代码需要初始化SD卡LCD。然后,它会打开指定的图片文件,并读取文件头信息以确定图片数据的起始位置。接下来,代码通过读取图片数据并使用`drawPixel`函数将每个像素点显示LCD上。最后,文件被关闭并在LCD显示读取完成的提示信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值