【开源】COF案例分享:速度仪表盘的设计和显示AD数值程序
——文档转载自电子发烧友此次分享使用COF智能屏实现速度仪表盘的案例,该案例利用仪表盘分别实现由串口传入速度值并显示功能、采集COF屏上AD数值并通过仪表显示功能。
1.DGUS开发
(1)首先使用DGUS 设计仪表盘面板,仪表盘面板设计如图1。
图1 仪表盘DGUS设计
(2)速度数据显示和里程数据显示分别采用不同的字体,用于对比数据效果,速度显示组件的设置如图2。
图2 速度显示组件的设置
(3)速度数据显示使用了外部自定义字库,为了显示风格,特意选用数码管字库。字库制作使用TS4.exe工具,因为只显示数字,则使用 ASICII编码,字体使用digital-7-italic 字体,这个字体在网上很容易找到,风格字库设置如图3。
图3 制作digital-7风格字库
(4)指针使用图设计一个正方形的图片,中间放置指针图标,图片大小为320x320,旋转指示组件设置如图4所示。
图4 图表旋转指示空间设置
(5)下方的里程数据显示组件设置如图5所示,这里使用另外一个16级灰度字库16号字库。其它设置跟速度显示组件一样。
图5 变量数值显示组件设置
(6)16级灰度字库使用DGUS的16级灰度字库生成工具制作,设置如图6。
图6 制作16级灰度字库
(7)界面显示效果如图7所示。
图7 UI在屏上显示效果
2.软件开发接下来就是相关软件的开发了,这个软件首先测试由串口发送数据到0x5082地址,通过连续发送的方式修改改地址的值,达到旋转指针的目标。这里通过另外一个MCU做上位机通过串口向COF屏发送串口指令,上位机程序如下:
int uart_output(char *send_dat, unsigned short len){ unsigned short i; printf( " send:"); for(i=0; i<len; i++) { printf( "%.2X ", send_dat ); } printf("\n"); tls_uart_write(TLS_UART_1, send_dat, len);/* output */ return len;}
//向COF屏发送读地址数据int read_t5l_data(short addr, short len){ char send={0}; send=0x5A; send=0xA5; send=0x04; send=0x83; send= (addr & 0xff00) >> 8; send= (addr & 0xff); send= (len & 0xff);
uart_output(send,7); //向上位机返回,此处可以改成本地处理,加入业务流程 return 0;}
//向COF屏发送写地址数据int write_t5l_data(short addr, short* data, short len){ char send={0}; unsigned short out_len; int i,j; send=0x5A; send=0xA5; send=0x00; send=0x82; send= (addr & 0xff00) >> 8; send= (addr & 0xff); for(i=0,j=0; j<len; i++,j++) { send= (data & 0xff00) >> 8; i++; send= (data & 0xff); } send = 3+i; out_len = 6+i; uart_output(send,out_len); return 0;}
//测试命令处理int command(char *cmd_str){ int i=0; char* token; short mileval; short svalue;
printf( "uart1 command: %s\n",cmd_str );
token = strstr(cmd_str,"set_speed"); //发送速度值 IF(token != NULL) { mileval = 1; for(i=0; i<280; i++) { write_t5l_data(0x5082,&mileval,1); tls_os_time_delay(10); mileval++; }
} token = strstr(cmd_str,"set_mile"); //发送里程数 if(token != NULL) { mileval = 12345; for(i=0; i<240; i++) { write_t5l_data(0x50A0,&mileval,1); tls_os_time_delay(10); mileval+=87; } }
return 0; }
COF屏51 C代码程序如下:void Function_All(void){u32 tmp;u16 V1;
adtime++; if(adtime%100==0){ V1 = Read_Dgus(0x50b0); if(V1==0x2022) { tmp = (u32) Read_Dgus(0x0033); V1 = (u16) (tmp / 167); Write_Dgus( 0x5082,V1); }}}
这里使用一个空闲的地址,来做一个功能的切换,即读取 0x50b0地址,当0x50b0地址内的值等于0x2022时,此时将读取采集 AD1 的数据,并转化为0~280范围的数值,并写入仪表指针的地址0x5082内。 当0x50b0不为0x2022时,此时讲由外部,也就是串口传入的命令来修改。这样就可以完成两个不同的测试,最后测试效果分别见两个视频。此项目代码工程打包附带在文件附件里,有需要的朋友可以自取。
视频链接:https://www.bilibili.com/video/BV14S4y1e7Vx/https://www.bilibili.com/video/BV14S4y1e7Vx/ 请问这个有DEMO吗? huojidu 发表于 2022-7-19 11:34
请问这个有DEMO吗?
楼上附件已经上传了DEMO哦 其乐融融 发表于 2022-7-19 13:39
楼上附件已经上传了DEMO哦
好的,谢谢 其乐融融 发表于 2022-7-19 13:39
楼上附件已经上传了DEMO哦
我用DGUS打开hmi文件显示是空的,是我打开方式有问题吗?
huojidu 发表于 2022-7-19 14:28
我用DGUS打开hmi文件显示是空的,是我打开方式有问题吗?
附件您再下载试试
其乐融融 发表于 2022-7-19 14:54
附件您再下载试试
现在能打开了 指针看起来很糊啊 空心菜 发表于 2022-11-16 11:09
指针看起来很糊啊
软件上的显示和屏上的显示会有差异。 fay 发表于 2022-11-16 11:35
软件上的显示和屏上的显示会有差异。
显示屏上边缘看起来也很糊
页:
[1]
2