——文档转载自电子发烧友
一、页面自动切换测试程序
1.选择的屏型号是:DMG85480F050_01WTC, 分辨率为854x480。页面背景图命名范围:01.jpg—10.jpg。
......
2.将做好的图片加载到DWIN DGUS软件中,设置好分辨率:854x480 ,界面程序就做好了。点生成命令,就可以生成安装文件。
3.接下来需要将图片打包成*.ICL文件 。切换到欢迎使用版块,启动DWIN ICL 生成工具,选择所有用到的图片,然后启动转换。
注意生成的icl文件名一定要是23开头。我这里是23_BJ.icl ,这是界面图片制作部分。
4.接下来需要实现界面的切换程序编写,这个需要在KEIL中完成。参考了群资料里的例程。
#include "t5los8051.h" #include "sys.h" int main(void) { u8 cmd[4]={0x5A,0x01,0x00,0x00};//5A01 0000 切换到0000界面 INIT_CPU(); T2_Init(); EA=1; while(1) { P1_0=!P1_0;//P1.0 循环取反,0V / 3.3V IF(cmd[3]<10) { cmd[3]++; } else{cmd[3]=0;} write_dgusii_vp(0x0084,cmd,4);// 界面0-10 之间循环切换 delay_ms(1000); } }
源码很简单,就是程序核和界面核之间进行通讯,发送界面切换的命令:0x5A,0x01,0x00,0x00,0x5A 0x01是命令字,表示界面切换命令,而后面的0x00,0x00表示要切换到的界面编号,对应界面中的每个配景图片的编号,编译生成T5L51.hex文件。然后,需要用DownLoadFor8051程序将T5L.hex转成T5L51.bin文件。将这些文件都放到DWIN_SET文件夹中,拷贝到SD卡中。上手操作成功。
二、远程控灯
下面我来分享一下,通过迪文DMG85480F050-01和ESP8266 WIFI模块实现远程控制3个LED灯的小例程。先上个图:
迪文屏的显示控件和触控控件很丰富也挺有特点的,认真学习指南,并且找个官方例程仔细研究一番就能掌握,更多是通过图片切换产生动态效果。迪文屏的一个特点是,包含了GUI和OS两个核,GUI核用来做显控, OS核做控制。Adc最大为16位,尝试用光敏电阻实现了屏的亮度自动控制,效果还是可以的。就是在开启待机亮度的时候遇到点麻烦,不过厂家的技术支持很到位。GUI的部分主要做显示控制,51核部分,主要是通过串口实现和esp8266的通信,实现了I/O口的控制3个LED灯,esp8266中已经编好了程序,自动连接wifi以及贝壳物联平台,实现时间获取和平台下推数据的接收。
51核代码:
1. 开关的触摸控制
每个开关图标上覆盖触控键,并设置相同的变量地址1000,分别设置键值0x0001,0x0002, 0x0003,程序循环中查询0x1000的值,判断是哪个触控键被触碰。
2. 开关和灯的状态改变
当检测到第一个开关被触碰时,先读取该开关的状态,sys_read_vp(0x3100,(u8*)&s_kg,1); 然后翻转开关的状态,在写入到开关的状态变量中和灯的状态变量中。同时控制I/O口的电平。 if(s_kg==1) { s_kg=0; sys_write_vp(0x3100,(u8*)&s_kg,1); sys_write_vp(0x3103,(u8*)&s_kg,1); P1_0=0; } While(1) { sys_read_vp(0x1000,(u8*)&g_ss,1); switch(g_ss) { case 1: sys_read_vp(0x3100,(u8*)&s_kg,1); if(s_kg==1) { s_kg=0; sys_write_vp(0x3100,(u8*)&s_kg,1); sys_write_vp(0x3103,(u8*)&s_kg,1); P1_0=0; } else { s_kg=1; sys_write_vp(0x3100,(u8*)&s_kg,1); sys_write_vp(0x3103,(u8*)&s_kg,1); P1_0=1; } g_ss=0; sys_write_vp(0x1000,(u8*)&g_ss,1); break; case 2: sys_read_vp(0x3101,(u8*)&s_kg,1); if(s_kg==1) { s_kg=0; sys_write_vp(0x3101,(u8*)&s_kg,1); sys_write_vp(0x3104,(u8*)&s_kg,1); P1_1=0; } else { s_kg=1; sys_write_vp(0x3101,(u8*)&s_kg,1); sys_write_vp(0x3104,(u8*)&s_kg,1); P1_1=1; } g_ss=0; sys_write_vp(0x1000,(u8*)&g_ss,1); break; case 3: sys_read_vp(0x3102,(u8*)&s_kg,1); if(s_kg==1) { s_kg=0; sys_write_vp(0x3102,(u8*)&s_kg,1); sys_write_vp(0x3105,(u8*)&s_kg,1); P1_2=0; } else { s_kg=1; sys_write_vp(0x3102,(u8*)&s_kg,1); sys_write_vp(0x3105,(u8*)&s_kg,1); P1_2=1; } g_ss=0; sys_write_vp(0x1000,(u8*)&g_ss,1); break; case 16: sys_read_vp(0x2108,(u8*)&s_kg,1); if(s_kg==1) { s_kg=0; sys_write_vp(0x2108,(u8*)&s_kg,1); auto_brt=0; } else { s_kg=1; sys_write_vp(0x2108,(u8*)&s_kg,1);
auto_brt=1; } g_ss=0; sys_write_vp(0x1000,(u8*)&g_ss,1); break; }
3. 远程控制的实现
这部分其实就是串口通信数据的解析,ESP8266已经做好了程序,每20s会通过串口发送时间的数据,格式如下: {"M":"time","T":"2022-03-17-410:16:34"} 平台下发的控制数据如下: {"M":"say","ID":"U1","NAME":"BIGIOT_SERVER","C":"play1","T":"1647483956"} {"M":"say","ID":"U1","NAME":"BIGIOT_SERVER","C":"stop1","T":"1647483956"} 其中:play1,stop1就是平台下发的命令,通过程序解析以后,发送到开关和灯的状态变量地址就实现了界面的变化和I/O控制。
str=strstr(uart2_buf,"\"C\":\"play1\",\"T\""); if(str!=NULL && uart2_buf[0]=='{') { s_kg=1; sys_write_vp(0x3100,(u8*)&s_kg,1); sys_write_vp(0x3103,(u8*)&s_kg,1); P1_0=1; } str=strstr(uart2_buf,"\"C\":\"play2\",\"T\""); if(str!=NULL && uart2_buf[0]=='{') { s_kg=1; sys_write_vp(0x3101,(u8*)&s_kg,1); sys_write_vp(0x3104,(u8*)&s_kg,1); P1_1=1; }
|