本帖最后由 纪国圣 于 2022-9-4 10:45 编辑
优化了一下界面,让其效果更好一些。
简单的讲一下四线效果:
1.开机动画:
首先从百度下载一份GIF动图,然后通过网站其他图像文件转换至JPG文件将GIF文件转换成一组JPG图片,然后再跟换图片格式为PNG:
之后新建一个Screen,命名为Hello,并添加一个AnimatedImage。按照下图顺序设置AnimatedImage:
为了实现开机动画效果,即GIF播放完毕后实现界面切换,还需一下设置:
注意点:在对图片标号时,一开始我的标号顺序是a1~a9,a10~a19,a20~a29。以为播放顺序与标号顺序一致,但实际上其播放顺序为a1-a10-a11-......a19-a2-a20-a21-a23-......,所以在标号时a1~a9的编号为a01~a09才能正确的按顺序播放。
建议:官方能否在TouchGFX中添加一个GIF转换为PNG的小工具,或者直接让AnimatedImage支持GIF格式的图片,这样AnimatedImage得使用会更加方便。
2.MainWindow简介:
界面效果如下:
这里介绍一下scrollwheel的使用。
首先点击Containers,然后添加一个Container并命名为ImageWheel。再其基础上添加Image控件。然后按照下图设置srcollwheel:
回到MainWindow界面,添加之前创建的container:
注意:MainWindow中的Scroll与Comtainer中的属性值必须一致。
打开TouchGFX\gui\include\gui\container\ImageWheel.hpp,添加红色的代码:
- #include <gui_generated/containers/ImageWheelBase.hpp>
- <font color="#ff0000">#include <BitmapDatabase.hpp></font>
- class ImageWheel : public ImageWheelBase
- {
- public:
- ImageWheel();
- virtual ~ImageWheel() {}
- virtual void initialize();
-
- <font color="#ff0000"> void setIcon(int16_t itemIndex)
- {
- switch (itemIndex)
- {
- case 0:icon.setBitmap(Bitmap(BITMAP_ICON1_ID));
- break;
- case 1:icon.setBitmap(Bitmap(BITMAP_ICON2_ID));
- break;
- case 2:icon.setBitmap(Bitmap(BITMAP_ICON3_ID));
- break;
- case 3:icon.setBitmap(Bitmap(BITMAP_ICON4_ID));
- break;
- case 4:icon.setBitmap(Bitmap(BITMAP_ICON5_ID));
- break;
- }
- }</font>
- protected:
- };
打开TouchGFX\gui\include\gui\mainwindow_screen\MainWindowView.hpp,添加红色的代码:- #include <gui_generated/mainwindow_screen/MainWindowViewBase.hpp>
- <font color="#ff0000">#include <gui/mainwindow_screen/MainWindowPresenter.hpp>
- </font>
- class MainWindowView : public MainWindowViewBase
- {
- public:
- MainWindowView();
- virtual ~MainWindowView() {}
- virtual void setupScreen();
- virtual void tearDownScreen();
- <font color="#ff0000"> virtual void scrollWheel1UpdateItem(ImageWheel& item, int16_t itemIndex)
- {
- item.setIcon(itemIndex);
-
- image1.setXY(0,0);
- switch (itemIndex)
- {
- case 0:image1.setBitmap(touchgfx::Bitmap(BITMAP_BACKGROUND3_ID));
- break;
- case 1:image1.setBitmap(touchgfx::Bitmap(BITMAP_BACKGROUND4_ID));
- break;
- case 2:image1.setBitmap(touchgfx::Bitmap(BITMAP_BACKGROUND5_ID));
- break;
- case 3:image1.setBitmap(touchgfx::Bitmap(BITMAP_BACKGROUND6_ID));
- break;
- case 4:image1.setBitmap(touchgfx::Bitmap(BITMAP_BACKGROUND_ID));
- break;
- }
-
- image1.invalidate();</font>
-
- }
- protected:
- };
scrollwheel的设置就算完成了。通过拨动scroollwhell可以实现背景图片的切换。
3.ClockWindow与SetTimeWindow简介:
界面效果如下:
这里简单的说明一下Clock控件的使用。
界面中包含了AnalogClock和DigtalClock,而提供时钟数据的是STM32H750的RTC。首先编写RTC的初始化、设置与读取函数:
- unsigned char hour;
- unsigned char minutes;
- unsigned char second;
- void RTC_Set(unsigned char hour,unsigned char minutes,unsigned char second)
- {
- #ifdef SIMULATOR
- #else
- RTC_DateTypeDef sdatestructure;
- RTC_TimeTypeDef stimestructure;
- /*##-1- Configure the Date #################################################*/
- /* Set Date: Tuesday September 4th 2018 */
- sdatestructure.Year = 0x18;
- sdatestructure.Month = RTC_MONTH_SEPTEMBER;
- sdatestructure.Date = 0x4;
- sdatestructure.WeekDay = RTC_WEEKDAY_TUESDAY;
- if(HAL_RTC_SetDate(&hrtc,&sdatestructure,RTC_FORMAT_BCD) != HAL_OK)
- {
- /* Initialization Error */
- Error_Handler();
- }
- /*##-2- Configure the Time #################################################*/
- /* Set Time: 16:30:00 */
- stimestructure.Hours = hour;
- stimestructure.Minutes = minutes;
- stimestructure.Seconds = second;
- stimestructure.TimeFormat = RTC_HOURFORMAT_24;
- stimestructure.DayLightSaving = RTC_DAYLIGHTSAVING_NONE ;
- stimestructure.StoreOperation = RTC_STOREOPERATION_RESET;
- if(HAL_RTC_SetTime(&hrtc,&stimestructure,RTC_FORMAT_BCD) != HAL_OK)
- {
- /* Initialization Error */
- Error_Handler();
- }
- #endif
- }
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] Display the current time.
- * @param showtime : pointer to buffer
- * @retval None
- */
- void RTC_TimeShow(void)
- {
- #ifdef SIMULATOR
- #else
- RTC_DateTypeDef sdatestructureget;
- RTC_TimeTypeDef stimestructureget;
- /* Get the RTC current Time */
- HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
- /* Get the RTC current Date */
- HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
- /* Display time Format : hh:mm:ss */
- hour = stimestructureget.Hours;
- minutes = stimestructureget.Minutes;
- second = stimestructureget.Seconds;
- #endif
- }
- unsigned char Get_Hour(void)
- {
- return hour;
- }
- unsigned char Get_Minutes(void)
- {
- return minutes;
- }
- unsigned char Get_Second(void)
- {
- return second;
- }
之后按下图所示顺序在Interactions添加Tick触发函数,调用之前编写的RTC控制函数以实现周期性的读取RTC的值:
同理,对RTC的设置,按照下图顺序设置即可:
4.OSCWindow界面简介
界面效果如下:
其实现效果为滑动Slider改变正弦波的频率,同时将不同频率的正弦波相乘并显示在DynamicGraph。
Slider滑动效果设置如下:
使用Tick周期获取正弦数值:
关于DynamicGraph的设置如下:
图14中的1是为了给YLabel让出空间,图15中的2-5为YLabel的设置。
图14中的3、4设置曲线显示范围。
图15中的1为曲线种类设置。
至此DynamicGraph的设置完成。
5.AboutWindow界面简介
界面效果如下:
与OSCWindow类似,通过周期调用编写好的ADC控制函数读取D值并显示在Graph中:
ADC函数如下:
- unsigned short Get_ADC(void)
- {
- unsigned short uwConvertedValue = 0;
- #ifdef SIMULATOR
- #else
- /* Start ADC conversion */
- if (HAL_ADC_Start(&hadc3) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_ADC_PollForConversion(&hadc3, 10) != HAL_OK)
- {
- Error_Handler();
- }
- /* Read the converted value */
- uwConvertedValue = HAL_ADC_GetValue(&hadc3);
-
- HAL_ADC_Stop(&hadc3);
- #endif
- return uwConvertedValue;
- }
- float Get_Vint(void)
- {
- #ifdef SIMULATOR
- return 0;
- #else
- ADC_ChannelConfTypeDef sConfig = {0};
- /** Configure Regular Channel
- */
- sConfig.Channel = ADC_CHANNEL_VREFINT;
- sConfig.Rank = ADC_REGULAR_RANK_1;
- sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
- sConfig.SingleDiff = ADC_SINGLE_ENDED;
- sConfig.OffsetNumber = ADC_OFFSET_NONE;
- sConfig.Offset = 0;
- sConfig.OffsetSignedSaturation = DISABLE;
- if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
- {
- Error_Handler();
- }
-
- return (*(__IO uint32_t *)0x1FF1E860)*3.3f/Get_ADC();
- #endif
- }
- float Get_Temp(void)
- {
- #ifdef SIMULATOR
- return 0;
- #else
- const unsigned short t1 = *(__IO uint32_t *)0x1FF1E820;
- const unsigned short t2 = *(__IO uint32_t *)0x1FF1E840;
-
- ADC_ChannelConfTypeDef sConfig = {0};
- /** Configure Regular Channel
- */
- sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
- sConfig.Rank = ADC_REGULAR_RANK_1;
- sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
- sConfig.SingleDiff = ADC_SINGLE_ENDED;
- sConfig.OffsetNumber = ADC_OFFSET_NONE;
- sConfig.Offset = 0;
- sConfig.OffsetSignedSaturation = DISABLE;
- if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
- {
- Error_Handler();
- }
-
- return 100.0f/(t2 - t1)*(Get_ADC() - t1) + 30.0f;
- #endif
- }
背光控制是通过如下设置实现:
- void Toggle_BL(void)
- {
- #ifdef SIMULATOR
- #else
- HAL_GPIO_TogglePin(LCD_BL_CTRL_GPIO_Port, LCD_BL_CTRL_Pin);
- #endif
- }
|