1. RA6809 HMI开发概述
RA6809作为一款高性能液晶屏控制芯片,在工业控制、智能家居等领域有着广泛应用。基于STC32G+RA6809/RA8889+GT911触摸IC的硬件平台,开发者可以构建功能丰富的人机交互界面。本系列教程将重点解析菜单逻辑架构的设计与实现,这是HMI开发中最核心也最具挑战性的部分。
在实际项目中,一个典型的HMI系统通常包含以下核心组件:
- 显示驱动层:负责液晶屏的底层驱动和图形渲染
- 触摸处理层:处理触摸事件和坐标转换
- 菜单逻辑层:管理页面跳转、状态维护和业务逻辑
- 数据交互层:与主控MCU进行参数传递和指令交互
2. 菜单逻辑架构设计原理
2.1 分层架构设计
优秀的菜单系统应采用分层架构设计,各层职责明确:
code复制应用层
├── 页面逻辑
├── 业务处理
└── 数据绑定
表示层
├── 页面渲染
├── 触摸反馈
└── 动画效果
框架层
├── 页面管理
├── 消息路由
└── 资源管理
驱动层
├── LCD驱动
├── 触摸驱动
└── 存储驱动
这种分层设计使得系统具有更好的可维护性和扩展性。当需要更换硬件平台时,只需修改驱动层;业务逻辑变更时,也只需调整应用层代码。
2.2 页面状态管理
每个HMI页面都需要管理以下状态信息:
- 页面ID:唯一标识符
- 显示状态:当前是否可见
- 响应区域:可触摸区域列表
- 数据绑定:需要动态显示的数据项
- 回调函数:页面生命周期函数
在RA6809平台上,通常使用结构体来管理这些状态:
c复制typedef struct {
uint16_t image_id; // 页面背景图ID
uint8_t page_type; // 页面类型
uint8_t is_worked; // 是否启用
uint16_t default_param; // 默认参数
unos_id_t (*tsj_func)(lcd_coordinate_t *); // 触摸判断函数
int (*init_func)(ui_page_t *); // 初始化函数
uint8_t response_area_num; // 响应区域数量
} ui_page_config_t;
2.3 消息传递机制
HMI系统需要处理多种消息类型:
- 触摸消息:用户点击事件
- 定时消息:自动刷新等定时任务
- 数据消息:参数更新通知
- 系统消息:低电量警告等
建议采用发布-订阅模式实现消息传递:
c复制// 消息类型定义
typedef enum {
MSG_TOUCH_EVENT,
MSG_TIMER_EVENT,
MSG_DATA_UPDATE,
MSG_SYSTEM_ALERT
} hmi_message_type;
// 消息处理函数原型
typedef void (*message_handler)(hmi_message_type type, void* data);
// 订阅消息
void subscribe_message(hmi_message_type type, message_handler handler);
// 发布消息
void publish_message(hmi_message_type type, void* data);
3. 页面开发实战
3.1 新建页面步骤详解
3.1.1 资源准备
每个页面需要准备两张图片资源:
- 背景图:正常显示状态下的完整页面
- 备份图:与背景图尺寸相同,但包含按下态效果
图片规格要求:
- 格式:JPG或PNG
- 尺寸:与屏幕分辨率一致(如800×480)
- 命名规范:PageName_bg.jpg, PageName_pressed.jpg
3.1.2 资源注册
在lcdts_LCD_Pic.h中添加图片枚举:
c复制typedef enum {
// 已有图片...
DemoPage, // 新页背景
DemoPage_backups, // 新页备份
// 后续图片...
} PICTURE_NAME_Pic;
在_Pic数组中添加图片信息:
c复制const INFO_Pic _Pic[IMAGE_REFERENCE_ID_END] = {
// 已有图片信息...
{800, 480, 153600, 0x00100000}, // DemoPage
{800, 480, 153600, 0x00125800}, // DemoPage_backups
// 后续图片信息...
};
3.1.3 页面配置
在ui_page_main.c中启用页面:
c复制static char page_worked[] = {
1, // Main_Page
// ...
1, // DemoPage (下标需与配置表一致)
0, // 保留位
// ...
};
添加页面配置项:
c复制const ui_page_config_t ui_page_def_conf[] = {
// 已有配置...
{IMAGE_ID_DEMO_PAGE, PAGE_TYPE_INTERACT_SINGLE, 1, 0, 0,
ui_tsj_DemoPage, ui_init
