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

[复制链接]
992|2
 楼主| jinglixixi 发表于 2025-3-18 21:59 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2025-3-18 22:03 编辑

#申请原创#  
前面曾介绍过一种双层图片实现动画效果的内容,它虽然设计很经典,但相对来讲其使用面比较窄。
这次介绍的是在LCD屏上通过解码来显示JPG图片,其显示效果如图1所示。
f10d99066a17df1852d0b8f79de6fac9
图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的显示程序中竟发现了相应的字符、字符串显示函数及图形绘制函数,这下意义就重大了,信息显示的问题就轻松解决啦!
为了了解相应函数的使用,特意进行了一下测试,其主程序如下:
  1. int main(void)
  2. {
  3. uint32_t xPos = 0, yPos = 0;
  4. uint8_t lcd_status = BSP_ERROR_NONE;
  5. MPU_Config();
  6. CPU_CACHE_Enable();
  7. HAL_Init();
  8. SystemClock_Config();
  9. BSP_LED_Init(LED2);
  10. JPEG_Handle.Instance = JPEG;
  11. HAL_JPEG_Init(&JPEG_Handle);
  12. lcd_status = BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);
  13. if(lcd_status != BSP_ERROR_NONE)
  14. {
  15. Error_Handler();
  16. }
  17. UTIL_LCD_SetFuncDriver(&LCD_Driver);
  18. UTIL_LCD_SetLayer(0);
  19. UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);
  20. BSP_LCD_GetXSize(0, &LCD_X_Size);
  21. BSP_LCD_GetYSize(0, &LCD_Y_Size);
  22. JPEG_Decode_DMA(&JPEG_Handle, (uint32_t)image_320_240_jpg, IMAGE_320_240_JPG_SIZE , JPEG_OUTPUT_DATA_BUFFER);
  23. while(Jpeg_HWDecodingEnd == 0)
  24. {
  25. }
  26. HAL_JPEG_GetInfo(&JPEG_Handle, &JPEG_Info);
  27. xPos = (LCD_X_Size - JPEG_Info.ImageWidth)/2;
  28. yPos = (LCD_Y_Size - JPEG_Info.ImageHeight)/2;
  29. DMA2D_CopyBuffer((uint32_t *)JPEG_OUTPUT_DATA_BUFFER, (uint32_t *)LCD_FRAME_BUFFER, xPos , yPos, JPEG_Info.ImageWidth, JPEG_Info.ImageHeight, JPEG_Info.ChromaSubsampling);
  30. UTIL_LCD_DrawLine(0, 60, 220, 60, 0xFFFF0000UL);
  31. UTIL_LCD_SetLayer(0);
  32. UTIL_LCD_SetTextColor(0xFFFF0000UL);
  33. UTIL_LCD_SetFont(&Font20);
  34. UTIL_LCD_DisplayStringAt(20, 38, "Hellow world!", LEFT_MODE);
  35. UTIL_LCD_SetFont(&Font16);
  36. UTIL_LCD_DisplayStringAt(40, 200, "2025.1.18", LEFT_MODE);
  37. UTIL_LCD_DrawLine(0, 222, 220, 222, 0xFFFF0000UL);
  38. while (1)
  39. {
  40. }
  41. }
经程序的编译与下载,其测试效果如图2和图3所示,说明测试是完全成功的,这样我们就可以自由地利用LCD屏来显示测试结果了,也就是可以自由地玩耍啦!
snap1.jpg
图2 测试效果1

snap.jpg
图3 测试效果2


yangjiaxu 发表于 2025-4-9 14:42 | 显示全部楼层
真的不错,这个屏幕的分辨率是多大的啊?好像不是很高清
 楼主| jinglixixi 发表于 2025-4-9 19:17 | 显示全部楼层
主要是图片质量的影响,其分辨率还可用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部