本帖最后由 jinglixixi 于 2025-3-18 19:20 编辑
在官方提供的例程中,含有LCD屏的内容以供测试和学习,其效果还是比较有特点的。
以双层动画效果的例程为例,其显示效果如图1和图2所示,即2张图片可以实现位置的交换。
图1 效果1
图2 效果2
其M7的主程序内容为:
- int main(void)
- {
- uint32_t index = 0;
- MPU_Config();
- CPU_CACHE_Enable();
- HAL_Init();
- SystemClock_Config();
- BSP_LED_Init(LED2);
- LCD_Config();
- HAL_LTDC_ConfigCLUT(&LtdcHandle, (uint32_t *)L8_320x240_CLUT, 256, 0);
- HAL_LTDC_EnableCLUT(&LtdcHandle, 0);
- while (1)
- {
- for (index = 0; index < 32; index++)
- {
- // 计算新的图片位置
- PicturesPosition(&Xpos1, &Ypos1, &Xpos2, &Ypos2, (index+1));
- //重新配置第1层位置,无需重新加载
- HAL_LTDC_SetWindowPosition_NoReload(&LtdcHandle, Xpos1, Ypos1, 0);
- //重新配置第2层位置,无需重新加载
- HAL_LTDC_SetWindowPosition_NoReload(&LtdcHandle, Xpos2, Ypos2, 1);
- //在下一个垂直空白期间请求LTDC重新加载
- ReloadFlag = 0;
- HAL_LTDC_Reload(&LtdcHandle,LTDC_RELOAD_VERTICAL_BLANKING);
- while(ReloadFlag == 0)
- {
- }
- }
- HAL_Delay(500);
- for (index = 0; index < 32; index++)
- {
- // 计算新的图片位置
- PicturesPosition(&Xpos2, &Ypos2, &Xpos1, &Ypos1, (index+1));
- //重新配置第1层位置,无需重新加载
- HAL_LTDC_SetWindowPosition_NoReload(&LtdcHandle, Xpos1, Ypos1, 0);
- //重新配置第2层位置,无需重新加载
- HAL_LTDC_SetWindowPosition_NoReload(&LtdcHandle, Xpos2, Ypos2, 1);
- //在下一个垂直空白期间请求LTDC重新加载
- ReloadFlag = 0;
- HAL_LTDC_Reload(&LtdcHandle,LTDC_RELOAD_VERTICAL_BLANKING);
- while(ReloadFlag == 0)
- {
- }
- }
- HAL_Delay(500);
- }
- }
经程序的分析可知,它在循环体内原来作了2件事,一件是使图片1沿着对角线向左上角移动(图片2沿相反方向移动),另一件是使图片2沿着对角线向左上角移动(图片1沿相反方向移动)。
其垂直方向的移动量正是32个像素点,而水平方向的移动量是水平方向的5倍,即160个像素点。
这个变换的处理过程由如下函数实现:
- static void PicturesPosition(uint32_t* x1, uint32_t* y1, uint32_t* x2, uint32_t* y2, uint32_t index)
- {
- // 图片1位置
- *x1 = index*5;
- *y1 = index;
- // 图片2位置
- *x2 = 160 - index*5;
- *y2 = 32 - index;
- }
至于图片1和图片2的数据则是由以下2个数组来提供的。由数组的大小,可明显地观察到其中一个的数据多,而另一个的数据少,这也正是2副图片在复杂程度有很大差别的原因,之外由数据量还可以看出,其中一个的数据量极为偏少,应该是采用编码压缩处理。
- const uint32_t L8_320x240_CLUT[256] =76800/300
- {
- 0x0,
- 0x800000,
- 0x8000,
- 0x808000,
- 0x80,
- ...
- }
- const uint32_t L8_320x240[19200] =76800/4
- {
- 0xF9F9F9F9,
- 0xF9F9F9F9,
- ...
- }
从显示效果看,其程序设计的还是十分精巧的,产生图层透明的效果且移动时十分流畅。
演示视频:
|