Funpack第11期-LPC55S69板卡-彩屏显示SD卡内图片
LPC55S69板卡读取FAT格式的SD卡内的图片文件,通过SPI接口的彩屏显示出来。
标签
嵌入式系统
显示
Snapdragon
更新2021-11-03
617

一、任务思路。

   第十一期funpack活动,我完成的是第二个任务:读取SD卡中预先存入的图像,显示在屏幕上(OLED或LCD)。总体上思路是,单片机读取FAT格式的SD卡内的图片文件,解码,并通过SPI接口的彩屏显示出来。

二、代码解释

 

    /* set BOD VBAT level to 1.65V */
    POWER_SetBodVbatLevel(kPOWER_BodVbatLevel1650mv, kPOWER_BodHystLevel50mv, false);
    CLOCK_EnableClock(kCLOCK_InputMux);
    /* attach 12 MHz clock to FLEXCOMM0 (debug console) 将12MHz连接到FLEXCOMM0 */
    CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);

    BOARD_InitPins();             // 开发板初始化引脚
    BOARD_BootClockPLL150M();     // 开发板设置时钟为PLL 150MHz
    BOARD_InitDebugConsole();     // 初始化调试控制台

代码片段1:初始化板卡基本外设。

	LCD_Init();
	LCD_Clear(BLUE);
	
    if (sdcardWaitCardInsert() != kStatus_Success)       // 检测卡插入 非独立引脚检测
    {
        return -1;
    }

    if (f_mount(&g_fileSystem, driverNumberBuffer, 0U))  // 挂载FatFs
    {
        PRINTF("Mount volume failed.\r\n");
        return -1;
    }

    error = f_chdrive((char const *)&driverNumberBuffer[0U]); // 设置逻辑驱动器号 "2:/"
    if (error)
    {
        PRINTF("Change drive failed.\r\n");
        return -1;
    }

代码片段2:初始化LCD彩屏并刷蓝色;初始化SD卡及FATFS。

if ((error = f_opendir(&directory, "2:/320240/bmp")) != FR_OK)
	{
		PRINTF("Read Directory Failed, Result = %d\r\n", (int)error);
	}
	PRINTF("Read Directory Success\r\n", (int)error);
	while (true)
	{
		error = f_readdir(&directory, &fileInformation);
		if (error != FR_OK || fileInformation.fname[0] == '\0')
			break;
		if (fileInformation.fattrib & AM_DIR)
		{
			PRINTF("Read Directory, Name: %s\r\n", fileInformation.fname);
		}
		else
		{
			PRINTF("Read File, Name: %s\r\n", fileInformation.fname);
			LCD_ShowPicture(fileInformation.fname);
			for (__IO uint32_t c = 0; c < 60000000; c++) { ; }
		}
	}
	f_closedir(&directory);

代码片段3:遍历图片文件夹,并通过彩屏显示出来。

uint16_t rgb_24bit_to_16bit(const char *pColor)
{
	uint16_t color = 0;
	color = ((pColor[2] >> 3) << 11) | ((pColor[1] >> 2) << 5) | (pColor[0] >> 3);
	return color;
}

void LCD_ShowPicture(const char *fileName)
{
	FRESULT fr;
	UINT br;
	char fullPath[30] = "2:/320240/bmp/";
	char buffer[240*3];
	strcat(fullPath, fileName);
	
	// 打开文件
	fr = f_open(&g_fileObject, fullPath, FA_READ);
	if (fr != FR_OK)
	{
		PRINTF("Read file %s Failed\r\n", fullPath);
		return;
	}
	// 读取BMP文件格式标识
	f_read(&g_fileObject, buffer, 2, &br);   // ptr -> 2
	if (strncmp(buffer, "BM", 2) != 0)
	{
		PRINTF("File Format Error\r\n"); 
		goto FUNCTION_END;
	}
	PRINTF("File Format BMP\r\n");
	// 获取位图数据偏移量
	f_read(&g_fileObject, buffer, 12, &br);  // 0x0E - 0x02 = 12, ptr -> 0x0E
	uint32_t bitMapOffset = (buffer[11] << 24) | (buffer[10] << 16) | (buffer[9] << 8) | buffer[8];
	f_read(&g_fileObject, buffer, bitMapOffset - 14, &br); // ptr -> bitMapAddr
	PRINTF("BitMapOffset = %u\r\n", bitMapOffset);
	for (uint32_t i = 0; i < 320; i++)
	{
		if ((fr = f_read(&g_fileObject, buffer, 240*3, &br)) != FR_OK) // One Line Data
		{
			PRINTF("Read File Failed\r\n");
			goto FUNCTION_END;
		}
//      画点
//		for (uint32_t j = 0; j < 240; j++)
//		{
//			POINT_COLOR = rgb_24bit_to_16bit(buffer+j*3);
//			LCD_DrawPoint(j, 320 - i - 1);
//		}
//      画线
		LCD_SetWindows(0, 320 - i - 1, 239, 320 - i - 1);
		LCD_CS_CLR;
		LCD_RS_SET;
		for (uint32_t j = 0; j < 240; j++)
		{
			uint16_t color = rgb_24bit_to_16bit(buffer+j*3);
			SPIv_WriteData(color >> 8);
			SPIv_WriteData(color & 0xFF);
		}
		LCD_CS_SET;
	}
	
FUNCTION_END:
	f_close(&g_fileObject);  

代码片段4:读取图片文件,解码,LCD彩屏通过打线方式显示出来。

三、效果展示

  FumEUqXQj0QYxuCcyBB9_Lb21sRq

图1:显示汽车图片

FmTZFnZyVnk50PDv9Wkwl9fQTXsf

图2:显示熊猫图片

四、感想

   现在单片机的功能相较于几年前有了大幅度的提升,以前可能需要一个昂贵板卡才能实现的功能,现在放一个单片机就可以完成。希望硬禾能够多推广写性能强劲的单片机。

附件下载
LCD_SD_FATFS_PICTURE.7z
源代码
团队介绍
嵌入式工程师-陈海 来自山东
团队成员
Snapdragon
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号