迪文屏开发保姆级教程6----触摸实现界面切换

 这篇文章要讲啥事呢?

 本篇文章主要介绍了在DGBUS平台上触摸实现界面切换的方法。

文哥悄悄话:

官方开发指南PDF:(不方便下载的私聊我发给你)

https://download.csdn.net/download/qq_21370051/88647174?spm=1001.2014.3001.5503https://download.csdn.net/download/qq_21370051/88647174?spm=1001.2014.3001.5503

文哥家目录小秘

 这篇文章要讲啥事呢?

文哥悄悄话:

文哥家目录小秘

一、前言

开发环境

二、详细步骤

1.添加按键返回控件

2.设置控件属性

3.屏幕接收处理代码

4.识别到按键点击,并切换另一个界面。

代码:

5.保存、导出、验证。

三、容易踩得坑


一、前言

在DGBUS平台上使用按键返回控件实现界面切换的功能。

开发环境

迪文屏型号DMG80480T070_09WTC
DGUS版本DGUS_V7646
单片机        GD32F407

二、详细步骤

1.添加按键返回控件

2.设置控件属性

这样设置后,实际运行的时候,当我们点击到这个按键控件,单片机串口会收到:

3.屏幕接收处理代码

/************************************************************************************
函数名称:	Screen_CmdCheck()
功能描述:	从屏幕收到的数据处理包括,按键  上报的输入变量等。
************************************************************************************/uint16_t  Class_LcdUart::Screen_CmdCheck(uint8_t *buffer,uint16_t *DateLen)
{uint16_t index = 0;uint16_t lu16_temp = 0;    uint16_t lu16_RecLen = (uint16_t)(*DateLen);uint16_t lu16_CMDLen = 0;    memset(&ms_LcdCMD,0,sizeof(ms_LcdCMD));//for(;index<len;index++){ms_LcdCMD.cmd_head      = (uint8_t) *(buffer+index);ms_LcdCMD.cmd_head01    = (uint8_t) *(buffer+index+1);    if( ( DIWEN_HEAD_0 == ms_LcdCMD.cmd_head)  && ( DIWEN_HEAD_1 == ms_LcdCMD.cmd_head01)  ){lu16_CMDLen = (uint8_t)(*(buffer+index + M_OFFSET_DW_LEN_POS) );}else{// continue;return 0;}if(lu16_RecLen >= ( lu16_CMDLen + M_DW_HEADER_LEN )){#if(CRC16_ENABLE)if(!CheckCRC16(buffer+M_OFFSET_DW_CMD_POS,lu16_CMDLen - M_CRC_LEN))                      //CRC校验return 0;        #endif     // if(index>0)// {//     memmove(buffer,(buffer+index),sizeof(lu16_CMDLen));// }lu16_temp = (uint16_t)*(buffer+M_OFFSET_DW_CTL_ID);ms_LcdCMD.control_id = ( lu16_temp << 8) + (*(buffer+M_OFFSET_DW_CTL_ID+1)) ;switch (ms_LcdCMD.control_id){//迪文屏内部当前页面ID寄存器地址case DIWEN_PIC_NOW_REG_ADDR:ms_LcdCMD.control_type = M_DW_READ_REG;//第7 8 字节为返回的当前页面IDlu16_temp = (uint16_t)*(buffer+M_OFFSET_DW_CTL_VAL);                ms_LcdCMD.u16val =   ( lu16_temp << 8) + (*(buffer+M_OFFSET_DW_CTL_VAL+1));  ms_LcdCMD.screen_id = ms_LcdCMD.u16val;break;case M_P0_BUTTON_ADDR:           case M_P1_BUTTON_ADDR:    case M_P2_BUTTON_ADDR:   case M_P3_BUTTON_ADDR:    case M_P4_BUTTON_ADDR:    case M_P5_BUTTON_ADDR:    case M_P6_BUTTON_ADDR:    case M_P7_BUTTON_ADDR:                                                                                                               case M_BUTTON_ADDR_END:ms_LcdCMD.control_type = M_BUTTON;//取控件ID的低字节为界面IDms_LcdCMD.screen_id = (uint8_t)(ms_LcdCMD.control_id & 0X00FF);//装载键值//loadup keyvaluelu16_temp = (uint16_t)*(buffer+M_OFFSET_DW_CTL_VAL);                ms_LcdCMD.u16val =   ( lu16_temp << 8) + (*(buffer+M_OFFSET_DW_CTL_VAL+1))   ;return lu16_CMDLen;break;                default:   break;}return  lu16_CMDLen;          }  //endof if(lu16_RecLen >= ( lu16_CMDLen + M_DW_HEADER_LEN ))else{return 0;}}
}/************************************************************************************
函数名称:	App_Screen_Recv()
功能描述:	从屏幕收到的数据处理包括,按键  上报的输入变量等。************************************************************************************/
uint16_t	Class_LcdUart::App_Screen_Recv(void)
{uint16_t    RecvLenth = 0;uint16_t    lu16_Res = 0;// if((TRUE == m_u8_idSendFlag)&&(FALSE == m_u8_idRecvFlag))// {// 	return;// }memset(&ms_LcdCMD,0,sizeof(ms_LcdCMD));lu16_Res = Dat_deUnFixQueueNode(*(ComLcdDiwenObj.pRxQueue),(uint8_t*)&m_u8_RecvBuff[0],&RecvLenth);if( E_QUEUE_NULL == lu16_Res){return 0;}if(0 == RecvLenth){return 0;}    lu16_Res = Screen_CmdCheck((uint8_t*)&m_u8_RecvBuff[0],&RecvLenth );return lu16_Res;
}

代码解析: 

 上面框框里的,是我从迪文屏串口接收队列里面取数据。

整个程序流程是这样的,串口DMA接收中断,收到数据后存进 接收队列里面。

然后再程序的另一个地方进行循环的取队列,然后分析处理。

串口接收入队列部分代码:

//ICCARD  20231109 ADDBYLZW
//Com6Obj 改为 ComIcCardObj
ComPortLinkDef ComIcCardObj		=ComlinkOp[COM2];
//ICCARD  20231109 ADDBYLZW//LCDLCD 20231204 ADDBYLZW
ComPortLinkDef ComLcdDiwenObj	=ComlinkOp[COM4];UnFixQueueDef *qHandleCom3Tx;
UnFixQueueDef *qHandleCom3Rx;
UnFixQueueDef *qHandleCom4Tx;
UnFixQueueDef *qHandleCom4Rx;const ComPortLinkDef ComlinkOp[] =
{// {&qHandleCom2Tx, &qHandleCom2Rx,	&BSP_Com2FramePost},{&qHandleCom3Tx, &qHandleCom3Rx,	&BSP_Com3FramePost},	{&qHandleCom4Tx, &qHandleCom4Rx,	&BSP_Com4FramePost},		
};/*===========================================================================*
*uint8_t    BSP_Com4FramePost(void)*==========================================================================*/
uint8_t    BSP_Com4FramePost(void)
{int16_t ret;	uint16_t DataLen;ret = Dat_GetUnFixQueueFlag(qHandleCom4Tx);if (ret == E_QUEUE_NULL|| ret == ERR_POINTER_NULL){return USART_DATA_ERR;}if (FALSE == usart4_busy){usart4_busy = TRUE;BSP_Com4_CloseTxInt();ret = Dat_deUnFixQueueNode(qHandleCom4Tx,urt4_tx_buf,&DataLen);if(DataLen>UART4_DMA_TX_BUFLEN){return USART_OVERFLOW;}if (E_QUEUE_NORMAL == ret){//errorBSP_Com4_OpenTxInt(DataLen);}else{usart4_busy = FALSE;}}else{return USART_SEND_BUSY;		}return USART_SEND_OK;  
}//20231204 ADDBYLZW LCDLCD OVER

4.识别到按键点击,并切换另一个界面。

 串口切换界面功能实现:

通过向屏幕发送如下数据实现切换屏幕。

注意:

切换的界面ID要和DGUS里面的界面ID对应起来。

代码:

/************************************************************************************
函数名称:	Gui_MeterWindows()
功能描述:	
************************************************************************************/
WinGuiID_TypeDef	Class_LcdUart::Gui_MeterWindows(void)
{static uint16_t ls_u16_cnt;char cbuf[50];    /*判断是否需要  切换界面*///如果 ms_Win.RunSta = 0 说明第一次进入,需要切换串口屏页面if( WIN_STA_FIRSTIN == ms_Win.RunSta)  {ls_u16_cnt = 0;if(IS_WINID_GROUP(ms_Win.Gui_Id)){this->m_NowGunNum = GUN_NULL;  SwitchPage(ms_Win.Gui_Id);            ComLcdDiwenObj.pSendFunc();delay_ms(10); GetPICNow();ComLcdDiwenObj.pSendFunc();delay_ms(10); App_Screen_Recv();     if(ms_LcdCMD.screen_id == ms_Win.Gui_Id ){ms_Win.RunSta = WIN_STA_OVER;   memset(&cbuf,0,sizeof(cbuf));sprintf(cbuf,"          ");DisplayString(TXT_GUN01_STA1_ADDR,cbuf);	//                      DisplayString(TXT_GUN01_STA1_ADDR,cbuf);	//             DisplayString(TXT_GUN01_STA2_ADDR,cbuf);	//    DisplayString(TXT_GUN01_STA3_ADDR,cbuf);	//    DisplayString(TXT_GUN01_STA4_ADDR,cbuf);	//    DisplayString(TXT_GUN01_STA5_ADDR,cbuf);	//    DisplayString(TXT_GUN01_STA6_ADDR,cbuf);	//   DisplayString(TXT_GUN02_STA1_ADDR,cbuf);	//             DisplayString(TXT_GUN02_STA2_ADDR,cbuf);	//    DisplayString(TXT_GUN02_STA3_ADDR,cbuf);	//    DisplayString(TXT_GUN02_STA4_ADDR,cbuf);	//    DisplayString(TXT_GUN02_STA5_ADDR,cbuf);	//    DisplayString(TXT_GUN02_STA6_ADDR,cbuf);	//   mu16F_Refresh =  1;}//读出来的当前页面ID和程序中  ms_Win.Gui_Id 的不一致 报错     else{//#ERROR ERRORreturn ms_Win.Gui_Id;}}// endof if(IS_WINID_GROUP(ms_Win.Gui_Id))else{//ERROR #ERROR/* code */}   } //endof if( ms_Win.Gui_Id != ms_LastWin.Gui_Id)App_Screen_Recv();if( M_BUTTON != ms_LcdCMD.control_type){return ms_Win.Gui_Id;}switch (ms_LcdCMD.u16val){case Key_Exit:ms_Win.Gui_Id = WinID_Gui_StandBy;ms_Win.RunSta = WIN_STA_FIRSTIN;   return     ms_Win.Gui_Id;    break;case Key_Gun2_Icon_Click:break;default:break;}return ms_Win.Gui_Id;
}
uint8_t GetPICNow(void)
{uint8_t lu8_res = 0;uint8_t DiwenSendBuf[10]={0x5A,0xA5,0x04,0x83,0x00,0x14,0x01};	lu8_res = DIWEN_FOR_putn((uint8_t *)DiwenSendBuf,7);		return 	lu8_res;
//    HAL_UART_Transmit(&huart5,(uint8_t *)DiwenSendBuf,10,0xFF);
}uint8_t SwitchPage(unsigned short  int pagenumber)
{uint8_t lu8_res = 0;#if( CORE_T5L ==DIWEN_CORE_TYPE )uint8_t DiwenSendBuf[10]={0x5A,0xA5,0x07,0x82,0x00,0x84,0x5A,0x01,0x00,0x00};	DiwenSendBuf[8]=(uint8_t)(pagenumber>>8);DiwenSendBuf[9]=(uint8_t)(pagenumber);		lu8_res = DIWEN_FOR_putn((uint8_t *)DiwenSendBuf,10);	#elseuint8_t DiwenSendBuf[10]={0x5A,0xA5,0x04,0x80,0x03,0x00,0x01};	DiwenSendBuf[5]=(uint8_t)(pagenumber>>8);DiwenSendBuf[6]=(uint8_t)(pagenumber);		DIWEN_FOR_putn((uint8_t *)DiwenSendBuf,7);	#endifreturn  lu8_res;		
//    HAL_UART_Transmit(&huart5,(uint8_t *)DiwenSendBuf,10,0xFF);
}


 

5.保存、导出、验证。

老规矩,养成好习惯,三连走一波,保存、生成、导出。 

​​​​

然后就大功告成了~~   用SD卡拷贝 DWIN_SET文件夹到SD卡根目录,去烧写屏幕程序验证。

GOOD LUCK~

三、容易踩得坑

注意 SwitchPage  函数切换的界面ID要和DGUS里面的界面ID对应起来。


作为一名头秃并且经常眼干的程序猿,要时刻铭记保护好眼睛啊!!   文哥我是疼粉的,

还是老规矩,文末来个福利图养养眼,放松一下  ~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32单片机】俄罗斯方块游戏

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;IIC OLED液晶、按键等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED显示开机界面&#xff0c;按下K1键进入游戏。K1键控制翻转&#xff0c;K2控…

关于OpenCV中 CV_Assert() 的使用引起程序中止/崩溃问题

CV_Assert() 的作用是&#xff1a;若括号中的表达式值为 false &#xff0c;则返回一个错误信息&#xff0c;并终止程序执行。 但是 CV_Assert() 与 assert 不同&#xff0c;CV_Assert() 会通过异常抛出&#xff0c;所以如果使用 CV_Assert()&#xff0c;可以通过捕获异常而不是…

神经网络介绍

目录 知识点介绍 知识点介绍 前馈神经网络&#xff1a;&#xff08;前馈网络的数据只向一个方向传播&#xff09; RNN循环神经网络&#xff0c;下图中多个 RNN 层都是“同一个层”&#xff0c;这一点与之前的神经网络是不一样的。

JavaScript基础知识点总结:从零开始学习JavaScript(二)

如果大家感感兴趣也可以去看&#xff1a; &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 学习…

智能优化算法应用:基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.驾驶训练算法4.实验参数设定5.算法结果6.…

Springboot整合MVC进阶篇

一、概述 1.1SpringBoot整合SpringMVC配置 SpringBoot对SpringMVC的配置主要包括以下几个方面&#xff1a; 自动配置&#xff1a;SpringBoot会自动配置一个嵌入式的Servlet容器&#xff08;如Tomcat&#xff09;&#xff0c;并为我们提供默认的SpringMVC配置。这样我们无需手动…

深圳锐科达SIP矿用电话模块SV-2801VP

深圳锐科达SIP矿用电话模块SV-2801VP 一、简介 SV-2800VP系列模块是我司设计研发的一款用于井下的矿用IP音频传输模块&#xff0c;可用此模块打造一套低延迟、高效率、高灵活和多扩展的IP矿用广播对讲系统&#xff0c;亦可对传统煤矿电话系统加装此模块&#xff0c;进行智能化…

基于5G智能网关的智慧塔吊监测方案

塔吊是建筑施工中必不可少的设施&#xff0c;由于塔吊工作重心高、起重载荷大、人工视距/视角受限等因素&#xff0c;也使得塔吊在工作过程中着较多的危险因素。对此&#xff0c;可以部署基于工业5G智能网关搭建智慧塔吊安全监测系统&#xff0c;实现对塔吊运行的全局精细监测感…

TP-Link路由器桥接设置

本文介绍了TP-Link路由器无线桥接设置方法&#xff1b;无线桥接指的就是通过无线的方式&#xff0c;把两台(多台)无线路由器连接起来&#xff0c;进行桥接的几台路由器中&#xff0c;只要有一台可以上网&#xff0c;剩下的也就可以上网了&#xff1b;主要作用是用来扩大无线WiF…

【STM32单片机】电子木鱼设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103/F407单片机控制器&#xff0c;TFTLCD触摸屏、蜂鸣器等。 主要功能&#xff1a; 系统运行后&#xff0c;TFTLCD显示画面&#xff0c;可触摸木鱼区域&#xff0c;功德计数加1&#xf…

漏刻有时数据可视化Echarts组件开发(46)散点图颜色判断

series组件 series: [{name: Top 5,type: scatter,coordinateSystem: bmap,data: convertData(data.sort(function (a, b) {return b.value - a.value;}).slice(0, 6)),symbolSize: 20,encode: {value: 2},showEffectOn: render,rippleEffect: {brushType: stroke},label: {fo…

分布式系统架构设计之分布式通信机制

二、分布式通信机制&#xff1a;保障系统正常运行基石 在分布式系统中&#xff0c;各个组件之间的通信是保障系统正常运行的基石&#xff0c;直接影响到系统的性能、可扩展性以及整体的可维护性。接下来我们就一起看看通信在分布式系统中的重要性&#xff0c;以及一些常用的技…

Java---IO流讲解(2)

文章目录 1. 字符流1.1 为什么出现字符流1.2 字符流写数据的5种方式1.3 字符流读数据的两种方式1.4 字符缓冲流1.5 字符缓冲流特有功能 2. IO流小结2.1 字节流2.2 字符流 1. 字符流 1.1 为什么出现字符流 由于字节流操作中文时不是特别方便&#xff0c;因此Java提供了字符流。…

SpringBoot - Maven 打包合并一个胖 JAR 以及主项目 JAR 依赖 JAR 分离打包解决方案

问题描述 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.1.18.RELEASE</version><configuration><!--<classifier>exec</classifier>--…

12.25广义分布外检测学习/代码复现

A model.getA().toarray() # b np.array(model.RHS) sense np.array(model.sense) f np.array(model.obj)Aineq np.vstack((-Ale, Age)) # 把所有的<和>组合在一起 bineq np.append(-ble, bge) # 这里用append使bineq为一个一维矩阵&#xff0c;而不是2行1列的二…

SpringBoot 3.2.0 基于Spring Security+JWT实现动态鉴权

依赖版本 JDK 17 Spring Boot 3.2.0 Spring Security 6.2.0 工程源码&#xff1a;Gitee 为了能够不需要额外配置就能启动项目&#xff0c;看到配置效果。用例采用模拟数据&#xff0c;可自行修改为对应的ORM操作 编写Spring Security基础配置 导入依赖 <properties>&l…

java练习之abstract (抽象) final(最终) static(静态) 练习

1&#xff1a;分析总结&#xff1a;写出private、abstract、static、final之间能否联动使用&#xff0c;并写出分析原因 private static final 之间可以任意结合 abstract 不可以与private static final 结合使用 2&#xff1a;关于三个修饰符描述不正确的是(AD) A. static …

Linux操作系统基础知识点

Linux是一种计算机操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年首次发布。Linux操作系统通常与GNU套件一起使用&#xff0c;因此也被称为GNU/Linux。它是一种类UNIX的操作系统&#xff0c;设计为多用户、多任务…

计算机组成原理综合6

补码表示&#xff1a; X&#xff1a;1111 1111 1111 1101 Y&#xff1a;1111 1111 1101 1111 Z&#xff1a;0111 1111 1111 1100 转原码表示&#xff1a;从右往左找第一个“1”&#xff0c;左边的所有数值位按位取反 X&#xff1a;1111 1111 1111 1101 1000 0000 00…

OGG-MySQL无法正常同步数据问题分析

问题背景: 用户通过OGG从源端一个MySQL从库将数据同步到目标端的另一个MySQL数据库里面&#xff0c;后面由于源端的从库出现了长时间的同步延时&#xff0c;由于延时差距过大最后选择通过重建从库方式进行了修复 从库重建之后&#xff0c;源端的OGG出现了报错ERROR OGG-0014…