打印
[STM32H7]

【STM32H745I-DISCO 试用】+LCD屏显示及使用

[复制链接]
51|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2025-3-18 22:03 编辑

#申请原创#  
前面曾介绍过一种双层图片实现动画效果的内容,它虽然设计很经典,但相对来讲其使用面比较窄。
这次介绍的是在LCD屏上通过解码来显示JPG图片,其显示效果如图1所示。

图1 显示效果

经对程序的分析,发现尽管它是通过解码来实现图片的显示,但图片的文件却是数组的方式存储的,而非那种常规的文件存储方式或结构。
其数据的存储形式如下:
const uint8_t image_320_240_jpg[IMAGE_320_240_JPG_SIZE] =
{
  0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x01, 0x2C, 0x01, 0x2C, 0x00, 0x00, 0xFF, 0xE1, 0x00, 0xD0, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00, 0x4D, 0x4D, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06,
  0x01, 0x0E, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x56, 0x01, 0x1A, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x60, 0x01, 0x1B, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x68, 0x01, 0x28, 0x00, 0x03,
...
}
这就使得它在使用时就不是很方便,需要将常规的JPG文件要转换为数组的方式才能进行显示。
它对其测试的收获却不仅在这里,所获得的最大收获则是轻松地解决了自由使用LCD屏的显示问题。
因为在通常的情况下,要使用LCD屏进行显示就首先要解决显示驱动的问题。
在不具备显示驱动的情况下,是很难达到显示目标的,对于STM32H745I-DISCO开发板所配置的LCD屏也存在同样的问题。
在无意间,为了解决常规的信息显示问题,在这个JPG的显示程序中竟发现了相应的字符、字符串显示函数及图形绘制函数,这下意义就重大了,信息显示的问题就轻松解决啦!
为了了解相应函数的使用,特意进行了一下测试,其主程序如下:
int main(void)
{
uint32_t xPos = 0, yPos = 0;
uint8_t lcd_status = BSP_ERROR_NONE;
MPU_Config();
CPU_CACHE_Enable();
HAL_Init();
SystemClock_Config();
BSP_LED_Init(LED2);
JPEG_Handle.Instance = JPEG;
HAL_JPEG_Init(&JPEG_Handle);
lcd_status = BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);
if(lcd_status != BSP_ERROR_NONE)
{
Error_Handler();
}
UTIL_LCD_SetFuncDriver(&LCD_Driver);
UTIL_LCD_SetLayer(0);
UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);
BSP_LCD_GetXSize(0, &LCD_X_Size);
BSP_LCD_GetYSize(0, &LCD_Y_Size);
JPEG_Decode_DMA(&JPEG_Handle, (uint32_t)image_320_240_jpg, IMAGE_320_240_JPG_SIZE , JPEG_OUTPUT_DATA_BUFFER);
while(Jpeg_HWDecodingEnd == 0)
{
}
HAL_JPEG_GetInfo(&JPEG_Handle, &JPEG_Info);
xPos = (LCD_X_Size - JPEG_Info.ImageWidth)/2;
yPos = (LCD_Y_Size - JPEG_Info.ImageHeight)/2;
DMA2D_CopyBuffer((uint32_t *)JPEG_OUTPUT_DATA_BUFFER, (uint32_t *)LCD_FRAME_BUFFER, xPos , yPos, JPEG_Info.ImageWidth, JPEG_Info.ImageHeight, JPEG_Info.ChromaSubsampling);
UTIL_LCD_DrawLine(0, 60, 220, 60, 0xFFFF0000UL);
UTIL_LCD_SetLayer(0);
UTIL_LCD_SetTextColor(0xFFFF0000UL);
UTIL_LCD_SetFont(&Font20);
UTIL_LCD_DisplayStringAt(20, 38, "Hellow world!", LEFT_MODE);
UTIL_LCD_SetFont(&Font16);
UTIL_LCD_DisplayStringAt(40, 200, "2025.1.18", LEFT_MODE);
UTIL_LCD_DrawLine(0, 222, 220, 222, 0xFFFF0000UL);
while (1)
{
}
}
经程序的编译与下载,其测试效果如图2和图3所示,说明测试是完全成功的,这样我们就可以自由地利用LCD屏来显示测试结果了,也就是可以自由地玩耍啦!

图2 测试效果1


图3 测试效果2


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

479

主题

2836

帖子

38

粉丝