1. 迪文COF智能屏开发环境搭建
在开始页面切换和数值显示功能开发前,我们需要先完成开发环境的准备工作。迪文COF结构智能屏采用独特的开发模式,与传统嵌入式GUI开发有显著区别。
1.1 硬件连接与驱动安装
迪文COF智能屏通常通过UART或USB接口与主控设备通信。我使用的DGUS II系列7寸屏(型号DMT80600T080_18WT)采用COF(Chip On Film)结构,这种设计使得屏幕整体厚度仅1.8mm。连接时需要注意:
- 电源配置:使用5V/2A直流电源,实测电压低于4.8V会导致屏幕闪烁
- 通信接口:推荐使用Type-C接口的USB转串口工具,波特率默认115200
- 电平匹配:如果使用UART直连,注意主控MCU的TX/RX需要接屏的RX/TX(交叉连接)
重要提示:首次连接时,Windows系统可能需要手动安装CH340/CH341串口驱动,这个驱动在迪文官网的"资料下载"专区可以找到。
1.2 软件开发工具准备
迪文屏配套的DGUS Tool V7.624是核心开发工具,这个工具链包含几个关键组件:
- 界面设计器:可视化设计UI页面(.hmi文件)
- 字库生成器:创建自定义字体(.zk文件)
- 图标转换工具:将图片转换为屏可识别的格式(.icl文件)
- 工程管理器:整合所有资源文件生成最终烧录包
我建议在工具安装完成后,先打开安装目录下的"示例工程"文件夹,里面有一个完整的"DEMO"项目,包含了各种控件的使用范例,这对新手快速上手非常有帮助。
1.3 工程目录结构规范
一个标准的迪文屏项目应该包含以下目录结构:
ProjectName/ ├── DWIN_SET/ # 核心资源文件夹 │ ├── 13_Touch.icl # 触控配置文件 │ ├── 14_Show.icl # 显示配置文件 │ ├── 22_Config.icl # 系统配置文件 │ └── ... # 其他资源文件 ├── Font/ # 字库文件 ├── Picture/ # 图片资源 ├── TFT/ # 生成的TFT文件 └── Project.hmi # 工程主文件在实际项目中,我习惯将不同功能的页面分开存放,比如将主界面、设置页、数据展示页分别放在不同的子文件夹中,这样后期维护会更加清晰。
2. 页面切换机制深度解析
迪文智能屏的页面切换是其核心功能之一,理解其底层机制对开发复杂应用至关重要。
2.1 页面管理基本原理
迪文屏采用"页面ID"的管理方式,每个页面都有一个唯一的ID编号(0-255)。屏幕内部维护着一个页面栈,支持以下几种切换方式:
- 直接跳转:立即切换到目标页面(无返回)
- 压栈跳转:将当前页面压入栈中,再跳转到新页面
- 退栈返回:从栈顶弹出页面ID并返回
- 复位跳转:清空页面栈后跳转
在DGUS Tool中,我们通过"页面管理"面板来设置这些属性。右击页面选择"属性",可以看到"Page ID"和"Page Type"两个关键参数。
2.2 触控按钮实现页面跳转
最常用的页面切换方式是通过触控按钮实现。具体配置步骤如下:
- 在源页面放置一个"触控按钮"控件
- 在属性面板设置:
- 操作模式:选择"页面切换"
- 目标页面:输入要跳转的Page ID
- 切换方式:选择"直接跳转"或"压栈跳转"
- 高级设置中可以配置按下/抬起时的显示效果
我通常会为每个跳转按钮添加一个"按下效果",比如改变按钮颜色或显示一个临时图标,这样能显著提升用户体验。
2.3 通过串口指令控制页面切换
除了触控操作,我们也可以通过串口发送指令实现页面切换。迪文屏的页面切换指令格式为:
5A A5 07 82 00 84 5A 01 00 01指令解析:
- 5A A5:帧头
- 07:数据长度
- 82:写寄存器指令
- 00 84:页面控制寄存器地址
- 5A 01:固定标识
- 00 01:目标页面ID(此处为1)
在实际项目中,我封装了一个简单的函数来处理页面切换:
void DGUS_SwitchPage(uint8_t pageID) { uint8_t cmd[] = {0x5A, 0xA5, 0x07, 0x82, 0x00, 0x84, 0x5A, 0x01, 0x00, pageID}; HAL_UART_Transmit(&huart1, cmd, sizeof(cmd), 100); }2.4 页面切换动画优化技巧
默认情况下,迪文屏的页面切换是瞬间完成的,这可能会显得生硬。通过以下方法可以优化切换效果:
- 预加载技巧:在跳转前先通过串口发送数据到目标页面的变量控件
- 过渡动画:在当前页和目标页设计相同的背景元素,制造视觉连续性
- 加载提示:在数据量大的页面切换时,显示一个加载动画
我在一个医疗设备项目中,通过预加载技巧将页面切换延迟从300ms降低到了50ms,关键是在跳转前就完成了90%的数据传输。
3. 数值显示功能实现
数值显示是工业HMI的核心功能,迪文屏提供了多种数值显示方案,各有适用场景。
3.1 变量显示控件基础使用
DGUS Tool中最常用的数值显示控件是"变量显示",配置要点:
- 控件属性:
- 显示模式:十进制/十六进制/浮点数
- 数据长度:8/16/32位
- 字体大小和颜色
- 变量地址:
- 每个变量对应一个VP地址(0x0000-0xFFFF)
- 建议在工程文档中维护VP地址分配表
例如显示一个温度值的配置:
- VP地址:0x1000
- 数据类型:16位有符号
- 显示格式:十进制,1位小数
- 字体:24点阵宋体
3.2 高级数值显示技巧
在实际项目中,我们经常需要一些特殊的显示效果:
- 数值范围颜色变化:
- 配置多个"变量显示"控件叠加
- 根据值域范围显示/隐藏对应控件
- 动态单位切换:
- 在变量旁边放置单位文本
- 通过串口指令修改单位文本内容
- 趋势指示:
- 添加▲/▼图标
- 根据数值变化方向控制图标显示
我在一个环境监测项目中实现了这样的效果:当PM2.5超过75时数值变红,并显示警告图标。这需要通过"条件显示"功能配合多个控件实现。
3.3 通过串口更新显示数值
迪文屏的变量显示内容可以通过串口指令更新。基本指令格式:
5A A5 0B 82 10 00 00 00 01 00 00 03 E8指令解析:
- 5A A5:帧头
- 0B:数据长度
- 82:写寄存器指令
- 10 00:VP地址(0x1000)
- 00 00 01 00:对于16位变量,中间4字节固定
- 03 E8:要写入的值(1000的十六进制)
在实际开发中,我建议封装一个通用的数值更新函数:
void DGUS_UpdateValue(uint16_t vpAddr, int32_t value) { uint8_t cmd[12] = {0x5A, 0xA5, 0x0B, 0x82}; cmd[4] = vpAddr >> 8; cmd[5] = vpAddr & 0xFF; cmd[10] = value >> 8; cmd[11] = value & 0xFF; HAL_UART_Transmit(&huart1, cmd, sizeof(cmd), 100); }3.4 浮点数显示的特殊处理
迪文屏原生支持浮点数显示,但需要注意:
- 内存布局:
- 浮点数占用4字节
- 采用IEEE 754标准
- 传输方式:
- 需要将float转换为4个字节依次传输
- 注意大小端问题(迪文屏为小端模式)
示例代码:
void DGUS_UpdateFloat(uint16_t vpAddr, float value) { uint8_t *p = (uint8_t *)&value; uint8_t cmd[9] = {0x5A, 0xA5, 0x08, 0x82}; cmd[4] = vpAddr >> 8; cmd[5] = vpAddr & 0xFF; cmd[6] = p[0]; cmd[7] = p[1]; cmd[8] = p[2]; cmd[9] = p[3]; HAL_UART_Transmit(&huart1, cmd, sizeof(cmd), 100); }4. 实战案例:温湿度监控界面
让我们通过一个完整的温湿度监控案例,综合运用页面切换和数值显示技术。
4.1 界面设计规划
我们设计两个页面:
- 主页面(ID:0):显示实时数据和状态
- 设置页(ID:1):配置报警阈值
主页面元素:
- 当前温湿度数值显示
- 历史曲线图
- 状态指示灯
- 进入设置按钮
设置页元素:
- 高温/低温阈值输入框
- 高湿/低湿阈值输入框
- 保存按钮
- 返回按钮
4.2 关键实现步骤
- 创建变量VP地址分配表:
| 变量说明 | VP地址 | 数据类型 |
|---|---|---|
| 当前温度 | 0x1000 | 16位有符号 |
| 当前湿度 | 0x1001 | 16位无符号 |
| 高温报警阈值 | 0x1100 | 16位有符号 |
| 低温报警阈值 | 0x1101 | 16位有符号 |
| 高湿报警阈值 | 0x1102 | 16位无符号 |
| 低湿报警阈值 | 0x1103 | 16位无符号 |
配置主页面到设置页的跳转按钮:
- 触控区域:矩形(700, 450, 800, 500)
- 操作模式:压栈跳转
- 目标页面:1
- 按下效果:图标变化
配置设置页的返回按钮:
- 触控区域:矩形(50, 50, 150, 100)
- 操作模式:退栈返回
- 按下效果:图标变化
4.3 数据更新逻辑实现
在主控MCU端,我们需要定期更新显示数据:
void UpdateDisplayData(float temp, float humi) { // 更新当前温湿度 DGUS_UpdateFloat(0x1000, temp * 10); // 放大10倍传输 DGUS_UpdateValue(0x1001, (uint16_t)(humi * 10)); // 更新状态指示灯 uint16_t status = 0; if(temp > g_highTemp) status |= 0x01; if(temp < g_lowTemp) status |= 0x02; if(humi > g_highHumi) status |= 0x04; if(humi < g_lowHumi) status |= 0x08; DGUS_UpdateValue(0x1200, status); }4.4 设置页的数据保存
当用户在设置页修改阈值后,我们需要将这些值保存到主控MCU:
在设置页配置"数据录入"控件:
- VP地址对应各阈值变量
- 设置合适的数据范围和步进值
配置保存按钮的触控事件:
- 按下时读取各阈值VP地址的值
- 通过串口发送到主控MCU
- MCU确认接收后返回成功提示
我在实际项目中发现,迪文屏的触控响应有时会有延迟,特别是在连续快速操作时。为了解决这个问题,我在按钮按下事件中添加了100ms的防抖处理,效果显著改善。