dwinForumAdmin 发表于 2022-4-25 14:26:09

【开源】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/

huojidu 发表于 2022-7-19 11:34:02

请问这个有DEMO吗?

其乐融融 发表于 2022-7-19 13:39:59

huojidu 发表于 2022-7-19 11:34
请问这个有DEMO吗?
楼上附件已经上传了DEMO哦

huojidu 发表于 2022-7-19 14:14:22

其乐融融 发表于 2022-7-19 13:39
楼上附件已经上传了DEMO哦

好的,谢谢

huojidu 发表于 2022-7-19 14:28:36

其乐融融 发表于 2022-7-19 13:39
楼上附件已经上传了DEMO哦

我用DGUS打开hmi文件显示是空的,是我打开方式有问题吗?

其乐融融 发表于 2022-7-19 14:54:10

huojidu 发表于 2022-7-19 14:28
我用DGUS打开hmi文件显示是空的,是我打开方式有问题吗?

附件您再下载试试

huojidu 发表于 2022-7-19 15:39:47

其乐融融 发表于 2022-7-19 14:54
附件您再下载试试

现在能打开了

空心菜 发表于 2022-11-16 11:09:32

指针看起来很糊啊

fay 发表于 2022-11-16 11:35:34

空心菜 发表于 2022-11-16 11:09
指针看起来很糊啊

软件上的显示和屏上的显示会有差异。

空心菜 发表于 2022-11-16 13:06:55

fay 发表于 2022-11-16 11:35
软件上的显示和屏上的显示会有差异。

显示屏上边缘看起来也很糊
页: [1] 2
查看完整版本: 【开源】COF案例分享:速度仪表盘的设计和显示AD数值程序