用stm32f1 emwin编写三层页面并且在主页面显示时间代码
时间: 2024-02-09 11:12:43 浏览: 26
好的,以下是一个简单的示例代码,展示了如何在STM32F1上使用emWin库编写三层页面并在主页面上显示时间。请注意,这只是一个示例代码,您需要根据您的具体情况和需求进行修改和优化。
```c
#include "emwin.h"
#include "stm32f1xx_hal.h"
// 定义RTC外设和LCD显示器的初始化函数
void RTC_Init(void);
void LCD_Init(void);
// 定义主页面、子页面和控件的句柄
WM_HWIN hMainWin, hSubWin1, hSubWin2;
BUTTON_Handle hButton1, hButton2;
TEXT_Handle hTextTime;
// 定义RTC时间结构体变量
RTC_TimeTypeDef sTime;
int main(void)
{
// 初始化HAL库和外设
HAL_Init();
RTC_Init();
LCD_Init();
// 初始化emWin库
GUI_Init();
WM_SetCreateFlags(WM_CF_MEMDEV); // 启用内存设备
// 创建主页面
hMainWin = GUI_CreateDialogBox(_aDialogCreateMain, GUI_COUNTOF(_aDialogCreateMain), NULL, WM_UNATTACHED, 0, 0);
// 进入主循环
while(1)
{
// 更新RTC时间
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
// 更新时间控件的文本
char timeStr[10];
sprintf(timeStr, "%02d:%02d:%02d", sTime.Hours, sTime.Minutes, sTime.Seconds);
TEXT_SetText(hTextTime, timeStr);
// 处理emWin消息
GUI_Exec();
GUI_X_Delay(10);
}
}
// RTC初始化函数
void RTC_Init(void)
{
// 启用RTC时钟
__HAL_RCC_RTC_ENABLE();
// 配置RTC时钟源
RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInit;
RCC_PeriphCLKInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
RCC_PeriphCLKInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; // 使用外部低速晶振
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInit);
// 配置RTC
RTC_TimeTypeDef sTime;
sTime.Hours = 0;
sTime.Minutes = 0;
sTime.Seconds = 0;
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
}
// LCD显示器初始化函数
void LCD_Init(void)
{
// 配置LCD控制器和显示屏
// ...
// 初始化emWin库
GUI_Init();
}
// 子页面1的回调函数
void _cbSubWin1(WM_MESSAGE * pMsg)
{
switch(pMsg->MsgId)
{
case WM_PAINT:
// 绘制子页面1的内容
// ...
break;
default:
WM_DefaultProc(pMsg);
break;
}
}
// 子页面2的回调函数
void _cbSubWin2(WM_MESSAGE * pMsg)
{
switch(pMsg->MsgId)
{
case WM_PAINT:
// 绘制子页面2的内容
// ...
break;
default:
WM_DefaultProc(pMsg);
break;
}
}
// 主页面的回调函数
void _cbMainWin(WM_MESSAGE * pMsg)
{
switch(pMsg->MsgId)
{
case WM_INIT_DIALOG:
// 创建控件并设置属性
hButton1 = BUTTON_CreateEx(10, 20, 80, 40, pMsg->hWin, WM_CF_SHOW, 0, GUI_ID_BUTTON1);
BUTTON_SetText(hButton1, "SubWin1");
hButton2 = BUTTON_CreateEx(110, 20, 80, 40, pMsg->hWin, WM_CF_SHOW, 0, GUI_ID_BUTTON2);
BUTTON_SetText(hButton2, "SubWin2");
hTextTime = TEXT_CreateEx(10, 80, 100, 20, pMsg->hWin, WM_CF_SHOW, 0, GUI_ID_TEXT0, "00:00:00");
TEXT_SetFont(hTextTime, GUI_FONT_20_ASCII);
TEXT_SetTextAlign(hTextTime, GUI_TA_LEFT | GUI_TA_VCENTER);
// 创建子页面
hSubWin1 = GUI_CreateDialogBox(_aDialogCreateSubWin1, GUI_COUNTOF(_aDialogCreateSubWin1), _cbSubWin1, pMsg->hWin, 0, 0);
hSubWin2 = GUI_CreateDialogBox(_aDialogCreateSubWin2, GUI_COUNTOF(_aDialogCreateSubWin2), _cbSubWin2, pMsg->hWin, 0, 0);
// 隐藏子页面
WM_HideWindow(hSubWin1);
WM_HideWindow(hSubWin2);
break;
case WM_NOTIFY_PARENT:
// 处理控件消息
if(pMsg->Data.v == WM_NOTIFICATION_RELEASED)
{
if(pMsg->hWinSrc == hButton1)
{
WM_ShowWindow(hSubWin1); // 显示子页面1
}
else if(pMsg->hWinSrc == hButton2)
{
WM_ShowWindow(hSubWin2); // 显示子页面2
}
}
break;
default:
WM_DefaultProc(pMsg);
break;
}
}
```
以上代码仅供参考,具体实现方式可以根据您的具体需求进行修改和优化。