迪文科技论坛

 找回密码
 立即注册
搜索
查看: 1561|回复: 10

【开源】COF案例分享:速度仪表盘的设计和显示AD数值程序

[复制链接]

571

主题

168

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12214
发表于 2022-4-25 14:26:09 | 显示全部楼层 |阅读模式
——文档转载自电子发烧友

此次分享使用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级灰度字库使用DGUS16级灰度字库生成工具制作,设置如图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[128]={0};
        send[0]=0x5A;
        send[1]=0xA5;
        send[2]=0x04;
        send[3]=0x83;
        send[4]= (addr & 0xff00) >> 8;        
        send[5]= (addr & 0xff);
        send[6]= (len & 0xff);

        uart_output(send,7); //向上位机返回,此处可以改成本地处理,加入业务流程
        return 0;
}

//COF屏发送写地址数据
int write_t5l_data(short addr, short* data, short len)
{
        char send[128]={0};
        unsigned short out_len;
        int i,j;
        send[0]=0x5A;
        send[1]=0xA5;
        send[2]=0x00;
        send[3]=0x82;
        send[4]= (addr & 0xff00) >> 8;        
        send[5]= (addr & 0xff);
        for(i=0,j=0; j<len; i++,j++)
        {
                send[6+i]= (data[j] & 0xff00) >> 8;        
                i++;
                send[6+i]= (data[j] & 0xff);         
        }
        send[2] = 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;        
}

COF51 C代码程序如下:
void Function_All(void)
{
  u32 tmp;
  u16 V1[8];

  adtime++;
   if(adtime%100==0)
  {
     V1[0] = Read_Dgus(0x50b0);
     if(V1[0]==0x2022)
     {
     tmp = (u32) Read_Dgus(0x0033);
     V1[1] = (u16) (tmp / 167);
     Write_Dgus( 0x5082,V1[1]);
    }
  }
}

这里使用一个空闲的地址,来做一个功能的切换,即读取 0x50b0地址,当0x50b0地址内的值等于0x2022时,此时将读取采集 AD1 的数据,并转化为0~280范围的数值,并写入仪表指针的地址0x5082内。 当0x50b0不为0x2022时,此时讲由外部,也就是串口传入的命令来修改。这样就可以完成两个不同的测试,最后测试效果分别见两个视频。此项目代码工程打包附带在文件附件里,有需要的朋友可以自取。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

194

主题

442

回帖

2741

积分

金牌会员

Rank: 6Rank: 6

积分
2741
发表于 2022-7-19 11:34:02 | 显示全部楼层
请问这个有DEMO吗?
回复

使用道具 举报

0

主题

981

回帖

4085

积分

论坛元老

Rank: 8Rank: 8

积分
4085
发表于 2022-7-19 13:39:59 | 显示全部楼层
huojidu 发表于 2022-7-19 11:34
请问这个有DEMO吗?

楼上附件已经上传了DEMO哦
回复

使用道具 举报

194

主题

442

回帖

2741

积分

金牌会员

Rank: 6Rank: 6

积分
2741
发表于 2022-7-19 14:14:22 | 显示全部楼层
其乐融融 发表于 2022-7-19 13:39
楼上附件已经上传了DEMO哦

好的,谢谢
回复

使用道具 举报

194

主题

442

回帖

2741

积分

金牌会员

Rank: 6Rank: 6

积分
2741
发表于 2022-7-19 14:28:36 | 显示全部楼层
其乐融融 发表于 2022-7-19 13:39
楼上附件已经上传了DEMO哦

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0

主题

981

回帖

4085

积分

论坛元老

Rank: 8Rank: 8

积分
4085
发表于 2022-7-19 14:54:10 | 显示全部楼层
huojidu 发表于 2022-7-19 14:28
我用DGUS打开hmi文件显示是空的,是我打开方式有问题吗?

附件您再下载试试

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

194

主题

442

回帖

2741

积分

金牌会员

Rank: 6Rank: 6

积分
2741
发表于 2022-7-19 15:39:47 | 显示全部楼层

现在能打开了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0

主题

3

回帖

39

积分

新手上路

Rank: 1

积分
39
发表于 2022-11-16 11:09:32 | 显示全部楼层
指针看起来很糊啊
回复

使用道具 举报

0

主题

932

回帖

6309

积分

论坛元老

Rank: 8Rank: 8

积分
6309
发表于 2022-11-16 11:35:34 | 显示全部楼层
空心菜 发表于 2022-11-16 11:09
指针看起来很糊啊

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

使用道具 举报

0

主题

3

回帖

39

积分

新手上路

Rank: 1

积分
39
发表于 2022-11-16 13:06:55 | 显示全部楼层
fay 发表于 2022-11-16 11:35
软件上的显示和屏上的显示会有差异。

显示屏上边缘看起来也很糊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-12-27 15:02 , Processed in 0.061837 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表